Eventi in sequenza

Questo progetto che permette di gestire una sequenza di eventi collegando all’uscita della porta B di Arduino, una serie di attuatori.

I led possono essere sostituiti da un foto accoppiatore per controllare un carico di potenza.

Il progetto richiama il funzionamento di un contatore Johnson, che permette di gestire una sequenza di eventi.

Premendo un pulsante il contatore accende i led in sequenza, premendo “reset,”  il contatore, si azzera ; il contatore può essere impostato per contare da 1 a 8 collegando una delle sue uscite al piedino di reset.

 

contatore arduino johnson
johns pannello
johns pulsanti
johns collegamento dip

3D system panel

nel 3D system panel, inserisco gli oggetti che utilizzo nel progetto

configuro i pulsanti “clock” , collegandolo al bit 2 della porta D,  e “reset”, collegandolo al bit 3 della porta D

nel microchip ATMEGA328, utilizzato da Arduino UNO,i pin 2 e 3 della porta D, sono usati da INT0 e INT1.

  • INT0, utilizza il bit 2 della porta D
  • INT1, utilizza il bit 3 della porta D

imposto lo switch_array a 3 elementi e li collego ai bit 4,5 e 6 della porta D

johns collegamentoled

collego il led_array alla porta B

variabili di progetto

variabilijohns
variabilijohns clock
variabilidip
variabilijohns reset
variabilijohns luci
johns out array
johns array

in Project Explorer, aggiungo le Variabili che utilizzerò nel progetto

Variabile “clock”, di tipo Byte, per il conteggio

variabile “reset”, per azzerare il contatore

variabili “dip0, dip1 e dip 3”, di tipo Bool,

per gestire lo stato logico dei “dip switch”, che utilizzerò per impostare il contatore

  • 0 - 0 - 0 = 0
  • 0 - 0 - 1 = 1
  • 0 - 1 - 0 = 2
  • 0 - 1 - 1 = 3
  • 1 - 0 - 0 = 4
  • 1 - 0 - 1 = 5
  • 1 - 1 - 0 = 6
  • 1 - 1 - 1 = 7

combinazione dei “dip switch”

la variabile “luci[10]”, contiene le dieci combinazioni , richiamate dalla variabile “clock”

Add Array Dimension, determna la lunghezza dello Array

l’uscita in sequenza dei dati contenuti nello “Array”, dipende dalla variabile “clock”

i dati nello “Array”, sono rappresentati in “binario” (0B, seguito da zero e uno)

la rappresentazione in “binario”, permette di visualizzare quale sarà l’uscita attiva (1) e quale quella spenta (0).

Diagramma di flusso

johnson flusso

per gestire il pulsante di “clock” e “reset”, utilizzerò la” funzione Interrupts”.

  • INT0, richiama la macro  “clock”, che incrementa il contatore ogni volta che si preme il pulsante “clock”.
  • INT1, richiama la macro “reset”, che azzera il contatore.
johnson macro clock

macro “clock”

johnson macro reset

macro “reset”

gestione dello Array

johnson luci-clock

la funzione “calcolo”, messa prima del ciclo principale, rappresenta il contenuto dello Array “luci[10]”.

ogni posizione dello Array, richiama la combinazione di zero e uno, che verrà inviata alla uscita della porta B.

il valore nella parentesi quadra, rappresenta il valore raggiunto dal contatore .

  • il valore zero indica che il led è spento.
  • il valore uno, indica che il led è acceso.

la funzione “output”, inserita nel ciclo principale, invia il contenuto dello Array,  alla porta B.

johnson decisione

la funzione “Decisione”,  nel ciclo principale, con l’istruzione : “if: clock=reset”, permette di far ripartire il conteggio, quando il contatore raggiunge il valore contenuto nella variabile  “reset”.

con le funzioni “ Connection Point” e “Goto Connection Point”, il ciclo si ripete.

con lo stesso principio di funzionamento utilizzato nell’esercizio Knight Rider, il ciclo si ripete.

utilizzo dei “dip switch” per determinare quando il contatore si resetta e il conteggio riparte da zero.

nel ciclo principale inserisco tre funzioni “Inputs”, che leggono il valore, zero o uno, dei “Dip Switch”:

  • Dip0 al bit 5 della porta D
  • Dip1 al bit 6 della porta D
  • Dip2 al bit 7 della porta D
johnson impostazione switch case
johnson impostazionedip input
johnson divisori switch case

la funzione “calcolo” inserita in ogni ramo della funzione “switch case”, resetta il conteggio del contatore, al valore selezionato.

  • 0,0,0 il contatore  accende in sequenza i led da B0 a B7
  • 0,0,1, il contatore accende e spegne solo B1
  • 0,1,0, il contatore accende in sequenza B0 e B1
  • 0,1,1, il contatore accende in sequenza  B0,B1 e B2
  • 1,0,0, il contatore accende in sequenza B0,B1,B2,e B3
  • 1,0,1, il contatore accende in sequenza B0,B1,B2 B3 e B4
  • 1,1,0, il contatore accende in sequenza  B0,B1,B2,B3,B4 e B5
  • 1,1,1, il contatore accende B0,B1,B2,B3;B4,B5 e B6

con la funzione “Switch case”, determino il numero delle uscite in funzione della combinazione dei “dip switch”

l’espressione “Switch dip0 + 2*dip1 + 4*dip2”, limita le combinazioni dei “dip switch” a 8 ( 0 - 7).

C Code

Riccardo Monti