Titolo del Campetto: Come equipaggiarsi per un viaggio interspaziale in poche semplici mosse

Scopo: costruiremo non una solita pila, ma una pila a led rgb (che possono cambiare colore) impostando moltissimi effetti luminosi

Date: 28 - 29 marzo 2015

Luogo: Sede del Gruppo Scout Cittadella 2

Specialità: Elettronico

 

L'evento è rivolto ai ragazzi/e appartenenti al reparto che abbiano minimo 11 anni e massimo 14 e non più di due ragazzi per reparto.

 

 

Controllo luci

 

Cosa faremo

In pratica costruiremo una pila a led a RGB, una serie di speciali led che hanno 4 piedini con cui è possibile variare il colore.

Il tutto sarà affiancato da un microcontrollore (componente con microprocessore, ram e eeprom al suo interno) Atmel ATMEGA328P-PU AVR da 8bit che programmeremo per creare degli effetti luminosi.

Scopriremo anche come realizzare un circuito stampato da zero e con pochi materiali poco costosi.

 

La pila sarà alimentata da una batteria da 9volt, sostituibile anche con qualsiasi batteria tra 7 fino a 25 volt.

Questa sarà composta da 3 intruttori, uno di acensione e agli altri due per selezionare gli effetti e da un pulsante per attivarli.

Schema elettrico

PCB Scheda

Componenti

 

1 microcontrollore Atmel ATMEGA328P-PU AVR 8bit, 20MHz, 28pin

2 condensatori ceramici multistrato da 22pF

1 quarzo 16MHz HC-49-4H

1 LM7805CT TO-220

1 condensatore elettrolitico da 47uF

1 condensatore elettrolitico da 10uF

4 led rgb ad alta luminosità

3 resistenze da 47kohm 1/4W

3 resistenze da 220ohm da 1/2 W

1 interuttore

1 dip switch a 3 bit

1 connettore per batterie da 9volt

1 zoccolo da 28pin

 

Programma C - non definitivo

 

/*
Titolo: PILA - Campetto Specialità Elettronico 2015

Questo programma implementa le funzionalità di una pila a RGB
le funzioni sono 11:

DIP SWITCH: | 0 | 0 | 0 |
Spento

DIP SWITCH: | 1 | 0 | 0 |
Premendo il pulsante si illuminano tutti i led

DIP SWITCH: | 1 | 1 | 0 |
Premendo il pulsante una volta si illuminano i led rossi
Premendo il pulsante una seconda volta si illuminano i led verdi
Premendo il pulsante una terza volta si illuminano i led blu

DIP SWITCH: | 1 | 0 | 1 |
Premendo il pulsante una volta modulo i led rossi in PWM
Premendo il pulsante una seconda volta modulo i led verdi in PWM
Premendo il pulsante una terza volta modulo i led blu in PWM
Premendo il pulsante una quarta volta modulo tutti i led in PWM

DIP SWITCH: | 1 | 1 | 1 |
Premendo il pulsante una volta lampeggio i led rossi
Premendo il pulsante una seconda volta lampeggio i led verdi
Premendo il pulsante una terza volta lampeggio i led blu

Il circuito:
* tasto collegato al piedino 2 in pull-up con resistenza da 47k
* dipswirch0 collegato al piedino 3 in pull-up con resistenza da 47k
* dipswirch1 collegato al piedino 4 in pull-up con resistenza da 47k
* LED rosso collegato con anodo al piedino 9 e catodo a massa
* LED verde collegato con anodo al piedino 10 e catodo a massa
* LED blu collegato con anodo al piedino 11 e catodo a massa

Creato:      12 febbraio 2015
da Cosma Stefano
Modificato:  12 febbraio 2015
da Cosma Stefano

Copyleft - Tutti i diritti sono riservati per scopo didattico
*/

#define RED 9                // pin 9 controllo led rosso
#define GREEN 10          // pin 6 controllo led verde
#define BLUE 11            // pin 11 controllo led blu
#define tasto      2         // pin 2 tasto in pull-up
#define dipswitch0 3       // pin 3 dipswitch 0 in pull-up
#define dipswitch1 4       // pin 4 dipswitch 1 in pull-up
#define delayTime 5        // ritardo fade led
#define time 200            // ritardo led

int cont=0;
boolean S0=LOW;
boolean S1=LOW;
//funzione impostazione
void setup()
{
  pinMode(RED, OUTPUT);           //imposto il pin rosso come uscita
  pinMode(GREEN, OUTPUT);       //imposto il pin verde come uscita
  pinMode(BLUE, OUTPUT);         //imposto il pin blu come uscita
  pinMode(tasto, INPUT);            //imposto il tasto 1 come ingresso
  pinMode(dipswitch0, INPUT);     //imposto il dipswitch 0 come ingresso
  pinMode(dipswitch1, INPUT);     //imposto il dipswitch 1 come ingresso
}

//funzione "main" principale
void loop()
{
  if(!digitalRead(dipswitch0)!=S0 || !digitalRead(dipswitch1)!=S1)
    cont=0;
  if(!S0 && !S1)
  {
    funzione_0();
  }
  else if(!S0 && S1)
  {
    funzione_1();
  }
  else if(S0 && !S1)
  {
    funzione_2();
  }
  else if(S0 && S1)
  {
    funzione_3();
  }
  S0=!digitalRead(dipswitch0);  //value_dipswitch(dipswitch0);
  S1=!digitalRead(dipswitch1);  //value_dipswitch(dipswitch1);
}

void funzione_0()
{
  if(!digitalRead(tasto))
    illumina(1,1,1);
  else
    illumina(0,0,0);
}

void funzione_1()
{
  controllo_tasto();            //controllo se il tasto 1 è stato premuto
 
  switch(cont)
  {
    case 0:                     //se il tasto non è stato premuto o in posizione 0
      illumina(0,0,0);        //spengo tutti i led
    break;
    case 1:                     //se il tasto non è stato premuto o in posizione 0
      illumina(1,0,0);        //accendo solo il rosso
    break;
    case 2:                     //se il tasto non è stato premuto o in posizione 0
      illumina(0,1,0);        //accendo solo il verde
    break;
    case 3:                     //se il tasto non è stato premuto o in posizione 0
      illumina(0,0,1);        //accendo solo il blu
    break;
    case 4:                     //se il tasto non è stato premuto o in posizione 0
      illumina(1,1,1);        //accendo tutti i led
    break;
    default:
      cont=0;                   //se il tasto non è stato premuto o in posizione 0                   
  }
}
void funzione_2()
{
  controllo_tasto();          //controllo se il tasto 1 è stato premuto
 
  switch(cont)
  {
    case 0:                      //se il tasto non è stato premuto o in posizione 0
      illumina(0,0,0);         //spengo tutti i led
    break;
    case 1:                      //se il tasto non è stato premuto o in posizione 0
      fadeLED(RED);         //accendo solo il rosso
    break;
    case 2:                      //se il tasto non è stato premuto o in posizione 0
      fadeLED(GREEN);      //accendo solo il verde
    break;
    case 3:                     //se il tasto non è stato premuto o in posizione 0
      fadeLED(BLUE);        //accendo solo il blu
    break;
    case 4:                     //se il tasto non è stato premuto o in posizione 0
      fade();                    //accendo tutti i led
    break;
    default:
      cont=0;                   //se il tasto non è stato premuto o in posizione 0
  }
}
void funzione_3()
{
  controllo_tasto();            //controllo se il tasto 1 è stato premuto
 
  switch(cont)
  {
    case 0:                     //se il tasto non è stato premuto o in posizione 0
      illumina(0,0,0);          //spengo tutti i led
    break;
    case 1:                     //se il tasto non è stato premuto o in posizione 0
      lamp(1,0,0);              //accendo solo il rosso
    break;
    case 2:                     //se il tasto non è stato premuto o in posizione 0
      lamp(0,1,0);              //accendo solo il verde
    break;
    case 3:                     //se il tasto non è stato premuto o in posizione 0
      lamp(0,0,1);              //accendo solo il blu
    break;
    default:
      cont=0;                   //se il tasto non è stato premuto o in posizione 0
  }
}

//funzione di modulazione colore dei led
boolean fade()
{
  //faccio crescere il rosso e decrescere il blu
  for(int fadeValue = 0; fadeValue <= 255; fadeValue++)
  {
    //scrivo i valori in PWM
    analogLED(fadeValue, 0, 255-fadeValue);
    //ritardo, se il tasto 1 è premuto esco con valore basso
    if(delaytast(time))
      return LOW;
  }
 
  //faccio crescere il verde e decrescere il rosso
  for(int fadeValue = 0; fadeValue <= 255; fadeValue++)
  {
    //scrivo i valori in PWM
    analogLED(255-fadeValue, fadeValue, 0);
    //ritardo, se il tasto 1 è premuto esco con valore basso
    if(delaytast(time))
      return LOW;
  }
 
  //faccio crescere il blu e decrescere il verde
  for(int fadeValue = 0; fadeValue <= 255; fadeValue++)
  {
    //scrivo i valori in PWM
    analogLED(0, 255-fadeValue, fadeValue);
    //ritardo, se il tasto 1 è premuto esco con valore basso
    if(delaytast(time))
      return LOW;
  }
}

//funzione di modulazione di un singolo colore
boolean fadeLED(int pinled)
{
  illumina(0,0,0);
  for(int fadeValue = 0; fadeValue <= 255; fadeValue++)
  {
    //scrivo i valori in PWM
    analogWrite(pinled, fadeValue);
    if(delaytast(time))
      return LOW;
  }
  for(int fadeValue = 0; fadeValue <= 255; fadeValue++)
  {
    //scrivo i valori in PWM
    analogWrite(pinled, 255-fadeValue);
    //ritardo, se il tasto 1 è premuto esco con valore basso
    if(delaytast(time))
      return LOW;
  }
}

//faccio per impostare in uscita i colori dei led in PWM analogici
void analogLED(int ledrosso, int ledverde, int ledblu)
{
  analogWrite(RED, ledrosso);
  analogWrite(GREEN, ledverde);
  analogWrite(BLUE, ledblu);
}

//faccio per impostare in uscita i colori dei led in digitale
void illumina(int ledrosso, int ledverde, int ledblu)
{
  digitalWrite(RED, ledrosso);
  digitalWrite(GREEN, ledverde);
  digitalWrite(BLUE, ledblu);
}

//funzione di ritardo che controlla il tasto 1 in ingresso
//se premuto resitutisce valore alto altrimenti basso
boolean delaytast(int tempo)
{
  //ciclo di ritardo "tempo"
  for(int c=0; c<tempo; c++)
  {
    if(controllo_tasto() == LOW)    //se il tasto 1 è premuto esco con valore alto
      return HIGH;
    if(!digitalRead(dipswitch0)!=S0 || !digitalRead(dipswitch1)!=S1)
    {
      cont=0;
      return HIGH;
    }
  }
  return LOW;                       //altrimenti con valore basso
}

//funzione che controlla la pressione del tasto con "antirimbalzo" di 200ms
//se premuto incrementa il contatore
boolean controllo_tasto()
{
  if(!digitalRead(tasto))
  {
    cont++;
    delay(200);
  }
}

//funzione di lampeggio led con un ritardo di 24000000 cilci macchina
boolean lamp(int ledrosso, int ledverde, int ledblu)
{
  illumina(0,0,0);                 //spengo tutti i led
  delaytast(24000000);             //controllo se il tasto 1 è stato premuto
  illumina(ledrosso, ledverde, ledblu);  //accendo solo i led stabiliti
  delaytast(24000000);             //controllo se il tasto 1 è stato premuto
}