Raspberry Pi Sensor & Aktuator Steuerung meistern: Beschleunigungsmesser, Servo und Datenstreaming
Während die meisten Entwickler mit statischen Dateien oder einfachen Grafiken arbeiten, öffnet Physical Computing die Tür zur Interaktion mit der realen Welt. Durch das Auslesen von Sensordaten und das Ansteuern von Aktuatoren können Sie Systeme schaffen, die wahrnehmen, entscheiden und in der physischen Welt handeln.
Ziel
Einen Raspberry Pi verwenden, um Beschleunigungsmesserwerte auszulesen und einen Servomotor zu steuern, und so Schlüsselkonzepte des Physical Computing zu demonstrieren.
Schlüsselkonzepte
- Raspberry Pi – Ein 35-Dollar Linux-Computer mit HDMI, Ethernet, zwei USB-Ports und vor allem GPIO-Pins, die das Senden und Empfangen von Signalen ermöglichen.
- GPIO Pins – General Purpose Input/Output Pins, die als binäre Schalter fungieren. Sie können einen Pin auf HIGH (3,3 V) oder LOW (0 V) setzen, um einen Aktuator anzusteuern, oder seinen Zustand auslesen, um Sensordaten zu sammeln.
Dieser Artikel führt durch vier praktische Python-Projekte, die die Hardware-Fähigkeiten des Pi veranschaulichen:
- Eine LED blinken lassen.
- Ein Potentiometer auslesen.
- Daten über ein Netzwerk streamen.
- Einen Servomotor steuern.
LED blinken lassen
Eine LED (Light-Emitting Diode) emittiert Licht, wenn Strom in eine Richtung fließt. Zum Schutz von Pi und LED verwenden Sie einen Widerstand zwischen 500 Ω und 1,5 kΩ. Der Widerstandswert kann mit R = (V_s - V_d) / I berechnet werden, aber der obige Bereich funktioniert für die meisten Hobby-Kits.
import time
from itertools import cycle
import RPi.GPIO as io
io.setmode(io.BCM)
io.setup(12, io.OUT)
for state in cycle([1, 0]):
io.output(12, state)
time.sleep(0.5)
Der Code setzt Pin 12 als Output und schaltet ihn alle halbe Sekunde um, wodurch die LED blinkt.
Potentiometer auslesen
Ein Potentiometer (Pot) ist ein variabler Widerstand, der eine Knopfposition in eine Spannung umwandelt. Da GPIO-Pins digital sind, benötigen wir einen Analog-Digital-Wandler (ADC). Der MCP3008 bietet acht 10-Bit-Kanäle, die 0–3,3 V auf Integer-Werte 0–1023 abbilden.
Installieren Sie spidev für die SPI-Kommunikation mit dem MCP3008:
pip install spidev
Führen Sie das folgende Skript aus, um Werte von Kanal 0 auszulesen:
import spidev
import time
spi = spidev.SpiDev()
spi.open(0, 0)
def readadc(adcnum):
if not 0 <= adcnum <= 7:
return -1
r = spi.xfer2([1, (8 + adcnum) << 4, 0])
adcout = ((r[1] & 3) << 8) + r[2]
return adcout
while True:
val = readadc(0)
print(val)
time.sleep(0.5)
Daten mit ØMQ streamen
ØMQ vereinfacht Networking durch Bereitstellung einer High-Performance-Messaging-Bibliothek. Mit dem REQUEST/REPLY-Muster können Sie einen leichten Server und Client in Python bauen.
Server
import zmq
context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind('tcp://*:1980')
while True:
message = socket.recv()
print(message)
socket.send(b"I'm here")
Client
import zmq
context = zmq.Context()
socket = context.socket(zmq.REQ)
socket.connect('tcp://192.168.1.6:1980')
for _ in range(10):
socket.send(b'You home?')
message = socket.recv()
print(message)
Mit traits und enaml können Sie eine responsive UI erstellen, die die gestreamten Daten visualisiert. Sehen Sie sich das acc_plot Demo für ein vollständiges Beispiel an.
Servomotor steuern
Servos bewegen sich auf präzise Positionen mithilfe von Pulsweitenmodulation (PWM). Ein typischer Hobby-Servo interpretiert einen 0,5 ms Puls als minimalen Winkel und einen 2,5 ms Puls als maximalen Winkel, sich alle 20 ms wiederholend.
Präzises Timing ist in einem General-Purpose-OS schwer zu erreichen. ServoBlaster ist ein Kernel-Modul, das PWM-Generierung an den DMA-Controller auslagert und ein einfaches /dev/servoblaster Interface bereitstellt.
Ich habe diese Funktionalität in eine kleine, objektorientierte Bibliothek gewrappt: RobotBrain. Das folgende Beispiel demonstriert das Bewegen eines Servos von 0 % auf 100 % Tastverhältnis.
import time
import numpy as np
from robot_brain.servo import Servo
# Servo auf Pin 4 initialisieren mit benutzerdefinierten min/max Pulsbreiten (in µs)
servo = Servo(0, min=60, max=200)
for val in np.arange(0, 1, 0.05):
servo.set(val)
time.sleep(0.1)
Nutzen Sie das servo_slider Demo auf GitHub, um zu sehen, wie der Servo über das Netzwerk gesteuert werden kann.
Für einen tieferen Einstieg in Sensor- und Aktuatorsteuerung mit dem Raspberry Pi verweisen Sie auf die ursprüngliche Dokumentation oder Community-Tutorials.
Herstellungsprozess
- Nahtlose MQTT-Integration: NodeMCU DHT22 Sensoren mit Raspberry Pi 3 B+ als Broker
- Raspberry Pi Temperaturlogger mit 5 $ I2C Sensor bauen
- Mehrere DS18B20 1-Wire Sensoren an Raspberry Pi anschließen für präzises Temperaturmonitoring
- Fern-Temperatursensor mit Raspberry Pi & Python bauen – Schritt-für-Schritt-Anleitung
- Raspberry Pi Wetterstation bauen, die tägliche Wetterdaten per E-Mail sendet
- HC-SR04 Ultraschallsensor an Raspberry Pi 3 anschließen – Komplettanleitung
- LED mit PIR-Bewegungsmelder am Raspberry Pi steuern
- Günstiger Raspberry Pi Bodenfeuchtesensor für smarte Bewässerung
- Linearen Hall-Sensor mit Raspberry Pi auslesen: Java-Anleitung & ADC0832 Einblicke
- Multi-Sensor Temperatur- & Licht-Überwachung mit Raspberry Pi & DS18B20