
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 🙂
