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.
1 | /* |
2 | Prof. Michele Maffucci |
3 | Utilizzo dell'LCD Keypad Shield della Keystudio |
4 | Data: 14.03.2021 |
5 |
6 | Controllo dello spostamento del carattere: |
7 | - destra/sinistra mediante i pulsanti: RIGHT e LEFT sul display |
8 | - su/giù mediante i pulsanti UP/DOWN |
9 | */ |
10 |
11 | // inclusione della libreria LiquidCrystal.h |
12 | #include <LiquidCrystal.h> |
13 |
14 | // inizializza la libreria con i numeri dei pin dell'interfaccia |
15 | LiquidCrystal lcd(8, 9, 4, 5, 6, 7); |
16 |
17 | // Colonna in cui si trova il carattere |
18 | int contatorePosizioneColonna = 0; |
19 |
20 | // Valore restituito dall'analogRead su A0 |
21 | int val; |
22 |
23 | // Velocità con cui viene stampato il carattere |
24 | int velocita = 200; |
25 |
26 | void setup() { |
27 | // impostazione del numero di colonne e righe del display |
28 | lcd.begin(16, 2); |
29 |
30 | // Carattere stampato nella prima colonna e prima riga (0,0) |
31 | lcd.print( "*" ); |
32 | } |
33 |
34 | void loop() { |
35 |
36 | // Memorizza in val il valore presente su A |
37 | int val = analogRead(A0); |
38 |
39 | // Alla pressione del pulsante UP sul display il carattere si sposta sulla prima riga |
40 | if (val >= 50 && val <= 150) { |
41 | // Cancella il display |
42 | lcd.clear(); |
43 | // Spostamento sulla prima riga nella colonna corrente |
44 | lcd.setCursor(contatorePosizioneColonna, 0); |
45 | // Stampa del carattere: * |
46 | lcd.print( "*" ); |
47 | // Attesa di un'istante per percepire il movimento del carattere |
48 | delay(velocita); |
49 | } |
50 |
51 | // Alla pressione del pulsante DOWN sul display il carattere si sposta sulla seconda riga |
52 | if (val >= 150 && val <= 300) { |
53 | // Cancella il display |
54 | lcd.clear(); |
55 | // Spostamento sulla seconda riga nella colonna corrente |
56 | lcd.setCursor(contatorePosizioneColonna, 1); |
57 | // Stampa del carattere: * |
58 | lcd.print( "*" ); |
59 | // Attesa di un'istante per percepire il movimento del carattere |
60 | delay(velocita); |
61 | } |
62 |
63 | // Premendo il pulsante RIGHT sul display, il carattere si sposta di una posizione |
64 | // a destra fino a quando non si raggiunge l'ultima colonna a destra. |
65 | // Premendo ancora il pulsante RIGHT non si ha l'avanzamento del carattere. |
66 | if ((val >= 0 && val <= 50) && contatorePosizioneColonna < 15) { |
67 | lcd.scrollDisplayRight(); |
68 | delay(velocita); |
69 | contatorePosizioneColonna++; |
70 | } |
71 |
72 | // Premendo il pulsante LEFT sul display, il carattere si sposta di una posizione |
73 | // a sinistra fino a quando non si raggiunge l'ultima colonna a sinistra. |
74 | // Premendo ancora il pulsante LEFT non si ha l'avanzamento del carattere. |
75 | if ((val >= 300 && val <= 500) && contatorePosizioneColonna > 0) { |
76 | lcd.scrollDisplayLeft(); |
77 | delay(velocita); |
78 | contatorePosizioneColonna--; |
79 | } |
80 | } |
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.
1 | /* |
2 | Prof. Michele Maffucci |
3 | Utilizzo dell'LCD Keypad Shield della Keystudio |
4 | Data: 14.03.2021 |
5 |
6 | Controllo dello spostamento del carattere *: |
7 | - destra/sinistra mediante i pulsanti: RIGHT e LEFT sul display |
8 | - su/giù mediante i pulsanti UP/DOWN |
9 |
10 | Stampa di una serie di X che rappresentano gli ostacoli |
11 | |
12 | */ |
13 |
14 | // inclusione della libreria LiquidCrystal.h |
15 | #include <LiquidCrystal.h> |
16 |
17 | // inizializza la libreria con i numeri dei pin dell'interfaccia |
18 | LiquidCrystal lcd(8, 9, 4, 5, 6, 7); |
19 |
20 | // Colonna in cui si trova il carattere |
21 | int contatorePosizioneColonna = 0; |
22 |
23 | // Valore restituito dall'analogRead su A0 |
24 | int val; |
25 |
26 | // Velocità con cui viene stampato il carattere |
27 | int velocita = 200; |
28 |
29 | // Riga in cui si trova il carattere * |
30 | int riga = 0; |
31 |
32 | void setup() { |
33 | // impostazione del numero di colonne e righe del display |
34 | lcd.begin(16, 2); |
35 |
36 | // Carattere stampato nella prima colonna e prima riga (0,0) |
37 | lcd.print( "*" ); |
38 | } |
39 |
40 | void loop() { |
41 |
42 | // Memorizza in val il valore presente su A |
43 | int val = analogRead(A0); |
44 |
45 | stampaOstacoli(); |
46 |
47 | // Alla pressione del pulsante UP sul display il carattere si sposta sulla prima riga |
48 | if (val >= 50 && val <= 150) { |
49 | // Cancella il display |
50 | lcd.clear(); |
51 | stampaOstacoli(); |
52 | // Spostamento sulla prima riga nella colonna corrente |
53 | lcd.setCursor(contatorePosizioneColonna, 0); |
54 | riga = 0; |
55 | // Stampa del carattere: * |
56 | lcd.print( "*" ); |
57 | // Attesa di un'istante per percepire il movimento del carattere |
58 | delay(velocita); |
59 | } |
60 |
61 | // Alla pressione del pulsante DOWN sul display il carattere si sposta sulla seconda riga |
62 | if (val >= 150 && val <= 300) { |
63 | // Cancella il display |
64 | lcd.clear(); |
65 | stampaOstacoli(); |
66 | // Spostamento sulla seconda riga nella colonna corrente |
67 | lcd.setCursor(contatorePosizioneColonna, 1); |
68 | riga = 1; |
69 | // Stampa del carattere: * |
70 | lcd.print( "*" ); |
71 | // Attesa di un'istante per percepire il movimento del carattere |
72 | delay(velocita); |
73 | } |
74 |
75 | // Premendo il pulsante RIGHT sul display, il carattere si sposta di una posizione |
76 | // a destra fino a quando non si raggiunge l'ultima colonna a destra. |
77 | // Premendo ancora il pulsante RIGHT non si ha l'avanzamento del carattere. |
78 | if ((val >= 0 && val <= 50) && contatorePosizioneColonna < 15) { |
79 | // Cancella il display |
80 | lcd.clear(); |
81 | contatorePosizioneColonna++; |
82 | // Spostamento di una posizione verso destra del cursore |
83 | lcd.setCursor(contatorePosizioneColonna, riga); |
84 | // Stampa del carattere: * |
85 | lcd.print( "*" ); |
86 | // Attesa di un'istante per percepire il movimento del carattere |
87 | delay(velocita); |
88 | } |
89 |
90 | // Premendo il pulsante LEFT sul display, il carattere si sposta di una posizione |
91 | // a sinistra fino a quando non si raggiunge l'ultima colonna a sinistra. |
92 | // Premendo ancora il pulsante LEFT non si ha l'avanzamento del carattere. |
93 | if ((val >= 300 && val <= 500) && contatorePosizioneColonna > 0) { |
94 | // Cancella il display |
95 | lcd.clear(); |
96 | contatorePosizioneColonna--; |
97 | lcd.setCursor(contatorePosizioneColonna, riga); |
98 | // Stampa del carattere: * |
99 | lcd.print( "*" ); |
100 | // Attesa di un'istante per percepire il movimento del carattere |
101 | delay(velocita); |
102 | } |
103 | } |
104 |
105 | void stampaOstacoli() { |
106 | lcd.setCursor(2, 0); |
107 | lcd.print( "X" ); |
108 | lcd.setCursor(5, 1); |
109 | lcd.print( "X" ); |
110 | lcd.setCursor(7, 1); |
111 | lcd.print( "X" ); |
112 | lcd.setCursor(9, 0); |
113 | lcd.print( "X" ); |
114 | lcd.setCursor(12, 0); |
115 | lcd.print( "X" ); |
116 | } |
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