Nutzbare GPIO-Pins

  • Hallo!

    Ich habe kürzlich mein erstes Hardware-Bastelprojekt mit einem Raspberry Pi B+ gestartet und bin zunehmend begeistert von den Möglichkeiten, die die GPIO-Anschlussleiste bietet. Aktuell bastele ich einen MP3-Player für meine Kinder mit verschiedenen Knöpfen, hinter denen sich einzelne Audios oder Playlists verstecken. Nun wüsste ich allzu gern, welche der vielen Pins ich NICHT für GPIO-Ein- bzw. -Ausgaben nutzen kann. Klar, die 3,3-Volt und 5-Volt-Anschlüsse und die Masse-Pins, aber was ist mit den Pins, die nicht nur GPIO 5 etc. heißen, sondern Sonderbezeichnungen haben wie GPIO 14 (TXD0) oder GPIO 8 (SPI_CE0_N)? Welche sind tabu? Sind nur die grünen (http://raspberry.tips/wp-content/upl…odel-B-Plus.png) nutzbar?

    Danke vorab für die Aufklärung.

    Kurt

  • Du kannst beinahe alle GPIO's nutzen. Wie Du bereits selbst festgestellt hast, sind die Pins 1,2,4,9,14,17,20,25,30,34 und 39 keine GPIO's die fallen raus. Die zwei speziellen Pins ID_SD und ID_SC könnte man rein theoretisch auch nutzen, der Programmieraufwand wäre aber recht hoch, es sei denn irgendjemand schreibt ne Bibliothek dafür. Der Rest der Bezeichnungen sind Funktionen, die im Kernel für die Pins vorgesehen sind, wie z.B. UART, I²C oder SPI. Diese GPIOs kannst Du trotzdem alle nutzen, musst nur bei der Programmierung darauf achten, dass Du diese GPIO's mit Deinem Wunschpegel initialisierst, aber das sollte man ja sowieso mit allen GPIO's machen.

  • Es gibt einige GPIO's, die ohne dass Du es willst erst mal mit Ihrer Nebenfunktion angesprochen werden. Vom UART weiß ich das 100%, weil da geprüft wird, ob ein Konsole am anderen Ende hängt. Schleißt Du da z.B. ein Relais an hasst du beim Start erst mal das große Gelicker :s Setzt du die dann aber auf die Funktion out oder in ist alles OK. Kannst ja mal wiringPi installieren. Mit gpio readall zeigt Dir das tool dann die "Pegellandschaft" und die jeweilige Funktion (IN / OUT) an.

  • Hallo,

    wäre es den möglich die Pins ausserhalb des Scripts so zu configurieren das sie beim starten vom Pi als Out verwendet werden?

    Damit ich beim Einschalten des Pi kein Schalten der Ausgänge habe?

    Einmal editiert, zuletzt von Edz (3. November 2014 um 09:45)

  • Wie stellst du dir das vor?

    Du musst schon irgendwo festlegen welche GPIO's du mit welcher Funktionsweise verwenden willst und ob die als IN oder OUT usw gesetzt sein sollen.
    Wenn du das nicht in Deinem Script machen willst - was ich aber nicht verstehen könnte da dann die Übersicht verloren geht - musst du das an einer anderen Stelle machen. Dazu bieten sich mehrere Möglichkeiten an, eben dort wo es Automatisch beim Systemstart ausgeführt werden würde. Siehe dazu Forumsuche nach Autostart

  • Danke für den tipp das hab ich auch gemeint.

    Mir ist klar das ich die Pins definieren muss nur geht's mir darum das sie beim Starten des Pi's eine andere Definition bekommen als zB UART_RXD.

    Ich werde mal weiter im Forum suchen.

    Falls du genau einen Topic im kopf hast würde ich mich freuen wenn du mir den Link schickst.

    Trotzdem nochmal danke

  • Hallo Edz,


    Hallo,

    wäre es den möglich die Pins ausserhalb des Scripts so zu configurieren das sie beim starten vom Pi als Out verwendet werden?

    Damit ich beim Einschalten des Pi kein Schalten der Ausgänge habe?

    wie stellst Du Dir das vor?

    Was heisst für Dich "beim Starten"?

    Der Pi führt beim Hochfahren eines oder mehrere Skripte durch. Da kannst Du nicht mittendrin herumfuhrwerken, und irgendwelche Sache "anders schalten". Ein GPIO-Pin (wenn ih mich recht entsinne ist dies GPIO4) schaltet in kurzen Abständen den Ausgang ein und aus, was ich bei mir über einen Widerstand und LED als Anzeige des Hochfahrens nutze. Danach glimmt die LED schwach. Nachdem vollständigen Herunterfahren leuchtet sie wieder intensiv (was auch als entsprechendes Kennzeichen verwendet werden kann).

    Wenn Du dieses eingestellte Verhalten ändern willst, musst Du mächtig tief ins System eingreifen - d.h. den Quellcode des Kernels Deinen Vorstellungen anpassen und das Sytem neiu compilieren.

    Kannst Du das? Dann mach es einfach.

    Kannst Du das nicht,m dann lass die Finger davon, weil Dein System Dein Alleinstellungsmerkmal hat - keiner kann Dir bei individuellen Problemen irgendwelche Tips geben.

    Dann denke ich, dass in Deinen Fragen ein Widerspruch steckt. Natürlich ist es möglich, die Pins so zu konfigurieren, dass sie beim Starten als Ausgang verwenet werden. Die Frage ist, ob Du "High" oder "Low"-Signale setzt, einmal passiert was am GPIO, das andere Mal nicht. Also Ein-Ausschalten von irgendwas.

    Kein Schalten der Ausgänge hast Du nur dann, wenn das Signal nicht wechselt. Je nach Logik "High" oder "Low" zum Ausschalten.

    Aber wie gesagt, da das Betriebssystem aus irgendeinem Grund irgendetwas "schaltet", wird das seinen Grund haben. Du kannst erst dazwischenfunken, wenn das System hinreichend weit hochgefahren ist. Erst danach haben die GPIOs einen festgelegten Zustand und eine festgelegte Funktion. Davor ist es Sache des Betriebssystems, welche Funktion gerade an welchem Pin eingesetzt wird.

    Beste Grüsse

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.


  • ....Du kannst erst dazwischenfunken, wenn das System hinreichend weit hochgefahren ist. Erst danach haben die GPIOs einen festgelegten Zustand und eine festgelegte Funktion. Davor ist es Sache des Betriebssystems, welche Funktion gerade an welchem Pin eingesetzt wird.

    das ginge per Hardware mit einem Resetcontroller und einem Treiberbaustein der erst dann die GPIO Signale durchlässt wenn der PI hochgefahren ist. Eine Zeit dafür kann ich bei der Vielzahl der Betriebssysteme nicht nennen, schätze mal 1 Minute sollte aber meistens reichen und Resetcontroller auf 1 Minute zu konfigurieren ist nicht so schwer, aber ohne Elektronikkenntnisse gehts auch nicht.

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

  • Ich probiere mal mein Problem etwas genauer zu beschreiben.

    Ich brauche bei meinem Pi 13 Eingänge und 12 Ausgänge.

    Ich hab jetzt ein kleines Script geschrieben was einfach ein Signal weiter leitet d.h. wenn Eingang x=true Ausgang y=true und so weiter.

    Ich habe auf die Ausgänge LED's geschalten damit ich sehe wenn sie True sind.

    Mein Problem ist, e wie Andreas es beschrieben hat, das gewisse Einänge schon beim Hochfahren des Pi's leuchten.

    Dies dürfte nicht sein bei der Anwendung für die ich den Pi brauche.

    Nur zur Info ich benutze das B+ Model und es geht direkt um den Pin 5 (GPIO 4(I2C1_SCL) so ist er laut Internet beschrieben)


    Zitat


    Wenn Du dieses eingestellte Verhalten ändern willst, musst Du mächtig tief ins System eingreifen - d.h. den Quellcode des Kernels Deinen Vorstellungen anpassen und das Sytem neiu compilieren.

    Kannst Du das? Dann mach es einfach.

    Kannst Du das nicht,m dann lass die Finger davon, weil Dein System Dein Alleinstellungsmerkmal hat - keiner kann Dir bei individuellen Problemen irgendwelche Tips geben.


    Das war meine Frage ob ich in der Lage wäre nur diesen einen Pin zu ändern.
    Wenn ich es alleine könnte hätte ich es auch gemacht ohne hier zu fragen.

    Mfg

  • Es gibt kaum eine Möglichkeit, den Zustand der GPIOs beim Start zu ändern. Es ist Architekturbedingt so, dass der Chip schon vor dem Betriebssystem versucht auf bestimmten GPIOs Signale zu finden und zu senden. Wenn müsste man also an die Firmware rangehen und z.B. den UART ganz abschalten, dass sollte eigentlich auch der einzige GPIO sein der Signale ausgibt. Ich habe das selbst nicht getestet, aber schreibe mal auf, welche GPIOs das betrifft.
    Weitaus einfacher dürfte die Nutzung von Portexpandern wie den MCP23017 sein. Die sind wirklich einfach zu beschalten, haben pro Schaltkreis 16 GPIOs laufen über den I²C-Bus, sind kaskadierbar (Hardwäremäßig am Schaltkreis von Dual 000 - 111). Für Dich wichtig, die machen erst was, wenn Du es willst!

  • Vielen Dank für deinen Tipp.

    Das Problem ist ich will sowenig wie möglich mit I²C und so arbeiten damit es da zu keinen Störungen und dadurch zu Fehlern kommen kann.

    Also ich hatte das Problem auch bei den UART Pins deswegen hab ich dort von Ausgang auf Eingang gewechselt.

    Jetzt hab ich das Problem bei Pin5 (I2C1_SCL)
    Da leuchtet beim Hochfahren die LED ganz schwach dennoch ist sie ein.

    Wenn es zu komliziert ist werde ich die Finger davon lassen ich wollte einfach mal Fragen dachte vielleicht geht's etwas einfacher.


    Trotzdem danke für deinen Tipp ich schau mal ob ich da auch noch was hin und her wechseln kann.

  • Hallo Edz,


    Das war meine Frage ob ich in der Lage wäre nur diesen einen Pin zu ändern.
    Wenn ich es alleine könnte hätte ich es auch gemacht ohne hier zu fragen.

    in der Lage bist Du, wenn Du weisst, was Du machen musst. Dazu musst Du ganz tief in die Kernel-Compilierung einsteigen.

    Wenn Du dieses Wissen nicht hast - oder kein Tutorial findest, dass genau das von Dir gewünschte Verhalten erzeugt, dann werden die meisten eigenen Versuche in einem Betriebssystem resultieren, dass entweder nicht bootet - oder instabil läuft.


    Im Rahmen meines aktuellen Projektes Kernel-Compilator habe ich einige interessante Dinge umsetzen können und auch einen gewissen Einblick in die Materie erhalten können - aber das jetzt und hier vermitteln zu wollen, würde jeglichen Rahmen sprengen.

    Ich könnte mir aber vorstellen, eines Tages ein Tutorial im Rahmen meines Icon-Kurses zu erstellen (der Kernel-Compilator ist ja auch in der Programmiersprache Icon geschrieben) und dort beschreiben, was man wie einzustellen hat, um dieses oder jenes Verhalten zu erzeugen.

    In der Zwischenzeit hilft nur der von Jar beschriebene Weg. jar: Du hast aber auch immer wieder ganz heisse Ideen :thumbs1:

    Aber meines Wissens wird nur ein einziger Pin (Modell B) beim Hochfahren als Ausgang geschaltet. Ich kann mir keine Anwendung vorstellen, die durch dieses Verhalten beeinträchtigt wird (ausser alle Ausgänge für Relais / Servomotoren reserviert). Denn dieses Verhalten ist zusammen mit einer LED und einem Wiederstand (300 - 620 Ohm) die beste Status-Anzeige, die ich mir vorstellen kann:
    1. LED blinkt ==> Raspberry Pi fährt hoch
    2. LED leuchtet schwach ==> Raspberry Pi aktiv
    3. LED leuchtet intensiv ==> Raspberry Pi ist heruntergefahren, hängt noch an der Spannungsversorgung
    4. LED aus ==> Raspberry Pi hängt nicht an der Spannungsversorgung

    Wenn Du ein solches Verhalten nicht gebrauchen kannst, dann musst Du schon eine recht spezifische Schaltung einsetzen. :s

    Beste Grüsse

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (10. November 2014 um 09:43)


  • Das Problem ist ich will sowenig wie möglich mit I²C und so arbeiten damit es da zu keinen Störungen und dadurch zu Fehlern kommen kann.

    Ich arbeite sehr oft mit Portextendern, von Störungen kann eigentlich nicht die Rede sein, gerade I²C ist sehr stabil. Mann muss natürlich wissen, dass, wenn man überhaupt Leitungen nimmt, diese wirklich so kurz wie möglich sein sollten.

    Bei mir läuft das über I²C und Portextender bedeutend störungsfreier als direkt über die GPIOs.

  • Ich versteh nur eins nicht.

    Ihr sagts beide das ihr nur einen Pin kennts der immer gesetzt ist als ausgang.

    Ich hab aber mindestens schon 2 und zwar Pin 3 und Pin 5.

    Das sind die I²C Pins.

    Die LED leuchtet immer ganz leicht bis ich das Python script lade.

  • Hallo Edz,

    dann deaktiviere doch I²C, indem Du es über

    Code
    sudo raspi-config

    deaktivierst. Dann kannst Du sauber auschließen, ob der bei Dir festgestellte Ausgang von I²C aktiviert wird.

    Kann ich mir aber nicht so recht vorstellen. DAs wir auch aus den Tiefen des Betriebssystems tammen und kann für Diagnosezwecke herangezogen werden.

    Beste Grüße (mal wieder mit ?, wenn ich nicht mit dem Schweizer PC unterwegs bin)

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.


  • ...In der Zwischenzeit hilft nur der von Jar beschriebene Weg. jar: Du hast aber auch immer wieder ganz heisse Ideen :thumbs1:

    die brauche ich in meinem Job als Ideenfinder und Problemlöser, Beispiel eine LED Anzeige mit 8-Bit Port auslesen um eine Schnittstelle nachzurüsten die fehlt, aus 8 I/O Ports 64 zu machen bidirektional über Analogmultiplexer.


    Das sind die I²C Pins.
    Die LED leuchtet immer ganz leicht bis ich das Python script lade.

    das sind Initialisirungswechsel ggffs in Verbindung mit pullups die low current LEDs schon leuchten lassen können.

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!