Non ci sono prodotti a carrello.
Due differenti approcci per realizzare un gadget natalizio che prende il colore del piano cui si appoggia. ร lโoccasione per vedere la differenza tra lo sviluppo di un progetto โamatorialeโ e di un prodotto โcommercialeโ.
Spesso, in redazione nascono discussioni โspontaneeโ sul modo di affrontare i progetti che vengono poi presentati sulla rivista; uno dei temi principali รจ quale approccio utilizzare in un progetto: orientarsi verso un circuito a componenti discreti, o usare uno o piรน integrati, oppure affidarsi a un microcontrollore e, nel caso, quale.
Chiaramente le soluzioni possono essere piรน di una e sono spesso legate alla formazione e allโesperienza dei singoli progettisti. E questi sono anche i motivi per i quali le discussioni diventano โacceseโ.
La situazione descritta si รจ puntualmente presentata durante la decisione su cosa presentare come โprogetto di Nataleโ: alla fine si รจ concordato di proporre una lampada a LED in grado di assumere il colore della superficie sulla quale viene appoggiata e da inserire in un albero di Natale cavo. A questo punto si รจ posta lโinevitabile serie di domande: quale lampada, come riconoscere i colori, come riprodurli?
Abbiamo perciรฒ deciso di valutare due differenti approcci e descriverli in questo articolo per farvi vedere come si puรฒ sviluppare un progetto partendo dalla concezione iniziale, passando dalla progettazione e realizzazione in forma prototipale, per giungere poi alla definizione di un prodotto finale da produrre in serie.
Nello specifico, per lโelettronica abbiamo contrapposto una realizzazione basata su Arduino ad una realizzata da zero con una scheda e un microcontrollore specifico; la prima รจ lโideale per sviluppare un prototipo, ma per costo e ingombri รจ inadatta a una produzione di serie, dove invece scegliere lโhardware fornisce la soluzione migliore.
Lโapproccio al progetto
Lo schema di massima del processo di progettazione e ingegnerizzazione di un prodotto รจ mostrato in Fig. 1: si parte dallโipotesi iniziale, nel nostro caso la volontร di realizzare la nostra lampada di Natale in grado di emettere luce dello stesso colore della superficie sulla quale viene appoggiata. Il primo passo che porta da una semplice idea ad unโipotesi di progetto รจ la definizione delle funzionalitร , la scelta dei componenti e, in questo caso, anche unโipotesi di design.
Il processo prevede una prima fase dedicata alla scelta dei componenti, per quanto riguarda la realizzazione elettronica, e alla definizione dellโaspetto estetico, per quel che concerne il corpo esterno della lampada. Sulla base delle prime scelte si realizza un primo prototipo da valutare e migliorare fino a giungere ad una versione adatta ad essere replicata in produzione.
La decisione (o, meglio, lโobbligo, detto anche โvincolo di progettoโ) รจ stata di realizzare la lampada con il processo di stampa 3D, in modo da ottenere un oggetto molto simile per aspetto e consistenza a quello che sarebbe risultato il prodotto definitivo. La forma iniziale sarร quella di un albero a tre dimensioni che ricordi quello di Natale.
Ora pensiamo alla funzionalitร della lampada, che consiste nel rilevare il colore della superficie sottostante la base e la sua riproduzione come tonalitร di luce.
Giร questo introduce un ulteriore vincolo: il corpo della lampada deve essere di materiale traslucido e di un colore che non interferisca con la tonalitร di luce emessa, in modo da non falsare i colori. In pratica il bianco รจ dโobbligo.
Per semplificare lo sviluppo del progetto ci conviene suddividere lโintero problema in parti piรน piccole e, per cosรฌ dire, monofunzione, quelli che comunemente vengono chiamati โmoduliโ: un โmodulo sensoreโ in grado di riconoscere il colore della superficie di appoggio della lampada, un โmodulo di elaborazioneโ in grado di comprendere il segnale in uscita dal โsensoreโ ed elaborarlo per produrre in uscita un โqualcosaโ in grado di pilotare una sorgente luminosa โprogrammabileโ e, infine, un โmodulo luceโ in grado di riprodurre una tonalitร luminosa a fronte di un input predefinito.
Definite le funzionalitร dei singoli โmoduliโ o โstadiโ come si diceva una volta, per ciascuno รจ necessario decidere quale tecnologia adottare e la conseguente โingegnerizzazioneโ.
Per il modulo di riconoscimento del colore si presentano diverse alternative: possiamo utilizzare una telecamera e poi elaborare le immagini acquisite per estrapolare il colore predominante, ma tale soluzione richiede un hardware con una potenza di elaborazione abbastanza significativa. Ma sarebbe come utilizzare un cannone per andare a caccia di zanzare.
Potremmo allora ipotizzare la costruzione di un sensore utilizzando componenti discreti, sensori di luce, e diodi multicolori da interfacciare ad una logica di elaborazione e controllo: una soluzione giร piรน adatta, ma ancora troppo complicata da realizzare e mettere a punto.
Una terza scelta รจ di adottare un criterio che sta avendo sempre piรน seguito: andare alla ricerca, sul mercato, di moduli preconfezionati che svolgano le funzioni di cui abbiamo bisogno.
Lo stesso criterio che adottiamo quando realizziamo i nostri progetti in GNU/Linux: ricerca della maggior quantitร di โmattoniโ disponibili nel โmondoโ e la realizzazione delle sole integrazioni tra le diverse parti. Questa ricerca sarร maggiormente fruttuosa quanto piรน siamo stati accurati nella scomposizione del problema in moduli.
Cerca che ti cerca, abbiamo trovato il TCS230, un modulo con sensore di riconoscimento dei colori prodotto da LC Technology.
Per riprodurre la tonalitร di luce rilevata con il sensore, la scelta รจ molto semplice: un LED RGB andrร benissimo in fase di prototipo e ci apre la strada a diverse scelte in fase di prodotto finale, in quanto il pilotaggio RGB si applica ad una vasta gamma di prodotti di produzione di luce, reperibili sul mercato in una varietร di forme, dimensioni, potenze e prezzi.
Ne consegue la definizione della funzione principale del โmodulo di elaborazioneโ: applicare ai piedini che pilotano ciascun colore un segnale PWM proporzionale alla intensitร della corrispondente componente di colore rilevata dal sensore.
Ci resta da scegliere cosa usare come โmodulo di elaborazioneโ: per un oggetto monofunzione, con molta probabilitร la scelta giusta รจ utilizzare un microcontrollore con unโadeguata dotazione di pin di ingresso/uscita sia analogici che digitali.
Le prestazioni non sono molto importanti, in quanto una lampada รจ un oggetto statico: una volta appoggiata su una superficie se ne sta lรฌ fino a quando qualcuno non la sposta, giusto per vedere se cambia colore.
Per intenderci, la nostra applicazione non richiede una soluzione real time basata su FPGA con tempi di campionamento dellโordine dei nanosecondi: un microcontrollore economico รจ piรน che sufficiente per le esigenze di questo progetto.
Per un primo prototipo la scelta รจ facile: basta allungare la mano sulla scrivania e utilizzare lโonnipresente Arduino Uno. La sua vocazione รจ proprio quella di rendere semplice e veloce la realizzazione di prototipi โฆ funzionanti.
LโIDE e il linguaggio di sviluppo sono stati messi a punto con il preciso obiettivo di essere accessibili a tutti. Abbiamo tutto per realizzare il nostro prototipo.
Per il prodotto finale dovremo sostituire Arduino Uno con una soluzione piรน adatta ad una produzione in serie, cosรฌ come probabilmente per il LED RGB, ma ce ne preoccuperemo a tempo debito.
Arduino Uno รจ giร stato oggetto di numerosi libri e articoli sulla rivista, quindi rimandiamo a questi per chi giร non ne conosce a sufficienza lโutilizzo. Ci concentriamo invece sulle caratteristiche del modulo TCS230 e sullโutilizzo dei LED RGB.
Il modulo TCS230
Il modulo TCS230 non รจ altro che una breakout board con a bordo il sensore TCS230, un convertitore programmabile che permette di trasformare la luce in ingresso in una frequenza proporzionale allโintensitร della luce percepita.
Il circuito integrato in tecnologia CMOS comprende una matrice di 8×8 fotodiodi ed un convertitore corrente-frequenza secondo lo schema a blocchi visibile in Fig. 2.
Nel sensore sono presenti tre filtri di colore R, G e B (guarda caso) e la misura delle componenti di colore consiste in una prima misura dellโintensitร della luce composta (senza filtri) e nel misurare successivamente le intensitร relative a ciascun colore applicando i filtri uno alla volta.
In Fig. 3 รจ visibile la pin-out dellโintegrato, mentre nella Tabella 1 sono descritti i significati dei singoli pin. I pin del modulo TCS230 trovano corrispondenza uno a uno con i pin dellโintegrato, come visibile nella Fig. 4.
I diodi presenti sul modulo sono alimentati in parallelo e servono ad โilluminareโ il campo di โvisioneโ del sensore.
Il modulo puรฒ essere alimentato con tensioni da 2,7V a 5,5V ed รจ quindi compatibile con i livelli dei microcontrollori alimentati sia a 3,3V che a 5V.
Il convertitore TCS230 legge i fotodiodi che compongono la matrice. In base alla configurazione dei pin di controllo S2 ed S3 (vedi Tabella 2) la matrice di diodi filtra la luce rossa, verde, blu o bianca ed emette in uscita sul pin OUT un segnale ad onda quadra con duty-cycle del 50% e frequenza direttamente proporzionale allโintensitร della luce percepita (irradianza).
Il funzionamento del sensore sfrutta il fatto che le differenti sfumature di colore possono essere ricondotte ad una combinazione dei tre colori fondamentali, rosso, verde e blu, in proporzioni appropriate (Fig. 5).
Quando viene impostato il filtro per un determinato colore predominate, ad esempio il blu, lโintegrato TCS230 misura la sola intensitร del colore esaminato, escludendo gli altri; in questo modo รจ possibile determinare la componente blu del colore in esame. Stesso procedimento per determinare lโintensitร delle componenti rossa e verde.
Lโampiezza dello spettro di frequenza emessa puรฒ essere scalata dei fattori espressi in Tabella 3 configurando opportunamente i livelli dei pin S0 ed S1, in modo da potersi adattare alle capacitร di elaborazione del microcontrollore utilizzato.
Gli ingressi e le uscite possono essere interfacciati ad un microcontrollore per la configurazione e la lettura dei valori di frequenza, cosa che noi faremo con il nostro Arduino Uno.
Il LED RGB
Per riprodurre la tonalitร di colore recepite dal sensore, utilizziamo un LED RGB, almeno nel nostro prototipo, ovvero un dispositivo optoelettronico composto da tre LED che emettono rispettivamente luce Rossa, Blu e Verde (Fig. 6).
Esistono due tipologie di questi componenti: ad anodo comune e a catodo comune. Nel primo, tutti i LED hanno lโanodo, ovvero il terminale positivo in comune, mentre i tre LED vengono comandati singolarmente pilotando il catodo di ciascuno.
Nei componenti a catodo comune, i tre LED condividono il terminale negativo, mentre il pilotaggio di ciascun singolo LED avviene utilizzando lโanodo, ovvero il terminale positivo. Una configurazione, questa, piรน adatta ad essere utilizzata con Arduino Uno.
Infatti per pilotare i LED utilizzeremo tre uscite analogiche (DAC) di Arduino Uno, in grado di convertire le grandezze digitali tra 0 e 255 in valori di tensione proporzionali tra 0 e +5V.
Ciascuna sfumatura di colore, nella rappresentazione RGB ad otto bit di precisione, รจ rappresentata da una terna di valori nellโintervallo 0-255 che rispecchia lโintensitร di ciascuna componente di colore. Per esempio, il rosso intenso รจ rappresentato dalla configurazione (255, 0, 0).
Sul web, allโindirizzo di RapidTables potete trovare una tabella interattiva nella quale, inserendo i valori delle tre tonalitร di colore base, vedrete a cosa corrispondono in RGB.
Vale la pena sottolineare una particolaritร relativa ai toni di grigio: chi si รจ occupato di elaborazione di immagini, sa che i toni di grigio sono espressi da terne di valori RGB uguali, per esempio (150, 150, 150). Non essendo possibile riprodurre, con il nostro LED, le tonalitร di grigio, faremo in modo che in queste condizioni il LED emetta luce bianca. Il LED RGB scelto per il nostro prototipo รจ siglato 540R2GBC-CC.
Strategia di elaborazione
La strategia di elaborazione per il microcontrollore del progetto รจ visibile nel diagramma a blocchi di Fig. 7: dopo le definizioni iniziali dellโambiente di elaborazione, allโaccensione del microcontrollore viene innescato il ciclo di elaborazione principale, che esegue allโinfinito le operazioni descritte qui di seguito.
Come prima operazione, tentiamo di verificare se la lampada รจ effettivamente appoggiata ad una superficie, oppure la stiamo tenendo sollevata, eventualmente per spostarla da un luogo ad un altro; in questo caso sospendiamo la funzione di โmimetismoโ saltando tutto il processo di elaborazione successivo.
Se verifichiamo che la lampada รจ appoggiata ad una superficie, dobbiamo operare sul sensore in modo da riconoscere la tonalitร di colore della superficie di appoggio.
Per ottenere questo risultato, eseguiamo una serie di letture della frequenza di uscita, la quale, come abbiamo giร visto, รจ proporzionale allโintensitร della componente luminosa, modificando di volta in volta la configurazione dei filtri.
La prima lettura viene eseguita in assenza di filtri, in modo da ottenere la luminositร totale riflessa dalla superficie. Eseguiamo le successive letture inserendo ogni volta un filtro diverso, rispettivamente il filtro per il colore rosso, il verde e il blu.
Dopo ogni lettura siamo in grado di determinare quanto la componente del colore selezionato รจ presente nella tonalitร complessiva, in termini percentuali.
Al termine delle letture prendiamo il valore maggiore tra quelli letti e gli assegniamo il livello 255 per poi rapportare gli altri due in modo proporzionale, con alcuni aggiustamenti che abbiamo trovato sperimentalmente sulla base del comportamento del sensore, come descritto nel datasheet.
La terna di valori ottenuti รจ utilizzata per configurare le tre uscite PWM che pilotano i terminali positivi del LED RGB.
Schema elettrico del prototipo con sensore di colore
Fig. 8
Nello schema in Fig. 8 possiamo vedere i collegamenti tra il sensore TCS230, la scheda Arduino Uno e il LED RGB.
Lโassemblaggio, in puro stile โprototipoโ, รจ visibile in Fig. 9.
I terminali S0 ed S1, che servono a configurare il range di frequenza della tensione emessa dallโuscita del sensore TCS230, sono collegati ai pin 2 e 3 di Arduino.
Le uscite S2 ed S3 che permettono di definire se e/o quale filtro utilizzare nella lettura delle intensitร luminose, sono collegati rispettivamente alle uscite digitali 6 e 5.
Il terminale di uscita del sensore TCS230 รจ collegato allโingresso 4 di Arduino.
Infine, i tre terminali del LED RGB sono collegati alle uscite PWM di Arduino 9 (R), 10 (G) e 11 (B). Le uscite PWM sono quelle identificate con un โ-โ sulla serigrafia della scheda.
Abbiamo usato le tre uscite citate, in quanto sono caratterizzare dallo stesso intervallo di frequenza del segnale PWM; se avessimo scelto altri pin, avremmo potuto riscontrare un funzionamento anomalo in quanto i pin 5 e 6 hanno frequenza di uscita di 976 Hz mentre gli altri pin (3, 9, 10 e 11) hanno frequenza di uscita di 488 Hz.
Per evitare sorprese e anomalie di funzionamento difficilmente individuabili, quando si affronta un progetto รจ sempre opportuno leggere i data-sheet e la documentazione dei componenti coinvolti.
Nel nostro caso, abbiamo collegato i terminali del LED RGB a tre uscite PWM caratterizzate dalla stessa frequenza.
Le tre resistente da 470 ohm limitano la corrente in ingresso ai terminali di uscita a circa 20 mA.
Sketch per Arduino Uno per la lampada cambiacolore
Lo sketch nel Listato 1 permette di gestire la logica della nostra lampada, ovvero il processo di riconoscimento del colore della base di appoggio e la sua riproduzione come tonalitร luminosa del LED RGB.
Lavorando a livello di prototipo con uno strumento semplice come Arduino, possiamo introdurre nel codice una serie di istruzioni utili ai fini del debug che poi elimineremo in fase di realizzazione del prodotto finale.
Nel nostro caso utilizzeremo il Monitor Seriale per evidenziare i valori letti ed i risultati dei calcoli eseguiti.
La costante isPresentTolerance permette di impostare un valore di soglia per verificare se la lampada รจ appoggiata o meno su una superficie.
Abbiamo usato lโaccorgimento di eseguire una lettura con i LED di illuminazione accesi ed una con i LED spenti; per accendere e spegnere i LED, si configurano opportunamente i pin S0 ed S1.
Nel caso di lampada appoggiata su una superficie, avremo due valori molto diversi, mentre nel caso di lampada โsospesaโ la luce ambiente raggiungerร comunque il sensore, fornendo due letture con valori piรน vicini.
Se la lampada รจ appoggiata ad una superficie, si misura lโintensitร totale della luce riflessa e le intensitร relative delle singole componenti di colore, applicando a ciascuna lettura i filtri opportuni mediante la configurazione dei pin S2 ed S3 del sensore TCS230.
Lโintensitร relativa di ciascuna componente viene calcolata in rapporto allโintensitร del colore complessivo, letto senza la presenza di alcun filtro.
Per leggere la frequenza emessa in corrispondenza dellโapplicazione di ciascun filtro viene utilizzata lโistruzione โpulseInโ, che legge la lunghezza di un impulso su uno specifico pin.
Lโistruzione puรฒ essere configurata per leggere la durata dellโimpulso nel livello LOW o nel livello HIGH: nel nostro caso, LOW.
In questa evenienza lโistruzione attende che il livello del pin assuma il valore LOW, poi inizia la misurazione del tempo fino a quando il livello torna HIGH, interrompendo la misurazione. Il risultato della lettura รจ in microsecondi. Il formato dellโistruzione รจ:
pulseIn(pin, value, timeout)
dove pin รจ il riferimento del pin per il quale si vuole leggere lโimpulso (int), value il livello dellโimpulso da leggere HIGH o LOW.
(int) e timeout (opzionale) corrisponde al numero di microsecondi entro i quali deve essere rilevato un impulso. Il valore predefinito รจ di un secondo (unsigned long).
Se entro il timeout non viene rilevato alcun impulso, viene prodotto come risultato il valore 0.
Lโistruzione โpulseinโ funziona per impulsi della durata tra 10 microsecondi e tre minuti, anche se per impulsi particolarmente lunghi possono verificarsi errori nelle letture.
La logica di riconoscimento del colore richiede una prima lettura in assenza di filtri, condizione che si ottiene impostando i pin S2 ed S3 rispettivamente a livello alto e basso, come specificato in Tabella 3.
Viene letto il valore presente sul pin OUT e, in sequenza, vengono impostati i filtri corrispondenti ai tre colori base e letti i valori delle relative intensitร , rapportati al valore dellโintensitร complessiva (Valore Intensitร Totale/Valore Intensitร Colore).
Per confronto e selezione dellโintensitร relativa piรน alta, viene poi calcolato il colore predominante al quale viene assegnato il valore di pilotaggio del PWM uguale a 255.
I valori di pilotaggio dei PWM per gli altri colori vengono calcolati in proporzione tra il valore letto per il colore in esame ed il valore del colore predominante rapportato a 255.
Come ultima operazione, i valori PWM calcolati vengono utilizzati per pilotare i rispettivi pin collegati ai terminali del LED RGB.
Lo sketch del Listato 1 puรฒ essere scaricato dal sito www.elettronicain.it.
Per eseguirlo, aprite lโIDE di Arduino e copiate lo sketch nellโeditor dellโIDE. Collegate Arduino Uno al PC con lโapposito cavo USB, impostate la porta COM e la scheda come indicato in precedenza, compilate ed eseguite lโupload dello sketch nel microcontrollore.
Aprite il Monitor Seriale: posizionate il sensore su oggetti o su fogli di carta di colore diversi e divertitevi a verificarne il funzionamento (Fig. 10).
Ora andiamo a vedere se la nostra stampante 3D ha terminato di realizzare lโalberello che rappresenta lโinvolucro della lampada.
Assembliamo il tutto e andiamo in giro a raccogliere i commenti sul nostro prototipo: nel mondo professionale, questa attivitร si chiama test di mercato.
Listato 1
/* Sketch lampada di Natale */ int S0 = 2; // pin controllo frequenza di output int S1 = 3; // pin controllo frequenza di output int S2 = 6; // pin controllo filtri colore int S3 = 5; // pin controllo filtri colore int taosOutPin = 4; // pin uscita frequenza int LED = 13; // pinD int R = 9; // PWM colore rosso int G = 10; // PWM colore verde int B = 11; // PWM colore Blu double Coeff = 0; int Ro = 0; // p inE int Go = 0; // pinE int Bo = 0; // pinE void setup() { TCS230setup(); Serial.begin(115200); Serial.print(โ\n\n\nready\n\n\nโ); pinMode(R,OUTPUT); //S2 pinE pinMode(G,OUTPUT); //S2 pinE pinMode(B,OUTPUT); //S2 pinE delay(100); } void loop() { Serial.print(detectColor(taosOutPin)); // impostazione seriale per debug Serial.print(โ\n\n\nโ); delay(1000); } int detectColor(int taosOutPin){ // controllo presenza superficie double isPresentTolerance = 5; double isPresent = colorRead(taosOutPin,0,0)/colorRead(taosOutPin,0,1); Serial.print(โisPresent:โ); Serial.println(isPresent,2); Serial.print(โvalore isPresentTolerance:โ); Serial.println(isPresentTolerance,2); if(isPresent < isPresentTolerance){ Serial.println(โnessuna superficie rilevataโ); return 0; } double red,blue,green; // lettura intensita della luce (senza filtri) double white = colorRead(taosOutPin,0,1); // lettura intensita componente rossa red = white/colorRead(taosOutPin,1,1); // lettura intensita componente blu blue = white/colorRead(taosOutPin,2,1); // lettura intensita componente verde green = white/colorRead(taosOutPin,3,1); Serial.print(โredโ); Serial.println(red); Serial.print(โblueโ); Serial.println(blue); Serial.print(โgreenโ); Serial.println(green); if(red > blue && red > green){ Coeff = 255 / red; Ro = 255; Go = green * Coeff; Bo = blue * Coeff; LED_RGB(Ro, Go, Bo); return 1; } if(blue > green && blue > red){ Coeff = 255 / blue; Bo = 255; Go = green * Coeff; Ro = red * Coeff; LED_RGB(Ro, Go, Bo); return 2; } if(green > blue && green > red){ Coeff = 255 / green; Go = 255; Ro = red * Coeff; Bo = blue * Coeff; LED_RGB(Ro, Go, Bo); return 3; } } double colorRead(int taosOutPin, int color, boolean LEDstate){ //make sure that the pin is set to input pinMode(taosOutPin, INPUT); taosMode(1); int sensorDelay = 3; //imposta i pin per selezionare i filtri if(color == 0){// bianco (no filtri) digitalWrite(S3, LOW); //S3 digitalWrite(S2, HIGH); //S2 // Serial.print(โ wโ); }else if(color == 1){// attiva filtro rosso digitalWrite(S3, LOW); //S3 digitalWrite(S2, LOW); //S2 // Serial.print(โ rโ); }else if(color == 2){// attiva filtro blu digitalWrite(S3, HIGH); //S3 digitalWrite(S2, LOW); //S2 // Serial.print(โ bโ); }else if(color == 3){// attiva filtro verde digitalWrite(S3, HIGH); //S3 digitalWrite(S2, HIGH); //S2 // Serial.print(โ gโ); } double readPulse; if(LEDstate == 0){ taosMode(0); // digitalWrite(LED, LOW); } if(LEDstate == 1){ taosMode(1); // digitalWrite(LED, HIGH); } delay(sensorDelay); readPulse = pulseIn(taosOutPin, LOW, 80000); // gestione timeout della lettura impulso if(readPulse < .1){ readPulse = 80000; } // spegne i LED del sensore taosMode(0); return readPulse; } // gestione modalita emissione frequenza. TaosMode(0); // zero sensore in quiete void taosMode(int mode){ if(mode == 0){ //power OFF digitalWrite(LED, LOW); digitalWrite(S0, LOW); //S0 digitalWrite(S1, LOW); //S1 // Serial.println(โmOFFmโ); }else if(mode == 1){ // frequenza 1:1 digitalWrite(S0, HIGH); //S0 digitalWrite(S1, HIGH); //S1 // Serial.println(โm1:1mโ); }else if(mode == 2){ // frequenza 1:5 digitalWrite(S0, HIGH); //S0 digitalWrite(S1, LOW); //S1 //Serial.println(โm1:5mโ); }else if(mode == 3){ // frequenza 1:50 digitalWrite(S0, LOW); //S0 digitalWrite(S1, HIGH); //S1 //Serial.println(โm1:50mโ); } return; } void LED_RGB(int Rx, int Gx, int Bx){ analogWrite(R, Rx); analogWrite(G, Gx); analogWrite(B, Bx); return; } void TCS230setup(){ // inizializza pin gestione frequenza pinMode(LED,OUTPUT); // pin di selezione dei filtri colore pinMode(S2,OUTPUT); //S2 pinMode(S3,OUTPUT); //s3 // pin di uscita conversione luce-frequenza pinMode(taosOutPin, INPUT); // pin selezione modo frequenza di uscita pinMode(S0,OUTPUT); //S0 pinB pinMode(S1,OUTPUT); //S1 pinA return; }
Schema elettrico dell’albero di Natale con sensore colore
Piano di montaggio
Elenco componenti
R1: 1 kohm R2: 1 kohm R3: 1 kohm R4: 100 ohm R5: 100 ohm R6: 100 ohm C1: 100 nF multistrato C2: 100 ยตF 25 VL elettrolitico C3: 100 nF multistrato C4: 100 ยตF 25 VL elettrolitico U1: PIC16F1827-I/P (MF1170) U2: 7805 U3: Brackout Board TCS230 D1: 1N4007 Q1: BS170 Q2: BS170 Q3: BS170 LD1: LEDRGB1W Varie: - Plug alimentazione - Zoccolo 9+9 - Strip femmina 4 poli (2 pz.) - Vite 3MA 6mm (4 pz.) - Torretta F/F 23mm (4 PZ.) - Circuito stampato
Ingegnerizzazione del prodotto
Una volta che il prototipo รจ stato โapprovatoโ, il che, come รจ capitato anche a noi, puรฒ richiedere diverse modifiche delle specifiche e rivisitazioni di soluzioni soprattutto estetiche, dobbiamo iniziare a pensare a produrne una versione โcommercialeโ.
Non possiamo certo mantenere lo schema a fili volanti ed Arduino Uno รจ decisamente troppo ingombrante e costoso per un prodotto di questo tipo. Dunque dobbiamo operare delle scelte con lโobiettivo di:
โข sostituire Arduino con un microcontrollore piรน economico e di ridotte dimensioni; la scheda Arduino Uno รจ sovrabbondante per un utilizzo in produzione e richiederebbe comunque la realizzazione di uno shield collegato con dei pin-strip, con ingombri e costi che posizionerebbero il nostro prodotto fuori mercato ancor prima di produrlo;
โข realizzare un circuito stampato che si adatti alla disposizione dei componenti, ovvero il sensore verso il basso e il o i LED RGB verso il centro della lampada, e che si adatti ad essere alloggiato allโinterno della lampada stessa;
โข proteggere il codice in modo che non sia facilmente replicabile da chi volesse copiare il progetto per un uso commerciale;
โข realizzare il tutto in modo che sia facilmente gestibile a chi dovrร occuparsi di assemblaggi, montaggio, gestione a magazzino e spedizione.
Per la lampada, anche qui dipende dal numero di pezzi da ottenere: con la stampante 3D possono essere realizzati prototipi e piccole serie, mentre per la produzione di massa รจ probabilmente meglio rivolgersi a stampatori con impianti a iniezione; in questo caso la produzione deve prevedere volumi veramente grandi, per ammortizzare il costo di allestimento degli stampi e dellโattrezzaggio delle macchine di produzione.
Quanto al microcontrollore, avremmo potuto scegliere un micro Atmel compatibile con il codice scritto per il prototipo, per poi compilarlo e caricarlo sul micro stesso con una tecnica che non richieda il bootloader, come ampiamente descritto nel libro โArduino e le Tecniche di programmazione dei microcontrollori Atmelโ.
Invece abbiamo preferito una soluzione โscomodaโ ma che viene adottata molto spesso in questo tipo di realizzazioni: siamo โandati a cadereโ su un microcontrollore ultraeconomico della Microchip, e precisamente il PIC16F1827.
Definiamo la scelta โscomodaโ perchรฉ dobbiamo riscrivere o meglio โportareโ il codice scritto per Arduino UNO in una forma utilizzabile per il micro PIC16F1827.
I motivi per cui abbiamo scelto un prodotto Microchip e in special modo questo micro, sono i seguenti:
โข ha un costo contenuto;
โข รจ disponibile sia in contenitore PDIP che SMD;
โข รจ dotato di clock interno, il che ci evita il ricorso a quarzi e componenti aggiuntivi, con il conseguente ulteriore contenimento dei costi;
โข presenta consumi ridotti;
โข dispone di 15 pin di I/O, ciascuno in grado di pilotare un LED;
โข ha un numero di pin PWM (4) sufficienti per i nostri scopi;
โข presenta compatibilitร pin to pin con micro della stessa famiglia con piรน funzionalitร .
Come ulteriore โingegnerizzazioneโ di prodotto, abbiamo sostituito il LED RGB con uno piรน potente e con una gestione migliore della luce prodotta, anche se questo ha comportato la necessitร di pilotare ciascun โcoloreโ con un circuito di potenza basato su un transistor MOSFET.
Il risultato finale รจ visibile nello schema elettrico qui sotto (notate che il LED RGB รจ composto dai diodi LD1r, LD1g, Ld1b). Possiamo vedere, con riferimento anche al Listato 2, le assegnazioni dei pin del microcontrollore Microchip PIC16F1827.
Nello schema elettrico รจ indicato sia il nome โfunzionaleโ del pin che il suo numero di riferimento. Come si vede nel Listato 2, i pin RB1, RB2, RB4 ed RB5 sono pin digitali di output, che pilotano gli ingressi del sensore TCS230.
Su RB7 viene letta la durata dellโimpulso risultato della misurazione dellโintensitร di luce. Come pin di uscita PWM abbiamo utilizzato CCP2, CCP3 e CCP4, ai quali fanno capo i terminali del LED di potenza B, G ed R.
Lโalimentazione per il microcontrollore e per il resto del circuito รจ fornita dallo stadio di alimentazione costruito attorno allโintegrato U2, un regolatore di tensione lineare di tipo 7805, con un diodo di protezione dallโinversione di corrente e le celle di livellamento e stabilizzazione della tensione realizzate con i condensatori C1, C2, C3 e C4.
Dato lโalto consumo del circuito, dovuto principalmente al LED di potenza, raccomandiamo di utilizzare un alimentatore esterno in CC stabilizzato che eroghi una tensione non superiore a 7,5 V.
Questo, per evitare un eccessivo surriscaldamento dellโintegrato 7805.
Listato 2
โ************************************************************** โ* Name : LampadaCamaleonte.pbp * โ* PIC : 16F1827 * โ* Notes : Firmware Lampada Camaleonte * โ* Riproduce i colori della superficie di appoggio * โ************************************************************** INCLUDE โmodedefs.basโ โ@ DEVICE INTRC_OSC_NOCLKOUT โ@ DEVICE MCLR_OFF DEFINE OSC 16 โDEFINE PULSIN_MAX 1350 โDEFINE PULSIN_MAX 1750 ADCON0 = %00000000 OPTION_REG.7=0 โCMCON0 =%00000111 ANSELA=%00000000 ANSELB=%00000000 โOSCCON=%01101010 OSCCON=%01111010 APFCON0.3=0 โCCP2 su pin Rb6 โMDSRC=%00000011 โWPU=%00010000 โ********************** Definizione porte del PIC ***************************** SYMBOL TX = PORTB.3 โPin 9 - Dati Seriali in uscita SYMBOL S0 = PORTB.2 โ Pin 8 SYMBOL S1 = PORTB.1 โ Pin 7 SYMBOL S2 = PORTB.5 โ Pin 11 SYMBOL S3 = PORTB.4 โ Pin 10 SYMBOL OUTC = PORTB.7 โ Pin 13 Coeff VAR WORD Ro VAR word Go VAR word Bo VAR word white VAR WORD white_off VAR WORD red VAR WORD blu VAR WORD green VAR WORD Tolerance VAR WORD mode VAR BYTE DEFINE CCP3_REG PORTA โHpwm 1 pin port DEFINE CCP3_BIT 3 โHpwm 1 pin bit DEFINE CCP4_REG PORTA โHpwm 1 pin port DEFINE CCP4_BIT 4 โHpwm 1 pin bit DEFINE CCP2_REG PORTB โHpwm 1 pin port DEFINE CCP2_BIT 6 โHpwm 1 pin bit INPUT OUTC OUTPUT S0 OUTPUT S1 OUTPUT S2 OUTPUT S3 โ********************* Dichiarazione variabili ****************************** CONTA VAR WORD โContiene la lunghezza dellโimpulso ERRORE VAR BYTE โ0:Nessun errore nel segnale - 1:Segnale non valido Ro = 0 Go = 0 Bo = 0 CONTA=0 ERRORE=0 โ************************ Inizializzazione programma ************************** INIZIO: CLEAR SEROUT tx,T9600,[13,10,โSYSTEM STARTUP v1.0โ,13,10] โโ********************************** M A I N *********************************** โLettura lunghezza impulso โ0โ e successivamente lettura treno di bit ricevuti MAIN: mode = 3 GOSUB TAOS_MODE CONTINUA: โ Legge il bianco LOW S3 HIGH S2 GOSUB LEGGI_COLORE SEROUT tx,T9600,[13,10,โW:โ,#CONTA,โ (โ,#S2,โ-โ,#S3,โ)โ,13,10] white = CONTA * 100 SEROUT tx,T9600,[13,10,โWx:โ,#white,โ (โ,#S2,โ-โ,#S3,โ)โ,13,10] โ Legge il rosso LOW S3 LOW S2 GOSUB LEGGI_COLORE SEROUT tx,T9600,[13,10,โR:โ,#CONTA,โ (โ,#S2,โ-โ,#S3,โ)โ,13,10] red = white / CONTA SEROUT tx,T9600,[13,10,โRx:โ,#red,โ (โ,#S2,โ-โ,#S3,โ)โ,13,10] โ Legge il verde HIGH S3 HIGH S2 GOSUB LEGGI_COLORE SEROUT tx,T9600,[13,10,โG:โ,#CONTA,โ (โ,#S2,โ-โ,#S3,โ)โ,13,10] green = white / CONTA SEROUT tx,T9600,[13,10,โGx:โ,#green,โ (โ,#S2,โ-โ,#S3,โ)โ,13,10] โ Legge il blu HIGH S3 LOW S2 GOSUB LEGGI_COLORE SEROUT tx,T9600,[13,10,โB:โ,#CONTA,โ (โ,#S2,โ-โ,#S3,โ)โ,13,10] blu = white / CONTA SEROUT tx,T9600,[13,10,โBx:โ,#blu,โ (โ,#S2,โ-โ,#S3,โ)โ,13,10] IF red >= blu AND red >= green THEN Coeff = 25500 / red Ro = 255 Go = green * Coeff / 100 Bo = blu * Coeff / 100 Bo=Bo * 3 / 4 Go=Go * 3 / 4 ENDIF IF blu >= red AND blu >= green THEN Coeff = 25500 / blu Bo = 255 Go = green * Coeff / 100 Ro = red * Coeff / 100 Ro=Ro * 3 / 4 Go=Go * 3 / 4 ENDIF IF green >= blu AND green >= red THEN Coeff = 25500 / green Go = 255 Ro = red * Coeff / 100 Bo = blu * Coeff / 100 Bo=Bo * 3 / 4 Ro=Ro * 3 / 4 ENDIF HPWM 2,bO,100 HPWM 3,gO,100 HPWM 4,rO,100 SEROUT tx,T9600,[13,10,โRGB:โ,#Ro,โ-โ,#Go,โ-โ,#Bo,13,10] pause 500 GOTO CONTINUA TAOS_MODE: SELECT CASE mode CASE 0 LOW S0 LOW S1 CASE 1 HIGH S0 HIGH S1 CASE 2 HIGH S0 LOW S1 CASE 3 LOW S0 HIGH S1 END SELECT pause 50 RETURN LEGGI_COLORE: pause 50 PULSIN OUTC,0,CONTA RETURN
Per quanto riguarda la breakout board TCS230, alimentazione a parte, lโunica nota da aggiungere, come nel caso del prototipo, รจ il collegamento a massa del terminale OE, in modo da mantenere sempre in funzione il sensore.
Per pilotare correttamente il LED di potenza, per ciascun terminale โcoloreโ del LED รจ inserito un circuito di potenza costituito da un MOSFET BS170, con relativa resistenza di limitazione.
Le resistenze R4, R5 ed R6 limitano la corrente assorbita da ciascun terminale del LED di potenza.
Se date unโocchiata al circuito stampato potete notare lโadattamento della realizzazione per lโutilizzo con la lampada.
Abbiamo previsto di montare il sensore al di sotto dello stampato, rivolto verso la superficie della quale si vuole rilevare il colore, mentre gli altri componenti, sono montati superiormente, in particolare il LED di potenza in posizione โcentraleโ, in modo da diffondere la luce nel modo migliore.
La disposizione dei componenti รจ visibile nel โPiano di montaggioโ.
Abbiamo montato sullโalloggiamento della breakout board TCS230 due strip di connettori femmina, cosรฌ come abbiamo adottato uno zoccolo per lโintegrato PIC16F1827.
Chiaramente, in caso di montaggio di produzione questi ultimi componenti verrebbero saldati direttamente sullo stampato. Ma tantโรจ, alla fine ha prevalso lo spirito del โkitโ.
Quattro โcolonnineโ, dalla parte della breakout board, costituiscono una solida base sulla quale poggiare il tutto. Portiamo lโattenzione sul software di gestione della lampada, da installare sul microcontrollore PIC16F1827.
Per il โporting del software abbiamo scelto il linguaggio di sviluppo Pic Basic Pro, una versione di BASIC appositamente destinato allo sviluppo sui microcontrollori Microchip. Per la programmazione dobbiamo utilizzare un programmatore Pic.
Nel Listato 2 vediamo il risultato del โportingโ, che rispetta la logica di elaborazione vista nel diagramma a blocchi di Fig. 7.
I commenti nel listato e la sua โsomiglianzaโ con lo sketch di Arduino non dovrebbero lasciare dubbi di interpretazione.
Download del codice dell’Albero di Natale โCamaleonteโ
Codice per Albero di Natale Camaleonte
1 file(s) 2 KB
Per il download di questo file รจ necessario essere registrati al sito
Per rendere โmodulareโ lโutilizzo della lampada, ovvero per offrire la possibilitร di sostituire lโalbero con contenitori di altre forme, abbiamo separato la base della lampada dal โlumeโ.
Come base abbiamo stampato un cilindro di 70 mm di diametro e 40 mm di altezza, in modo da contenere tutto il circuito della lampada e fornire supporto alla parte superiore (vedere la Fig. 11).
Abbiamo quindi praticato un foro laterale da 10 mm di diametro in corrispondenza del plug di alimentazione per fare passare il jack dellโalimentatore.
Finalmente (lo vedete nella Fig. 12) abbiamo raggiunto il risultato finale del nostro processo: la lampada di โNataleโ che si adatta al colore dellโoggetto dove viene appoggiata.
Provate ad appoggiarla sulle confezioni dei regali o sulla tovaglia della tavola di Natale e vedrete che prenderร il loro colore.
Ora non ci resta che salutarvi, augurarvi buon divertimento e …Buone Feste!