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.
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.
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
}