R2D2 soll per Bluetooth mit dem Smartphone gesteuert werden können und zusätzlich sollen die Autonomen Fahrprogramme mit dem Smartphone gestartet und beendet werden können.
Die erste Hürde um die Steuerung in Angriff nehmen zu können, war die serielle Konsole unter Ubuntu zu deaktivieren, da sonst die Kommunikation über die serielle Schnittstelle nicht funktioniert.
Da unter Ubuntu das Tool raspi-config nicht verfügbar ist, müssen die Einstellungen für die Deaktivierung manuell vorgenommen werden.
In der Datei: /boot/firmware/cmdline.txt löscht man dazu den Eintrag:
console=serial0,115200
Nach dem Reboot ist die serielle Schnittstelle nicht mehr der Gruppe: tty zugeordnet, sondern dialout:
crw-rw---- 1 root dialout 4, 64 Jan 10 05:56 /dev/ttyS0
dialout hat im Gegensatz zu tty Leserechte auf dieser Schnittstelle.
Falls noch nicht geschehen den angemeldeten Nutzer zu der Gruppe dialout hinzufügen:
sudo addgroup <benutzername> dialout
Nun funktioniert auch die Datenübertragung einwandfrei:
from time import sleep
import serial
ser = serial.Serial ("/dev/ttyS0", 9600) #Open port with baud rate
while True:
received_data = ser.read() #read serial port
data_left = ser.inWaiting() #check for remaining byte
received_data += ser.read(data_left)
print (str(received_data.decode("ascii"))) #print received data
# ser.write(received_data) #transmit data serially
# if (received_data) is None:
# break
sleep(0.01)
Jetzt lässt sich für das HC-06 Bluetooth Modul, das bei meinem ersten Arduino Robot dabei war eine kleine Python Klasse schreiben:
import threading
from time import sleep
import serial
class BlueTooth:
def __init__(self):
self._last_command = "D"
self._closed = True
self._thread = None
def get_last_command(self):
return self._last_command
def closed(self):
return self._closed
def close(self):
self._closed = True
def set_last_command(self, last_command):
self._last_command = last_command
def _run(self):
ser = serial.Serial ("/dev/ttyS0", 9600) #Open port with baud rate
while not self.closed():
received_data = ser.read() #read serial port
data_left = ser.inWaiting() #check for remaining byte
received_data += ser.read(data_left)
self.set_last_command(str(received_data.decode("utf-8")))
sleep(0.02)
self.set_last_command("D")
def open(self):
self._closed = False
self._thread = threading.Thread(target=self._run)
self._thread.start()
In einem Jupyter Notebook kann sie getestet werden:
from robotbench.tools.bluetooth import BlueTooth
bluetooth = BlueTooth()
bluetooth.open()
s = bluetooth.get_last_command()
print(s)
Nach dem Test Klasse beenden:
bluetooth.close()
Die Verbindung zum hc-06 kann man z.B. mit dem Bluetooth RC Controller herstellen. Das funktioniert finde ich ganz gut.
Die vier Zusatzfunktionen werde ich dann für die autonomen Fahrfunktionen verwenden.