Archivi tag: Game Pad

Lezione 3 – Arduino GamePad – LCD1602 Keypad Shield della Keyestudio

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
15LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
16 
17// Colonna in cui si trova il carattere
18int contatorePosizioneColonna = 0;
19 
20// Valore restituito dall'analogRead su A0
21int val;
22 
23// Velocità con cui viene stampato il carattere 
24int velocita = 200;
25 
26void 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 
34void 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
18LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
19 
20// Colonna in cui si trova il carattere
21int contatorePosizioneColonna = 0;
22 
23// Valore restituito dall'analogRead su A0
24int val;
25 
26// Velocità con cui viene stampato il carattere
27int velocita = 200;
28 
29// Riga in cui si trova il carattere *
30int riga = 0;
31 
32void 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 
40void 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 
105void 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 🙂