Raspberry Pi-sensor- en actuatorbeheersing onder de knie: versnellingsmeter, servo en datastreaming
Terwijl de meeste ontwikkelaars werken met statische bestanden of eenvoudige graphics, opent fysieke computing de deur tot interactie met de echte wereld. Door gegevens van sensoren uit te lezen en actuatoren aan te sturen, kun je systemen creëren die waarnemen, beslissen en handelen in de fysieke wereld.
Doel
Gebruik een Raspberry Pi om versnellingsmeterwaarden uit te lezen en een servomotor aan te sturen, waarmee de kernconcepten van fysieke computing worden gedemonstreerd.
Kernconcepten
- Raspberry Pi – Een $35 Linux-computer met HDMI, Ethernet, twee USB-poorten en, het allerbelangrijkste, GPIO-pinnen waarmee je signalen kunt zenden en ontvangen.
- GPIO-pinnen – General Purpose Input/Output-pinnen die fungeren als binaire schakelaars. Je kunt een pin HIGH (3,3 V) of LOW (0 V) instellen om een actuator aan te sturen, of de status ervan uitlezen om sensorgegevens te verzamelen.
Dit artikel loopt vier praktische Python-projecten door die de hardwaremogelijkheden van de Pi illustreren:
- Een LED laten knipperen.
- Een potentiometer uitlezen.
- Data via een netwerk streamen.
- Een servomotor besturen.
Een LED laten knipperen
Een LED (Light-Emitting Diode) emiteert licht wanneer stroom in één richting vloeit. Om de Pi en de LED te beschermen, gebruik je een weerstand tussen 500 Ω en 1,5 kΩ. De weerstandswaarde kan berekend worden met R = (V_s - V_d) / I, maar het bovenstaande bereik werkt voor de meeste 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)
De code stelt pin 12 in als output en schakelt deze elke halve seconde, waardoor de LED knippert.
Een potentiometer uitlezen
Een potentiometer (pot) is een variabele weerstand die een knoppositie omzet in een spanning. Omdat GPIO-pinnen digitaal zijn, hebben we een Analog-to-Digital Converter (ADC) nodig. De MCP3008 biedt acht 10-bit kanalen, die 0–3,3 V afbeelden op gehele waarden 0–1023.
Installeer spidev om te communiceren met de MCP3008 via SPI:
pip install spidev
Voer het volgende script uit om waarden van kanaal 0 uit te lezen:
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)
Data streamen met ØMQ
ØMQ vereenvoudigt netwerken door een hoogprestatie messaging-bibliotheek te bieden. Met het REQUEST/REPLY-patroon kun je een lichtgewicht server en client in Python bouwen.
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)
Met traits en enaml kun je een responsieve UI creëren die de gestreamde data visualiseert. Zie de acc_plot-demo voor een volledig voorbeeld.
Een servomotor besturen
Servo's bewegen naar exacte posities met behulp van Pulse Width Modulation (PWM). Een typische hobby-servo interpreteert een puls van 0,5 ms als minimale hoek en een puls van 2,5 ms als maximale hoek, herhaald elke 20 ms.
Precieze timing is lastig in een algemeen besturingssysteem. ServoBlaster is een kernelmodule die PWM-generatie afhandelt aan de DMA-controller, wat een eenvoudige /dev/servoblaster-interface blootlegt.
Ik heb deze functionaliteit verpakt in een kleine, objectgeoriënteerde bibliotheek: RobotBrain. Het onderstaande voorbeeld demonstreert het bewegen van een servo van 0 % naar 100 % duty cycle.
import time
import numpy as np
from robot_brain.servo import Servo
# Initialiseer servo op pin 4 met aangepaste min/max pulsgolften (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)
Gebruik de servo_slider-demo op GitHub om te zien hoe de servo via het netwerk kan worden bestuurd.
Voor een diepere duik in sensor- en actuatorbeheer met de Raspberry Pi, raadpleeg de oorspronkelijke documentatie of community-tutorials.
Productieproces
- Naadloze MQTT Integratie: NodeMCU DHT22 Sensoren Met Raspberry Pi 3 B+ Als Broker
- Bouw Een Raspberry Pi Temperatuur Logger Met Een $5 I2C Sensor
- Meerdere DS18B20 1-Wire Sensoren Aan Een Raspberry Pi Koppelen Voor Nauwkeurige Temperatuurmonitoring
- Een externe temperatuursensor bouwen met Raspberry Pi en Python – Stap-voor-stap handleiding
- Een Raspberry Pi-weerstation bouwen dat dagelijkse weergegevens e-mailt
- HC-SR04 ultrasoon-sensor aansluiten op Raspberry Pi 3 – Complete gids
- Een LED Besturen met een PIR-bewegingssensor op Raspberry Pi
- Een Goedkope Raspberry Pi Grondvochtigheidssensor Bouwen voor Slimme Irrigatie
- Een Lineaire Hall-sensor Uitlezen met Raspberry Pi: Java-handleiding & ADC0832-inzichten
- Een Multi-sensor Temperatuur- & Lichtmonitoringssysteem Bouwen met Raspberry Pi & DS18B20
- Raspberry Pi-gebaseerde badkamerbezet-sensor met spraak- en SMS-waarschuwingen via Twilio