I2C Keyboard

  • Hallo,


    mit vielen guten Tips von motom001 - DANKE!!!!! - konnte ich ein kleines Projekt verwirklichen.
    Ein keyboard für doorpi, das mittels I2C kommunizieren kann.


    Hintergrund bei mir: Ich habe eine billige Folientastatur (sh Foto, kostet bei ali*** ca 80 cent inkl Porto), die ich gerne zum Öffnen der Tür (zusätzlich zu RFID) verwenden möchte. Außerdem habe ich noch einige Relais herumliegen, die allerdings nur mit Arduinos direkt funktionieren (5V) - und in Software kenne ich mich ein wenig besser aus als in Hardware....


    Anbei das keyboard-file, das ich mit der aktuellen doorpi-Version (frisch laut Anleitung auf Jessie installiert) getestet habe.
    Außerdem anbei der arduino-Sketch (getestet mit einem UNO), der sowohl die Tastatur als auch ein an Pin 10 des Arduino angeschlossenes Relay bedient. Der Sketch ist ein wenig roh und könnte sicherlich noch wesentlich verbessert werden (zum Beispiel ist der Pin 10 hardcoded) - aber das lässt sich sicherlich gut erweitern.


    Ich hoffe, die enthaltene Doku ist halbwegs verständlich.


    WICHTIG: Damit das funktioniert, muß das python smbus-package installiert sein! geht am raspi mit:
    sudo apt-get install python-smbus


    motom001_new: Kannst Du das evtl ins repo mit aufnehmen? Würde mich darüber sehr freuen...


    Cheers,


    Pula

  • Für einen Anfänger wie mich:


    • In welchen Pfad muss den die Keyboard Datei "from_i2c.py" kopiert werden?
      -> Lösung: /usr/local/lib/python2.7/dist-packages/doorpi
    • Wie sieht den eine Beispiel doorpi.ini aus um auf eingehende und ausgehende Events zu reagieren?
      -> Ich habe mich mal eingelesen und mir ein Beispiel gebastelt; passt das so?
      [keyboards]
      arduino = i2c


      [arduino_keyboard]
      delete_key = D #key which clears the entered code - default D
      dismisstime = 10 #time in seconds after the entered code is cleared - default 10 ; ich habe zur eingabe eines längeren Codes 10 Sekunden Zeit?
      i2cadress = 0x04 #i2c adress of the arduino, default 4
      port = 1 # local i2c port: 0 = /dev/i2c-0 (port I2C0), 1 = /dev/i2c-1 (port I2C1) - default 1
      register = I2C register (not used in the sketch, default 1)
      chars = 0,1,2,3,4,5,6,7,8,9,A,B,C,D,*,# #chars accepted by keyboard default 0,1,2,3,4,5,6,7,8,9,A,B,C,D,*,# ; Kann ich das auch noch beliebig mit anderen Buchstaben erweitern?
      maxretries = 10 # how often should we retry sending to I2C before giving up? default 10


      [arduino_InputPins]
      L = call:11 # Wenn vom arduino "L" kommt ruft es Nummer "11" an
      Was müsste ich hier machen, wenn ich weitere Aktionen ausführen will? (also nicht nur einen Anruf starten)


      [arduino_OutputPins]
      SEND = ArduinoTerminal #needed
      Hier habe ich meine Probleme, wann kommt "SEND"?
      Hätte Jemand mal ein Beispiel wie ich z.B. zum Arduino ein "A" schicke, wenn jemand die Telefontastenkombi fürs Türöffnen betätigt hat?

    • Zum Arduino-Code:
      Du nutzt:
      Wire.onReceive
      Wire.onRequest
      Wann fragt den der Master (also doorPi) denn den Slave (also den Arduino) an, das der Arduino Daten senden soll?
      Wäre es nicht sinnvoller gewesen einfach dann Daten an den Pi zu senden, wenn die beim Arduino anliegen?

    • Hast du den Arduino direkt verbunden oder mithilfe eines Pegelwandlers?
      -> wohl direkt verbunden; macht das aber keine Probleme? (5V Arduino vs. 3,3V RPi)


    Hoffe das ich mich mit den Fragen nicht zu stark blamiere :D

  • Hallo ich habe das Keyboard eingebunden und einen Arduino programmiert.

    Mit i2cset -y 1 0x04 "Wert" kann ich meine am Arduino angeschlossenen Relais schalten.


    Wenn ich das aus der doorpi.ini raus mache geht es mit (10 = os_execute:/usr/sbin/i2cset -y 1 0x04 0x14)


    Verwende ich die from_I2c.py in der Konfiguration bekomme ich in der Log eine Fehlermeldung:


    UnknownOutputPin: outputpin with name ArduinoTerminal is unknown


    Hier die Auszug aus der doorpi.ini: