Aiuto: Hacking di un lettore USB-RFID

Buongiorno a tutti!
Sono nuovo sul forum e spero di trovare qui quello che cerco! :slight_smile:

Qualche giorno fa su YouTube ho trovato questo video:

Mi sono subito interessato al progetto dato che a casa avevo lo stesso lettore RFID del video,ed ho deciso di ripetere ciò che ha fatto l'autore del video con il mio Arduino UNO.
Ho smontato il lettore saldato i pin ed ho collegato il pin data ad arduino utilizzando la libreria SoftwareSerial con un banalissimo Sketch.

#include <SoftwareSerial.h>

SoftwareSerial rfid = SoftwareSerial(2,3); //RX, TX

char x;

void setup()
{
Serial.begin(9600);
Serial.println("Seriale OK");

rfid.begin(9600);
Serial.println("RFID OK");
}

void loop()
{
if (rfid.available()>0)
{
x=rfid.read();
Serial.println(x);
}
}

Ma non ho ottenuto quello che cercavo... la risposta di Arduino al passaggio dei tag è questa:

Dove sbaglio? Potete Aiutarmi????

Grazie!

tu ti aspetti che siano lettere leggibili, ma non è detto (dovresti vedere bene a 0:55), comunque stampati i valori in esadecimale:

Serial.println(x, HEX);

Grazie Ho appena provato! Non va nemmeno cosi...

Nel video lui riesce ad avere dati leggibili ma non capisco se li converte in qualche modo...

Non so come fare... Questa è la modifica che ho appena fatto:

#include <SoftwareSerial.h>

SoftwareSerial rfid = SoftwareSerial(2,3); //RX, TX

char x;

void setup()
{
Serial.begin(9600);
Serial.println("Seriale OK");

rfid.begin(9600);
Serial.println("RFID OK");
}

void loop()
{
if (rfid.available()>0)
{
x=rfid.read();
//Serial.println(x);
Serial.println(x, HEX);
}
}

e questa è la risposta:

:roll_eyes: :roll_eyes: :roll_eyes:

...altri suggerimenti???

tanto per cominciare rfid.read(); non ritorna un char (1 byte) ma un int (2 byte).

quindi dichiara x come int e il resto lo lasci così com'è.

Iniziamo ad ottenere dei valori validi, poi mi aspetto che questi valori in corrispondenza della tabella ASCII siano lettere (quindi è giusto il concetto del char, ma qualcosa da qualche parte rompe tutto)

edit: tra l'altro l'uoput è moooolto strano:
dovrebbe esseer (dal reference)
Serial.print(78, HEX) gives "4E"

Ok fatto ora ci sono 4 valori che per me sono comunque strani!
Quando utilizzato normalmente, il lettore rfid collegato a windows con l'usb restituisce il codice del tag con 10 numeri (esempio 0012847567)
Invece quello che si ottiene dalla seriale di Arduino sono solo 4 valori!

Da quello che ho capito ho modificato cosi...giusto?

#include <SoftwareSerial.h>

SoftwareSerial rfid = SoftwareSerial(2,3); //RX, TX

int x;

void setup()
{
Serial.begin(9600);
Serial.println("Seriale OK");

rfid.begin(9600);
Serial.println("RFID OK");
}

void loop()
{
if (rfid.available()>0)
{
x=rfid.read();
Serial.println(x, HEX);
}
}

e questo è l'output:

:cold_sweat:

stai usando un IDE > 1.0 vero?

Si Si!!! Utilizzo la 1.0.1 e Arduino uno rev3

no, arduino IDE è il programma lato PC, non la scheda :slight_smile:

...sicuro anche della velocità della comunicazione serale?

nel video han specificato

A si giuto! Utilizzo la 1.0.1 !!! :sweat_smile:

quindi molto strano, sicuro di esserti collegato al pin dati e non quello ready? in oltre il fatto che i dati sonao solo 4 byte invece che molti di più, può essere che il tuo chip lavori ad un bitrate inferiore (prova un pò quello default)

1 200
1 800
2 400
3 600
4 800
7 200
9 600

Allora ho fatto tutte le prove! Ma niente! Guarda:

Con 1200 e 4800 ottengo questo:

Con 1800, 3600 e 7200 questo:

E con 2400 questo:

Con 9600 ottengo ciò che abbiamo visto fino ad ora nei post precedenti...
:~ :~ :~

ma invece col sui driver normale funziona?

puoi fare così, lascia perdere la serial per un momento e leggi le durate grezze dei segnali low e high, poi confrontale con i messaggi che ti aspetti, in particolare con la durata di un baud via seriale

pitusso:
...sicuro anche della velocità della comunicazione serale?

Quoto.
Se non comunichi alla stessa velocità ottieni caratteri senza senso.

Collegato al computer tramite usb funziona perfettamente e non necessita di driver. Infatti simula una tastiera virtuale e "scrive" 10 numeri che corrispondono al numero del tag che ci si passa sopra.

Per il resto non ho capoto bene! :roll_eyes:
Cosa dovrei fare? :astonished:

Proviamo cosi... :cold_sweat:
Mi sono riscritto tutto il codice del video, eccolo:

http://goo.gl/VV4jk

è per un µC ATtiny2313 e un display 2X8 Digit LCD.
Sarebbe possibile convertirlo per Arduino???
Anche escludendo il display e inviare i dati al serial monitor cosi è piu facile!

Please help me! :~

uart_getc() corrisponde a Serial.read() (però DEVE ritornare un valore, quindi prima fai un loop finchè non c'è un available o il valore letto è != -1)

counter_ms corrisponde a millis(). Il resto resta uguale tranne le inizializzazione della UART (la seriale) e del counter_ms (la millis() si autosetta

Ho trovato qualcosa!!!
http://thetransistor.com/2011/10/hacking-cheap-rfid-readers/
Sembrava che poteva risolvere i miei problemi!
Invece non è stato cosi... Dove sbaglio?
La scheda che usa lui è molto simile alla mia! E credo che ha gli stessi componenti e le stesse uscite!

Ho provato ad utilizzare il suo Sketch ma il risultato è una pagina bianca!

// Ebay RFID decoder by Aaron Christiansen

// NOTE: this uses the NewSoftwareSerial beta 11
// by Mikal Hart, available here:
// NewSoftSerial 11 (beta) | Arduiniana
#include <SoftwareSerial.h>

SoftwareSerial rfid(3, 4);

void setup(){
rfid.begin(9600);
Serial.begin(9600);
}

void loop(){

if(rfid.available()){
Serial.println(readRFID());
}
}

String readRFID(){

String out = "";
int temp = 0;
unsigned long timer = millis() + 1000;
// using a timer to prevent a possible hang
while(out.length() < 10 && timer > millis()){

if(rfid.available()){

temp = rfid.read() - 29;

if(temp > -1 && temp < 11){
temp = (temp == 10)? 0 : temp;
out += temp;
}
}
}
// clearing out the unused extra bytes
rfid.flush();
return out;
}

ho provato a mettere la visualizzazione dei dati prima di String readRFID() ma ottengo quello che ottenevo all' inizio numeri senza senso divisi su 4 righe!!! Sembra che fa 4 letture!!! Perche?

Aiuto! :cold_sweat:

devi analizzare i segnali grezzi che escono da quella scheda e vedere s sono dati Seriali validi.

Tentare di usare altri skecth basati sulla serial è un fallimento a priori, salvo botte di cu*o