Domanda:
Impossibile leggere l'input sui pin GPIO SDA / SCL
emptyset
2013-01-24 04:41:20 UTC
view on stackexchange narkive permalink

Sono totalmente perplesso nel tentativo di capire come leggere l'input ai pin GPIO SDA / SCL sul Pi.

Contesto: ho un lettore RFID Wiegand 26 da cui vorrei leggere i dati. L'idea è che ottengo i bit dal lettore, li analizzo / li interpreto come Wiegand e da lì posso fare una serie di cose. Per ora, mi occupo solo della risoluzione dei problemi di questa parte, anche se la mia configurazione fa parte di un sistema più grande.

Riferimenti: ho utilizzato Pi Doorman come guida e sto usando il suo programma C che utilizza la libreria WiringPi. Ho seguito le istruzioni per installare la libreria WiringPi e ho compilato wiegand.c con gli interruttori, come mostrato sul sito.

Ci sono due parti che so di dover eseguire il debug, il circuito e il codice.

Il circuito: il circuito è mostrato nell'immagine / allegato qui sotto. Ho un Pi di revisione 1, che ho verificato scrivendo un piccolo programma per chiamare il metodo che restituisce la revisione includendo wiringpi.h . Ho ricevuto un aiuto da alcune persone dell'elettronica, dato che questa non è la mia timoneria. Come puoi vedere, viene utilizzato il Pi Cobbler e colleghiamo la terra dall'alimentatore 12V al lettore a uno dei pin di terra Pi. 5V esce dal lettore su D0 (verde) e D1 (bianco), che abbassiamo a 3,3V, prima di collegare rispettivamente a SDA e SCL. Questo è anche il modo in cui viene descritto nel commento in wiegand.c.

the circuit

Il commento rileva anche che la tensione è tenuta alta su entrambe le linee dati, quindi ho provato con un multimetro e ho visto che vicino a 3,3 V stava entrando nei pin Pi Cobbler per ogni linea. Inoltre, abbiamo collegato le linee a un oscilloscopio e quando faccio scorrere la scheda RFID, come descritto, la tensione scende brevemente a 0V. Questo ci dà fiducia nel fatto che il circuito sia accurato, ma sentiti libero di rivedere l'immagine e fammi sapere se hai qualche suggerimento, soprattutto se hai ottenuto che funzioni correttamente.

Il codice: il programma wiegand.c sembra essere scritto bene. Sono fondamentalmente due thread che trattengono il waitForInterrupt su ciascuna riga di dati, indefinitamente, finché i bit non vengono letti. Viene attivato un contatore, che più o meno cerca di raccogliere tutti i bit possibili da un impulso.

Ho compilato il codice secondo le istruzioni di Pi Doorman e l'ho eseguito. Mi viene chiesto di utilizzare il codice del sito standard, dico Y e poi premo invio. Quando faccio scorrere la scheda RFID, non viene visualizzato nulla.

Ci sono alcune cose che ho fatto per eseguire il debug del codice, principalmente dichiarazioni di stampa. Non sono andato molto lontano, tranne per confermare che il codice dovrebbe funzionare nel modo in cui è scritto. Come ho detto sopra, ho scaricato il sorgente per la libreria WiringPi e ho ispezionato i metodi per vedere cosa stava succedendo dietro le quinte, e ho verificato di avere un Pi di revisione 1 con un piccolo programma per escluderlo. Inoltre, nella cartella / sys / class / gpio / sul Pi, sono definiti i link simbolici gpio0 e gpio1 , quindi penso di aver forte evidenza che ho una scheda di revisione 1.

Ho esaminato più da vicino la funzione wiringPiSetupSys che è una delle prime cose chiamate da wiegand.c . C'è un loop qui:

  for (pin = 0; pin < 64; ++ pin) {sprintf (fName, "/ sys / class / gpio / gpio% d / value", perno); sysFds [pin] = open (fName, O_RDWR);}  

Quindi, c'è qualcosa che accade qui. Quando torno a wiegand.c e aggiungo del codice a ogni thread, per stampare il valore di ritorno della funzione waitForInterrupt , è -2 . waitForInterrupt fondamentalmente estrae il valore dall'array del descrittore di file, quindi -2 è in definitiva il valore restituito dalla chiamata open () qui in la funzione di configurazione.

Non so cosa significhi, ma probabilmente è una supposizione sicura che la chiamata di lettura / scrittura open () non sia riuscita, solo perché è convenzione C restituire valori negativi per cose del genere. Quindi, se non riesco ad aprire il pin per la lettura / scrittura, non posso leggere i dati.

Dovrei anche notare: la compilazione e l'esecuzione di wiegand.c è stata completata sotto l'utente root , quindi non credo che si tratti di un problema di autorizzazioni. Inoltre, sto eseguendo wheezy debian su questo Pi, nel caso sia importante.

Quindi, un paio di domande: - Dove vado da qui, in termini di tracciamento cosa significa l'errore o modificare il codice per restringere ulteriormente il campo? - Qualcuno ha utilizzato con successo Raspi e questo software per leggere i dati in questo modo, da un lettore RFID come questo o qualcosa di simile?

Spero di non aver tralasciato nulla, ma fammi sapere se devo fornire alcune informazioni aggiuntive.

Il lettore emette un segnale acustico quando legge una carta ok? O sta a noi farlo accadere? Ho lo stesso lettore che sto cercando di connettere a una scheda Piface ma non fa nulla ...
hai fatto funzionare correttamente? saresti in grado di chiarire il disegno a mano? entrambi i valori di resistenza sono 100ohm? dove si collegano i pin d0 e d1 a questo circuito? :)
Due risposte:
#1
+5
ikku
2013-01-26 20:14:11 UTC
view on stackexchange narkive permalink

Prima di tutto:

Se fossi nei tuoi panni, starei lontano da Wiegand in generale !!!

Perché :

  1. Wiegand è un protocollo per carte magnetiche sviluppato negli anni '80. Non utilizza alcuna forma di segnale di clock o indicazione di velocità, la temporizzazione dei dati viene eseguita in base all'ultimo bit che è stato trasferito + il tempo di ritardo Wiegand. Questo è uno svantaggio ma non ne rende impossibile l'utilizzo. Oltre a ciò ci sono molte implementazioni e modifiche diverse sul protocollo stesso, questo non viene fatto perché è un protocollo così buono.
  2. Wiegand 26, trasferisce un codice a 24 bit + 2 bit di parità, anche il più economico L'implementazione RFID (chip RFID EM4102 125Khz) utilizza un codice a 40 bit in ogni scheda RFID. Il tuo lettore emula Wiegand perché i lettori "veri" per quella roba non esistono più. Significa che invierà i PRIMI 24 bit della scheda RFID e lascerà cadere i restanti 26 bit. Ciò si tradurrà in carte duplicate, perché la maggior parte dei dati non viene nemmeno trasferita! Questo problema è ancora più importante quando si utilizza EPC (96 bit o più), quindi viene trasferita solo una frazione dei dati totali.
  3. La maggior parte (immagino anche tutti!) Dei moderni lettori RFID hanno Wiegand come opzione per essere compatibile con installazioni molto vecchie, è probabile che il tuo lettore supporti anche l'output seriale, per favore fatti un favore e usa qualsiasi altra cosa disponibile tranne Wiegand.

Informazioni sul Hardware:

L'unica cosa che puoi fare è controllare in modo metodico e molto preciso prima ogni parte del tuo hardware. Il fatto che una linea venga momentaneamente trascinata a 0V non significa che la comunicazione stia effettivamente funzionando.

Su un oscilloscopio dovresti vedere un "treno di impulsi" quando controlli i cavi di comunicazione. Quando non vengono inviati dati, sia DATA0 che DATA1 vengono portati al livello di tensione "alto". Quando viene inviato uno 0, il filo DATA0 viene tirato a bassa tensione mentre il filo DATA1 rimane ad alta tensione. Quando viene inviato un 1, il filo DATA1 viene tirato a bassa tensione mentre DATA0 rimane ad alta tensione. Dovresti vederlo su un oscilloscopio, su 5v prima dei convertitori di livello e su 3.3v dopo.

Dovresti tracciare / monitorare questo segnale fino al GPIO collegato sulla scheda RPI, se è costante si può dire che l'hardware funziona in modo stabile. Assicurati anche di utilizzare i pin corretti e il segnale sembra ancora accettabile quando entra nell'RPI. Le breadboard, a causa del modo in cui sono costruite, hanno alcuni effetti indesiderati (principalmente capacità), ma per la velocità media di Wiegand questo non dovrebbe influenzare troppo immagino, ma controllalo comunque.

Dopodiché puoi iniziare a guardare il software. Gli errori (-2) di cui parli indicano che qualcosa non è felice, dovrai controllarli prima di continuare. Sono sicuro che Google o una pagina man possono fornire la risposta a questo. Inoltre, quando i dati arrivano in quei gestori di interrupt dovrebbero attivarsi (immagino circa 26 volte per "swipe"), se ciò non accade, i dati non arrivano ancora. Ma controllando il codice, sembra che dovrebbe essere in grado di funzionare , quindi immagino che per il momento l'hardware non sia ancora in condizioni ottimali.

Puoi anche vedere se questi gestori di interrupt si attivano semplicemente collegando e scollegando manualmente il 3.3v all'input che stai usando, se aggiungi un po 'di printf () al gestore di interrupt, qualcosa dovrebbe essere stampato almeno una volta quando scolleghi il 3.3v da quel pin (il bordo e la caduta sono usati da gpio, presumo che significhi innesco sul fronte di caduta).

E per rispondere alla tua ultima domanda, Sì, io non ho avuto problemi ad usare lettori RFID sull'RPi, ma ho evitato Wiegand dall'inizio!

Spero che questo aiuti ...

Grazie per i suggerimenti! Alla fine è stato l'hardware (segnale debole) come puoi vedere dalla risposta sotto, quindi, se ottengo un lettore migliore, potrei leggere tutti i 40 bit in un programma software simile? Buono a sapersi per un futuro aggiornamento.
È probabile che il tuo attuale lettore possa già inviarti i dati reali (tutti i 40 bit), per i motivi che ho indicato al punto 2 e 3 sotto "Perché".
#2
+1
emptyset
2013-01-29 08:42:19 UTC
view on stackexchange narkive permalink

Quindi, ho ricevuto aiuto da un collega membro di Freeside per collegare il lettore RFID al GPIO di Pi. Non capisco completamente il circuito, ma il succo è che non c'era abbastanza segnale per raggiungere il GPIO del Pi con il circuito nel modo in cui l'avevo cablato. Invece, siamo arrivati ​​a questo (vedi sotto).

the circuit diagram

the implemented circuit

Quindi, quando si esegue di nuovo il programma wiegand.c, questa volta abbiamo ricevuto un buon segnale e il programma è stato in grado di decodificare correttamente l'array di bit e generare l'ID del token RFID!



Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...