DIY – Split Flap FB Counter

DIY – Split Flap FB Counter

L’idea

Che cosa è un Fab Lab?
Questo è l’interrogativo di fronte al quale ci si ritrova, giustamente, tutte le volte che si approccia ai Non Iniziati al mondo dell’artigianato digitale e agli spazi di condivisione di attrezzature e conoscenze. La strada più efficace per rispondere esaustivamente catturando l’attenzione dell’interlocutore è quella di mostrare progetti che sono stati creati e sviluppati dentro la nostra realtà e sottolineare come diverse competenze ed arti possano trovare sintesi in un unica opera, come persone con diverse attitudini e interessi riescano a confrontarsi e acquisire nuove conoscenze, come sia divertente e appagante collaborare.
I nostri progetti, però, sono sempre stati pensati e realizzati per uno scopo particolare e per rispondere ad un bisogno specifico. Nascono già destinati all’uso e non disponibili ad essere trasportati all’evento perché già installati e operativi altrove.

Abbiamo quindi chiaro il bisogno di portare ad eventi e fiere un oggetto interattivo prodotto da noi, che attiri l’interesse del pubblico e che ci permetta di spiegare e mostrare le possibilità che un Fab Lab offre.

Nelle varie sessioni di brainstorming per cercare questo oggetto, ha affascinato tutti l’idea di realizzare qualcosa che funzionasse con lo stesso principio dei vecchi cartelloni ferroviari riconosciuti dagli inconfondibili caratteri meccanici a cascata e dal loro suono che cattura l’attenzione.

A questo punto mancava solo da definire il compito di questo “display” meccanico: contare in tempo reale i like sulla pagina Facebook!

In questo modo i visitatori possono interagire con il contatore, mettendo un like dal loro smartphone e vedere (e sentire!) lo Split-flap girare.

Con questa soluzione abbiamo unito il processo di costruzione (meccanica, elettronica e informatica), il pubblico e la visibilità sui social.

Gli strumenti

Non ci siamo accontentati di realizzare un semplice oggetto ma ci siamo impegnati di rilasciare i file di progettazione cosicché altre realtà come la nostra possano riprodurne uno. Se cosi non fosse stato avremmo reso il progetto monco di una importante potenzialità: essere esso stesso un occasione di condivisione di competenze e di abilità.

La scelta degli strumenti necessari alla costruzione è ricaduta su macchine e materiali ampiamente disponibili nei vari laboratori condivisi sparsi per tutto il mondo.

L’unica macchina a controllo numerico utilizzata è la nostra Laser-Cutter; abbiamo scartato la stampante 3D per via dei lunghi tempi di stampa.

Materiali utilizzati:

  • compensato da 3 e da 4 mm;
  • plexiglass da 3 mm;
  • 24 bulloni M3 x 16 mm a testa conica con relativi dadi (per assemblare le parti plastiche che ospitano i numeri);
  • 12 barre filettate da 83mm (per garantire solidità a ogni elemento rotante);
  • 8 bulloni M2.5 x 12 mm a testa conica con relativi dadi (per fissare i microswitch);
  • 12 bulloni M3 x 12 mm a testa piana con relativi bulloni (per assicurare i motori alla scatola);
  • 12 bulloni M3 x 12 mm a testa conica (per fissare i supporti motore ai motori stessi);
  • 8 cuscinetti F686Z foro 6 x diametro 8 x spessore 6 mm (flangiati, utili a far scorrere l’asse di ogni numero);
  • 1 spina in legno da 6 mm lunga 386 mm (costituisce l’asse centrale del dispositivo);

Componenti elettronici e meccanici:

  • un ESP8266 nella sua variante NodeMCU 1.0 (scheda di sviluppo che incorpora microcontrollore e modulo di connessione Wi-Fi)
  • 4 motori passo-passo NEMA17 (responsabili dei movimenti di ciascuna cifra)
  • 4 driver motori A4988 (traducono i comandi del microcontrollore in passi dei motori)
  • 4 microswitch (determinano la posizione home di ciascuna cifra)
  • 4 cinghie GT2 da 300mm di larghezza 6mm
  • 4 pulegge GT2 a 20 denti (montare sui motori)
  • 4 pulegge GT2 a 70 denti autocostruite in plastica (facenti parte del corpo del rotore)

 

Realizzazione

La prima e più laboriosa parte è stata la costruzione del rotore di ciascuna cifra. Il flap sono realizzati col compensato da 3mm colorato con mordente nero, protetti con una finitura opaca e successivamente incisi dei numeri e tagliati nella corretta forma.

Dettaglio cifra con puleggia desta in primo piano.

Le parti plastiche laterali sinistre e destre sono composte rispettivamente da due e quattro strati che sono ben assicurati tra loro da tre bulloni M3  a testa conica e dadi. La parte plastica destra ha anche l’importante funzione di puleggia che, ricevendo il movimento del motore attraverso la cinghia, permette al intero rotore di ruotare e mostrare la corretta cifra.
E’ molto importante svasare le sedi delle teste dei bulloni altrimenti non sarà possibile inserire i cuscinetti agli estremi.

 

 

 

 

 

 

 

Dettaglio del lato sinistro dove sono ben visibili i 3 bulloni e il cuscinetto

Tutto il rotore (le due parti plastiche e i dieci flap numerati) è reso un unico corpo solidale dalle 3 barre filettate bloccate in posizione dal collante epossidico. Questi passaggi verranno ripetuti per ciascun rotore.

 

 

 

 

 

Dettaglio del telaio smontato visto dal retro

Completati i quattro rotori numeri si procede all’assemblaggio del telaio. Tutte le parti di questo sono ad incastro e sarà sufficiente della colla vinilica per ben assicurarle tra loro. La parte posteriore ed anteriore verranno aggiunte in un secondo momento.

 

 

 

 

 

Quando la colla vinilica è essiccata si utilizza la spina di legno da 6mm per mettere in posizione i quattro rotori numeri nel telaio. Questo è il momento di  posizionare anche le cinghie.

 

Assemblaggio delle cifre sul telaio

dettaglio spina di legno

La spina da 6mm attraverso per intero il telaio e i 4 rotori.

 

 

 

 

 

 

 

 

Disegno del supporto motore.

 

Ciascun supporto motore è formato da tre parti plastiche (sempre da 3mm) e richierà tre viti M3 a testa conica per il fassaggio al motore. Due di queste hanno tre rientranze per ospitare i 3 dadi M3, la terza bloccherà i dati in posizione. I due dadi in basso verrano catturati dalle viti sul fondo per assicurare il motore al telaio solo dopo che quello laterale, grazie alla vite sul retro, ha permesso di tensionare correttamente la cingha.

 

 

Processo di svasatura con la punta per intestare

Alesatura correttamente effettuata. La testa della vite è allo stesso livello della superficie plastica.

I supporti sono stati disegnati per contenere i bulloni che accoglieranno le viti per il fissaggio sul telaio

Fissati tutti e quattro i motori si può posizionare e incollare il pannello posteriore facendo attenzione al passaggio dei cavi.

Solo  un passaggio ci separa dal posizionamento del pannello anteriore che decreterà la fine dell’assemblaggio delle parti meccaniche: il posizionamento dell’asta flessibile di trattenuta del flap. Una piccola fascetta da elettricista tranciata alla corretta misura è tutto quello di cui necessitiamo.

 

dettaglio linguetta di bloccaggio

Pochi e semplici – si fa per dire – collegamenti elettrici doneranno la vita al nostro Split Flap…

elettronica di controllo

… piccoli vezzi estetici ne formeranno il carattere!

QR code inciso che punta alla pagina facebook

Il firmware

Il codice è stato sviluppato su IDE Arduino per essere eseguito su NodeMCU1.0, basata sul modulo ESP8266 e predisposta nativamente di connettività wifi.

Il fine del codice è quello di controllare, ad intervalli regolari, il numero di like alla pagina interrogando il server di Facebook e sfruttando l’API dedicata. In risposta il server restituirà un file json che sarà analizzato dal microcontrollore e dal quale verrà estratto il numero di like. Per fare questo è stato sfruttato lo sketch reperibile qui. Il parsing del file json è stato affidato alla libreria ArduinoJson.

All’interno dello sketch ogni rotore è identificato attraverso una struct contenente diverse variabili:

int currentStep;
int stepPin;
int switchPin;
int homeVal;
byte state;

currentStep contiene il valore attuale del numero di step che sono stati percorsi da ogni singolo rotore.
stepPin contiene il numero del pin al quale è collegato lo il pin step del driver del relativo rotore.
switchPin contiene il numero del pin al quale è collegato il microswitch del relativo rotore.
homeVal contiene il numero di microstep al quale corrisponde la posizione di “home” del rotore, cioè quella posizione in cui il microswitch risulta premuto.

Quest’ultima variabile è di fondamentale importanza in quanto ci è utile a tracciare la posizione dei numeri mostrati dal rotore. Come sappiamo, i motori stepper non sono nativamente dotati di encoder (o di qualsiasi altro componente utile a tracciarne la posizione) e per questo motivo è stato previsto un microswitch che, alla pressione, comunica al microcontrollore la posizione esatta del rotore. In questo modo ci è possibile avere un riferimento sulla posizione dello stesso stepper e, in base a questo valore, farlo ruotare per mostrare il numero che ci interessa. Purtroppo, per questioni pratiche, il grado di rotazione del rotore che consente la pressione dello switch (e quindi il riferimento su cui basiamo le rotazioni) si trova a una gradazione tale che le palette che compongono i numeri siano fra il valore 7 e il valore 8. Attraverso delle prove, abbiamo rilevato che il numero di step da percorrere a partire dalle palette in posizione di “0” (ovvero che mostrano il numero 0), fino ad arrivare a premere il microswitch, corrisponde a 510: questo è il numero che va memorizzato in homeVal. Il funzionamento può sembrare contorto, ma in questo modo ci assicuriamo una perfetta calibrazione dei numeri correlata al numero di step percorsi o da percorrere.

Per ogni rotore è stato necessario implementare una macchina a stati finiti che gli faccia eseguire delle rotazioni distinte, in base all “stato” in cui lo stesso si trova. Il numero di stato corrente viene memorizzato all’interno della variabile state.

ciascuno dei rotori può assumere 4 stati:

  • stato 0: stato di partenza (si deve essere certi che il rotore non stia premendo il microswitch);
  • stato 1: ricerca del punto Home (muove il rotore fino al punto home);
  • stato 2: scrittura del numero (muove il rotore il numero di step necessari a mostrare la cifra desiderata);
  • stato 3: pronto (la cifra mostrata corrisponde alla cifra target).

Una volta ottenuto dal server Facebook il numero di like della pagina, questo parametro viene passato alla funzione printVal, insieme ai puntatori alle struct di ogni rotore.

void printVal(int target, cifra *u, cifra *d, cifra *h, cifra *k)
{
k->state = 0;
h->state = 0;
d->state = 0;
u->state = 0;
 
int kTarget = (target / 1000) * 70;
int hTarget = (target / 100 - (target / 1000) * 10) * 70;
int dTarget = (target / 10 - (target / 100) * 10) * 70;
int uTarget = (target / 1 - (target / 10) * 10) * 70;
 
while (k->state != 3 ||
h->state != 3 ||
d->state != 3 ||
u->state != 3)
{
 
byte doStepK, doStepH, doStepD, doStepU;
doStepK = singlePrint(kTarget, &k);
doStepH = (k->state == 3) ? singlePrint(hTarget, &h) : 1;
doStepD = (h->state == 3) ? singlePrint(dTarget, &d) : 1;
doStepU = (d->state == 3) ? singlePrint(uTarget, &u) : 1;
 
digitalWrite(k->stepPin, doStepK);
digitalWrite(h->stepPin, doStepH);
digitalWrite(d->stepPin, doStepD);
digitalWrite(u->stepPin, doStepU);
delay(1);
digitalWrite(k->stepPin, 0);
digitalWrite(h->stepPin, 0);
digitalWrite(d->stepPin, 0);
digitalWrite(u->stepPin, 0);
delay(1);
 
}
}

Questa funzione si occupa di separare il numero di like, avente potenzialmente un massimo di 4 cifre, in 4 singoli numeri che costituiscono il target per ogni singolo rotore.
Il ciclo while all’interno di questa funzione viene eseguito fino a quando tutti i rotori non si troveranno nello stato 3, cioè lo stato a cui corrisponde il rotore in posizione da mostrare il numero corretto. Per stabilire se far compiere degli step a ogni rotore, viene utilizzata la funzione singlePrint, che si occupa di valutare lo stato in cui si trova un rotore e restituire “1” nel caso in cui sia necessario far compiere un ulteriore step al relativo stepper; in caso contrario viene restituito il valore 0.

byte singlePrint(int target, cifra **number)
{
byte doStep = 0;
if ((*number)->state == 0)
if (!digitalRead((*number)->switchPin))
{
doStep = 1;
}
else
(*number)->state = 1;
else if ((*number)->state == 1)
{
if (digitalRead((*number)->switchPin))
{
doStep = 1;
}
else
{
(*number)->state = 2;
(*number)->currentStep = (*number)->homeVal;
}
}
else if ((*number)->state == 2)
{
if ((*number)->currentStep != target)
{
doStep = 1;
(*number)->currentStep = ((*number)->currentStep + 1) % 700;
}
else
(*number)->state = 3;
}
return doStep;
}

Questo valore viene memorizzato nelle variabili doStepK, doStepH, doStepD, doStepU, relative, in ordine, a migliaia, centinaia, decine e unità. Per un miglior effetto visivo abbiamo deciso di far avviare il corretto posizionamento di un rotore solo quando tutti i rotori di ordine superiore si troveranno già in posizione corretta, ovvero nello stato 3. Per fare un esempio, se la cifra delle migliaia non ha ancora raggiunto il numero target, le centinaia, le decine e le unità ruoteranno senza che su esse venga eseguito alcun particolare controllo della posizione.

 doStepK = singlePrint(kTarget, &k);
doStepH = (k->state == 3) ? singlePrint(hTarget, &h) : 1;
doStepD = (h->state == 3) ? singlePrint(dTarget, &d) : 1;
doStepU = (d->state == 3) ? singlePrint(uTarget, &u) : 1;

Le risorse

Listato integrale disponibile su Github;
Guida per la generazione del token su facebook;
Instructables Facebook Fan Count;
File di progetto CAD.