Проблемы Python Raspberry Pi GPIO и Wiegand

Я очень новичок в Python, я немного учился за последние пару недель. Это то, что мне удалось придумать. Я на седьмом небе от счастья, код работает большую часть времени.

Я использую 2 контакта GPIO для чтения формата wiegand со считывателя на мой Raspberry Pi 2.
Однако это не так. не всегда правильно сканирует. Иногда сканирование зависает при сохранении бита, и мне приходится обманывать ридер во второй раз, чтобы завершить его. Иногда он заканчивается правильно. Иногда он заканчивается номером карты, который совершенно неверен. Обычно обман в третий раз дает новый набор информации, который является правильным. Я возился с версиями PIGPIO для C и Python, чтобы попытаться понять, что я делаю по-другому. Я не могу понять, почему он всегда возвращает правильный набор значений от читателя, используя этот код. У меня недостаточно знаний, чтобы полностью понять, что происходит в коде PIGPIO, поэтому я не уверен, как добиться такой согласованности в моем собственном коде, когда я получаю информацию от читателя.

Действительно ли что-нибудь всплывает немедленно для любого, кто указывает на ошибку в моей логике для чтения информации от читателя?

Помните, я супер новичок, поэтому мне нужно немного подержать руку с этим. Я хочу захватить только 26-битный формат карты с 26-битного устройства чтения карт HID. У меня есть 3 разных брелка/карты формата HID, и я использовал их для тестирования. Проблема возникает при использовании одного и того же брелока снова и снова, и если я переключаюсь между ними, используя один за другим. Иногда он будет сканировать нормально более 10 раз, в других случаях он сразу же выйдет из строя и не будет работать в течение 2 или 3 сканирований.

from time import sleep
import os
import RPi.GPIO as GPIO
import pifacecad as p
GPIO.setmode(GPIO.BOARD)
#GPIO setup
data0=38
data1=40
GPIO.setup(data0,GPIO.IN,pull_up_down=GPIO.PUD_UP)
GPIO.setup(data1,GPIO.IN,pull_up_down=GPIO.PUD_UP)
#Setting up display
cad = p.PiFaceCAD()
cad.lcd.backlight_on()
cad.lcd.clear()
cad.lcd.cursor_off()
cad.lcd.blink_off()
cad.lcd.write("Ready")
#Variables
i=0
dataBits=[]
bitCount=1
fcc="0"
card="0"
Zero="0"
One="1"
hexFilter=[]
hexCard=[]
hexFCC=[]
justRead=0
j=0
k=0
#Main code
while (1):
    #Reading code
    while (bitCount<27):   
        if GPIO.input(data0)==0:
            dataBits.append(Zero)
            print dataBits
            print "Bitcount %d" % bitCount
            bitCount = bitCount+1
            justRead=1
        if GPIO.input(data1)==0:
            dataBits.append(One)
            print dataBits
            print "Bitcount %d" % bitCount
            bitCount = bitCount+1
            justRead=1   
        if justRead ==1:
            if bitCount>26:
    #Transforming our information into usable bits  
    #Rest of the code just handles the information and prints to a screen. 
    #The issue existed before I wrote the rest of the code

Я использую схему деления напряжения с резисторами, чтобы понизить 5 В до 3 В, а мои линии передачи данных и Pi заземлены вместе.

Зависание Wiegand Виганд Неправильно

РЕДАКТИРОВАТЬ: решено здесь

https://raspberrypi.stackexchange.com/questions/42118/wiegand-gpio-read-not-working-all-the-time-works-most-times-but-hangs-on-some-r


person Dregnox    schedule 02.02.2016    source источник
comment
Я не вижу никакого кода, управляющего временем/скоростью. Как избежать двойного чтения символа (0 или 1)?   -  person flo    schedule 03.02.2016
comment
Я не рассматривал это в то время. Ничто из того, что я активно делаю в коде, не контролирует это. Я не уверен, как быстро wiegand понижает и поднимает напряжение. Но в большинстве случаев я получаю правильные значения. Я изучу это и посмотрю, смогу ли я предоставить какую-либо полезную информацию в Интернете.   -  person Dregnox    schedule 04.02.2016


Ответы (1)


В прошлый раз, когда я изучал это, пару лет назад (в 2018 году) выяснилось, что python недостаточно быстр, чтобы напрямую и последовательно читать weigand. В этот раз я поставил Arduino на считыватель RFID, а C-код на Arduino прочитал вейганд и вывел значения в виде ASCII через USB/последовательный порт.

Из того, что я прочитал, должно быть возможно прочитать weigand из raspberry pi с помощью C. Я попал на эту страницу, потому что хотел узнать, создал ли кто-нибудь библиотеку python/C для чтения weigand. Еще не нашел.

РЕДАКТИРОВАТЬ: Хм, pigpio выглядит так, как будто он может справиться с этой задачей:

https://raspberrypi.stackexchange.com/questions/56706/raspberry-pi-as-wiegand-device-output-wiegand-to-receiver

http://abyz.me.uk/rpi/pigpio/examples.html#pdif2_tx_WD

person Steven J Owens    schedule 22.05.2020
comment
Мне удалось получить помощь от создателя Pigpio. На стековой бирже raspberrypi. Ответ есть, и я отредактировал свой вопрос, чтобы отобразить сработавшие изменения. У меня есть несколько устройств, которые уже много лет показывают 99-100% правильных показаний. Код проверки ошибок и времени ожидания действительно старый и грубый, я его больше не использую, поэтому не рекомендую его оставлять. gpio-read-not-working-all-the-time-works-most-times-but-hangs-on-some-r" title="wiegand gpio read не работает все время работает в большинстве случаев, но иногда зависает" >raspberrypi.stackexchange.com/questions/42118/ - person Dregnox; 24.05.2020
comment
Спасибо, я проверю! Возможно, вы захотите поместить эту информацию в свою запись выше. - person Steven J Owens; 26.05.2020