Konfiguration des GPIO mit Raspbian Jessie und Raspberry Pi 3

  • 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.
    :helpnew:
    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
    :danke_ATDE:



    Übersetzt aus dem Englischen von:  
    Dirgi2
    Original Link:                            
    http://spellfoundry.com/2016/0…an-jessie-including-pi-3/


    [hr]



    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 (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.


    Alternativ: Aktiverung über config.txt:
    1. Öffne die Konsole
    2. Öffne die config Datei durch Eingabe von:

    Code
    1. sudo nano /boot/config.txt


    3. Bewege dich ganz nach unten und mache dort den Eintrag:

    Code
    1. enable_uart=1


    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:

    Code
    1. sudo reboot


    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:

    Code
    1. core_freq=250


    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:

    Code
    1. ls -l /dev


    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 es auch immer möglich sollte, wenn man den seriellen Port ansprechen möchte
    sollte auf den serial0 verwiesen 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:

    Code
    1. sudo systemctl stop serial-getty@ttyAMA0.service
    2. 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:

    Code
    1. sudo systemctl stop serial-getty@ttyS0.service
    2. 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:

    Code
    1. cd /boot


    Mache dann am besten gleich eine Sicherheitskopie im gleichen Verzeichnis mit dem Befehl:

    Code
    1. sudo cp cmdline.txt cmdline.txt.old


    Öffnen nun die Datei mit:

    Code
    1. sudo nano cmdline.txt


    Suche nun nach folgendem Eintrag (o.ä.)
    console=serial0,115200
    und lösche ihn. Bei mir sieht dass dann wie folgt aus:
    Vorher:

    Code
    1. dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes root wait


    Nachher:

    Code
    1. 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:

    Code
    1. sudo reboot



    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:

    Code
    1. sudo nano /boot/config.txt


    und füge folgenden Befehl am Ende hinzu:

    Code
    1. dtoverlay=pi3-miniuart-bt


    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:

    Code
    1. ls -l /dev


    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:

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


    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:

    Code
    1. sudo nano /boot/config.txt


    und fügst folgenden Text an:

    Code
    1. core_freq=250


    Das war's,
    viel Spaß und ich hoffe die Belegung der Ports unter dem rasPi3 mit Jessie ist nun etwas verständlicher. :thumbs1:


    Edited once, last by Dirgi2 ().