Als weiteres Feature wollen wir unseren kleinen Roboter nun zusätzlich dem Klang unserer Stimme folgen lassen. Ist der Modus aktiviert, so soll der Roboter automatisch in jene Richtung navigieren, aus der gerufen wurde.
Dazu gibt es kleine analoge Sound Erkennungssensoren, welche über einen MCP3008 ADC Wandler ausgelesen werden und dann der Raspberry Pi Roboter dementsprechend in diese Richtung lenkt.
Wie auch bei den meisten vorherigen Tutorials zum Raspberry Pi Roboter gilt, dass du diese überspringen bzw. anpassen kannst, wenn dein Roboter eine andere Funktionalität haben soll.
Benötigte Hardware
Solltest du dieses Tutorial nachbauen wollen, so werden folgende Bauteile benötigt:
- 3x Sound Sensoren (für Vorne, Rechts und Links)
- MCP3008 ADC
- Jumper Kabel
Im Übrigen erleichtert Heißkleber auch weiterhin die Montage.
Aufbau und Verkabelung
Als erstes schließen wir die Sensoren an. Dazu müssen je drei Jumper Kabel pro Sensor angeschlossen werden. Falls deine Sensoren 4 Pins haben, musst du nur VCC, GND und A0 anschließen. Nun können die Module einfach an die Karosserie geklebt werden. Bevor du sie allerdings endgültig (mit Heißkleber o.ä.) befestigst, solltest du erst die beste Position finden (dazu später mehr). Ich habe einen Sensor vorne angeschlossen, sowie einen rechts und links. Denkbar wäre es auch noch weitere Sound Detektoren z.B. hinten oder in 45° Position zu befestigen.
Als nächstes ist der MCP3008 dran. Die Kommunikation findet über SPI statt, lediglich die 3.3V Spannung bekommen wir von einem anderen, freien Pin:
RaspberryPi | MCP3008 |
---|---|
Pin 17 (3.3V) | Pin 16 (VDD) |
Pin 17 (3.3V) | Pin 15 (VREF) |
Pin 25 (GND) | Pin 14 (AGND) |
Pin 23 (SCLK) | Pin 13 (CLK) |
Pin 21 (MISO) | Pin 12 (DOUT) |
Pin 19 (MOSI) | Pin 11 (DIN) |
Pin 24 (CE0) | Pin 10 (CS/SHDN) |
Pin 25 (GND) | Pin 9 (DGND) |
Auf der anderen Seite befinden sich die 8 Channel, an denen analoge Sensoren (Data bzw. A0 Pin) angeschlossen werden können. An CH0 schließen wir den vorderen Sensor an, der rechte Sensor kommt an CH1 und der linke an CH2. Der VCC Pin von allen drei Modulen wird ebenfalls an 3.3V angeschlossen und GND an einen GND Anschluss vom Raspberry Pi.
Schematisch sieht der Aufbau (inkl. unserer vorherigen angeschlossenen Module, dann folgend aus:
MCP3008 ADC Wandler
Der Raspberry Pi kann ohne weiteres keine analogen Werte auslesen. Daher ist ein ADC wie der MCP3008 nötig. In einem vorherigen Tutorial habe ich die Funktionsweise eines ADCs inkl. nötiger Installationen beschrieben. Sollte noch nie ein Analog-Digital Wandler verwendet worden sein, empfiehlt es sich, dieses Tutorial durchzulesen. Ansonsten kann hier einfach fortgefahren werden.
Wir erstellen also im Ordner mit unseren weiteren Python Robot Dateien eine neue Datei, welche eine Klasse für den Analog-Digital Wandler enthält:
sudo nano MCP3008.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
from spidev import SpiDev class MCP3008: def __init__(self, bus = 0, device = 0): self.bus, self.device = bus, device self.spi = SpiDev() self.open() self.spi.max_speed_hz = 1000000 # 1MHz def open(self): self.spi.open(self.bus, self.device) self.spi.max_speed_hz = 1000000 # 1MHz def read(self, channel = 0): adc = self.spi.xfer2([1, (8 + channel) << 4, 0]) data = ((adc[1] & 3) << 8) + adc[2] return data def close(self): self.spi.close() |
Nun muss nur noch gespeichert (STRG+O) und der Editor beendet (STRG+X) werden.
Code erweitern
In unserer robot.py
Datei importieren wir die erstelle Datei zu erst:
1 |
from MCP3008 import MCP3008 |
Am Ende der Klasse muss außerdem noch eine weitere Funktion erstellt werden, womit auf die Stimmerkennung reagiert werden kann. Folgenden Code fügen wir also hinzu:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
def followVoice(self): adc = MCP3008() while True: front = adc.read(0) right = adc.read(1) left = adc.read(2) # tiny values are invalid => map them to 1023 if front < 10: front = 1023; # motors make noise of about 150, if motor is running if right < 50: right = 1023; if left < 50: left = 1023; if front < 1000 and right > 1000 and left > 1000: self.motor.forwardRight() elif front > 1000 and right < 1000 and left > 1000: self.motor.forwardLeft() elif front > 1000 and right > 1000 and left < 1000: self.motor.forwardRight() elif front < 1000 and right < 1000 and left > 1000: # front / right self.motor.forwardLeft() time.sleep(self.motor.SEC_PER_TURN / 360.0 * 45) elif front < 1000 and right > 1000 and left < 1000: # front / left self.motor.forwardRight() time.sleep(self.motor.SEC_PER_TURN / 360.0 * 45) else: self.motor.stop() time.sleep(0.1) |
Mit den Schwellwerten (ab welcher Lautstärke reagiert wird), kannst du experimentieren. Da die Motoren doch recht laut sind, habe ich den Schwellwert der seitlichen Mikrophone höher gestellt. Sobald du eine gute Position gefunden hast (oder die Schwellwerte entsprechend angepasst), können auch die Schalldetektoren an der Karosserie befestigt werden.
Ist die Datei entsprechend erweitert, können wir einen kleinen Test laufen lassen. Dazu öffnen wir die Python Konsole (sudo python
) und geben folgenden Code ein:
1 2 3 4 5 6 7 8 9 10 |
from robot import Robot import time try: r=Robot() r.followVoice() except Exception as e: print(e) finally: r.motor.stop() |
Leider sind die Geräuschsensoren nicht all zu genau, weshalb das Folgen der Stimme nicht immer optimal funktioniert – als Spielerei sicherlich dennoch eine nette Sache.
Mit Hilfe der Infrarot Steuerung, welche wir davor erstellt haben, können wir z.B. eine Taste festlegen, welche den Modus zum Folgen der Stimme anschaltet.
Mit einem richtigen Mikrofon könnte man den Raspberry Pi Roboter sogar auf Sprachbefehle reagieren lassen. Dabei müsste nur auf bestimmte Codewörter reagiert werden (vorwärts, rechts, links, stop, etc.) und die entsprechenden Aktionen aufgerufen werden.
Im nächsten Teil lassen wir den Roboter noch per Xbox 360 Controller / Joystick fernsteuern.
2 Kommentare
Wie wärs mit einer Wii Fernbedinung (oder andere Controller) steuerung?
Die Steuerung per Xbox 360 Controler ist geplant – die Software ist schon soweit. Tutorial kommt wohl nächste Woche. Wenn du es nicht verpassen willst, trag dich doch in den Newsletter ein 🙂