Raspberry Pi 3: GPIO-Port Module und Bluetooth
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]