Contapersone:

A gennaio del 2016, in occasione della Notte bianca dei licei classici, il liceo Zucchi di Monza mi ha chiesto di realizzare un sistema che consentisse di ottenere una stima, mediante conteggio, del numero di visitatori accolti durante l’iniziativa.
Il sistema realizzato allora era costituito da una scheda Arduino Leonardo cui è stato collegato un display LCD 2x8 caratteri, un tasto per l’azzeramento del conteggio e, per il rilevamento del passaggio delle persone, un sensore ottico a sbarramento. Quest’anno, visto il successo che ha avuto l’iniziativa l’anno precedente, mi è stato chiesto di modificare il sistema in modo da rendere il conteggio visibile anche ai visitatori in arrivo attraverso l’uso di un monitor o di un proiettore. Per fare questo ho scelto di riciclare un vecchio computer della scuola non più in uso al quale, da una parte, viene collegato il sistema già esistente e, dall’altra, il monitor o proiettore del caso.
Tutto il sistema è organizzato nel seguente modo: sul computer sono in esecuzione un programma scritto ad hoc e un’istanza di un browser web; il programma richiede, tramite comunicazione seriale, il valore attuale del conteggio al sistema preesistente e, sulla base di questo e un file template, genera in locale una pagina html, il quale viene letto e mostrato a schermo dal browser web. Ho deciso di utilizzare un browser web per la parte di visualizzazione in modo da rendere semplice lo sviluppo della parte “estetica” del contatore: l’aspetto della schermata vista da chi arriva può essere progettato come se si trattasse di una pagina web qualsiasi.

Parte realizzata con Arduino:

Nel modulo di conteggio il numero delle persone è gestito da una variabile a 32 bit senza segno che viene incrementata ogniqualvolta il segnale in arrivo dal sensore ha una transizione dal livello alto a quello basso (questo è dovuto al tipo di segnale in uscita dal sensore). La gestione dell’impulso di conteggio è fatta tramite interrupt in modo da garantire che non vengano persi degli impulsi, mentre la gestione della porta seriale, del tasto di azzeramento e lo schermo LCD sono affidati al ciclo principale del sistema.
La comunicazione seriale avviene ad una velocità di 9600 bit al secondo ed è basata sul seguente protocollo:

In particolare, poiché sia il PC che Arduino sono little endian l’invio del valore del contatore è effettuato in questo modo:

uint8_t *ptr = (uint8_t *) (&counter);
for(uint8_t i=0; i<4; i++)
{
    Serial1.write(ptr[i]);
    delay(50);
}

Essenzialmente si prende un puntatore alla variabile “counter” (ovvero quella che contiene il numero di persone transitate) e lo si tratta come se fosse un array di 4 numeri a 8 bit, in questo modo si riesce a inviare il valore della variabile a 32 bit senza dover ricorrere all’uso di maschere e scorrimenti di bit.

Parte su PC:

Il programma in esecuzione sul PC non fa altro che richiedere il valore del conteggio due volte al secondo aggiornando opportunamente la pagina html che poi verrà mostrata dal browser. Come detto prima, il contenuto della pagina html prodotta viene letto da un file template opportuno; l’unico requisito che deve avere questo file è quello di contenere la parola “counter_val” laddove si desidera che venga inserito il valore del conteggio.
Poiché l’inserimento del numero viene effettuato tramite una regex è possibile modificare a piacere la “parola chiave” che indica il posto dove svolgere questa operazione: semplicemente basta cambiare il valore tra virgolette specificato in questa direttiva

#define REGX_TAG "counter_val"

collocata nelle prime righe del file main.cpp.
Al momento questo programma può essere compilato ed eseguito solo in ambiente Linux, anche se modificarlo per consentirne l’esecuzione su un altro sistema operativo non dovrebbe un’operazione troppo complessa. L’unica nota da fare circa la compilazione è che è richiesto GCC 5.0 o successivo, in caso contrario il meccanismo di sostituzione tramite regex non funziona.

Infine, qui è disponibile il codice sorgente di tutto l’accrocchio.