Konfiguration des GPIO mit Raspbian Jessie und Raspberry Pi 3
Nachdem ich mich damit beschäftigt habe mein GPS Modul am Raspberry Pi 3 zum Laufen zu bringen,
stieß ich zunächst auf einige Hindernisse. Die meisten Anleitungen zu dem Thema basierten noch auf
älteren Pi Modellen und/oder des Raspian Wheezy Betriebsystems. Leider kam ich hier nicht weiter.
Dann stieß ich auf einer englischen Seite auf eine tolle Erklärung über die Unterschiede des neuen
Betriebssystems Jessie in Zusammenarbeit mit dem Raspberry Pi 3. Was sich geändert hat, wo die
Probleme liegen und wie man sie löst. Ich habe mir nun die Arbeit gemacht diese ins Deutsche zu
übersetzten und auch hier für andere User zu posten. Im Zweifelsfall oder für Updates sollte man natürlich
auch mal auf der Originalseite vorbeischauen, ob der Author etwas neues gepostet hat.
Hier also der Artikel und meine Übersetzung dazu:
Author:
Jon Watkins am 29. Mai 2016 in Raspberry Pi
Übersetzt aus dem Englischen von:
Dirgi2
Original Link:
http://spellfoundry.com/2016/05/29/con…including-pi-3/
Inhalt:
- Geschichte
- Benutzung des seriellen Ports mit anderer Hardware
- Raspberry Pi 3
Aktivierung
- Serielle Aliases
- Deaktivieren der Konsole
- Vertauschen der seriellen Ports auf dem Raspberry Pi 3
Früher war das relativ einfach, allerdings hat sich mit der Umstellung des Betriebssystems von
Wheezy auf Jessie einiges geändert. Hinzu kommt noch die neue Hardware des Radspberry Pi 3
mit der eingebauten Bluetooth Unterstützung. Plötzlich wurde es recht verwirrend. Nachdem
ich damit viel Zeit verbracht habe, habe ich hier einmal alles niedergeschrieben, was ich zu
wissen glaube. Mit etwas Glück sind dies genau die Informationen die Du brauchst um den
GPIO erfolgreich anzusprechen und auch parallel zu Bluetooth zu betreiben und dies nicht nur
für den aktuellen Raspberry Pi 3, sonder auch ältere Modelle.
Hinweis: Du brauchst dafür die aktuelle Firmware Mai 2016 müssen (2016.05.10)
oder höher um damit zu arbeiten. Sollte sich hier etwas ändern, werde ich diesen Beitrag
wieder aktualisieren. (Anmerkung: Folge hierzu dem Original Link)
Geschichte:
Bevor ich tiefer in die Konfiguration einsteige, lohnt sich ein kleiner Ausflug in die Geschichte
des Raspberry Pi. Wenn Du ein noch ein wenig der alten Schule angehörst, würdest Du erwarten
einen Header mit dem Namen COM1 o.ä. vorzufinden. Im Rasperry Pi/Linux Land findest Du
dies äquivalent an den Pins 14 und 15 des GPIO Headers vor.
Dieser nennt sich hier: /dev/ttyAMA0 .Im Raspberry Pi Land kannst Du den seriellen Port dazu
benutzen um mit ihm eine Terminal Verbindung herzustellen, welche z.B. nützlich sein kann, sollte
keine Netzwerk Verbindung möglich sein. Du kannst einen anderen Computer über den seriellen Port
verbinden um damit zu kommunizieren. Standardmäßig verwendet der Raspberry Pi den seriellen
Port für diesen "Konsolen" login über ein Software-Service namens "getty". D.h. im Originalzustand
des Betriebssystems ist der Port bereits so ausgelegt, dass man die Terminalsteuerung nutzen könnte.
Benutzung des seriellen Ports mit anderer Hardware:
Dies ist also die normale Konfiguration der seriellen Schnittstelle. Aber serielle Schnittstellen sind
nun einmal nützliche Dinge. Was würde passieren, wenn wir die serielle Schnittstelle dafür benutzen
wollen um z.B. GPS-Daten auszulesen, oder mit einem Arduino kommunizieren möchten? -
Es geht dann nicht. Somit müssen wir zunächst die Konsolenfunktion am seriellen Port abschalten
um für unsere Belange darauf Zugriff zu bekommen - Richtig? - Ja/Nein. Es steht hier zunächst ein
großer Elefant im Weg mit dem Namen Raspberry Pi.
Bevor wir also mit dem seriellen Port kommunizieren können müssen wir über den Raspberry Pi 3
sprechen, welcher uns zunächst einen großen Strich durch die Rechung macht. Zumindest was den
seriellen Port anbelangt.
Raspberry Pi 3:
RasPi 3's sind großartige kleine Biester mit eingebauter Bluetooth Unterstützung. Wie dem auch sei.
Um die Bluetooth Funktion einzubinden hat man den /dev/ttyAMA0 vom GPIO Header kurzerhand
"gestohlen" und im gleichen Atemzug ergänzt durch einen zweiten minderwertigeren Port. Der
/dev/ttyAMA0 ist ein Hardware Serial Port (UART) mit einer hohen Performance. Der zweite Port,
teilweise software basierend, ist nicht so performant. Aufgrund dessen wurde der qualitativ bessere
Port für Bluetooth "abgezweigt". Viele "ältere" Software & Hardware Applikationen wissen dies nicht
und machen nun Probleme.
Die nun zweite serielle Schnittstelle auch als "Mini UART" bezeichnet liegt nun am seriellen Port:
/dev/ttyS0 . Der Mini UART kalkuliert sein BIT Timing über die CPU Core Frequenz und wenn die CPU
eine hohe Rechenauslastung hat, kann dies einen negativen Einfluss auf die serielle Kommunikation an
diesem Anschluss haben. Dies ist wahrlich nicht gut.
Um diese Problematik zu ungehen, setzten viele Anwender die Core Frequenz (meist auf 250MHz)
herab, damit die serielle Schnittstelle wieder stabil läuft. Dies führt logischer Weise zu einem leichten
Leistungsverlust, welchen man allerdings meist nicht bemerkt. Ich beschreibe später wie man das macht.
Wie dem auch sei, die Änderungen an der seriellen Schnittstelle haben nicht nur ihre negativen Seiten.
Die Arduino IDE beispielsweise erwartet eine serielle Kommunikation an der /dev/ttyS0. Somit hättest
Du damit keine Arbeit mehr diese dort abzubilden.
Um es nochmal zusammenzufassen. Die aktuelle unveränderte Belegung des Paspberry Pi 3 an der
seriellen Schnittstelle sieht wie folgt aus:
An: /dev/ttyAMA0 liegt die Bluetooth Kommunikation an
An: /dev/ttyS0 liegt die GPIO serielle Schnittstelle an.
(Anmerkung am Rande: AMA0 und S0 ist jeweils eine NUll und kein Buchstabe O)
Aktivieren:
Es gibt noch eine kleine Falle vor der Benutzung der seriellen Schnittstelle. Diese ist von Haus aus noch
deaktiviert (Stand Jessie Mai 2016). Um die Schnittstelle zu aktivieren, kann Du entweder den Weg über
die grafische Oberfläche gehen, oder den Eintrag dierekt in der config.txt Datei vornehmen. Beide Wege
führen zum gleichen Ziel.
Zunächst Aktivierung über die GUI Oberflache: (siehe Bild)
Gehe zu Einstellungen/Raspberry-Pi-Konfiguration und zum Reiter Schnittstelle. Aktiviere dort
Seriell und bestätige mit OK. Danach musst Du das System neu starten.
Aktiverung über config.txt:
1. Öffne die Konsole
2. Öffne die config Datei durch Eingabe von:
3. Bewege dich ganz nach unten und mache dort den Eintrag:
4. Speichere nun die Datei mit der Tastenkombination STRG+O und schließe sie danach mit STRG+X
5. Nun musst Du das System neu starten durch die Eingabe von:
Anschließend ist nun die serielle Schnittstelle aktiviert. Seit Mai 2016 hat sich damit auch automatisch
die Core Frequenz auf 250MHz fixiert. Somit musst Du dann eigentlich nichts mehr beachten. Wenn
Du hierbei auf Nummer sicher gehen möchtest, füge der Datei config.txt noch folgenden manuellen
Eintrag an: Vorgehensweise wie oben bereits genannt:
Somit steht einer stabilen Kommunikation über die serielle Schnittstelle für die meisten Anwendugen nichts
mehr im Wege.
Serielle Aliases:
Auf dem Raspberry Pi 3 heißt der zweite serielle Port /dev/ttyS0 (wie bereits erwähnt) und ist standardgemäß
den GPIO PINs 14 & 15 zugewiesen. Wenn Ihr (besonders ältere) Sofware habt, greift diese standardgemäß
auf den ersten Port zu, welcher hier der /dev/ttyAMA0 ist. Ihr werdet also Probleme bekommen und die
Software wird nicht funktionieren. Natürlich könntet Ihr nun den Software Code überabeiten und jeweils
AMA0 durch S0 ersetzen. Allerdings kann es vielleicht sein, dass Ihr gar keinen Zugriff auf die
Softwareprogrammierung habt und/oder ihr die Software beispielsweise über eine SD-Karte bei dem RasPi 3
und gleichzeitig anderen Modellen verwenden möchtet. Dann habt Ihr hier ein Problem.
Um das Problem zu umschiffen hat die Raspberry Pi Foundation (Mai 2016) den Serial Port Alias eingeführt.
Dadurch erhält das System die serielle Ports serial0 und serial1 (nur beim RasPi3). Der Raspberry Kernel stellt
fest, auf welchem Raspberry Modell ihr Euch befindet und verweist demenstprechend darauf. Der serial0 auf
einem RasPi 3 verweist somit auf die GPIO PINS 14 & 15 und beutzt dabei den Mini-UART, also den
/dev/ttyS0 während bei anderen Modellen auf den Hardware UART /dev/ttyAMA0 verwiesen wird.
Um auf Euerem Raspberry Pi einmal festzustellen worauf der Kernel verweisst, könnt Ihr einmal folgenden
Befehl in die Konsole eingeben:
In dem darauffolgenden Listing (ihr müsst Euch im Listing etwas aufwärts bewegen) werdet Ihr nun hierzu
vermutlich folgende Einträge sehen:
Standard Raspberry PI 3 serielle Port-Aliases
Standard Raspberry PI 2 serielle Port-Aliases
Damit ergibt sich folgendes: Wo auch immer möglich sollte, wenn man den serielle Port ansprechen möchte
auf den serial0 verweisen werden. Dann sollte die Software unter allen bisherigen System laufen und um den
Rest kümmert sich der Raspberry Pi.
Deaktivieren der Konsole:
Wenn Du die serielle Schnittstelle für etwas anderes als die Konsole benutzen möchtest
(ich erwähnte dies Eingangs schon), muss Du natürlich die Konsolenfunktion zwingend abschalten sonst wird
Deine serielle Schnittstelle so für Deine Zwecke nicht funktionieren. Für nicht Raspberry Pi 3 Modelle denke daran,
es ist der /dev/ttyAMA0 der mit dem getty Konsolendienst verbunden ist.
Folgende Befehle muss Du in der Konsole (Terminalfenster) eingeben um den Konsolendienst über die serielle
Schnittstelle zunächst zu stoppen und beim erneuten Hochfahren des Raspberry Pi eine erneute Einbindung zu
verhindern:
sudo systemctl stop serial-getty@ttyAMA0.service
sudo systemctl disable serial-getty@ttyAMA0.service
Bei dem Raspberry Pi 3 ist der Befehl ähnlich, alledings wie oben gelernt auf den /dev/ttyS0 referenziert:
sudo systemctl stop serial-getty@ttyS0.service
sudo systemctl disable serial-getty@ttyS0.service
Zu guter Letzt musst Du auch noch eine Änderung in der cmdline.txt Datei vornehmen, damit die Änderung
Bestand hat. Hierzu öffnest Du den Terminal und wechselst zunächst in Verzeichnis der Datei:
Mache dann am besten gleich eine Sicherheitskopie im gleichen Verzeichnis mit dem Befehl:
Öffnen nun die Datei mit:
Suche nun nach folgendem Eintrag (o.ä.)
console=serial0,115200
und lösche ihn. Bei mir sieht dass dann wie folgt aus:
Vorher:
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes root wait
Nachher:
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes root wait
Speichere nun die Datei mit der Tastenkombination STRG+O und schließe sie danach mit STRG+X
Nun musst Du das System neu starten durch die Eingabe von:
Vertauschen der seriellen Ports auf dem Raspberry Pi 3:
Was wäre, wenn Du Bluetooth gar nicht benötigst und stattdessen dem Raspberry Pi die volle Leistung
des Hardware Serial Ports /dev/ttyAMA0 am GPIO gönnen möchtest? - Also die Belegungen tauschen?
Das kannst Du natürlich machen und zwar über ein Device overlay mit Namen: pi3-miniuart-bt.
Du nutzt dann den Hardware Serial Port für Dich und Bluetooth läuft dann über den mini-UART
/dev/ttyS0. Natürlich ist dann die Performance für Bluetooth nicht mehr so gut, aber vielleicht
reicht es Dir ja aus, solltest Du Bluetooth weiterhin benötigen. Ebenso könntest Du natürlich
Bluetooth komplett abschalten mit einem anderen Device overlay Names: pi3-disable-bt.
In beiden Fällen erhältst Du weitere Informationen darüber in der Readme Datei unter:
/boot/overlays/README.
Hier der Auszug der relevanten Teile aus der README Datei:
Name: pi3-disable-bt
Info: Disable Pi3 Bluetooth and restore UART0/ttyAMA0 over GPIOs 14 & 15
N.B. To disable the systemd service that initialises the modem so it
doesn't use the UART, use 'sudo systemctl disable hciuart'.
Load: dtoverlay=pi3-disable-bt
Params: <None>
Name: pi3-miniuart-bt
Info: Switch Pi3 Bluetooth function to use the mini-UART (ttyS0) and restore
UART0/ttyAMA0 over GPIOs 14 & 15. Note that this may reduce the maximum
usable baudrate.
N.B. It is also necessary to edit /lib/systemd/system/hciuart.service
and replace ttyAMA0 with ttyS0, unless you have a system with udev rules
that create /dev/serial0 and /dev/serial1, in which case use
/dev/serial1 instead because it will always be correct. Furthermore,
you must also set core_freq=250 in config.txt or the miniuart will not
work.
Load: dtoverlay=pi3-miniuart-bt
Params: <None>
Wie dem auch sei. Wenn Du also die Ports vertauschen möchtest, gehst Du wie folgt vor: Öffne
wieder die config.txt Datei über die Konsole mit:
und füge folgenden Befehl am Ende hinzu:
speichere und schließe wieder die config.txt Datei. Um zu sehen, ob alles soweit OK ist reboote
den Raspberry Pi erneut (siehe oben). Wenn Du Dir nun erneut eine Übersicht über die Belegung
anzeigen lässt mit dem Befehl:
dann sollte in Deinem Listing folgende Aussage erscheinen:
Wir vergleichen nun noch einmal mit vorher:
und, wie wir sehen können wurden die Ports nun vertauscht.
Aus der oben genannten Readme erfahren wir allerdings, dass es damit evtl. noch nicht getan ist.
Denn: Sollte ein Programmierer mittlerweile in seinem Programm die Problematik berücksichtigen und die
Ports über serial0 bzw. serial1 ansprechen stimmt dies nun nicht mehr. Du musst also folgende Datei öffnen:
und die darin enthaltenen Bzeichnungen: ttyAMA0 ttyS0 ersetzen. Speichern mit STRG+O, schließen
mit STRG+X. Sollten in der Datei keine ttyAMA0 Bezeichnungen gestanden sein, war/ist vermutlich
Deine Bluetooth Schnittstelle hier gar nicht aktiv gewesen. Dies kannst Du einfach auf der grafischen
Oberfläche sehen ob das Bleutooth Icon in der Systemleiste ausgegraut ist. Dann braucht Du hier natürlich
keine Einträge machen. Solltest Du Änderungen gemacht haben, muss Du natürlich noch lt. README den
CORE Frequency Takt Eintrag in der config.txt Anpassen. Du ruft also die config.txt auf mit:
und fügst folgenden Text an:
Das war's,
viel Spaß und ich hoffe die Belegung der Ports unter dem rasPi3 mit Jessie ist nun etwas verständlicher. :thumbs1: