Kokiuina beta – Una storia un po tormentata
Pelle e ossa “riciclati”
- 1 Arduino mod. “diecimila” equipaggiato con il piccolo ATMega168 (ovvero solo 1Kbyte di Ram e 16Kbytes di Flash Rom di cui 2Kbytes già usati dal bootloader);
- 1 sensore ADNS-2620 (Optical Mouse Sensor);
- 1 risonatore ceramico da 24Mhz;
- 1 condensatore da 2,2µF;
- 2 mini servomotori per modellismo dinamico reperiti su eBay un annetto fa e pagati pochi euro (ancora oggi si trovano a poco meno di 5 euro l’uno … ma valgono davvero poco…);
- 24 led GIALLI originariamente montati su luci di Natale (e che ne avessi trovato uno uguale all’altro sia come colore che come luminosità… ma, come vedremo più avanti, non tutto il male viene per nuocere);
- 1 led BLU sempre ricavato dalle stesse luci di natale;
- 9 resistenze da 220Ω per la limitazione corrente ai led (8 per le colonne della matrice degli occhi e 1 per il led blu);
- 2 pezzetti di circuito stampato “mille fori” per realizzare la matrice di led per gli occhi e il supporto del sensore ottico;
- alcuni spezzoni di “piattina” grigia recuperata da vecchi PC (quei cavi a più fili che collegano Hard Disk, Floppy e drive per CD/DVD) + un pezzo di filo celeste per il led blu;
- alcuni connettori passo 2,5mm per i collegamenti con Arduino (è sempre un problema collegare qualcosa ad Arduino, perchè non si trovano connettori adatti se non a prezzi esorbitanti!);
- 2 supporti per uova di pasqua (quelle di cioccolata) utilizzati per “vestire” Kokiuina (il corpo ed il cappello);
- 1 alloggiamento per cd come supporto cavo per il passaggio dei fili dalla base alla testa opportunamente lavorata (la colonnina centrale bianca);
- 1 tappo di un pennarello come innesto/supporto tra il servo per il movimento orizzontale e la base;
- 1 contenitore per uso alimentare per la base (non ricordo neppure più cosa c’era dentro..);
- parte di una vecchia scatola di plastica trasparente per floppy disk come raccordo/supporto tra gli “occhi” (la matrice di led) e il servo per il movimento verticale;
- una piccola lente recuperata da una vecchia macchina fotografica (e qui però, come vi racconterò più avanti, ancora non ho risolto del tutto…);
- altro materiale vario (piccole viti autofilettanti, fascette, colla a caldo, pezzetti di densa spugna nera, ecc).
- la memoria ram a disposizione è praticamente finita (1024 byte sono veramente troppo pochi per un programma come questo se scritto in C), così non ho potuto implementare al meglio reazioni e comportamenti dipendenti dal tempo (per non lasciare Kokiuina sempre ferma in una posizione voglio implementare comportamenti di “distrazione” e una situazione di “riposo” quando non avviene nulla per periodi lunghi (per limitare anche i consumi quando sarà alimentata a pila);
- la lente che alla fine ho utilizzato (ne ho provate più di 6 prima di sceglierla) l’ho recuperata da un vecchio masterizzatore di CD (una delle lenti che focalizzano il raggio laser) ma nonostante questo il campo di visione che si ottiene è comunque troppo ristretto.
[sourcecode language=”cpp” autolinks=”true” collapse=”false”]
/* Sensore ottico per mouse ADNS-2620
* invio della sola immagine tramite codici ascii dove 32 = 0 e ciascun pixel è nel range tra 0 e 63
* il record inizia con il valore ‘>’ e termina con ‘<‘
*
* (c) Kokiua alias L.M. Sorbolo Parma Italia
*/
#include “Adns.h”
#define cam_sclk 2 //definisce il pin 2 di Arduino come SCLK
#define cam_sdio 3 //definisce il pin 3 di Arduino come SDIO
Mousecam cam( cam_sclk, cam_sdio ); // attiva il sensore
void setup(){
Serial.begin(115200);
if(cam.adns_init() == 0){
Serial.println(“sensore non presente…”);
for(;;); //si ferma con un loop infinito
}
cam.adns_write(ADNS_CONFIG, 0x01); // forza lo stato del sensore ottico a “sempre sveglio” (Forced Awake Mode)
cam.adns_write(ADNS_FRAME_PERIOD, 0x04); // imposta il FrameRate per ottenere la massima luminosità (norm C2 – min 20 – max F0)
Serial.println(byte(‘>’)); //invia inizio record
}
void loop(){
byte val = 255;
register int z = 324;
cam.adns_write(ADNS_PIXEL_GRAB, 0x00); // scrive per iniziare il frame
do { val = cam.adns_read(ADNS_PIXEL_GRAB); } while (!(val & 0x40)); //legge il sensore sino a quando non è settato il flag DATA_VALID (bit 6)
while( z ){ //prosegue sino a quando non ha letto tutti i pixel
val = 32 + (val & B00111111);//maschera per valore < 64
Serial.print(byte(val)); //invia il dato in seriale
if( ((z-1) % 18) == 0 ) Serial.println(); //a capo se multiplo di 18 (per lettura su monitor di Arduino)
z–; //decrementa conteggio pixel
do { val = cam.adns_read(ADNS_PIXEL_GRAB); } while (!(val & 0x40)); //legge il sensore sino a quando non è settato il flag DATA_VALID (bit 6)
}
Serial.println(“<>”); //invia fine/inizio record
}
[/sourcecode]
e al fine di poter visualizzare le immagini ottenute, per Processing:
[sourcecode language=”cpp” autolinks=”true” collapse=”false”]
/* Sensore ottico per mouse ADNS-2620
* ricezione immagine da Arduino
*
* (c) Kokiua alias L.M. Sorbolo Parma Italia
*/
import processing.serial.*;
int DimCella = 20, i = 0, val = 0;
byte fotogramma = 0;
Serial PortaSeriale;
void setup () {
size(360, 360);
String NomePorta = Serial.list()[1];
PortaSeriale = new Serial(this, NomePorta, 115200);
background(0);
}
void draw() { //non usato
}
void serialEvent(Serial PortaSeriale) {
val = PortaSeriale.read();
switch( val ){
case ‘>’: i = 0; fotogramma = 1; // nuovo inizio fotogramma
break;
case ‘<‘: fotogramma = 0; //fine fotogramma
break;
default:
if( fotogramma == 1 && val > 63 ){
int x = i / 18;
int y = 17 – ((i – (x * 18)) + 1);
x = 17 – x; //immagine raddrizzata
int temp = (val – 64) * 4;//moltiplica il valore letto per aumentare la luminosità e il contrasto
fill( temp );
stroke(153);
rect(x * DimCella, (y+1) * DimCella, DimCella, DimCella);
i++;
} else {
if( fotogramma == 0) print(char(val)); //qualsiasi altro carattere ricevuto viene visualizzato nell’area di stampa di Processing
}
}
}
[/sourcecode]
Probabilmente in un prossimo futuro proverò ad acquisire direttamente l’immagine da una telecamera a basso costo (se ne trovano su internet a poco più di 5 euro) così da ottenere una migliore velocità e risolvere del tutto il problema della lente.
Restate sintonizzati!

6 Comments Already
Lascia un commento
Devi essere connesso per inviare un commento.
senza parole per la tua inventiva…
Non ci vogliono grandi soldi, ma solo grandi idee..
Grazie per l’apprezzamento 🙂
Ne approfitto per spiegare le differenza tra la versione di Kokiuina ripresa nel video precedente e quello attuale:
Nel video precedente (E’ nata Kokiuina) ho mostrato il prototipo che aveva montato una lente poco adatta (riceveva una porzione di immagine veramente molto stretta), tanto che l’unico modo di far “reagire” Kokiuina era quello di muovere una luce in uno spazio minimo (qualche centimetro) a quasi 2 metri di distanza. Nella parte finale di quel video si vede che Kokiuina ha solo l’alimentazione (niente collegamenti esterni), e all’avvio processa una fase di “azioni” (movimenti ed espressioni) pre-programmate, per poi diventare pressochè statica a causa della vista troppo ridotta.
Nel secondo filmato (in questo articolo) Kokiuina monta la lente recuperata dal masterizzatore di CD e, per verificare il campo di visibilità, è collegata via USB per trasmettere a Processing sul Mac (ovvero il programma che ho reso qui pubblico e che come si vede non effettua alcuna elaborazione) i dati via via che li riceve. Come si può notare Kokiuina è più reattiva anche se molto lenta, e anche lo spostamento che si ottiene non è perfettamente rapportato ai reali spostamenti del soggetto che ha di fronte (io con la telecamera). Se avessi rapportato i movimenti alla dimensione del campo visivo, Kokiuina sarebbe praticamente restata ferma… Come ho già scritto, conto di risolvere tutti questi problemini cambiando fonte dell’immagine ma restando entro a un costo complessivo di realizzazione veramente alla portata di chiunque! 😉
Bello e interessante, io purtroppo mi sono un po’ fermato per l’estate…ma con il freddo dell’inverno si iniziano ancora i lavori di ricerca…
bel lavoro
Ciao Kokiua,
innanzitutto complimenti per il tuo progetto.
Mi presento, mi chiamo Alessio e sono un giovane laureando in ingegneria meccanica, che ha scoperto questo mondo dal quale è rimasto rapito.
Ho acquistato da poco Arduino 2009, con cui piano piano sto familiarizzando, sia a livello software, sia a livello hardware, avendo già provato alcuni dei progettini presenti all’interno.
Leggendo tutto il tuo progetto, e avendo a disposizione un mouse ottico con il sensore ADNS-2620, volevo provare l’acquisizione della sola immagine, ma non ci sono riuscito.
Vengo al punto, in questo post hai messo a disposizione due listati, e fai anche riferimento ad una libreria con il relativi link, per il dialogo tra Arduino e il sensore, ma non ho ben chiaro come utilizzare il tutto per effettuare una prova. Potresti aiutarmi in questo?
Non avendo trovato nessun tuo altro recapito, mi sono avvalso di questo spazio per chiederti aiuto.
Comunque la mia email è : xxxxxxxxxxxxx
E se ti può interessare questo è il mio blog : http://cemecer.blogspot.com/
Grazie dell’attenzione.
Spero di sentirci presto,
Alessio.
Ciao Alessio,
per prima cosa devi collegare il tuo sensore così come vedi nello schema presente nel mio testo. E se lo vuoi lasciare nella sua sede (e quindi saldato nel circuito stampato originale con i componenti necessari già presenti) devi interrompere i collegamenti dei segnali SCK e SDIO (pin 4 e 3) con l’integrato che li utilizza per le funzioni originali del mouse. Per quanto riguarda invece la massa (GND) e l’alimentazione (il +5), puoi riportarli senza dover interrompere alcun segnale (praticamente saldi 4 fili nella parte superiore del sensore in modo da poter avere funzionanti il LED che illumina l’area sottostante e la sua lente).
Chiaramente i segnali SCK e SDIO li dovrai far corrispondere ai pin indicati nel primo listato (quello di Adrduino), ovvero rispettivamente i pin 2 e 3.
Fatto questo, carica il programma su Arduino e prova a vedere il monitor della seriale che ti dovrebbe mostrare i frame che arrivano dal mouse sotto forma di gruppi di lettere (caratteri ascii) 18 per ciascuna riga per 18 righe ad ogni immagine rilevata. Se tutto funziona, interrompi il monitor della seriale di Arduino ed avvia il programma per Processing (il secondo listato). Vedrai una finestra che ti mostra le immagini che arrivano dal tuo mouse 😉
Fammi sapere se è tutto chiaro e se sei riuscito nella tua prova…
Ciao Kokiua,
grazie per l’interessamento, il tuo post era chiarissimo.
Ho isolato il sensore ottico da tutti gli altri componenti del mouse, tranne il risuonatore e il condensatore, e li ho collegati tra loro come da te suggerito.
Ho effettuato la prova, ma il monitor della seriale mi dice : sensore non presente…
Adesso ordinerò un nuovo sensore e risuonatore, anche se il mouse da cui ho prelevato i presenti era funzionante, quindi effettuerò questa ulteriore prova e ti farò sapere.
Grazie ancora.
Alessio.