I2C Anbindung

  • Hallo,


    ich hab das im raspi-forum-Thread schon einmal geschrieben, aber dort ist das irgendwie untergegangen.


    Ich möchte neben den coolen features, die doorpi schon bietet, auch eine Matrix-Tastatur anbinden - kostet bei ali unter einem Euro.


    Da der Pi selbst nicht genug Pins hat (wenn man so wie ich auch noch einen RFID-Leser und mehrere Taster angeschlossen hat), habe ich das kurzerhand per Arduino und I2C gelöst.
    Mein Ansatz (da ich mit dem Konzept von doorpi noch nicht so vertraut bin und auch python für mich neu ist):


    Auf dem Raspi läuft parallel zum doorpi ein kleines python-Skript, das die Kommunikation mit dem Arduino übernimmt und mit doorpi über eine einfache File-Schnittstelle kommuniziert (an der config für doorpi muss ich noch feilen, aber nach dem, was ich gelesen habe sollte das funktionieren).


    Da ich nur 5V Relais für den Arduino herumliegen habe und keine Lust hatte, extra zum Elektronik-Shop zu fahren, um mir Sachen zu holen, mit denen ich das Relais am Raspi betreiben kann, habe ich auch das Relais, das dann den Türöffner bedienen soll am Arduino hängen. Das Python-Skript betätigt es, wenn ein bestimmtes File existiert.
    Außerdem wird das Relais von dem Skript betätigt, wenn ein richtiger PIN auf der am Arduino hängenden Tastatur eingegeben wird.
    Ich habe das Skript und den Sketch angehängt - vielleicht kann das mal jemand gebrauchen (und bitte nicht schimpfen, weil mein code stümperhaft ist).


    Nebenbei wäre es toll, wenn I2C ebenfalls (als keyboard?) in doorpi integriert werden könnte - dann würde man sich den Zauber mit eigenem Skript sparen...


    lg


    Pula
    [hr]
    Und hier noch der Sketch (habs leider nicht in einem Posting geschafft, 2 Files hochzuladen)

  • Ganz viele Infos und ich weiß nicht ob ich alles richtig verstanden habe.
    Zum Thema Keypad allgemein - da gibt es auch welche, die mit zwei Pins auskommen:
    http://board.doorpi.org/Thema-…ith_raspberry.html#pid217


    Zum Thema DoorPi <-> Arduino - die Anforderung gab es schon einmal:
    https://github.com/motom001/Do…eyboard/from_usb_plain.py


    Auf Arduino Seite war es der Quellcode:


    Zitat aus der changelog:


    Quelle: http://www.forum-raspberrypi.d…port?pid=168810#pid168810



    Zu Deiner keypad.py (die dringend eine richtige IDE brauch, da Tabs und Space gemischt sind und das bei Python zu Syntax-Fehler führen kann), schau Dir mal diese Datei an:
    https://github.com/motom001/Do…/keyboard/from_rdm6300.py


    Vom Grundgedanken gleich - warte auf bestimmte Zeichenfolge und öffne dann die Tür. Eventuell kannst Du damit "kurzerhand" ein eigenes Keypad schreiben.

  • Hi!


    Danke für die rasche Antwort!


    Naja - ich bastle hier nur mit vim herum, hab nur Linux und so viel hab ich mit python noch nicht gemacht :-(
    Aber danke für den Hinweis - wenn ich wirklich mehr mache, werd ich mich mal umschaun, was es so an IDEs für Linux und Python gibt. Eclipse is ja hier wie mit Kanonen auf Spatzen schießen...


    Wenn ich das richtig verstanden habe, dann ist das keyboard für den arduino einfach eine "einfache" Terminal-Anbindung?


    Ich werde mir das rfid-keyboard genauer ansehen, aber ich kann noch nicht versprechen, daß ich da durchsteige. Richtig programmieren ist bei mir schon eine Weile her und so firm bin ich mit I2C auch nicht (war froh, daß ich das so weit mal hinbekommen habe). Aber eleganter, als mit files zu arbeiten wäre das allemal....



    So richtig spannend ist doorpi meiner Einschätzung auch, wenn man es mit einer Hausautomatisierung (in meinem Fall fhem) koppelt. Ich denke da zb an Dinge wie automatisches Einblenden des Kamera-Bildes ins laufende Fernsehen oder Türöffnen per Fernbedienung (entweder aus fhem oder aus kodi heraus).... spannend, spannend :-)

  • So unterschiedlich sind die Welten - ich kenne mich (zumindest ein wenig) mit Programmierung aus, aber dafür sind FHEM und kodi für mich "böhmische Dörfer"...


    FHEM hab ich mir einmal angesehen und dachte von der Oberfläche: "Willkommen im Jahr 1993"
    Und was der Unterschied zwischen kodi und FHEM ist hab ich bis heute nicht verstanden...


    // EDIT \\


    Hab den Quellcode für den Arduino oben noch ergänzt...

  • Also naja.... kodi ist ein mediaplayer (den ich auch zum Fernsehen einsetze zb) und fhem ist ein Hausautomatisierungs-System, das in perl geschrieben wurde.


    Die Standard-Oberfläche ist vielleicht nicht so jedermanns Sache, aber man kann das mit diversen Mitteln super anpassen.
    Ich steuere zb damit Rolladen, Beleuchtung, Lüfter, Zirkulationspumpe, Multimedia, Fritzbox, Verstärker, Squeezebox-Player (auf einem raspi im Bad), Beschattung, Fenster/Tür Status etc. Ist ziemlich mächtig mittlerweile und das schöne ist, es ist extrem offen für viele, viele verschiedene Systeme (von Homematic über Arduino, mysensors, Beleuchtungs-Protokolle wie Wifilight, Hue und so weiter).
    Ich hab grad umgebaut und hab mir das alles mehr oder weniger selbst gebaut inkl. vollständiger LED-Beleuchtung um unter 2000€ - wenn man so was fertig kauft, ist man in etwa 20.000 € los....
    Und da passt doorpi wunderbar rein - weil man da zb. auch Events absetzen kann. Beispielsweise könnte man bestimmte Beleuchtungen einschalten im Haus, wenn der RFID-Reader einen bestimmten Chip erkennt. Oder eben ein Live-Umschalten des Fernsehers auf das Kamerabild vom doorpi, wenn jemand läutet :-)


    Falls Dich das Thema Hausautomatisierung interessiert, schau mal auf forum.fhem.de - da gibts jede Menge Infos und auch viele hilfsbereite Menschen :-)


    //EDIT \\
    Und ja: ist eine einfache Terminal-Implementation :-)
    [hr]
    Aber noch eine andere Frage:
    Hab grad festgestellt, daß meine kleine python-Routine so den Raspi (Modell A) zu etwa 40% auslastet.
    Wenn ich ein time.sleep(.2) einfüge funktioniert es noch genau so gut (kein Mensch kann so schnell drücken) und lastet das System nicht mehr spürbar aus.
    Da ich die Architektur von doorpi nicht kenne - wenn ich hier ein sleep in das Modul einbauen würde, bremst das doorpi dann aus?
    Muss ich das keyboard dann (außer in der ini) irgendwie speziell einbinden? Oder erkennt doorpi das modul, wenn es im keyboard-dir liegt von selbst?


  • Da ich die Architektur von doorpi nicht kenne - wenn ich hier ein sleep in das Modul einbauen würde, bremst das doorpi dann aus?


    Leider ja - deshalb mit threads arbeiten wie beim rdm6300



    Muss ich das keyboard dann (außer in der ini) irgendwie speziell einbinden? Oder erkennt doorpi das modul, wenn es im keyboard-dir liegt von selbst?


    Du musst nichts spezielles einbinden außer das Keyboard im Dir ablegen - Keyboards werden dynamisch anhand deren Namen nachgeladen, sobald diese in der Config aktiviert werden...

  • Hi,


    hab mal ein wenig angefangen, aber teilweise seh ich den Wald vor lauter Bäumen nicht, hab ich das Gefühl. Hab zb nicht wirklich Ahnung, was die _ immer bedeuten, aber das lässt sich recherchieren.


    Was ich aber nicht verstehe:
    Im Gegensatz zu dem RFID-Reader habe ich keine definierten Start- und End-Chars. Also müsste ich in der Schleife auf die Strings aus der ini prüfen. Kannst Du mir hier bitte weiterhelfen?
    Hab mal ein wenig angefangen, dein Keyboard ein wenig umzuklempnern (sorry, bin wirklich noch kein Python-Profi)....



    Ach ja... beim I2C kommts immer wieder zu errors, daher die sleep(.001) in den excepts


    Cheers,


    Otto

  • Ach so - ja, das ist richtig.
    Ich hab das auch oben in dem code vermerkt. Habe aus den raspbian-repos die Pakete

    Code
    1. python-smbus python3-smbus pypy-smbus-cffi


    nachinstalliert. Ich habe heute keine Zeit mehr, aber ich kann morgen ausprobieren, ob wirklich alle drei notwendig sind (habe sicherheitshalber alles installiert, was python und smbus war)...


    Python selber kann anscheinend ohne diese libs nicht mit I2C kommunizieren...


    lg
    Pula
    [hr]
    Hi,


    OK, habs getestet.

    Code
    1. python-smbus


    reicht aus, damit die Kommunikation funktioniert...
    [hr]
    Was mir aber nicht wirklich weiterhilft...


    kannst du mir bitte kurz sagen, wie ich eine eingabe mit einem eintrag in der ini vergleichen kann?
    ich vermute, es handelt sich um diesen code:

    Code
    1. for input_pin in self._InputPins:
    2. if self._last_received_chars.endswith(input_pin):


    aber werd da nicht ganz schlau... :-(
    müsste den gesamten eingegebenen pin mit einem in der ini hinterlegten vergleichen....