Ratcam: illuminatore e sensore ambientale

Apro qui un topic per organizzare in maniera pulita tutte le informazioni che altrimenti sono in chat. Qui ci sono tutti i link al progetto Ratcam e le info: Ratcam v1.


Contesto

Ho realizzato un circuito che controlla dal Raspberry Pi una batteria di LED infrarossi per illuminare la scena in modo che la telecamera del Raspberry Pi possa acquisire immagini notturne. I LED sono controllati da un pin del RPi tramite un mosfet.

Problema
Ora vorrei far sì che si attivi/disattivi da solo, in base alla luce ambientale. Posso usare la telecamera per identificare quando l’immagine è troppo scura, ma non per capire quando è il caso di spegnere i LED, perché fanno comunque luce sufficiente da non permettere di capire se nell’ambiente ce n’è a sufficienza.

Soluzione
Vorrei aggiungere un sensore di luce ambientale per controllare quanta luce c’è e attivare/disattivare i LED. Questo dovrebbe

  • Comunicare con I2C o SPI al RPi, il software poi decide se è chiaro o scuro (così non devo tararlo, dato che vorrei poterlo usare anche in interni).
  • Guardare nella direzione della telecamera (magari anche lo stesso campo), in modo che effettivamente ci sia correlazione tra l’accensione e l’immagine (anche se la telecamera viene per esempio collocata in un angolo scuro o punta verso una zona poco illuminata)
  • Non essere sensibile agli infrarossi (sennò abbiamo lo stesso problema di prima)
  • Essere saldabile a mano :smiley:

Ora ho trovato questo bellissimo chippino che ha tutto quello che mi serve. È un sensore ambientale con sensibilità nello spettro visibile, con risposta molto simile a quella dell’occhio umano, contiene un ADC a 16 bit e comunica tramite I2C. Decisamente costa meno della somma dei suoi componenti se dovessi tentare di farlo io (a parte il fatto che la maggior parte di fotodiodi/fototransistor hanno molta sensibilità nell’infrarosso).

Ora, vorrei alimentarlo dalla linea a 5V del RPi se possibile, la stessa che uso per i LED, per evitare di portare i 3.3V (un’altro filo). Dal momento che sulla linea a 5V ci sono anche i LED e quelli si accendono e spengono, mi servirà qualcosa per evitare problemi al chip in caso di “induttanza della linea e rempentino cambio di corrente” [cit. @wifasoi], e per portare i 5V a 3.3V.

I 3.3V mi servono sia per alimentare il chip, che per le resistenze di pull-up dell’I2C. Suggerimenti?

Questo è il circuito suggerito dal datasheet:

Da notare che questo chip ha anche la guida per progettare applicazioni, che contiene in dettaglio le spiegazioni su come usare gli interrupt, i comandi, come calcolare i lux e compensare per gli infrarossi, e come pilotarlo per adattare le impostazioni all’ambiente, che è piuttosto una figata.

Allora, tu devi risolvere due problemi, che sono legati tra di loro ma si possono affrontare in maniera indipendente.

Condensatori di bypass

Come giustamente dice @wifasoi, l’induttanza della linea potrebbe darti problemi se hai cose che si accendono e spengono velocemente. Il modello mentale è che la corrente ci “mette un po’” ad arrivare al tuo circuito, quindi quando accendi i led la tensione sulla tua scheda si abbassa leggermente e poi si rialza quando la corrente arriva dalla RPi.
Questo problema si risolve mettendo condensatori di disaccoppiamento, che “disaccoppiano” la tua scheda dalla RPi, insomma funzionano come un “buffer” locale di tensione che aiuta a rendere uniforme la tensione.

Conviene metterne uno all’ingresso vicino al connettore e poi uno o due vicino a ogni integrato che cambia tensione repentinamente (nel tuo caso, solo il sensore, per il MOSFET non serve secondo me)

Tensione di alimentazione a 3.3V

Il chip da te scelto non supporta i 3.3V. Hai quindi due vie:

  1. Portare un altro cavo dai 3.3V interni della RPi
  2. Aggiungere un regolatore di tensione che ti porta i 3.3V dai 5V
  3. Fare un hack mettendo due (o tre) diodi in serie.

Io sinceramente ti consiglierei la 1). È quella che da meno problemi, alla fine aggiungere un filo non credo sia così problematico.

La 2) ti complica un po’ il circuito (non di molto), in quanto dovrai aggiungere un LDO (direi di evitare switching sotto l’1mA di consumo) e un paio di condensatori.

La 3) è un po’ un hack, e si basa sul fatto che su un diodo polarizzato direttamente avrai una caduta di tensione fissa intorno ai 0.7V per diodi al silicio. Mettendone 3 in serie ottieni circa 3V. Il problema con questo setup è che non puoi tirarci fuori troppa corrente, ma con un consumo teorico massimo di 45 uA direi che sei salvo.

Pull-up del bus I2C

Come si discuteva in chat, il bus I2C è un open drain. Ogni membro del bus può portare la tensione di una linea a 0V oppure lasciarla flottante. Questo si fa per abilitare più integrati sulla stessa linea, condividendola nel tempo (solo uno trasmette alla volta).
Il risultato di questo è che devi metterci delle resistenze di pull-up che “fissano” la linea ad una tensione nota (alta, in questo caso) quando nessuno dei dispositivi la “pilota” (la mette a 0V).

Ora, da data sheet dell’integrato non puoi applicare più di 3.6V ai pin di i2c, che casca a fagiolo in quanto la RPi lavora a 3.3v se non erro. Dovrai quindi mettere le resistenze di pull-up a 3.3v come nell’application note. Come valore io metterei qualcosa tipo 4.7kOhm.

1 Mi Piace

Per contrastare l’induttanza delle tracce sul pcb?

Sarebbe sulla linea 5V suppongo che andrebbe, in caso, sul mosfet, giusto? (i.e. tra il mosfet e i LED)

Sembra anche a me l’opzione migliore delle 3. In tal caso, i 3V3 alimenterebbero esclusivamente il sensore, e beh, il pullup delle linee dellI2C. Devo mettere un condensatore di disaccoppiamento anche in questo caso?

Si, e anche di quella del cavo.

Si, andrebbe vicino al mosfet, sul drain.

Beh, valuta tu :blush: Conta anche la corrente dei pull-up!

Si, quello va messo sempre. Possibilmente il più vicino possibile all’integrato!

Quindi tutti i condensatori di disaccoppiamento vanno a massa dall’altro lato giusto?
Sarebbe un condensatore prima del drain, e uno prima del V_DD del sensore.

Come sono scelti in generale i valori? Immagino che il valore del condensatore abbia a che vedere con il tipo di interferenze che filtra? E per le resistenze di pullup? È un valore che è sicuramente più alto dell’impedenza del chip?

Yep!

Yep! ma in mia opinione quello prima del Adrain non serve montarlo (puoi sempre progettarlo, ma non montarlo)

Si, alla fine è tutta una rete RLC, però “di solito” si mette un 100nF o addirittura un 470nF.

Non ho ben capito cosa intendi con l’impedenza del chip, ma no, il valore per il bus i2c si sceglie in base alla velocità del bus e dal consumo desiderato. Più i valori sono bassi, più veloce riesci ad andare (modello mentale: hai più corrente per “caricare” la capacità della linea). Per il bus i2c direi che 4k7 vanno bene, se non hai cavi troppo lunghi (<20cm).

1 Mi Piace

Script aggiornati e ordine a mouser partito… :wink:

Ancora però non ho rifatto il routing del PCB.

2 Mi Piace

Allora il chippino è arrivato! A parte il totale spreco di tempo nel disegnare un modello dettagliato solo per avere i render… devo dire che, confrontando ad occhio nudo, il raytracing di Kicad dà davvero soddisfazioni!

Ad ogni modo ho aggiornato lo schematics, spero che sia tutto collegato come dovrebbe:

Ho rifatto il routing, ho aggiunto due paddini per semplificare il debug (non so se davvero aiutano, ma immagino male non facciano). Ecco i render:

In verità non ho nulla da ridire sul routing e componentistica :blush: L’unica precisazione che avrei da fare è sullo schematico, che è forse un po’ poco chiaro. Ti consiglio di usare dei power symbol per massa e alimentazioni che semplificano un po’ lo schematico!

Giusto! Mi ricordo all’inizio non capivo come usarli, ma immagino che è sufficiente che collego tutto quello che va a massa al simbolo di massa (incluso il pin del connettore) e lui capisce che è la stessa net giusto?

Yes, tutto quello che è collegato al simbolo GND appartiene alla net GND e quindi è collegato insieme (anche se non fisicamente con una linea). Idem per altri power symbol.

Per l’I2C potresti usare un bus, ma sinceramente non ne vale la pena dato che i tuoi componenti sono uno vicino all’altro. :slight_smile:

Ahaha è da ieri che penso se devo usare un bus o meno :smiley:

Invece, posso usare il logo Mittelab? Non abbiamo guidelines per l’utilizzo. Visto che ho un po’ di spazio dietro, pensavo di mettere quello e OpenSourceHardware.

(sempre se Kicad mi lascia uscire dall’inferno dei formati impossibili che nessuno usa)


EDIT
Sono riuscito a far vedere a Kicad dei loghi decenti. Il buon svg2mod, che avrebbe bisogno di una spolveratina, ha un parametro --precision che permette di convertire le curve di Bézier in segmenti. All’inizio non lo usavo e il risultato era pessimo. Poi ho scoperto che anche usandolo il risultato è piuttosto limitato.
Tuttavia, questa guida mi ha messo sulla strada giusta! Inkscape può convertire le curve in segmenti con Flatten Bézier curves, il che mi dà molto più controllo. Risultato:

Non c’è niente tra le cose superflue che dia tanta soddisfazione come i loghetti.

1 Mi Piace

Ripulito! Sono anche riuscito a recuperare tutto il PCB pur cambiando la netlist.