Der Quellencode aller Programmbeispiele kann hier heruntergeladen werden. |
Experiment 1: Verwendung des HC-SR04 Ultraschall-Sensors |
Ziel: Bestimmen der Distanz zu einem reflektierenden Objekt durch Messung der Laufzeit eines Ultraschall-Pulses. Das Ergebnis wird in der Konsole angezeigt. Durch Drücken des Tastenschalters wird das Programm beendet. Die Verwendung des HC-SR04 Moduls ist einfach. Ein positiver Triggerpuls von etwa 10-100 us am Trigger-Eingang löst die Messung aus. Nach einer gewissen Zeit sendet der Echo-Ausgang einen positiven Puls zurück, dessen Länge der Laufzeit des Ultraschallsignals entspricht. Das untenstehende Oszilloskop-Bild zeigt den Trigger- und Echopuls für eine typische Situation. Da die Schallgeschwindigkeit 343 m/s ist, bewegt sich der Schallpuls in 700 us 24 cm weit. Dies entspricht dem Abstand vom Sensor zum Ziel und zurück zum Sensor. Das Ziel ist also 12 cm entfernt.
Programm:[►] # Ultrasonic1.py # Using HC-SR04 ultrasonic module import RPi.GPIO as GPIO import time P_TRIGGER = 15 P_ECHO = 16 def setup(): GPIO.setmode(GPIO.BOARD) GPIO.setup(P_TRIGGER, GPIO.OUT) GPIO.setup(P_ECHO, GPIO.IN) def getDistance(timeoutCount = 10000): # Send max 10 us trigger pulse GPIO.output(P_TRIGGER, GPIO.HIGH) time.sleep(0.00001) GPIO.output(P_TRIGGER, GPIO.LOW) # Wait for HIGH signal count1 = 0 while GPIO.input(P_ECHO) == GPIO.LOW and count1 < timeoutCount: count1 += 1 startTime = time.time() # Wait for LOW signal count2 = 0 while GPIO.input(P_ECHO) == GPIO.HIGH and count2 < timeoutCount: count2 += 1 if count1 == timeoutCount or count2 == timeoutCount: return -1 elapsed = time.time() - startTime distance = 34300 * elapsed / 2.0 # round to 2 decimals distance = int(distance * 100 + 0.5) / 100.0 return distance print "starting..." setup() while True: d = getDistance() print "d =", d time.sleep(0.1) Um ein hängendes Programm zu vermeiden, wenn der Sensor nicht antwortet, verwenden wir einen timeoutCount und geben im Fehlerfall -1 zurück. Eine autonome Anwendung erhalten Sie, wenn Sie die Distanz auf einem angeschlossenen Oled- oder 7-Segment-Display anzeigen. Programm:[►] # Ultrasonic2.py # Show distance on Oled import RPi.GPIO as GPIO import time from OLED1306 import OLED1306 P_ESCAPE = 12 # Button A P_TRIGGER = 15 P_ECHO = 16 def setup(): GPIO.setmode(GPIO.BOARD) GPIO.setup(P_TRIGGER, GPIO.OUT) GPIO.setup(P_ECHO, GPIO.IN) GPIO.setup(P_ESCAPE, GPIO.IN) def getDistance(timeoutCount = 10000): # Send max 10 us trigger pulse GPIO.output(P_TRIGGER, GPIO.HIGH) time.sleep(0.00001) GPIO.output(P_TRIGGER, GPIO.LOW) # Wait for HIGH signal count1 = 0 while GPIO.input(P_ECHO) == GPIO.LOW and count1 < timeoutCount: count1 += 1 startTime = time.time() # Wait for LOW signal count2 = 0 while GPIO.input(P_ECHO) == GPIO.HIGH and count2 < timeoutCount: count2 += 1 if count1 == timeoutCount or count2 == timeoutCount: return -1 elapsed = time.time() - startTime distance = 34300 * elapsed / 2.0 # round to 2 decimals distance = int(distance * 100 + 0.5) / 100.0 return distance print "starting..." oled = OLED1306() oled.setFontSize(50) setup() while GPIO.input(P_ESCAPE) == GPIO.LOW: d = getDistance() oled.setText(str(d)) time.sleep(1) GPIO.cleanup() oled.setText("done") |
Experiment 2: Verwendung von Relais |
Ziel:
Hier eine klassische Schaltung unter Verwendung eines bipolaren Transistors (die Bauteile lassen sich durch kompatible Komponenten ersetzen). Die zum Relais parallel geschaltete Diode ist nötig, um den Transistor vor Spannungsspitzen zu schützen, die durch Induktion beim Ausschalten des Spulenstroms verursacht werden. Bemerkungen: |
Experiment 3: Step-up Konverter 3.3V to 5 V |
Ziel:
|