Sistema di Accesso con QRcode per Raspberry Pi

Le capacità di elaborazione dati e le librerie a disposizione per Raspberry Pi sono molto ampie e permettono di prototipare un'ampia gamma di progetti. In questo articolo vedremo come impostare il Raspberry per poter leggere "al volo" i QRcode stampati su carta o visualizzati su smartphone per comandare o eseguire lavori. L'utilizzo del QRcode è ultimamente incrementato e permette di gestire anche grandi quantità di informazioni in spazi ristretti come una immagine quadrata. Una camera CSI e un pugno di righe di Python ci apriranno nuovi orizzonti di interfacciamento.

Introduzione

Probabilmente sappiamo tutti che il nome QRcode significa Quick Response Code e che altro non è se un barcode a due dimensioni, forse però non tutti sanno che in un solo crittogramma possono essere contenuti 7.089 caratteri numerici o 4.296 alfanumerici. Nato poco più di una ventina di anni fa per identificare le parti di ricambio nell'industria automobilistica ne esistono oggi di diverse forme e dimensioni (per es. esistono i micro qrcode) e ultimamente si trovano produttori che li personalizzano con loghi e colori. Oggi quasi tutti gli oggetti, monumenti, parti elettroniche e quant'altro dispongono di questo codice per la loro immediata identificazione tramite Smartphone.

Per poter leggere un QRcode lo si deve fotografare (o comunque si deve sottoporre ad uno streaming di dati che verranno trasformati in immagine), analizzarlo poi con un software che lo identifica all'interno dell'immagine, ne legge le varie aree e ne produce il contenuto sotto forma di stringa. Questa stringa può essere formattata in vari modi, dal semplice testo, all'URL di un dominio, al formato Vcard di una rubrica ad un punto geografico, ecc.

Per Raspberry Pi vi sono diverse librerie e diverse soluzioni per poter leggere ed analizzare un QRcode, sia con la camera CSI sia utilizzando una camera USB. E' possibile creare programmi e script oppure eseguire le operazioni di scan da riga di comando. La soluzione che ho studiato è quella che mi ha dato meno problematiche e a mio giudizio più semplice da implementare forse anche a discapito di metodi più potenti e performanti.

La Camera

La camera usata è una PiCamera ver. 2.1. Rilasciata nell'aprile 2016, la seconda versione della PiCamera è la nuova versione di questo accessorio, che è andato a sostituire l'ormai vecchio modello PiCamera v1.3. Resta compatibile con tutti i modelli di Raspberry esistenti. Infatti, il cavo piatto è rimasto invariato, comunque atto ad essere inserito nel connettore dedicato sul lato superiore di tutte le Raspberry.

Questo nuovo modulo monta una fotocamera Sony IMX219 con fotocamera da 8 megapixel, in modo da sostituire il vecchio OmniVision OC5647 con 5 megapixel sul modello precedente. Le dimensioni sono veramente ridotte, 25 mm x 23 mm x 9 mm per un peso di 3 grammi circa.

Ne esiste un modello anche all'infrarosso. Se non l'avete mai usata ne resterete affascinati.

Il Progetto

Per questo piccolo ma utile progetto, oltre ad una scheda embedded Raspberry Pi 2 o 3 con installato il sistema operativo Raspbian aggiornato all'ultima versione (consiglio sempre e comunque la versione 3 della scheda se non avete già una RPi e dovete quindi procurarvela), sono necessari, come detto, una telecamera PiCamera CSI, un modulo relè e la libreria ZBAR. Con la Raspberry Pi 3 avrete una maggior velocità operativa e meno tempi di attesa nel caricamento dei programmi. Inoltre, essa fornisce tante altre innovazioni, come potete osservare in altri articoli inerenti la RPi.

Per prima cosa colleghiamo la camera al Raspberry Pi e attiviamola, se ancora tale operazione non dovesse essere stato fatta in precedenza. Per attivare la camera, quindi, occorre lanciare il programma di configurazione raspi-config oppure si può utilizzare il nuovo configuratore da menù, molto semplice da utilizzare. Le videate che seguono alle figure 1 e 2 sono relative al nuovo desktop Pixel.

 

Figura 1: programma di configurazione

Figura 1: programma di configurazione

Portarsi su Interfacce e abilitare Camera.

Figura 2: abilitazione Interfacce

Figura 2: abilitazione Interfacce

Dopodiché apriamo la finestra di terminale, digitiamo il comando sudo su per evitare di anteporre sudo ad ogni altro comando inoltrato successivamente e installiamo la libreria. In questo modo otterremo i diritti di root per qualsiasi altra operazione. Ovviamente, è importante rammentare che tali super poteri potrebbero essere anche pericolosi, in quanto basterebbe l'invio erroneo di un solo comando, magari per una svista o una sbadataggine) per cancellare definitivamente, e senza possibilità di recupero, tutto il sistema operativo con annesso l'intero file system.

$ apt-get install python-zbar python-qrtools

Ora colleghiamo la scheda relay (vedi figura 3) alla Raspberry. Servono solamente tre fili di connessione: la massa, i 5V e il comando d'impulso (che trovate solitamente indicato come IN o SIG sui moduli relay), in questo progetto ho usato il pin 11 corrispondente alla GPIO17. Io ho usato un semplice modulo da due relay come quelli che si trovano nei kit per Arduino e Raspberry. Ovviamente ho utilizzato uno solo dei due relay.

Figura 3: modulo relay

Figura 3: modulo relay

Se volete usare il relay per comandare un carico come una lampada potrebbe aiutarvi lo schema di cui alla figura 4:

Figura 4: schema relay

Figura 4: schema relay

E per finire il codice.

# Progetto di Accesso con QRcode
# scritto da Brain & Bytes
# per Elettronica Open Source - EOS-Book

import io
import picamera
import hashlib
import zbar
import RPi.GPIO as GPIO

from PIL import Image
from time import sleep

# inizializzo il pin della porta GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(17, GPIO.OUT)
GPIO.output(17, 1)

# Bisogna impostare qui la password
password = "1234567890"

while 1:
    # crea uno stream dati in memoria
    stream = io.BytesIO()

    #  visualizzazione dello streaming della camera
    with picamera.PiCamera() as camera:
        camera.exposure_mode = 'auto'
        camera.preview_fullscreen = False
        # ridimensiono il preview per poter interrompere in caso di problemi
        camera.preview_window = (300, 200, 640, 480)
        camera.start_preview()
        sleep(1)  # aumentare se si vuole inquadrare meglio
        camera.capture(stream, format='jpeg')

    # recupera tutto il flusso per creare l'immagine
    stream.seek(0)
    pil = Image.open(stream)

    # inizializza lo scan dell'immagine
    scanner = zbar.ImageScanner()

    # configura il lettore
    scanner.parse_config('enable')

    pil = pil.convert('L')
    width, height = pil.size
    raw = pil.tostring()

    # wrap dati della immagine
    image = zbar.Image(width, height, 'Y800', raw)

    # cerca un QRcode
    scanner.scan(image)

    # stampa il valore badge e comanda il relay
    # se la password corrisponde ed e' esatta
    for symbol in image:
        if hashlib.sha256(password).hexdigest() == symbol.data:
            GPIO.output(17, 0)
            print 'SHA256 : ', hashlib.sha256(password).hexdigest()
            print symbol.type, ': ', '%s' % symbol.data
            sleep(1)
            GPIO.output(17, 1)
        else:
            print 'QRCODE : non corrisponde alla password'

    # pulisci e cancella
    del(image)

Le parti del codice da sottolineare e focalizzare sono il ciclo infinito, nel quale il programma continua a fotografare l'ambiente inquadrato dalla telecamera e nell'immagine ricavata cerca un QRcode. Se c'è un QRcode e questo è uguale e corrispondente alla password indicata in codifica SHA256, allora verrà eccitato il relay per un eventuale accesso e presenterà a video la stringa crittografata (SHA256) del QRcode stesso (per scopi di debug ma voi ovviamente potete eliminare la visualizzazione o trasformarla in un Log su file, in caso di applicazione definitiva). In questo modo solo chi ha la password potrà entrare.
[...]

ATTENZIONE: quello che hai appena letto è solo un estratto, l'Articolo Tecnico completo è composto da ben 2337 parole ed è riservato agli ABBONATI. Con l'Abbonamento avrai anche accesso a tutti gli altri Articoli Tecnici che potrai leggere in formato PDF per un anno. ABBONATI ORA, è semplice e sicuro.

Scarica subito una copia gratis

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend