Terza lezione in cui aggiungo alcuni esempi che suggeriscono alcune azioni di gioco che gli allievi del gruppo di lavoro dell’attività di PCTO: Arduino GamePad potranno sfruttare per la realizzazione del loro.
Esempio 1
Controllo dello spostamento del carattere:
- destra/sinistra mediante i pulsanti: RIGHT e LEFT sul display
- su/giù mediante i pulsanti UP/DOWN
Per realizzare queste azioni riprendiamo quanto realizzato nella lezione precedente aggiungendo all’ultimo sketch il controllo della pressione del pulsante UP o DOWN in cui viene controllato se l’analogRead sul A0 restituisce un valore comprese tra:
Controllo UP
(val >= 50 && val <= 150)
Controllo DOWN
(val >= 150 && val <= 300)
Lo spostamento del carattere dalla prima alla seconda riga deve essere fatta cancellando prima l’intero schermo, poi posizionando il carattere con il metodo setCursor() a cui si passa la variabile globale “contatorePosizioneColonna” che viene modificata di volta in volta alla pressione dei pulsanti RIGHT e LEFT. La selezione della riga avviene passando il valore 0 che identifica la prima riga e il valore 1 per la seconda riga.
/* Prof. Michele Maffucci Utilizzo dell'LCD Keypad Shield della Keystudio Data: 14.03.2021 Controllo dello spostamento del carattere: - destra/sinistra mediante i pulsanti: RIGHT e LEFT sul display - su/giù mediante i pulsanti UP/DOWN */ // inclusione della libreria LiquidCrystal.h #include <LiquidCrystal.h> // inizializza la libreria con i numeri dei pin dell'interfaccia LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // Colonna in cui si trova il carattere int contatorePosizioneColonna = 0; // Valore restituito dall'analogRead su A0 int val; // Velocità con cui viene stampato il carattere int velocita = 200; void setup() { // impostazione del numero di colonne e righe del display lcd.begin(16, 2); // Carattere stampato nella prima colonna e prima riga (0,0) lcd.print("*"); } void loop() { // Memorizza in val il valore presente su A int val = analogRead(A0); // Alla pressione del pulsante UP sul display il carattere si sposta sulla prima riga if (val >= 50 && val <= 150) { // Cancella il display lcd.clear(); // Spostamento sulla prima riga nella colonna corrente lcd.setCursor(contatorePosizioneColonna, 0); // Stampa del carattere: * lcd.print("*"); // Attesa di un'istante per percepire il movimento del carattere delay(velocita); } // Alla pressione del pulsante DOWN sul display il carattere si sposta sulla seconda riga if (val >= 150 && val <= 300) { // Cancella il display lcd.clear(); // Spostamento sulla seconda riga nella colonna corrente lcd.setCursor(contatorePosizioneColonna, 1); // Stampa del carattere: * lcd.print("*"); // Attesa di un'istante per percepire il movimento del carattere delay(velocita); } // Premendo il pulsante RIGHT sul display, il carattere si sposta di una posizione // a destra fino a quando non si raggiunge l'ultima colonna a destra. // Premendo ancora il pulsante RIGHT non si ha l'avanzamento del carattere. if ((val >= 0 && val <= 50) && contatorePosizioneColonna < 15) { lcd.scrollDisplayRight(); delay(velocita); contatorePosizioneColonna++; } // Premendo il pulsante LEFT sul display, il carattere si sposta di una posizione // a sinistra fino a quando non si raggiunge l'ultima colonna a sinistra. // Premendo ancora il pulsante LEFT non si ha l'avanzamento del carattere. if ((val >= 300 && val <= 500) && contatorePosizioneColonna > 0) { lcd.scrollDisplayLeft(); delay(velocita); contatorePosizioneColonna--; } }
Esempio 2
In questo secondo esempio viene aggiunta una semplice matrice di cinque “X” che identificano degli ostacoli che devono essere superati. Nell’esempio esposto però gli ostacoli possono essere superati, lascio quindi a voi la realizzazione dello sketch che consente il blocco dell’avanzamento nel caso in cui ci si scontra con l’ostacolo.
/* Prof. Michele Maffucci Utilizzo dell'LCD Keypad Shield della Keystudio Data: 14.03.2021 Controllo dello spostamento del carattere *: - destra/sinistra mediante i pulsanti: RIGHT e LEFT sul display - su/giù mediante i pulsanti UP/DOWN Stampa di una serie di X che rappresentano gli ostacoli */ // inclusione della libreria LiquidCrystal.h #include <LiquidCrystal.h> // inizializza la libreria con i numeri dei pin dell'interfaccia LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // Colonna in cui si trova il carattere int contatorePosizioneColonna = 0; // Valore restituito dall'analogRead su A0 int val; // Velocità con cui viene stampato il carattere int velocita = 200; // Riga in cui si trova il carattere * int riga = 0; void setup() { // impostazione del numero di colonne e righe del display lcd.begin(16, 2); // Carattere stampato nella prima colonna e prima riga (0,0) lcd.print("*"); } void loop() { // Memorizza in val il valore presente su A int val = analogRead(A0); stampaOstacoli(); // Alla pressione del pulsante UP sul display il carattere si sposta sulla prima riga if (val >= 50 && val <= 150) { // Cancella il display lcd.clear(); stampaOstacoli(); // Spostamento sulla prima riga nella colonna corrente lcd.setCursor(contatorePosizioneColonna, 0); riga = 0; // Stampa del carattere: * lcd.print("*"); // Attesa di un'istante per percepire il movimento del carattere delay(velocita); } // Alla pressione del pulsante DOWN sul display il carattere si sposta sulla seconda riga if (val >= 150 && val <= 300) { // Cancella il display lcd.clear(); stampaOstacoli(); // Spostamento sulla seconda riga nella colonna corrente lcd.setCursor(contatorePosizioneColonna, 1); riga = 1; // Stampa del carattere: * lcd.print("*"); // Attesa di un'istante per percepire il movimento del carattere delay(velocita); } // Premendo il pulsante RIGHT sul display, il carattere si sposta di una posizione // a destra fino a quando non si raggiunge l'ultima colonna a destra. // Premendo ancora il pulsante RIGHT non si ha l'avanzamento del carattere. if ((val >= 0 && val <= 50) && contatorePosizioneColonna < 15) { // Cancella il display lcd.clear(); contatorePosizioneColonna++; // Spostamento di una posizione verso destra del cursore lcd.setCursor(contatorePosizioneColonna, riga); // Stampa del carattere: * lcd.print("*"); // Attesa di un'istante per percepire il movimento del carattere delay(velocita); } // Premendo il pulsante LEFT sul display, il carattere si sposta di una posizione // a sinistra fino a quando non si raggiunge l'ultima colonna a sinistra. // Premendo ancora il pulsante LEFT non si ha l'avanzamento del carattere. if ((val >= 300 && val <= 500) && contatorePosizioneColonna > 0) { // Cancella il display lcd.clear(); contatorePosizioneColonna--; lcd.setCursor(contatorePosizioneColonna, riga); // Stampa del carattere: * lcd.print("*"); // Attesa di un'istante per percepire il movimento del carattere delay(velocita); } } void stampaOstacoli() { lcd.setCursor(2, 0); lcd.print("X"); lcd.setCursor(5, 1); lcd.print("X"); lcd.setCursor(7, 1); lcd.print("X"); lcd.setCursor(9, 0); lcd.print("X"); lcd.setCursor(12, 0); lcd.print("X"); }
Esercizio 1
Utilizzando l’esempio 2 esposto sopra, aggiungere la funzionalità che blocca l’avanzamento del carattere “*” nel caso in cui ci si scontra con l’ostacolo.
Esercizio 2
Definire tre matrici di ostacoli diversi e fare in modo che ad ogni avvio di Arduino la scelta della matrice venga fatta in modo casuale.
Esercizio 3
Aggiungere la funzionalità che permette di modificare la matrice degli ostacoli se si raggiunge l’ultima colonna a destra.
Esercizio 4
Definire tre scenari diversi costituiti da tre matrici ostacoli diversi. La navigazione può avvenire solamente all’interno di questi tre scenari. La partenza del carattere “*” avviene dalla colonna 0 del secondo scenario, il movimento dovrà essere il seguente:
- partendo dalla colonna 0 del secondo scenario, la pressione del pulsante LEFT porta allo scenario 1 e il carattere “*” viene posizionato nella colonna 15 del display;
- se si è nel secondo scenario in colonna 15, la pressione del pulsante RIGHT conduce alla colonna 0 del 3′ scenario;
- la pressione del pulsante LEFT in colonna 0 del primo scenario non permette nessun cambiamento di scenario
- la pressione del pulsante RIGHT in colonna 15 del terzo scenario non permette nessun cambiamento di scenario
Buon Coding a tutti 🙂