Lettore di codici a barre a scopo dimostrativo 
Quello che voglio presentare è un lettore di codice a barre realizzato a scopo dimostrativo come progetto per l'esame di stato.

Descrizione


Il lettore di codici a barre è uno di quelli classici a penna (i più economici e lenti) che devono essere passati sopra il codice da un lato all'altro. La lettura avviene tenendo premuto un pulsante e le barre convertite in segnali elettrici vengono inviate al computer tramite un collegamento USB; il lettore è dotato anche di un LED che segnala l'esito della lettura.

Com'è fatto il codice a barre


Un codice a barre è una sequenza di linee di spessore diverso che codificano un valore. Nel nostro caso le barre hanno solo 2 spessori: le barre strette valgono 0, quelle larghe 1.
Per decodificare le barre si utilizza un sistema di numerazione posizionale pesato, nel nostro caso quello binario. Ciascuna cifra ha un peso che dipende dalla posizione che occupa.
Il valore del codice è dato dalla somma dei valori delle cifre, moltiplicata ciascuna per il suo peso.


Il sistema di comunicazione con il PC


Per realizzare la comunicazione con il computer è stato utilizzato il circuito di una tastiera USB, il che ha reso la realizzazione molto semplice ed economica. Il circuito che ho realizzato non fa altro che "premere" virtualmente un pulsante della tastiera in corrispondenza di una barra, il software interpreta la durata della pressione del tasto come una barra di spessore più o meno grande. Naturalmente per evitare di interferire con altri programmi è consigliabile scegliere un tasto di uso poco comune (nel nostro caso F12).


Il rivelatore


Il rivelatore ha il compito di distinguere il foglio bianco da quello nero e quindi di individuare le barre. E' costituito da una sorgente luminosa (laser) e da un sensore ottico (fotoresistenza).
Il laser che ho utilizzato l'ho preso da una penna alimentata con 3 pile a bottone da 1,5 V e quindi è già dotato di una resistenza di protezione; mi è bastato bloccare il pulsante con una fascetta di plastica.
La cosa più importante è coprire la fotoresistenza e il laser con un tubicino nero che dovrà aderire al codice in fase di lettura per evitare che la luce ambientale possa interferire con il sensore. Una soluzione migliore sarebbe quella di utilizzare una sorgente a infrarossi con relativo filtro.
Bisogna inoltre rendere il fascio di luce molto sottile per aumentare la risoluzione di lettura e consentire l'utilizzo di codici più compatti. Per fare ciò ho posto davanti al fascio laser un lamierino di rame nel quale ho fatto un piccolo foro.


Il circuito


Il circuito ha il compito di distinguere tra barre nere e foglio bianco e simulare di conseguenza la pressione del pulsante scelto sul circuito della tastiera. Questo circuito si compone di due parti:
- un comparatore, che confronta la resistenza del sensore (che varia con l'esposizione alla luce) con una di riferimento;
- un interruttore elettronico (transistor) che apre o chiude i contatti corrispondenti al pulsante scelto.

Il sensore è siglato in figura con R2, mentre la resistenza R1 (visibile in basso nella foto) costituisce insieme ad esso un partitore di tensione. La tensione misurata al centro è inversamente proporzionale alla resistenza di R2 e quindi direttamente proporzionale alla luce riflessa. Il potenziometro VR1 (visibile a destra nella foto) costituisce un altro partitore che genera la tensione di riferimento. La corrente scorrerà dal punto a potenziale maggiore verso il punto a potenziale minore polarizzando a seconda del verso il transistor Q1 (a sinistra nella foto) direttamente o inversamente, mandandolo così in saturazione o in interdizione. I terminali CT+ e CT- vanno collegati ai pin del circuito della tastiera corrispondenti al tasto scelto. La corrente scorrerà attraverso di essi solo quando il laser illumina una parte nera del foglio e la luce non viene riflessa sulla fotoresistenza. Al connettore L+ va collegato il polo positivo del laser, mentre l'altro va a massa; il potenziometro VR2 da 100 ohm consente di regolarne la luminosità. Il laser e il circuito vengono alimentati solo quando viene premuto il pulsante SW1 situato sul lato posteriore della basetta millefori (non visibile nella foto). Nella foto sono visibili alcuni ponticelli che ho inserito in seguito a delle modifiche apportate al circuito, mentre lo schema elettrico è quello finale. L'alimentazione di 5 V DC è prelevata direttamente dalla porta USB.

I pin del circuito USB


Una volta scelto il pulsante che più si preferisce, bisogna individuare i 2 pin del circuito corrispondenti al pulsante della tastiera. Per fare ciò occorre smontare la tastiera e seguire le piste dal pulsante fino ai pin. L'operazione risulta più semplice se si ha a disposizione un tester che permette di identificare le estremità delle piste misurandone la continuità.
Nel mio caso al pulsante F12 corrispondevano i pin siglati R5 e C10. E' molto importante che il pin con la tensione positiva sia collegato al connettore CT+ e quello con la tensione negativa a CT-; per verificare la polarità, collegare il circuito al PC e misurare la tensione dei pin con il tester.
Chiedo scusa per la confusione, purtroppo avevo già montato il circuito quando ho fatto le foto... causa: dopo 5 anni mi è passata la voglia! Scherzo, avevo poco tempo :)

Voglio far notare i connettori: visto che avevo solo quelli femmina ho saldato il filo di rame rigido (quello del doppino telefonico) all'estremità dei fili e li ho inseriti nei fori dei connettori femmina. Come si dice: la necessità aguzza l'ingegno! :D


Il box


Il box per contenere tutto il circuito l'ho realizzato in legno recuperato un po' qua e là ed ho fissato le basette con delle viti, mentre il laser è montato con due fascette che attraversano il fondo del box. Ho coperto poi il fondo con uno strato di compensato sottile per nascondere le fascette e i fori grezzi delle viti. Nel coperchio superiore ho praticato un foro nel quale ho inserito una "fibra ottica" fatta in casa ottenuta scaldando un pezzetto di vetro, che serve per portare all'esterno del box la luce proveniente dai LED della tastiera (indicatore del Bloc Scroll).


Il software
Il software è stato realizzato in Visual Basic 6 (volevo farlo in C++ ma poi ho desistito per mancanza di tempo). La parte principale sono gli eventi KeyDown e KeyUp che determinano l'inizio e la fine di una barra. Le procedure StartBar e EndBar salvano la durata (in millisecondi) di ciascun bit all'interno del vettore "bT()".

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
    If KeyCode = vbKeyF12 Then          'Se la barra è iniziata
        StartBar
    End If
End Sub

Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer)
    If KeyCode = vbKeyF12 Then          'Se la barra è finita
        EndBar
    End If
End Sub

Private Sub StartBar()
    If curBit = -1 Then                 'Se non c'è più spazio
        ShrV bT                         'Crea posto per il nuovo bit
        curBit = 0
    End If
    bT(curBit) = GetTickCount           'Tempo corrente nel bit corrente
    Sh1.FillStyle = vbFSSolid           'Accende il LED
End Sub
 
Private Sub EndBar()
Dim cTime   As Long
    cTime = GetTickCount                'Tempo corrente
    bT(curBit) = cTime - bT(curBit)     'Calcola la durata del bit
    curBit = curBit - 1                 'Va al bit successivo
    lblCnt.Caption = curBit + 1
    Sh1.FillStyle = vbFSTransparent     'Spegne il LED
    lTime = cTime                       'Tempo ultimo segnale
End Sub



La funzione seguente calcola i bit a partire dalla loro durata, prendendo come durata di riferimento la loro durata media. Il valore del codice viene restituito dalla funzione, mentre il parametro "par" passato per riferimento, indica l'esito del controllo di parità.

Public Function ConvertData(v() As Long, par As Boolean) As Long
Dim m   As Long     'Durata media
Dim t   As Long     'Totale
Dim p   As Long     'Conteggio bit
Dim i   As Long
    m = (Minimo(v) + Massimo(v)) / 2    'Calcola la durata media
    For i = LBound(v) To UBound(v)      'Per ogni valore
        If v(i) < m Then                'Se è minore della media
            v(i) = 0                    'Il bit è zero
        Else                            'Altrimenti
            v(i) = 1                    'Il bit è 1
            p = p + 1                   'Incrementa il conteggio
        End If
        t = t + v(i) * 2 ^ i            'Calcola il totale
    Next i
    p = p - v(0)                        'Non contare l'ultimo bit
    par = (v(0) = p Mod 2)              'Controllo parità
    ConvertData = t
End Function



Sono presenti altre funzioni che consentono il funzionamento del programma, inclusa una che consente di accendere il LED del circuito della tastiera per indicare l'esito della lettura, ed un'altra che verifica il collegamento del lettore al PC.
Al termine della pagina inserirò il programma compilato e i sorgenti.

La probabilità di errore


Se il numero di bit letto in modo errato è pari, il controllo di parità risulterà positivo e l'errore non verrà segnalato. Supponendo che la probabilità di leggere in modo errato un bit sia p, la probabilità di sbagliare la lettura di un numero pari non nullo di bit su n bit sarà:


Collegamento con il PC


La prima volta che inserite il lettore nella porta USB, Windows visualizzerà il messaggio "Trovato nuovo hardware" (del resto si tratta di una tastiera USB). Una volta che il lettore è installato, potete lanciare il programma, che mostrerà un messaggio dicendo che il lettore non è stato trovato*. Questo accade perchè il programma controlla l'hardware ID del lettore con quello salvato nella costante "Lettore" dichiarata nel form1:

Private Const Lettore = "VID_04D9&PID_1603&MI_00"

Modificando il valore di questa costante e ricompilando, il programma funzionerà correttamente. Potete trovare l'hardware ID del vostro lettore seguendo questi passi:
1) andate in "Gestione periferiche>Tastiere";
2) collegate il lettore e vedrete che apparirà una nuova voce "Tastiera HID";
3) fate doppio clic sulla voce appena comparsa;
4) andate nella scheda "Dettagli";
5) selezionate la voce "ID hardware" dal menù a scorrimento;
6) l'hardware ID è un codice alfanumerico simile a quello riportato sopra, in genere la seconda voce dell'elenco (senza "HID").

*Nota: anche se non modificate l'hardware ID il programma funzionerà comunque.

Taratura


Per eseguire la taratura collegare il lettore al PC e lanciare il programma. Tenendo il lettore su un foglio bianco mantenere premuto il pulsante e ruotare il potenziometro finchè il LED rosso del programma non si spegne. Poi spostare il lettore su un foglio nero e assicurarsi che il LED si accenda; se il LED non si accende ruotare il potenziometro nel verso opposto. Sarà necessario trovare una posizione tale da far accendere il LED solo quando si passa su una barra nera. Ho tarato il lettore in occasione dell'esame e funziona tuttora senza che abbia dovuto apportare correzioni.

Foto del lettore

(clic per ingrandire)



Allegati


Sorgenti
Binari
Allego inoltre questo programma che consente di stampare in modo semplice codici a barre compatibili con questo lettore e una pagina stampabile di codici per chi non volesse utilizzare il programma suddetto.
Vi ricordo che i file binari sono in formato .rar e non hanno bisogno di installazione, ma è sufficiente estrarli in una cartella e lanciare l'eseguibile.

Spero che vi sia piaciuto, se avete domande, suggerimenti, o critiche da farmi, non esitate!

Commenti

Lorenzo 
Friday, 25 July 2014, 22:57
Ciao, ho letto questo articolo, però non mi è chiara una cosa, hai scritto che la corrente circolerà dal potenziale più alto a quello più basso, e finqui è ok. Ma non capisco le dinamiche del circuito... Per esempio, CT- devo considerarlo 0V?
Poi essendo che i due circuiti hanno le masse collegate, perchè è tutto alimentato dal PC, la corrente non dovrebbe comunque e sempre andare al pin CT-?? Grazie.

Lorenzo 
Friday, 25 July 2014, 23:02
E poi, un altra cosa, dove sta il comparatore di qui parli? Forse intendi dire che il funzionamento si avvicina a quello di un comparatore?

Aggiungi commento
Compilare i campi sottostanti per inserire un commento.









Inserisci formattazione testo: