Raspberry Pi 3: GPIO-Port Module und Bluetooth

Aus FHEMWiki


Info blue.png
Die Vorbereitung der UART-Schnittstelle ist auch in Raspberry Pi beschrieben. Hier sollten zukünftig nur Besonderheiten und Abweichungen stehen!


Der Raspberry Pi 3 nutzt für den GPIO-Port standardmäßig den UART1 (ttyS0), während die vorherigen Raspberry Pi-Modelle noch den UART0 dafür verwendeten. Der UART0 (ttyAMA0) wird beim Pi 3 durch das neu eingeführte Bluetooth-Modul softwaremäßig belegt. Der UART1 des Pi 3 mit Anhängigkeiten von CPU-Frequenz, CPU-Last, Temperatur und anderem ist für den Betrieb von Aufsteckmodulen jedoch häufig nicht stabil genug. Der Pi 3 muss daher zur Verwendung von einigen Aufsteckmodulen für den GPIO-Port, die über GPIO 14/15 kommunizieren so umkonfiguriert werden, dass der GPIO-Port wie bei den Vorgängermodellen wieder den UART0 einsetzt.

Unter anderem folgende Aufsteckmodule setzen für einen stabilen Betrieb die Nutzung des UART0 für den GPIO-Port voraus:

Immer wieder angeführte und einfach umzusetzende Lösung ist Bluetooth zu deaktivieren und dann den UART0 (ttyAMA0) auf den GPIO-Port umzumappen (siehe beispielsweise Beitrag). Damit kann man aber das im Pi 3 eingebaute Bluetooth-Modul nicht mehr nutzen. Ein Vorteil des Pi 3 zu den Vorgängermodellen geht somit verloren.

robert.heinze hat aufbauend auf seinen Erkenntnissen in diesem Thema nachfolgendes HowTo zur Verfügung gestellt, nach dessen Abarbeitung eine parallele Verwendung von Aufsteckmodulen für den GPIO-Port und Bluetooth in FHEM mit dem Pi 3 möglich ist.

HowTo

Standardmäßig belegt der Raspberry 3 den Software-UART-ttyAMA0 mit Bluetooth. Da wir diese Schnittstelle aber für serielle Module wie z.B. hier den EnOceanPi verwenden, legen wir den integrierten Bluetooth-Empfänger des Raspberry Pi 3 auf ttyS0 (UART1 - „mini UART“) um den Hardware-UART auf die TX/RX-Pins zu legen (UART0 - „full UART“). Hierfür sind einige Maßnahmen vorzunehmen, die nachfolgend schrittweise beschrieben werden.

Schritt 1:

Im ersten Schritt gilt es den Raspberry Pi 3 zu konfigurieren:

sudo raspi-config
A7 Serial auf enabled setzen

Schritt 2:

Zur Bearbeitung von Textdateien wird hier und bei allen folgenden Schritten der Editor nano genutzt. Selbstverständlich kann auch auf einen anderen Editor zurückgegriffen werden.

sudo nano /boot/cmdline.txt

Diese Zeile suchen:

dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait

und editieren. Der Eintrag console=serial0,115200 sollte wie schon beim RPi2 entfernt werden, wenn es gesetzt ist, damit die UART-Schnittstelle von Zusatzmodulen wie EnOceanPi verwendet werden kann. Der genaue Inhalt der Zeile kann sich je nach System unterscheiden.

Hinweis: Ändert man nachträglich noch einmal etwas über "raspi-config", so kann es vorkommen, dass console=serial0,115200 wieder in der Zeile ergänzt wird.

Schritt 3:

Raspberry auf aktuellen Stand bringen:

sudo apt-get update
sudo apt-get upgrade

Schritt 4:

Firmware aktualisieren:

sudo apt-get install rpi-update
sudo rpi-update 
sudo reboot

Ein rpi-update soll nur gemacht werden, wenn es unbedingt erforderlich ist. (Quelle: [1])

Schritt 5:

In der Config-Datei /boot/config.txt wird das dementsprechende Overlay geladen, um Bluetooth auf mini UART zu legen:

dtoverlay=pi3-miniuart-bt 

Die Taktfrequenz muss beim Starten auf eine konstante Frequenz eingestellt werden:

enable_uart=1

UART1 wird auf die Maximalfrequenz oder Minimalfrequenz gelegt, da der mini UART die Baudrate abhängig von der System Clock variiert: force_turbo=1 oder core_freq=250, wir entscheiden uns für force_turbo=1 sofern ein dementsprechendes Netzteil (2,5A) verwendet wird.

sudo nano /boot/config.txt

Am Ende der Datei einfach die folgenden Zeilen hinzufügen:

dtoverlay=pi3-miniuart-bt
enable_uart=1
force_turbo=1

Schritt 6:

Dieser Schritt ist nach Mai 2016 nicht mehr notwendig.

Der Bluetooth UART-Service muss auf ttyS0 gelegt werden.

sudo nano /lib/systemd/system/hciuart.service

In der Datei 2x ttyAMA0 gegen ttyS0 (oder alternativ /dev/serial1) tauschen, was in folgendem Code resultiert:

[Unit]
Description=Configure Bluetooth Modems connected by UART
ConditionPathIsDirectory=/proc/device-tree/soc/gpio@7e200000/bt_pins
Before=bluetooth.service
After=dev-ttyS0.device

[Service]
Type=forking
ExecStart=/usr/bin/hciattach /dev/ttyS0 bcm43xx 921600 noflow -

[Install]
WantedBy=multi-user.target

Schritt 7:

Dieser Schritt ist fragwürdig und ab September 2017 durch Anpassungen in der fhem.pl nicht mehr notwendig.


Auf Grund eines Timing-Problems in der Boot-Phase zwischen Bluetooth und dem FHEM Start muss der FHEM-Service 10 Sekunden verzögert werden.

sudo nano /etc/init.d/fhem

In der ersten Zeile der Datei

sleep 10

einfügen.

Nun sollten nach einem Reboot das GPIO-Port-Aufsteckmodul (ttyAMA0) und Raspi 3-Bluetooth (ttyS0) parallel funktionieren.

Schritt 8 (optional)

Wenn Bluetooth noch nicht installiert wurde, muss es noch installiert werden.

sudo apt-get install pi-bluetooth

Schritt 9: (optional)

Sollte es immer noch nicht möglich sein, auf die Schnittstelle /dev/ttyAMA0 zuzugreifen, so sollte man die rechte überprüfen:

ls -lha /dev/ttyAMA0

Hierbei muss sichergestellt sein, dass der User "fhem" zur angezeigten Gruppe (z.B. dialout) gehört. Ist dies nicht der Fall, dann den User "fhem" hinzufügen

usermod -a -G dialout fhem

Quelle: [2]

Schritt 10: (optional)

Den Dienst serial-getty deaktivieren

systemctl disable serial-getty@ttyAMA0.service

Quelle: [3]