Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

12
voti

Effetto SUPERCAR con PIERIN AT90

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.

SupercarAT90.jpg

SupercarAT90.jpg

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. :)

8

Commenti e note

Inserisci un commento

di ,

Me l'ho metto sulla moto XD.

Rispondi

di ,

Vedo che nei cablaggi sei poco ordinato, eh? :D Scherzi a parte, articolo molto interessante! PS: anch'io son per le cose ordinate, precise! ;)

Rispondi

di ,

@crestus: Non saprei, io leggo il datasheet. Le porte, i moduli, i timers più o meno si assomigliano tutti. Se non ricordo male tu hai esperienza sui PIC. Con gli AVR cambiano i nomi dei registri, magari il modo di settare/resettare i bit. Nei PIC usi una struct predefinita come LATA.LATA5, con gli AVR e gcc scrivi 1<

Rispondi

di ,

Azz, è stato un lapis ... pardon un lapsus. :D

Rispondi

di ,

KITT la macchina di Magnum!?! Knight Industries Two Thousand; acronimo in K.I.T.T. Magnum aveva una Ferrari, che in realtà nemmeno era sua ma di Robin Masters... Ma che infanzia hai avuto?

Rispondi

di ,

Grazie, modifico subito. OK!

Rispondi

di ,

della serie: quando la programmazione può diventare divertente. solo una cosa: KIT non era la macchina di Magnum P.I.... :)

Rispondi

di ,

Visto che i programmi iniziano subito con l'utilizzare funzionalità avanzate, dove è possibile trovare informazioni sull'utilizzo delle funzionalità del micro? è disponibile una guida dettagliata per la programmazione? :)

Rispondi

Inserisci un commento

Per inserire commenti è necessario iscriversi ad ElectroYou. Se sei già iscritto, effettua il login.