progetto sistema di controllo di accessi tramite tessera sanitaria

Salve a tutti,
sono profano del mestiere ma ho ben chiaro quello che vorrei fare.
vorrei realizzare come da titolo un sistema di controllo accessi per minori che una volta riscontrato la maggiore età attivarà un motore passo passo , tra i tanti progetti nella rete sono riuscito a fare un po’ di passi copiando qua e la gli sketch.
per la realizzazione ho acquistato:

N 1 arduino uno rev3
N 1 USB Host arduino shield
N 1 Lettore di tessere magnetiche
N 1 motore passo passo

questo è quanto sono riuscito a programmare oltre non riesco, chiedo gentilmente a chiunque voglia aiutarmi nel progetto la compilazione corretta per il giusto funzionamento.
grazie anticipatamante a tutti

#include <DS1307RTC.h>
#include <SPI.h>
#include <Max3421e.h>
#include <Max3421e_constants.h>
#include <Usb.h>

/*
Data taken from configuration descriptor.
/
#define KBD_ADDR 1
#define KBD_EP 1
#define EP_MAXPKTSIZE 8
#define EP_POLL 0x0a
/

Endpoint record structure.
/
EP_RECORD ep_record[2];
#define LINEFEED 10
#define RETURNCH 13
#define ENDTXTFILE 26
/

0 nessun debug;
1 debug normale;

1 per avere debug dettagliato.
/
#define DEBUG 1
MAX3421E Max;
USB Usb;
String idutn="";
void setup()
{
Serial.begin(9600);
Serial.println(“Controllo accesso”);
/

Setto l’uscita digitale “ctcPin” come OUTPUT.
/
if(DEBUG>1) Serial.println(“connesso”);
/

Start USB Host controller.
*/
Max.powerOn();
if(DEBUG) Serial.println(“Sistema attivato e pronto per la lettura di schede”);
delay(1000);
}

void loop()
{
/*
If there are incoming bytes available
from the server, read them and print them.
/
String row="";
String testo="";
String code="";
/**/
if(DEBUG>1) Serial.println(“Inizio loop”);
Max.Task();
if(DEBUG>1) Serial.println(“Max Task”);
Usb.Task();
if(DEBUG>1) Serial.println(“Usb Task”);
if(Usb.getUsbTaskState() == USB_STATE_CONFIGURING )
{
/

Wait for addressing state.
/
if(DEBUG>1) Serial.println(“init”);
crdrdr_init();
Usb.setUsbTaskState( USB_STATE_RUNNING );
}
if(Usb.getUsbTaskState() == USB_STATE_RUNNING )
{
/

Poll the card reader.
*/
if(DEBUG>1) Serial.println(“poll”);
code=crdrdr_poll();
if(DEBUG>1) Serial.println(“exit poll”);
}
if(code.length()==8)
{
if(DEBUG) Serial.println(“Connessione al server.”);

{

}

{
if(DEBUG>1) Serial.print(“S:”);
if(DEBUG>1) Serial.println(row);
if(DEBUG) Serial.println(“ACCESSO NEGATO!”);
}

Serial.flush();
if(DEBUG>1) Serial.println(“END”);
while(1); //stop
}
} /* loop */

String row="";

String netgets()
{
String s="";
char ch=0;
int i=0;
/**/
while(1)
{

if(ch==RETURNCH)
{

return(s);
}
if(ch!=-1) s+=ch;
}
return(s);
} /* netgets /
void crdrdr_init(void)
/

Initialize card reader.
/
{
byte rcode = 0; //return code
/

Initialize data structures;
Copy endpoint 0 parameters.
*/
ep_record[ 0 ] = ( Usb.getDevTableEntry( 0,0 ));
ep_record[ 1 ].MaxPktSize = EP_MAXPKTSIZE;
ep_record[ 1 ].Interval = EP_POLL;
ep_record[ 1 ].sndToggle = bmSNDTOG0;
ep_record[ 1 ].rcvToggle = bmRCVTOG0;
/

Plug endpoint parameters to devtable.
/
Usb.setDevTableEntry( 1, ep_record );
/

Configure device.
/
rcode = Usb.setConf( KBD_ADDR, 0, 1 );
if(rcode)
{
if(DEBUG) Serial.print(“Error attempting to configure card reader.Return code:”);
if(DEBUG) Serial.println( rcode, HEX );
while(1); //stop
}
/

Set boot protocol.
*/
rcode = Usb.setProto( KBD_ADDR, 0, 0, 0 );
if(rcode)
{
if(DEBUG) Serial.print(“Error attempting to configure boot protocol.Return code:”);
if(DEBUG) Serial.println( rcode, HEX );

while(1); //stop
}
} /* crdrdr_init /
int readCardReader(void)
{
int val=0;
byte rcode=0; //return code
char buf[8]={0};
while(buf[2]==0) rcode=Usb.inTransfer(KBD_ADDR,KBD_EP,8,buf);
if(rcode!=0)
{
return -1;
}
val=(int)buf[2]-29;
if(val==10) val=0;
if(DEBUG>1) Serial.println(val);
return(val);
} /
readCardReader /
String crdrdr_poll(void)
/

Poll card reader and print result.
/
{
int digit=readCardReader();
if(DEBUG>1) Serial.println(".poll inizia switch");
switch(digit)
{
case 22:
if(DEBUG>1) Serial.println(“Inizio lettura codice traccia 2”);
idutn=readCardReader();
idutn+=readCardReader();
idutn+=readCardReader();
/

Controlla che siamo in presenza di un prefisso valido di tre cifre.
*/
if(idutn!=“204”)
{
if(DEBUG>1) Serial.println(".poll errore 1"); return("-ERR1");
}
idutn+=readCardReader();
idutn+=readCardReader();
idutn+=readCardReader();
idutn+=readCardReader();
idutn+=readCardReader();
if(readCardReader()==27)
{
return(idutn);
}
else
{
if(DEBUG>1) Serial.println(".poll errore 2 “);
return(”-ERR2");
}
break;
default:
if(DEBUG>1) Serial.println(".poll default");
return(“0”);
}

/*
Start USB Host controller.
*/
Max.powerOn();
if(DEBUG) Serial.println(“Sistema attivato e pronto per la lettura di schede”);
delay(1000);
}

String testo="";
String code="";

private Sub AssisititoCodiceFIscale_AfterUpdato ()
Dim anno As Integer
Dim Mese As Integer
Dim giorno As Integer
Dim DataNascita As Date

anno = Mid"$"(AssisititoCodiceFIscale, 7, 2)
If anno > Year(Format(Now(),“dd/mm/yy”)) Then
anno = anno - 100
MsgBox “anno STRANO…”
end If
Mese = retMese(Mid"$"(AssisititoCodiceFIscale, 9, 1))
giorno = Mid"$"(AssisititoCodiceFIscale, 10, 2)
If giorno > 31 Then
giorno = giorno - 40
MsgBox “FEMMINA”
end If
DataNascita = DateSerial(anno, Mese, giorno)
Me!AssisititoEta = "Anni: " & Age(DataNascita)
end Sub
If IsNull(varBirthdate) then Age = 0: Exit Function
varAge = DateDiff(“yyyy”, varBirthDate, Now)
If Date < DateSerial(Year(Now), Month(varBirthDate), _
Day(varBirthDate)) Then
varAge = varAge - 1
end If
Age = CInt(varAge)
end Function
int motorPins = {8, 9, 10, 11};
int count = 0;
int count2 = 0;
int delayTime = 500;
int val = 0;

void setup() {
for (count = 0; count < 4; count++) {
pinMode(motorPins[count], OUTPUT);
}
}

void moveForward() {
if ((count2 == 0) || (count2 == 1)) {
count2 = 16;

}
}

che problema hai esattamente? se non riesci a leggere la tessera, sicuro che la frequenza sia la stessa della tessera sanitaria?

Ciao

a quanto mi pare di capire stai usando un lettore smartcard USB connesso all'USB host shield di arduino, corretto? Non conosco il protocollo con cui si interagisce con tale lettore, sempre dal codice forse lo stai usando come se fosse una tastiera (KBD) usb?

Se colleghi il lettore al PC come viene visto? Hai qualche programma di esempio lato PC per leggere il CF dalla tessera?

questo è interessante!

tempo fà tentai di capire come funzionassero le tessere sanitarie o quanto meno le tessere con chip. volevo implementare una sorta di "Tessera punti" per il mio negozio, ma non riuscii a comprendere come leggere e scrivere i dati!

ciao

per il tuo scopo normalmente si scelgono tessere più semplici, es. quelle che contengono una EEPROM a cui accedi via i2c. Per evitare che il cliente possa in qualche modo "alterarla" si sceglie di salvare sulla tessera (o comprarne di già fatte così) un semplice seriale e di tenere un DB con l'associazione seriale->punti

per il tuo scopo normalmente si scelgono tessere più semplici, es. quelle che contengono una EEPROM a cui accedi via i2c.

a me piace di più utilizzare RFID 125 khz, con tag readonly. Il concetto rimane poi il medesimo: l'id viene associato ai dati su un db.

Ciao, prima di tutto bisogna capire che tessera sanitaria è, chi risiede in Lombardia ha delle tessere basate su chip Simens, e per leggerle deve installare su pc le crypto api i driver del lettore, non penso che per ora qualcuno abbia implementato le crypto api per le tessere Simens su arduino, per cui attualmente la tessera non si può leggere.

Alberto

Alberto

mi sembra però che anche la tessera sanitaria della lombardia aderisca allo standard nazionale, ampliandolo come dici tu con anche un chip criptografico accedibile via contatti chip. la banda magnetica comunque presente dovrebbe avere memorizzato il CF con lo standard nazionale... a te non risulta?

Oops non avevo letto "magnetiche" effettivamente c'è sia la banda magnetica che il codice a barre!

Alberto

mi ha scritto che via pc funziona tutto, è l'arduino ch enon riceve i dati. da quanto ho capito ha il PC che fa da ponte tra arduino e lettore di tessere (ma forse ho capito male visto che cita la host shiled). Io credo che se usa la host shield deve scrivere il driver e upparlo sul chip della host shield (operazione complessa), mille vote più facile prendere un cavolo di lettore schede con interfaccia uars o usart ttl o RS232

allora mi spiego meglio io ho utilizzato arduino uno poi ho aggiunto rtc clock per il match del calcolo della tessera e poi ho aggiunto l’usb host shield dove ho collegato il mio lettore.
Ora inserendo lo sketch qui sotto, il lettore si attiva con led verde, passando la tessera si spegne e si accende come se leggesse la tessera, pero non avendo nessun display non vedo cosa legge, presumo che legga.
SKETCH PER USB HOST SHIELD
#include <SPI.h>
#include <Max3421e.h>
#include <Max3421e_constants.h>
#include <Usb.h>

/*
Data taken from configuration descriptor.
/
#define KBD_ADDR 1
#define KBD_EP 1
#define EP_MAXPKTSIZE 8
#define EP_POLL 0x0a
/

Endpoint record structure.
/
EP_RECORD ep_record[2];
#define LINEFEED 10
#define RETURNCH 13
#define ENDTXTFILE 26
/

0 nessun debug;
1 debug normale;

1 per avere debug dettagliato.
/
#define DEBUG 1
MAX3421E Max;
USB Usb;
String idutn="";
void setup()
{
Serial.begin(9600);
Serial.println(“Controllo accesso”);
/

Setto l’uscita digitale “ctcPin” come OUTPUT.
/
if(DEBUG>1) Serial.println(“connesso”);
/

Start USB Host controller.
*/
Max.powerOn();
if(DEBUG) Serial.println(“Sistema attivato e pronto per la lettura di schede”);
delay(1000);
}

void loop()
{
/*
If there are incoming bytes available
from the server, read them and print them.
/
String row="";
String testo="";
String code="";
/**/
if(DEBUG>1) Serial.println(“Inizio loop”);
Max.Task();
if(DEBUG>1) Serial.println(“Max Task”);
Usb.Task();
if(DEBUG>1) Serial.println(“Usb Task”);
if(Usb.getUsbTaskState() == USB_STATE_CONFIGURING )
{
/

Wait for addressing state.
/
if(DEBUG>1) Serial.println(“init”);
crdrdr_init();
Usb.setUsbTaskState( USB_STATE_RUNNING );
}
if(Usb.getUsbTaskState() == USB_STATE_RUNNING )
{
/

Poll the card reader.
*/
if(DEBUG>1) Serial.println(“poll”);
code=crdrdr_poll();
if(DEBUG>1) Serial.println(“exit poll”);
}
if(code.length()==8)
{
if(DEBUG) Serial.println(“Connessione al server.”);

{

}

{
if(DEBUG>1) Serial.print(“S:”);
if(DEBUG>1) Serial.println(row);
if(DEBUG) Serial.println(“ACCESSO NEGATO!”);
}

Serial.flush();
if(DEBUG>1) Serial.println(“END”);
while(1); //stop
}
} /* loop */

String row="";

String netgets()
{
String s="";
char ch=0;
int i=0;
/**/
while(1)
{

if(ch==RETURNCH)
{

return(s);
}
if(ch!=-1) s+=ch;
}
return(s);
} /* netgets /
void crdrdr_init(void)
/

Initialize card reader.
/
{
byte rcode = 0; //return code
/

Initialize data structures;
Copy endpoint 0 parameters.
*/
ep_record[ 0 ] = ( Usb.getDevTableEntry( 0,0 ));
ep_record[ 1 ].MaxPktSize = EP_MAXPKTSIZE;
ep_record[ 1 ].Interval = EP_POLL;
ep_record[ 1 ].sndToggle = bmSNDTOG0;
ep_record[ 1 ].rcvToggle = bmRCVTOG0;
/

Plug endpoint parameters to devtable.
/
Usb.setDevTableEntry( 1, ep_record );
/

Configure device.
/
rcode = Usb.setConf( KBD_ADDR, 0, 1 );
if(rcode)
{
if(DEBUG) Serial.print(“Error attempting to configure card reader.Return code:”);
if(DEBUG) Serial.println( rcode, HEX );
while(1); //stop
}
/

Set boot protocol.
*/
rcode = Usb.setProto( KBD_ADDR, 0, 0, 0 );
if(rcode)
{
if(DEBUG) Serial.print(“Error attempting to configure boot protocol.Return code:”);
if(DEBUG) Serial.println( rcode, HEX );

while(1); //stop
}
} /* crdrdr_init /
int readCardReader(void)
{
int val=0;
byte rcode=0; //return code
char buf[8]={0};
while(buf[2]==0) rcode=Usb.inTransfer(KBD_ADDR,KBD_EP,8,buf);
if(rcode!=0)
{
return -1;
}
val=(int)buf[2]-29;
if(val==10) val=0;
if(DEBUG>1) Serial.println(val);
return(val);
} /
readCardReader /
String crdrdr_poll(void)
/

Poll card reader and print result.
/
{
int digit=readCardReader();
if(DEBUG>1) Serial.println(".poll inizia switch");
switch(digit)
{
case 22:
if(DEBUG>1) Serial.println(“Inizio lettura codice traccia 2”);
idutn=readCardReader();
idutn+=readCardReader();
idutn+=readCardReader();
/

Controlla che siamo in presenza di un prefisso valido di tre cifre.
*/
if(idutn!=“204”)
{
if(DEBUG>1) Serial.println(".poll errore 1"); return("-ERR1");
}
idutn+=readCardReader();
idutn+=readCardReader();
idutn+=readCardReader();
idutn+=readCardReader();
idutn+=readCardReader();
if(readCardReader()==27)
{
return(idutn);
}
else
{
if(DEBUG>1) Serial.println(".poll errore 2 “);
return(”-ERR2");
}
break;
default:
if(DEBUG>1) Serial.println(".poll default");
return(“0”);
}

/*
Start USB Host controller.
*/
Max.powerOn();
if(DEBUG) Serial.println(“Sistema attivato e pronto per la lettura di schede”);
delay(1000);
}

String testo="";
String code="";

Ho aggiunto allo scketch queste righe che dovrebbero consetire all’arduino di fare il match con la tessera sanitaria sulla traccia 2 per poi attivare il motore passo passo
SKETCH MATCH TESSERA
private Sub AssisititoCodiceFIscale_AfterUpdato ()
Dim anno As Integer
Dim Mese As Integer
Dim giorno As Integer
Dim DataNascita As Date

anno = Mid""(AssisititoCodiceFIscale, 7, 2) If anno > Year(Format(Now(),"dd/mm/yy")) Then anno = anno - 100 MsgBox "anno STRANO..." end If Mese = retMese(Mid""(AssisititoCodiceFIscale, 9, 1))
giorno = Mid"$"(AssisititoCodiceFIscale, 10, 2)
If giorno > 31 Then
giorno = giorno - 40
MsgBox “FEMMINA”
end If
DataNascita = DateSerial(anno, Mese, giorno)
Me!AssisititoEta = "Anni: " & Age(DataNascita)
end Sub
If IsNull(varBirthdate) then Age = 0: Exit Function
varAge = DateDiff(“yyyy”, varBirthDate, Now)
If Date < DateSerial(Year(Now), Month(varBirthDate), _
Day(varBirthDate)) Then
varAge = varAge - 1
end If
Age = CInt(varAge)
end Function
int motorPins = {8, 9, 10, 11};
int count = 0;
int count2 = 0;
int delayTime = 500;
int val = 0;

void setup() {
for (count = 0; count < 4; count++) {
pinMode(motorPins[count], OUTPUT);
}
}

void moveForward() {
if ((count2 == 0) || (count2 == 1)) {
count2 = 16;

}
}

lesto: mi ha scritto che via pc funziona tutto, è l'arduino ch enon riceve i dati. da quanto ho capito ha il PC che fa da ponte tra arduino e lettore di tessere (ma forse ho capito male visto che cita la host shiled). Io credo che se usa la host shield deve scrivere il driver e upparlo sul chip della host shield (operazione complessa), mille vote più facile prendere un cavolo di lettore schede con interfaccia uars o usart ttl o RS232

ciao

in realtà lui ha un lettore di tessere magnetiche USB che "simula" una tastiera appunto usb se connesso al PC. L'uso di usb host shield è per gestire la comunicazione arduino -> lettore tessere appunto sfruttando la libreria usb per leggere una tastiera... il mio consiglio non avendo a disposizione l'hw per le prove e quindi per capire cosa non va è che esistono lettori PS/2, dei quali Arduino ha già una comoda libreria (che ti evita anche l'uso dell'usb host shield): http://www.arduino.cc/playground/Main/PS2Keyboard