R2D2 – serielle Konsole deaktivieren auf dem Raspberry Pi unter Ubuntu

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.

hc-06 – Bluetooth Modul

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.

Diese Seite verwendet Cookies, um die Nutzerfreundlichkeit zu verbessern. Mit der weiteren Verwendung stimmen Sie dem zu.

Datenschutzerklärung