I circuiti a LED o lampadine che simulano l' effetto SUPERCAR, quello con le lucine che vanno avanti ed indietro montato nell' automobile KITT, è molto richiesto ed apprezzato. Talmente apprezzato che ognuno lo vorrebbe diverso dagli schemi che trova in rete. Rispolverando le discussioni in cui gli utenti chiedevano informazioni e circuiti ed ho notato che alcuni hanno bisogno di un preciso numero di LED, molti vorrebbero avere la velocità di scansione regolabile altri che vorrebbero l' effetto "avanti ed indietro" ed altri solo in una direzione.
Ho ancora il Pierin montato sulla breadboard e, visto che in questi giorni sono praticamente in vacanza pur rimanendo a casa, ho pensato di scrivere un programmino per realizzare l' applicazione in oggetto. Il programma non è niente di speciale. Permette di predisporre esternamente il numero dei LED desiderato (da 5 a 20), il modo di funzionamento (monodirezionale/bidirezionale) tramite ponticelli o dip-switches e la velocità di scansione tramite un trimmer.
Il circuito è quindi alla portata di chi non ha esperienza di programmazione sui microcontrollori. Si stratta di montare il circuito, collegarlo all' USB e scaricarci direttamente il file .HEX tramite il software (gratuito) FLIP della Atmel.
Indice |
Il circuito
Il circuito è semplicissimo. Se lo si realizza su un circuito stampato fatto ad hoc bisogna anche considerare i componenti montati sulla scheda del Pierin. Il circuito completo del Pierin lo trovate in questo articolo.
Nota: i pin del Pierin corrispondono esattamente ai pin del micrcontrollore.
Le uscite da LED0 a LED19 sono le uscite che pilotano i LED o i transistors (nel caso si vogliano usare LED potenti o lampadine). Il numero minimo di uscite è 5 (da LED0 a LED4) anche perché un effetto supercar con meno di 5 LED è una cosa da barboni. Il trimmer da 4K7 serve per regolare la velocità di scansione. L' ingresso EFF se collegato al +5V fa scorrere il LED avanti ed indietro, se collegato a massa (GND) i LED scorrono solo in una direzione. Gli ingressi da N0 a N3 servono per impostare il numero dei LED secondo questa tabella.
E quindi andranno opportunamente collegati al +5V o alla massa a seconda di quanti LED si desidera utilizzare.
Collegamento dei LED
Le uscite sono attive una alla volta quindi possiamo chiedere al micro una corrente anche superiore ai classici 20mA. I LED si possono così collegare alle uscite con una opportuna resistenza in serie. In alternativa si può pilotare un transistor o un' array di transistors come l' ULN2003A che contiene 7 darlington.
Nel collegamento di sinistra la resistenza R1 è stata calcolata per pilotare un LED rosso con caduta di tensione 1,2V e corrente 20mA. Il circuito di destra permette di pilotare un carico di 500mA connesso fra il collettore di Q1 e il positivo.
Il programma
Il programmino non è niente di speciale e questa volta l' ho scritto utilizzando AVR Studio 4. Utilizza un' interrupt ciclica che viene chiamata ogni ms. e che aggiorna un timer software. La velocità, o meglio il ritardo, fra un LED e l' altro è ottenuto leggendo il valore della tensione sull' ingresso ADC0. La tensione di riferimento è impostata su AVCC. LA variabile "direzione" assume i valori 1 o -1 a seconda del movimento. Rimane sempre a 1 nel movimento in una sola direzione.
/* * SupercarAT90.c * * Created: 25/07/11 12:29:15 * Author: TardoFreak * Note: 4.3° earthquake at 14:32. Author ran scared!!! */ #include <avr/io.h> #include <avr/interrupt.h> #include <avr/wdt.h> #include <avr/pgmspace.h> // Timer software. // Nota: vanno dichiarate come "volatile" per fare in modo che il // valore sia sempre e comunque letto evitando che l' ottimizzazione // non lo faccia. volatile unsigned short SoftTimer1; // Routine di servizio chiamata quando il contenuto del comparatore A // corrisponde al valore del timer. Quando raggiunge tale valore il // timer viene resettato e viene invocata questa routine. ISR(TIMER1_COMPA_vect) { if(SoftTimer1) SoftTimer1--; } //-------------------------------------------------------------------------- int main(void) { unsigned int ValADC; char numero_led; char c,direzione; unsigned long int uscite; // disabilita watchdog MCUSR &= ~(1 << WDRF); wdt_disable(); // Inizializza timer 1 per timeout 1ms // Questa istruzione assicura che l' I/O clock per il timer1 sia abilitato PRR0 &= ~(1<<PRTIM1); // Carica il registro di comparazione per ottenere 1ms OCR1A = 1250; // Enable output compare A match TIMSK1 = (1<<OCIE1A)|(0<<TOIE1); // Avvia il timer1, prescaler 1/8 modo operativo Clear Top Count TCCR1B = (0<<WGM13)|(1<<WGM12)|(0<<CS12)|(1<<CS11)|(8<<CS10); // Predispone la porta A come ingresso DDRA = 0x00; // Predispone la porta B come uscita DDRB = 0xff; // Predispone la porta C come uscita DDRC = 0xff; // Predispone la porta D come uscita DDRD = 0xff; // Inizializza ADC // Disabilita l' ingresso digitale ADC0 DIDR0 = 0x01; // Seleziona il canale 0 single ended (tutti i bit a 0) // e Vref=Avdd ADMUX = (0<<REFS1)|(1<<REFS0); // Abilita il convertitore e seleziona prescaler a 128 ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0); // ADCSRB non lo tocchiamo, va bene così. // Abilita le interrupt sei(); c=0; direzione = 1; // Ciclo principale infinito. while(1) { if(!SoftTimer1) { // Fa partire la conversione ADCSRA |= (1<<ADSC); // Attende la fine della conversione while(ADCSRA&(1<<ADSC)); // ottiene il numero dei LED da utilizzare // Dal codice presente nei pin PA0 PA1 e PA2 e PA3 numero_led = 5 + (PINA & 0x0F); ValADC = ADCL + (ADCH << 8); c += direzione; // Effetto avanti-indietro if (PINA & 0x10) { if (c>=numero_led-1) { c = numero_led-1; direzione = -1; } if (c == 0) { direzione = 1; } } // Effetto monodirezionale else { // si assicura che la direzione sia sempre quella giusta direzione = 1; if (c>=numero_led) c=0; } // Mette la configurazione nelle porte uscite = (unsigned long int) 1 << c; PORTB = uscite & 0xff; PORTD = (uscite >> 8) & 0xff; PORTC = (uscite >> 16) & 0xff; // Ricarica il timer software SoftTimer1 = ValADC/8 + 5; // Carica il timer software per intervallo 500ms. } } }
Da notare l' istruzione iniziale per la disabilitazione del watchdog ed un paio di piccoli ma importanti particolari. Innanzi tutto la verifica della fine della scansione non è fatta utilizzando un "==" ma un ">=" perché gli ingressi si possono cambiare "al volo" mentre il circuito funziona. Il secondo particolare è nell' istruzione
uscite = (unsigned long int) 1 << c;
dove viene espressamente specificato il tipo di risultato che bisogna ottenere dalla funzione di shift a sinistra. Il risultato deve essere un "unsigned long int" a 32 bit ed è necessario specificarlo altrimenti il compilatore non lo calcola correttamente. Questo programma può essere preso come scheletro o esempio per realizza magari effetti personalizzati.
La programmazione del micro
La modalità di programmazione del file .HEX nel micro è ben descritta in questo articolo. Nel mio Pierin ho montato un AT90USB1287 ma il programma può benissimo funzionare con un AT90USB646 che costa molto di meno (su RS costa la metà del fratello maggiore). Per chi non ha dimestichezza con la programmazione ho allegato il file SupercarAT90.hex che contiene il programma già compilato e pronto all' uso.
Conclusioni
Questo è il circuito montato. Questa volta ho provato ad utilizzare la breadboard e devo dire che mi sono trovato bene. Una bella esperienza. Penso che la utilizzarò ancora in futuro. L' immagine trae in inganno perché i LED si accendo uno per volta. Si vedono tre LED accesi ma è solo per il fatto che senza flash il tempo di esposizione è lungo. Però rende bene l' idea dell' effetto a livello visivo.
Questo circuito, può essere una soluzioni flessibile per i vari ragazzi che intendono abbellire la propria auto o motocicletta con l' effetto di KITT. Personalmente ritengo la cosa una mezza tamarrata ma forse solo perché non sono più un ragazzino. A pensarci bene, se ne avessi avuto la possibilità, forse l' avrei montata anch' io una cosa del genere sulla mia auto ... o forse no, ma de gustibus non disputandum est ed ognuno è libero di fare quello che gli da più soddisfazione visto che si vive una volta sola. Diciamo che il fatto di utilizzare un microcontrollore ha i suoi vantaggi. Il Pierin può essere riprogrammato attraverso l' USB, addirittura direttamente sull' auto/moto caricandogli di volta in volta effetti personalizzati. E magari, visto che la memoria utilizzata è poca, nessuno vieta di fargli fare altre cose mentre controlla i LED.
Una piccola nota di colore. Mentre scrivevo il programma un terremoto ha scosso la casa. Abito qui da quando avevo 16 anni e questo è stato il più forte che ho sentito. Un movimento ondulatorio/sussultorio che mi aperto qualche cassettino e fatto cadere qualche oggetto non ostante il laboratorio sia nel semi interrato. Inutile dire che ho fotto uno scatto da centometrista per uscire fuori in giardino. Spero che mi perdoniate se mi è sfuggito qualcosa o ho commesso qualche errore, sono ancora molto scosso. :)