domenica 10 aprile 2011

CCD sensore di scansione a linee (parte 2)

C'è un "cinese" a cui devo un favore. Non è stato per nulla facile, ma alla fine ho trovato degli appunti, mai pubblicati in rete, su come tentare di far lavorare il sensore di immagini a contatto (Toshiba CIPS218CF600 - CIS Contact Image Sensor). Alcuni dati li avevo "indovinati" con dei ragionamenti logici, altri invece sono specifici. 

Procediamo con ordine partendo dalla piedinatura del connettore e poi vediamo i segnali da applicare. 
  1. OS Tensione analogica di uscita
  2. Mode (300/600dpi switch)
  3. GND
  4. VOD Power supply
  5. GND
  6. TR (impulso di start)
  7. M (clock)
  8. LEDCA (anodo comune dei tre led RGB)
  9. Led blu
  10. Led verde
  11. Led rosso
  12. GND
Alcune caratteristiche dei segnali da applicare:
La tensione di uscita OS è di 800 mV (tipico) e 1,2 - 1,5V al massimo in condizioni di saturazione non lineare. Il VO tipico è misurato su un foglio bianco riflettente dall'80 al 90% con corrente per ogni led a 20mA e tempo di esposizione di 5mS. In condizioni di nero, il VO è di 40mV.
La modalità 300-600 dpi si ottiene applicando rispettivamente tensione o massa al piedino 2. Se il piedino 2 è a massa la risoluzione selezionata è 600 dpi. Per controllare l'esposizione, basta applicare un PWM ai tre diodi RGB sui quali non dovrà scorrere una corrente superiore ai 20mA.
L'alimentazione tipica del CIS è di 5V (minimo 4,5V massimo 5,5V) con un consumo di 60mA (max 100mA).
La frequenza del clock e del data rate in uscita è minimo 0,1 Mhz e massimo 2.5Mhz. Raccomandato 1Mhz. con ampiezza pari alla tensione di alimentazione. 
Per la lettura di una linea occorre applicare un impulso di start ed aspettare 5 impulsi di clock, trascurare le letture dei successivi 17 impulsi  di clock e successivamente leggere OS ad ogni impulso di clock per 5152 volte (i pixel dell'immagine vera e propria). Quindi per una lettura di una singola riga, occorreranno 5173 impulsi di clock. Si converte la lettura analogica OS in un valore binario e quello sarà il valore dell'intensità luminosa riflessa. Questo ciclo andrà ripetuto tre volte, per la stessa linea di lettura, accendendo alternativamente i led rosso blu e verde se si effettua una scansione a colori. Se si desidera una lettura in BN allora si accendono tutti e tre i led contemporaneamente (luce "bianca") e si legge per un solo ciclo ad ogni riga di lettura. Poi si avanza di una riga e si legge la successiva. E' chiaro che lo step di avanzamento andrà sincronizzato. Si può quindi predisporre un motore passo passo (stepper) o usare un encoder per rilevare il movimento del sensore se si vuole trascinare il CIS a mano. Un encoder di un mouse potrebbe andare bene, anche se va verificata la sensibilità in funzione della necessità di spostamento del sensore rapportata alla risoluzione adottata.
Bene, ce n'è abbastanza per cominciare a fare degli esperimenti e sbattere la testa con un problema mai trattato ad oggi nella pratica. Per pilotare il CIS ho a disposizone la Fox board 832 GNU-linux embedded system. Per generare un clock di 1Mhz dovrò creare un modulo apposito e lavorare a livello di kernel space...mai fatto prima d'ora, per cui mi servirà parecchio tempo per studiare e procedere per tentativi (e non è detto che ci riesca). Al limite proverò alla frequenza più bassa a livello di user space, dove dovrei raggiungere una frequenza di circa 130Khz (sufficienti). Sebbene si trovi della documentazione, devo dire che questa è a volte inutile in quanto imprecisa e poco dettagliata, come questo mio diario del resto. Ma preferisco così, non mi è mai piaciuta la pappa pronta così come odio pigiare bottoni senza sapere cosa sto facendo e cosa succede.
Per la conversione da analogico a digitale, mi sa che dovrò tribolare un pò. Non ne ho "di recupero" per le mani (sembrano abbastanza rari nelle apparecchiature che tratto) e vige l'obbligo di recuperarli da qualche parte, giusto per onorare lo sciopero della spesa e dato che a casa mia vige da anni l'auto embargo volontario. Ne ho trovato un paio in una scheda di un vecchissimo hard disk ma la tensione di alimentazione è a 12 volts e mi sa che è troppo "lento". Pensavo anche di usare un convertitore AD preso da una mother board di un paio di PC. Sono i chip codec audio (AC97) ma credo che siano troppo lenti anche questi in quanto progettati per le frequenze audio e noi siamo un pò oltre la gamma delle frequenze udibili. Vedrò cosa inventarmi, devo indagare. Un alternativa (un ripiego) potrebbe essere la seguente. Chissenenfrega di voler ricostruire uno scanner professionale. Se applico il segnale analogico (opportunamente amplificato) direttamente su una porta logica di input (3,3volts tolerant), quest'ultima interpreterà il valore binario in base alle soglie dichiarate nel datasheet. O zero o uno, o bianco o nero e basta. In caso di uso come sensore lineare generico potrebbe andare bene. Immaginiamo, per assurdo, un sensore che mi deve dire a che livello è posizionata una tapparella, oppure per indicare i gradi di apertura di un varco (un cancello ad esempio), o il posizionamento di un carrello o, ancora, il livello di un liquido con precisione "millimetrica"... in questi casi mi basta lo zero o l'uno ed i toni di grigio che vadano a farsi f*ttere, tanto alla fine quelli che se ne stanno un pò di quà ed un pò di là non mi sono mai piaciuti tanto, maledetti opportunisti. Alla prossima.

P.S. La gallina ha fatto l'uovo nero. Ripeto: La gallina ha fatto l'uovo nero.

4 commenti:

cptzpk ha detto...

http://spritesmods.com/?art=lineccdts
Penso possa interessarti!
Ciao, buon lavoro!

unamico ha detto...

mmmm, visto, grazie, anche se il sensore è di una epson ed è leggermente diverso. Interessante che anche lui abbia optato per una lettura dummy senza conversione AD.

Anonimo ha detto...

e realizzare un potenziometro ottico lineare no ?

unamico ha detto...

sisi, ottima idea, grazie.