PN532 Keyboard

    This site uses cookies. By continuing to browse this site, you are agreeing to our Cookie Policy.

    Da in jedem Forum ein paar Regeln eingehalten werden müssen, möchte ich diese auch vorher hier festlegen und niederschreiben. Die grundsätzliche Netiquette setze ich bei Jedem voraus. Darüber hinaus möchte ich nur spezielle Regeln ansprechen:
    - Unterlasse FullQuote sondern nutze Alternativen wie Inline-Quoting
    -> siehe auch https://de.wikipedia.org/wiki/Fullquote vs. https://de.wikipedia.org/wiki/TOFU#Alternativen_zu_TOFU
    - Unterlasse nichtssagende Antworten wie "Danke" oder "werde ich mal testen" oder ähnliches, sofern Du nicht der Threadersteller bist und einen Lösungsvorschlag angeboten bekommen hast.
    - Vermeide Doppel-Posts (zwei Beiträge von Dir hintereinander) sondern editiere wenn möglich Deine Posts.

    Danke...

    • PN532 Keyboard

      Hallo,

      hatte mal Zeit, ein Keyboard für den PN532 RFID-Reader zu basteln.

      Config:

      Source Code

      1. [keyboards]
      2. nfcreader = pn532
      3. [nfcreader_keyboard]
      4. device = tty:AMA0:pn532
      5. [nfcreader_InputPins]
      6. 98DD1234 = call:**622
      7. [EVENT_OnKeyPressed_nfcreader.98DD1234]
      8. 00 = call:**622
      Anstatt 98DD1234 natürlich die ID der eigenen Tags eintragen ;) (lassen sich mit dem Python-Schnipsel unten auslesen oder mit tagtool, sh. unten).

      Das keyboard benötigt noch libnfc und für python nfcpy.
      Installation in Stichworten:
      Installation libnfc nach learn.adafruit.com/adafruit-nf…pberry-pi/building-libnfc
      (link ändern - ist jetzt auf github)
      vor automake noch ein touch NEWS und touch README (sonst stürzt automake)
      pip installieren, falls nicht schon vorhanden
      dann danach vorgehen:
      nfcpy.org/latest/topics/get-started.html#installation

      Verkabelung:

      PN532 - Raspberry
      VCC - 5V
      GND - GND
      RX - TX (GPIO 14)
      TX - RX (GPIO 15)


      python tagtool.py --device tty:AMA0:pn532 -- funktioniert, tag gefunden

      srccode nach /usr/local/lib/python2.7/dist-packages/nfc kopieren (sudo)


      Zum Testen, ob die Installation von nfcpy erfolgreich war, folgenden code in ein file testnfc.py kopieren:

      Source Code

      1. import nfc
      2. def connected(tag):
      3. try:
      4. hmm = str(tag)
      5. bla, ID = hmm.split('ID=')
      6. print(ID)
      7. return False
      8. except KeyboardInterrupt:
      9. raise
      10. clf = nfc.ContactlessFrontend('tty:AMA0:pn532')
      11. while True:
      12. try:
      13. clf.connect(rdwr={'on-connect': connected})
      14. except KeyboardInterrupt:
      15. raise
      Display All
      dann mit python testnfc.py ausprobieren, ob eine ID ausgegeben wird, wenn man einen Tag an den Reader hält.

      Anschließend das angehängte Keyboard nach /usr/local/lib/python2.7/dist-packages/doorpi/keyboard/ entpacken.

      Was mir an der Sache noch überhaupt nicht gefällt, ist, daß es in der momentanen Version noch nicht möglich ist, zusätzlich zur ID einen User (für Logging, Weitergabe von Statusinfos an Hausautomatisierung etc) zu hinterlegen. Hier muß ich noch einiges an Arbeit reinstecken. Beim I2C-Keyboard habe ich das schon gemacht, aber momentan habe ich nicht sehr viel Zeit dafür...

      Weiters bin ich momentan ein wenig ratlos, warum das nur funktioniert, wenn auch ein OnKeyPressed-Event definiert wird (hier habe ich leider noch immer nicht ganz verstanden, wie diese Dinge in doorpi implementiert sind, ist für mich momentan aber eher Kosmetik)...

      Würde mich freuen, wenn jemand die Muße hat, das zu testen und Feedback zu geben...
      Files
      • from_pn532.zip

        (2.2 kB, downloaded 162 times, last: )
      cheers,
      pula

      don´t panic
    • Ich wollte den NFC Reader via SPI anbinden, scheitere jetzt jedoch daran das SPI (und I²C) in nfcpy nicht implementiert sind.

      Stephen Tiedemann wrote:

      Unfortunately there was still no time left to implement I2C or SPI communication into nfcpy. You'd need to use the UART.
      Ist Dir eine Alternative bekannt, die SPI Unterstützt?

      Ansonsten sollte das problemlos laufen :)
      Images
      • spi_nfc.jpg

        31.12 kB, 482×342, viewed 260 times
      Grüße
      Heiko
    • Hallo,

      nein, ehrlich gesagt ist mir keine Alternative bekannt. Ich hatte den rdm6300, aber nachdem einige im Board von dem pn532 geschrieben haben, bin ich neugierig geworden und hab mir den bestellt.

      Hast Du einen besonderen Grund, warum Du den unbedingt per SPI anbinden möchtest?
      cheers,
      pula

      don´t panic
    • Genau, wegen der etwas höheren Geschwindigkeit.

      Die Idee dahinter war auch größere Datenmengen auslesen zu können um für die Zukunft gerüstet zu sein. Ein späterer Umbau auf SPI ist dann aber auch kein Hexenwerk.

      Aktuell nicht machbar, die Grundidee dahinter auslesen des Personalausweises vergleich des gespeicherten Fotos mit dem Videobild und wenn das passt dann Freigabe (sofern berechtigt)
      Grüße
      Heiko
    • pula wrote:

      Verkabelung:

      PN532 - Raspberry
      VCC - 5V
      GND - GND
      RX - TX (GPIO 14)
      TX - RX (GPIO 15)

      srccode nach /usr/local/lib/python2.7/dist-packages/nfc kopieren (sudo)
      ....
      Hi @pula,
      Dem PN532 ist es wahrscheinlich egal ob hier 5V oder 3,3V eingespeist werden, könnte nur ein bisschen weniger Reichweite haben. Das spart den Spannungsteiler oder Level-Shifter.

      Welchen srccode meinst Du denn? Den branch nfcpy? Dann mit dem ganzen Ordner?
      Sorry stehe heute ein bisschen auf dem Schlauch, war ne lange Nacht gestern ;)

      Danke


      --------------------------------------------------------------------------------------------------------------------------------------------

      Ich beantworte mir mal meine (doofe) Frage selbst.
      Klaro meinst Du den kompletten Ordner nfc.

      Aber noch etwas,
      wie beendet man das kleine python script testnfc.py aber so dass das Device dann nicht mehr belegt ist?

      Wenn ich mit Strg - z das script anhalte belegt es immernoch das device. Dann muss ich das device kurz von der Stromzufuhr trennen und einen reboot machen.

      ---------------------------------------------------------------------------------------------------------------------------------------------

      Noch etwas, bei mir gibt es anscheinend ein timing Problem. Wenn ich den Pi reboote und DoorPi möchte starten ist anscheinend der RFID reader noch nicht soweit und DoorPi beendet sich gleich wieder da das keyboard das device nicht findet. Getestet mit Pi3.
      Werde morgen nochmal genauer schauen, vieleicht auch ein Problem wegen meiner 3,3V Einspeisung des PN532.

      Aber ansonsten gute Arbeit pula :thumbsup: :thumbsup: , danke.
      Mit freundlichen Grüßen

      Andreas
    • Nea wrote:


      Wenn ich mit Strg - z das script anhalte belegt es immernoch das device. Dann muss ich das device kurz von der Stromzufuhr trennen und einen reboot machen.
      Hi, öhm ctrl-z?? das suspendet das Skript nur, beendet es aber nicht. Zum Beenden bitte Ctrl-C nehmen ^^

      Zu dem Timing-Problem kann ich leider nichts sagen, bei mir (Pi 2) tritt das nicht auf. Kannst Du hier evtl einen trace schicken oder so? Evtl. könnte ich noch ein entsprechendes wait in das Keyboard einbauen?
      cheers,
      pula

      don´t panic
    • Das ist ja auch nicht schlimm, ist ja nur zum testen ob der tag ausgelesen wird.

      Ich bekomme aber immer mal wieder ein exception weil der resder nicht gefunden wurde.

      Source Code

      1. 2016-05-17 12:41:11,136 [INFO] [nfc.clf] searching for reader on path tty:AMA0:pn532
      2. 2016-05-17 12:41:11,244 [ERROR] [doorpi.main] Exception NameError: [Errno 110] Connection timed out
      3. Traceback (most recent call last):
      4. File "/usr/local/lib/python2.7/dist-packages/doorpi/main.py", line 152, in main_as_application
      5. try: doorpi.DoorPi(parsed_arguments).run()
      6. File "/usr/local/lib/python2.7/dist-packages/doorpi/doorpi.py", line 232, in run
      7. if not self.__prepared: self.prepare(self.__parsed_arguments)
      8. File "/usr/local/lib/python2.7/dist-packages/doorpi/doorpi.py", line 147, in prepare
      9. self.__keyboard = load_keyboard()
      10. File "/usr/local/lib/python2.7/dist-packages/doorpi/keyboard/KeyboardInterface.py", line 20, in load_keyboard
      11. return KeyboardHandler(config_keyboards)
      12. File "/usr/local/lib/python2.7/dist-packages/doorpi/keyboard/KeyboardInterface.py", line 104, in __init__
      13. self.__keyboards[keyboard_name] = load_single_keyboard(keyboard_name)
      14. File "/usr/local/lib/python2.7/dist-packages/doorpi/keyboard/KeyboardInterface.py", line 51, in load_single_keyboard
      15. pressed_on_key_down=pressed_on_key_down
      16. File "/usr/local/lib/python2.7/dist-packages/doorpi/keyboard/from_pn532.py", line 93, in get
      17. def get(**kwargs): return pn532(**kwargs)
      18. File "/usr/local/lib/python2.7/dist-packages/doorpi/keyboard/from_pn532.py", line 134, in __init__
      19. self.__clf = nfc.ContactlessFrontend(self._device) #init nfc-reader
      20. File "/usr/local/lib/python2.7/dist-packages/nfc/clf/__init__.py", line 71, in __init__
      21. if path and not self.open(path):
      22. File "/usr/local/lib/python2.7/dist-packages/nfc/clf/__init__.py", line 145, in open
      23. self.device = device.connect(path)
      24. File "/usr/local/lib/python2.7/dist-packages/nfc/clf/device.py", line 104, in connect
      25. device = driver.init(tty)
      26. File "/usr/local/lib/python2.7/dist-packages/nfc/clf/pn532.py", line 366, in init
      27. if not transport.read(timeout=100) == Chipset.ACK:
      28. File "/usr/local/lib/python2.7/dist-packages/nfc/clf/transport.py", line 134, in read
      29. raise IOError(errno.ETIMEDOUT, os.strerror(errno.ETIMEDOUT))
      30. IOError: [Errno 110] Connection timed out
      31. 2016-05-17 12:41:11,273 [DEBUG] [doorpi.doorpi] destroy doorpi
      Display All
      Ich denke das hier wirklich ein wait Befehl hier Abhilfe schaffen würde. Ich suche mir den Abschnitt mal raus und setze dann den wait Befehl.
      Mit freundlichen Grüßen

      Andreas
    • Also ein sleep bringt hier nichts da es kein timing Problem ist.

      So wie ich das sehe greift hier etwas auf das RFID-Device zu und blockiert dies.

      Source Code

      1. pi@DoorPi:~ $ python /home/pi/libnfc/trunk/examples/tagtool.py --device tty:AMA0:pn532
      2. [nfc.clf] searching for reader on path tty:AMA0:pn532
      3. [main] no contactless reader available

      Erst wenn ich das Device kurz von der Stromzufuhr trenne ist das Device wieder verfügbar.

      Source Code

      1. pi@DoorPi:~ $ python /home/pi/libnfc/trunk/examples/tagtool.py --device tty:AMA0:pn532
      2. [nfc.clf] searching for reader on path tty:AMA0:pn532
      3. [nfc.clf] using PN532v1.6 at /dev/ttyAMA0
      4. ** waiting for a tag **
      Kann es sein dass das nfc keyboard nicht sauber beendet wird wenn DoorPi geschlossen wird?

      --------------------------------------------------------------------------------------------------------------------

      So wie ich das im Datenblatt herauslese gibt es nur einen Hardware reset und kein Software reset. Ansonsten hätte ich das device kurz resettet.

      Da müsstest Du mal bitte schauen pula da das ja leider alles python ist und ich nur Bahnhof verstehe.
      Mit freundlichen Grüßen

      Andreas
    • Ich habe da etwas gefunden was das Problem erklären könnte.

      Internet wrote:

      And I encountered the same issue as you: Accessing the PN532, through I2C, works well but *only* if the debug level 3 is defined.
      If I lower the debug level (to 1) , or switch it off completely, I get the same communication error. (and this drove me crazy !)
      After this error, the PN532 chip seems to be totally 'hanged' (it doesn't answer to I2C requests anymore, not even detected by the 'i2cdetect' tool). The only way to recover is to hard reset it (power it off / on).
      This problem seems related to some bad timings in the libnfc code, which are 'hidden' when trace logs are activated. When trace logs are active the communication with the PN532 is slowed down, which seems to 'fix' the problem.
      As a matter of example I replaced the trace logs with a short delay, and the code is working right again.
      Ich habe jetzt das device an 5V angeschlossen aber das Problem bleibt bestehen.

      Nochmal das Fehlerbild:

      Wenn DoorPi, das erste mal, gestartet wurde funktioniert der reader einwandfrei. Wenn ich DoorPi beende sei es per reboot oder per Kommandozeile und danach DoorPi wieder starte funktioniert der reader nicht mehr und logischerweise starte DoorPi dann auch nicht durch. Der reader funktioniert erst wieder wenn ich diesen kurz Spannungsfrei mache.

      Kann es sein dass das device wegen dem loop im Keyboard nicht mehr funktioniert da dieser loop nicht beendet sondern nur abgebrochen wird wenn man DoorPi beendet? Weißt Du was ich meine?
      Kann man das im script implementieren oder per Event in der doorpi.ini [AfterShutDown] ?
      Mit freundlichen Grüßen

      Andreas
    • Kann mir das in den nächsten Tagen mal ansehen - mir ist ein derartiges Verhalten allerdings nicht aufgefallen bei meinen Tests.
      Ich denke auch nicht, daß der Beitrag unmittelbar damit zu tun hat, denn ich spreche das Ding nicht per I2C sondern per UART an. Bevor ich das implementiert hatte, habe ich irgendwo (hier im Forum?) gelesen, daß der PN532 mit I2C nicht wirklich stabil arbeitet....

      mach bitte mal wenn der reader blockiert ein

      Source Code

      1. ls -la /dev/ttyA*

      dann ein

      Source Code

      1. sudo lsof | grep tty

      und ein

      Source Code

      1. sudo fuser /dev/ttyAMA0


      und poste die Outputs hier. Vielleicht bringt uns das weiter....
      cheers,
      pula

      don´t panic
    • Hi pula,
      danke für Deine Antwort. Hier nun die Ausgabe:

      Source Code

      1. pi@DoorPi:~ $ /home/pi/libnfc/utils/nfc-list
      2. /home/pi/libnfc/utils/.libs/lt-nfc-list uses libnfc 1.7.1
      3. error libnfc.driver.pn532_uart pn53x_check_communication error
      4. lt-nfc-list: ERROR: Unable to open NFC device: pn532_uart:/dev/ttyAMA0
      5. pi@DoorPi:~ $ python /home/pi/libnfc/trunk/examples/tagtool.py --device tty:AMA0 :pn532
      6. [nfc.clf] searching for reader on path tty:AMA0:pn532
      7. [main] no contactless reader available
      8. pi@DoorPi:~ $ ls -la /dev/ttyA*
      9. crw-rw---- 1 root dialout 204, 64 Mai 18 11:20 /dev/ttyAMA0

      Source Code

      1. pi@DoorPi:~ $ ls -la /dev/ttyA*
      2. crw-rw---- 1 root dialout 204, 64 Mai 18 11:20 /dev/ttyAMA0

      Source Code

      1. pi@DoorPi:~ $ sudo lsof | grep tty
      2. lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
      3. Output information may be incomplete.
      4. systemd-l 349 root 6r REG 0,16 4096 2086 /sys/devices/virtual/tty/tty0/active
      5. systemd-l 349 root 13u CHR 4,6 0t0 1046 /dev/tty6
      6. Xorg 694 root 6u CHR 4,7 0t0 1047 /dev/tty7
      7. llvmpipe- 694 725 root 6u CHR 4,7 0t0 1047 /dev/tty7
      8. llvmpipe- 694 726 root 6u CHR 4,7 0t0 1047 /dev/tty7
      9. llvmpipe- 694 727 root 6u CHR 4,7 0t0 1047 /dev/tty7
      10. llvmpipe- 694 728 root 6u CHR 4,7 0t0 1047 /dev/tty7
      11. login 1056 root mem REG 179,2 9520 3292 /lib/arm-linux-gnueabihf/security/pam_securetty.so
      12. login 1056 root 0u CHR 4,1 0t0 1041 /dev/tty1
      13. login 1056 root 1u CHR 4,1 0t0 1041 /dev/tty1
      14. login 1056 root 2u CHR 4,1 0t0 1041 /dev/tty1
      15. bash 1070 pi 0u CHR 4,1 0t0 1041 /dev/tty1
      16. bash 1070 pi 1u CHR 4,1 0t0 1041 /dev/tty1
      17. bash 1070 pi 2u CHR 4,1 0t0 1041 /dev/tty1
      18. bash 1070 pi 255u CHR 4,1 0t0 1041 /dev/tty1
      19. pi@DoorPi:~ $ sudo fuser /dev/ttyAMA0
      20. pi@DoorPi:~ $ python /home/pi/libnfc/trunk/examples/tagtool.py --device tty:AMA0:pn532
      21. [nfc.clf] searching for reader on path tty:AMA0:pn532
      22. [main] no contactless reader available
      Display All

      Ich werde nochmal versuchen den Aufbau aufe einem Pi2 zu machen mit den selben Bedingungen.
      Mit freundlichen Grüßen

      Andreas
    • Welches Board verwendet ihr?

      Ich konnte am RPi3 via SPI auslesen.. Nachdem ich es auf UART umgelötet habe kommt aus dem Teil rein gar nichts heraus. Wenn ich wieder zurück auf SPI löte funktioniert es einwandfrei (Geht auch nicht am RPi2 ...) Vermutlich ist das Board nix..

      UART funktioniert am RPi3
      Images
      • IMG_0281.JPG

        139.97 kB, 800×661, viewed 432 times
      • IMG_0282.JPG

        115.13 kB, 800×800, viewed 246 times
      Grüße
      Heiko
    • @HomeLab
      Hallo Heiko,
      mein Board hat die Farbe Rot und ist von "ELECHOUSE". Diese besitzt auch einen DIP Schalter für die Auswahl UART, I2C und SPI.

      @pula

      Die Info wegen dem instabilen I2C ist von mir das hatte ich mal gelesen. Ich habe aber auch die Passage bzw. Zitat und woher ich das hatte mit reingeschrieben.

      So, ich habe mit einem Pi2 jetzt eine neue Teststellung gebaut mit den gleichen Bedingungen wie vorher mit dem Pi3.
      Also hier funktioniert das Board einwandfrei ebenso Dein Keyboard.

      Nun stellt sich mir hier die Frage warum es beim Pi3 nicht 100%ig geht.

      Werde hier noch ein bisschen mit dem Pi3 und dem PN532 experimentieren.
      Mit freundlichen Grüßen

      Andreas
    • @HomeLab: habe das gleiche Board wie Nea....

      @Nea: Merkwürdig.... HomeLab hat hier doorpi.org/forum/thread/358-rd…ys0/?postID=2497#post2497
      eine Lösung geschrieben, wie UART auf dem RPI3 doch funktioniert - da ich aber keinen 3er habe, kann ich das nicht testen - vielleicht hilft Dir das aber weiter? Er hatte auch das Verhalten, daß ein Reader nur einmal funktioniert hat und dann erst wieder nach reboot...

      HomeLab weiß da garantiert mehr darüber - vorsicht, nicht daß Du Deinen RPI3 grillst....
      cheers,
      pula

      don´t panic