Taster blockiert I2C

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Moinsen,

    nach dem ich nun ein wenig gebastelt und mittlerweile mein LCD und den On/Off-Mechanismus von Kernkrank nachgebaut habe, wollte ich per I2C meine beiden MCP23008 anschließen.

    Als mir auffiel, dass ich ja den SCL-Pin belege für den Taster suche ich nun nach einem Workarround.

    Natürlich könnte ich zwei Schalter nehmen. Einen der bei Druck und ausgeschaltetem Rasp, SCL auf GND zieht und damit das Teil startet. Und einen zweiten, der mit einem Pull-Up/Down Widerstand auf einem freien Pin liegt und das Herunterfahren-Script auslöst.

    Diese Lösung finde ich aber nicht schön. Ich würde gerne einen Taster verwenden. Da aber I2C sicher Probleme damit haben wird, wenn ich dauerhaft Logisch 1 oder bei Pull-Down Logisch 0 auf den SCL haue, versuche ich einfach einen anderen Pin mit ins Boot zu holen.

    Ich möchte also beim Drücken des Tasters einen Pin (z.B. 18) auf Logisch 1 oder 0 setzen und gleichzeitig SCL auf GND ziehen. Zwar stört dann das Drücken des Tasters bei eingeschaltetem Rasp kurz I2C weil ich den Pin dann auf GND ziehe, aber ich gehe davon aus, dass ich dann auch herunterfahren möchte und nicht dauerhaft drücke um Spaß zu haben.

    Wie kann ich das realisieren? Bei der jetzigen Variante liegen ständig Logisch 1 auf SCL wenn das Raspberry läuft. Es darf aber kein Signal auf SCL liegen. Es soll nur zu GND gezogen werden um das Rasp einzuschalten. Während es läuft wird der Pin nur für I2C verwendet.

    Geht das vielleicht mit einem Transistor udn wenn ja wie? Bin für Ideen offen.

    EDIT: Gibt es ein Bauteil, dass ich zwischen SCL Pin und Schalter setzen kann, welches nur eine "Verbindung/Fluss" in Richtung GND erlaubt und sobald Strom aus der anderen Richtung diesen "aufhält"? Das würde ja das Problem lösen.

    Greetz,
    Kanasaru

    Einmal editiert, zuletzt von Kanasaru (29. April 2014 um 10:36)


  • Nimm einen anderen Pin und schreib das Script um.

    ich denke das geht nicht so einfach, der Trick vom Andreas war ja das der PI mit diesem Pin kontrolliert runterfährt per Script und das der schlafende PI mit runterziehen am SDA geweckt werden kann ! und nicht bei versehentlichen Druck resettet, was eine Kombi shutdown pin für Script und aufwachen per Reset ja machen würde !

    jeder Resetdruck resettet brutalst den PI auch wenn er gerade dabei war die SD neu zu beschreiben, was im kaputten Filesystem endet oder in verlorene Daten.

    er soll den TO vom Script fragen wie das mit der Nutzbarkeit von I2C ist....

    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)

    Einmal editiert, zuletzt von jar (29. April 2014 um 15:01)


  • Nimm einen anderen Pin und schreib das Script um.

    Hier hat jar recht. Das geht nicht. Deshalb habe ich das Problem so ausführlich beschrieben, weil es nicht durch das ändern des Scriptes geht. Denn dann würde ja immer noch Logisch 1 am SCL Pin anliegen wenn das Rasp läuft. Also etwas Sinnfrei für I2C. Und den Reset-Pin zu nutzen. Naja, ich denke da hat jar schon genug zu gesagt. Meinen Rasp belaste ich lieber anders :bravo2:

    Der Autor(bzw die von ähnlichen engl. Projektseiten) sagt dazu auch, dass dies nur geht wenn I2C nicht genutzt wird, eben wegen dem ständigen Signal auf SCL.

    Aber da du mir letztes Mal so toll mit PullUp/Down geholfen hattest jar, wäre es möglich eine Diode zu nehmen um das Logisch 1 Signal vom PullUp "aufzuhalten" und eben nur die SCL zu GND Verbindung durch Tastendruck zu erlauben?

    Ich bitte die Zeichnung der Schaltung zu entschuldigen :daumendreh2: aber ich denke meine Lösungsidee ist darauf gut zu erkennen. Hab aber noch nie eine Diode genutzt und wenn das so geht, was für eine bräuchte ich?

    taster.png


  • ... wäre es möglich eine Diode zu nehmen um das Logisch 1 Signal vom PullUp "aufzuhalten" und eben nur die SCL zu GND Verbindung durch Tastendruck zu erlauben?

    ....und wenn das so geht, was für eine bräuchte ich?

    ja und ich würde eine BAT42 o.ä. wählen, wenn das funktioniert wäre es toll, aber da stecke ich zu wenig drin wie sich das mit der I2C Nutzbarkeit verhält ?

    probieren ist ja nicht teuer.....

    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)

    Einmal editiert, zuletzt von jar (29. April 2014 um 15:39)

  • Hier hat jar recht. Das geht nicht.

    Kann sein das ich grad auff'em Schlauch stehe, aber warum geht das nicht ?
    Wenn man z.B. die Pins 16 (GPIO23) und 18 (GPIO24) nimmt und das script entsprechend ändert sind SDA/SCL doch frei.
    [Tutorial] Hoch- und runterfahren mittels Taster (incl. Status-LED) hat doch nix mit I²C zu tun, und kann eigentlich jeden GPIO nutzen.
    Oder hast du alle anderen GPIOs schon belegt ?

    Gruß
    Swen

    EDIT - OK, habs gesehn, Pin5 auf GND = reset (bzw. neustart nach shutdown) (macht kein anderer Pin - hm, mal testen)
    Dann halt I²C0 von P5 nutzen ?

    Einmal editiert, zuletzt von Swen (29. April 2014 um 16:28)


  • Da der RPi ja 2 I2C Busse zur Verfügung stellt, könnte man ja auch den noch freien zweiten I2C Bus verwenden.

    Hat er? Auf keiner Pin Belegung konnte ich das sehen und egal welches Tutorial man nimmt, wird imemr der I2C genommen.
    Wenn ein zweiter da wäre, wäre das natürlich wunderbar. Ich müsste nur wissen wo und ob ich dann auch die libs anpassen muss um den zweiten zu nutzen oder ob denen das *****egal ist :geek:


  • Da der RPi ja 2 I2C Busse zur Verfügung stellt, könnte man ja auch den noch freien zweiten I2C Bus verwenden.

    ja bedingt, wenn der 2te so in das OS eingebunden werden kann das er so bequem nutzbar ist ohne den Kernel neu zu bauen, oder wenn der 2te das script mit shutdown und wakeup genauso umsetzt .....

    sonst halte ich persönlich die Diodenvariante für aussichtsreicher.

    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)

  • Kann sein das ich grad auff'em Schlauch stehe, aber warum geht das nicht ?
    Wenn man z.B. die Pins 16 (GPIO23) und 18 (GPIO24) nimmt und das script entsprechend ändert sind SDA/SCL doch frei. [Tutorial] Hoch- und runterfahren mittels Taster (incl. Status-LED) hat doch nix mit I²C zu tun, und kann eigentlich jeden GPIO nutzen.
    Oder hast du alle anderen GPIOs schon belegt ?

    Nein eben nicht. der SCL Pin wird gebraucht um das Rasp anzuschalten. Wenn dud en Pin auf GND ziehst fährt das rasp hoch. Das geht mit keinem Ersatzpin :) (mal von Hardware-Reset abgesehen)


  • Kann sein das ich grad auff'em Schlauch stehe, aber warum geht das nicht ?
    Wenn man z.B. die Pins 16 (GPIO23) und 18 (GPIO24) nimmt und das script entsprechend ändert sind SDA/SCL doch frei.

    soweit ich das verstanden hatte ist der PI ja nicht wirklich aus mit shutdown, sieht man ja auch am Stromverbrauch, er schläft nur und nicht sehr tief und kann deswegen über eine undokumentierte Funktion am SCL geweckt werden, aber eben nur an dieser ! (denn er fragt dann natürlich nicht andere Pins ab)
    oder eben reset oder power Stecker ziehen und wieder stecken.

    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)

    Einmal editiert, zuletzt von jar (29. April 2014 um 16:22)

  • soweit ich das verstanden hatte ist der PI ja nicht wirklich aus mit shutdown, sieht man ja auch am Stromverbrauch, er schläft nur und nicht sehr tief und kann deswegen über eine undokumentierte Funktion am SCL geweckt werden, aber eben nur an dieser ! (denn er fragt dann natürlich nicht andere Pins ab)
    oder eben reset oder power Stecker ziehen und wieder stecken.

    Vollkommen richtig jar. Mit I2C hat der On/off Button an sich ncihts zu tun. Er nutzt aber die Möglichkeit das Rasp zu "wecken" ohne den Stromstecker neustecken zu müssen. Hier kommt SCL ins Spiel. Und weil das nur damit geht, kann ich auch nicht einfach einen anderen Pin nehmen.

  • Ist ein wenig aus dem Blickfeld geraten. Der 2. I²C-Bus ist ohne großen Aufwand nutzbar.

    Der Pins des i2c-0 Bus an P5 (oder wie der auch gerade heißt :cool: ) sind für die Kamera auf alternativen Modus gesetzt.
    Mit HiPi kann man diesen Modus ändern.

    Code
    /usr/local/bin/hipi-i2c e 0 1

    Das geht aber nur bis zum Neustart gut. Also die Zeile in die /etc/rc.local eintragen und i2c-0 steht zur Verfügung.


  • Ist ein wenig aus dem Blickfeld geraten. Der 2. I²C-Bus ist ohne großen Aufwand nutzbar.

    Der Pins des i2c-0 Bus an P5 (oder wie der auch gerade heißt :cool: ) sind für die Kamera auf alternativen Modus gesetzt.
    Mit HiPi kann man diesen Modus ändern.

    Code
    /usr/local/bin/hipi-i2c e 0 1

    Das geht aber nur bis zum Neustart gut. Also die Zeile in die /etc/rc.local eintragen und i2c-0 steht zur Verfügung.

    Vielen Dank für die Information. Das hilft wirklich weiter. Nun muss ich mir überlegen ob ich nun Pins auf den Header löten will oder nicht :s Aber ich werde auf jeden Fall die Dioden Variante mal testen. Die paar Cent sollten drin sein, allein weil es interessant zu wissen wäre.

  • Glaube nicht, dass das klappt. Ich denke da vor allem an die Flussspannung der Diode. Könnte sein, dass dabei kein eindeutiger Pegel rauskommt.

    Was haltet Ihr von einem Taster mit Umschaltkontakt? Der im Ruhezustand offene Kontakt liegt zwischen SCL und GND. Der geschlossene zwischen GND und GPIO x an einem Pullup. Im Ruhezustand interessiert der Pullup nicht, aber ich kann durch Drücken den SCL auf GND ziehen und den RasPi starten. Will ich den RasPi runterfahren, drücke ich den Taster, ein Script reagiert und macht ein Shutdown. Im Script könnte man evtl. auch versehentliches Drücken abfangen. Das einzige was passieren kann ist, dass ich beim Drücken des Knopfes kurz den I²C störe, aber das sollte beim Willen den RasPi herunterzufahren nicht stören.


  • Glaube nicht, dass das klappt. Ich denke da vor allem an die Flussspannung der Diode. Könnte sein, dass dabei kein eindeutiger Pegel rauskommt.

    was soll bei eine Schottkydiode die Flussspannung stören, aber wir lassen uns überraschen


    .......Aber ich werde auf jeden Fall die Dioden Variante mal testen. Die paar Cent sollten drin sein, allein weil es interessant zu wissen wäre.


    Was haltet Ihr von einem Taster mit Umschaltkontakt?....

    klar alles machbar, ich hatte ja schon lange vor diesem Trick mit SCL an eine Steuerelektronik gedacht. Reset ist gesperrt im "Normalbetrieb" und wird nach dem Runterfahren -> Taster am GPIO per Skript erst scharf geschaltet, war aber ins Unreine gedacht, was ist wenn der PI abgeschmiert ist ? OK watchdog aktivieren, aber das wurde mir zu softwarelastig.

    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)

  • Das mit dem Umschalter klappt. Habe das mal auf dem Breadboard aufgebaut. Scheint mir die einfachste Lösung zu sein die Funktion über SCL zu nutzen, ohne dabei den I²C-Bus zu verlieren.
    Der RasPi startet auf Knopfdruck, nach dem Start kann ich den I²C-Bus ganz normal nutzen. Erst, wenn ich den Taster wieder drücke geht am Bus nichts mehr, aber der zweite angeschlossene GPIO0 / BCM17 (Pin11) wird auf high gezogen. Ich hätte ja lieber den GPIO7 / BCM4 (Pin7) benutzt weil die so schön zusammenliegen, aber da hängt der 1wire-Bus drauf.

Jetzt mitmachen!

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