Gioco di luci didattico con AtMega328 standalone

Ecco a voi un nuovo tutorial didattico su un piccolo circuito utilizzando l’integrato AtMega328 in standalone.

Lista componenti:

  • 1 batteria da 9 Volt
  • 1 Regolatore di carica 7805
  • 1 condensatore ceramico da 0,33 uF (oppure elettrolito da 100 uF)
  • 1 condensatore ceramico da 0,1 uF (oppure elettrolito da 10 uF)
  • 2 condensatori ceramici da 22 pF
  • 3 resistenze da 10 Kohm (marrone, nero, arancione)
  • 1 quarzo da 16 MHz
  • 2 switch
  • 6 led
  • 6 resistenze da 220 ohm (rosso, rosso, marrone)

Ecco lo schema:

gioco di luci_circuito

 

PCB:

Se non sai come fare un circuito stampato leggi il mio tutorial clicca qui!

gioco di luci_pcb

Ecco il file in pdf del circuito stampato: Circuito Stampato

Sketch da caricare sull’atmega328:

Se non sai come caricare uno sketch su un atmega328 in standalone clicca qui!

// Gioco di luci con atmega328 www.giuseppecaccavale.it
// Written by Giuseppe Caccavale

const int puls1 = 10;
const int puls2 = 12;

int pulsante1 = 0;
int pulsante2 = 0;

const int led1 = A5;
const int led2 = A3;
const int led3 = A1;
const int led4 = 13;
const int led5 = 11;
const int led6 = 9;

int tempo = 300;

void setup(){
  pinMode(puls1, INPUT);
  pinMode(puls2, INPUT);

  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  pinMode(led5, OUTPUT);
  pinMode(led6, OUTPUT);
}

void loop(){
  pulsante1 = digitalRead(puls1);
  pulsante2 = digitalRead(puls2);

  if((pulsante1 == LOW) && (pulsante2 == LOW)){
    digitalWrite(led1, LOW);
    digitalWrite(led2, LOW);
    digitalWrite(led3, LOW);
    digitalWrite(led4, LOW);
    digitalWrite(led5, LOW);
    digitalWrite(led6, LOW);
  }

  if((pulsante1 == LOW) && (pulsante2 == HIGH)){
    digitalWrite(led6, LOW);
    digitalWrite(led1, HIGH);
    delay(tempo);
    digitalWrite(led1, LOW);
    digitalWrite(led2, HIGH);
    delay(tempo);
    digitalWrite(led2, LOW);
    digitalWrite(led3, HIGH);
    delay(tempo);
    digitalWrite(led3, LOW);
    digitalWrite(led4, HIGH);
    delay(tempo);
    digitalWrite(led4, LOW);
    digitalWrite(led5, HIGH);
    delay(tempo);
    digitalWrite(led5, LOW);
    digitalWrite(led6, HIGH);
    delay(tempo);
  }

  if((pulsante1 == HIGH) && (pulsante2 == LOW)){
    digitalWrite(led1, LOW);
    digitalWrite(led6, HIGH);
    delay(tempo);
    digitalWrite(led6, LOW);
    digitalWrite(led5, HIGH);
    delay(tempo);
    digitalWrite(led5, LOW);
    digitalWrite(led4, HIGH);
    delay(tempo);
    digitalWrite(led4, LOW);
    digitalWrite(led3, HIGH);
    delay(tempo);
    digitalWrite(led3, LOW);
    digitalWrite(led2, HIGH);
    delay(tempo);
    digitalWrite(led2, LOW);
    digitalWrite(led1, HIGH);
    delay(tempo);
  }

    if((pulsante1 == HIGH) && (pulsante2 == HIGH)){
    digitalWrite(led2, LOW);
    digitalWrite(led5, LOW);
    digitalWrite(led1, HIGH);
    digitalWrite(led6, HIGH);
    delay(tempo);
    digitalWrite(led1, LOW);
    digitalWrite(led6, LOW);
    digitalWrite(led2, HIGH);
    digitalWrite(led5, HIGH);
    delay(tempo);
    digitalWrite(led2, LOW);
    digitalWrite(led5, LOW);
    digitalWrite(led3, HIGH);
    digitalWrite(led4, HIGH);
    delay(tempo);
    digitalWrite(led3, LOW);
    digitalWrite(led4, LOW);
    digitalWrite(led2, HIGH);
    digitalWrite(led5, HIGH);
    delay(tempo);
  }
}

 

Funzionamento:

Ora illustro brevemente il funzionamento del circuito (molto banale) :

I due switch corrispondono a due bit binari (0,1). Con due bit è possibile fare 4 diverse combinazioni come:

n° Comb. switch 1 switch 2
1 0 0
2 0 1
3 1 0
4 1 1

e per ogni combinazione faccio corrispondere una sequenza di luci.

  1. Combinazione 1 i led rimangono spenti.
  2. Combinazione 2 i led si accendono da sinistra verso destra.
  3. Combinazione 3 i led si accendono da destra verso sinistra.
  4. Combinazione 4 i led si accendono dall’esterno verso l’interno.

Ecco un video dimostrativo: