5.2.3 Semplice Pianoforte Elettronico
5.2.3.1 Panoramica

In questo progetto, controlliamo l’altoparlante micro:bit per riprodurre toni diversi azionando il joystick e premendo i pulsanti. Nel frattempo, la matrice LED a bordo mostrerà i numeri corrispondenti.
Girando il joystick a destra si produce “Do (Tono Do Centrale)” con la visualizzazione che mostra “1”; girandolo a sinistra si produce “Re (Tono Re)” con “2”; girandolo verso l’alto si produce “Mi (Tono Mi)” con “3”; girandolo verso il basso si produce “Fa (Tono Fa)” con “4”. Premendo il pulsante C si produce “Sol (Tono Sol)” con “5”, premendo D si produce “La (Tono La)” con “6”, E produce “Si (Tono Si)” con “7”, e premendo F si produce un “Do (Diesis)” più alto mentre la visualizzazione torna a “1”. C’è una bella sincronizzazione tra joystick, pulsanti, toni e display.

5.2.3.2 Conoscenza dei Componenti
Questo progetto utilizza lo stesso altoparlante micro:bit del Progetto 03. Si prega di fare riferimento alla sezione 4.2.3.2 per la conoscenza dei suoi componenti.
5.2.3.3 Parti Richieste
Scheda micro:bit V2 (auto-fornita) ×1 |
Smart Gamepad micro:bit (assemblato) ×1 |
Batteria AAA (auto-fornita) ×4 |
|---|---|---|
|
|
|
5.2.3.4 Flusso del Codice

5.2.3.5 Codice di Test
⚠️ Nota che la sensibilità del joystick può essere regolata in base alle proprie esigenze.
Codice completo:
from microbit import *
# Calibrazione del joystick (regola questi valori se il joystick non è centrato)
JOYSTICK_CENTER_X = 511
JOYSTICK_CENTER_Y = 511
# Soglia per rilevare il movimento (regola per la sensibilità)
JOYSTICK_THRESHOLD = 100
# Mappatura delle note musicali ai numeri visualizzati
NOTES = {
"right": (262, "1"), # Do centrale
"left": (294, "2"), # Re
"up": (330, "3"), # Mi
"down": (349, "4"), # Fa
"C": (392, "5"), # Sol
"D": (440, "6"), # La
"E": (494, "7"), # Si
"F": (523, "1") # Do alto
}
# Funzione per riprodurre una nota e visualizzare un numero
def play_note_and_show(note_freq, display_char):
music.play(music.note(note_freq, 500), wait=False) # Riproduci per 500ms in sottofondo
display.show(display_char)
# Configura i pin dei pulsanti
pin13.set_pull(pin13.PULL_UP) # Pulsante D
pin15.set_pull(pin15.PULL_UP) # Pulsante C
pin16.set_pull(pin16.PULL_UP) # Pulsante E
pin14.set_pull(pin14.PULL_UP) # Pulsante F (assumendo P14 per F)
display.show(Image.MUSIC)
while True:
# Leggi i valori analogici del joystick
x_value = pin0.read_analog()
y_value = pin1.read_analog()
# Controlla il joystick
if x_value > JOYSTICK_CENTER_X + JOYSTICK_THRESHOLD:
play_note_and_show(NOTES["right"][0], NOTES["right"][1])
elif x_value < JOYSTICK_CENTER_X - JOYSTICK_THRESHOLD:
play_note_and_show(NOTES["left"][0], NOTES["left"][1])
elif y_value < JOYSTICK_CENTER_Y - JOYSTICK_THRESHOLD:
play_note_and_show(NOTES["up"][0], NOTES["up"][1])
elif y_value > JOYSTICK_CENTER_Y + JOYSTICK_THRESHOLD:
play_note_and_show(NOTES["down"][0], NOTES["down"][1])
# Controlla i pulsanti
if not pin15.read_digital(): # Pulsante C
play_note_and_show(NOTES["C"][0], NOTES["C"][1])
elif not pin13.read_digital(): # Pulsante D
play_note_and_show(NOTES["D"][0], NOTES["D"][1])
elif not pin16.read_digital(): # Pulsante E
play_note_and_show(NOTES["E"][0], NOTES["E"][1])
elif not pin14.read_digital(): # Pulsante F
play_note_and_show(NOTES["F"][0], NOTES["F"][1])
sleep(100) # Breve ritardo per evitare letture eccessive e debounce

Breve spiegazione:
① Inizializza la matrice LED micro:bit per mostrare
.
from microbit import *
# Calibrazione del joystick (regola questi valori se il joystick non è centrato)
JOYSTICK_CENTER_X = 511
JOYSTICK_CENTER_Y = 511
# Soglia per rilevare il movimento (regola per la sensibilità)
JOYSTICK_THRESHOLD = 100
# Mappatura delle note musicali ai numeri visualizzati
NOTES = {
"right": (262, "1"), # Do centrale
"left": (294, "2"), # Re
"up": (330, "3"), # Mi
"down": (349, "4"), # Fa
"C": (392, "5"), # Sol
"D": (440, "6"), # La
"E": (494, "7"), # Si
"F": (523, "1") # Do alto
}
# Funzione per riprodurre una nota e visualizzare un numero
def play_note_and_show(note_freq, display_char):
music.play(music.note(note_freq, 500), wait=False) # Riproduci per 500ms in sottofondo
display.show(display_char)
# Configura i pin dei pulsanti
pin13.set_pull(pin13.PULL_UP) # Pulsante D
pin15.set_pull(pin15.PULL_UP) # Pulsante C
pin16.set_pull(pin16.PULL_UP) # Pulsante E
pin14.set_pull(pin14.PULL_UP) # Pulsante F (assumendo P14 per F)
display.show(Image.MUSIC)
② Determina la direzione del movimento del joystick; riproduci i toni corrispondenti per mezza battuta in sottofondo, e la matrice LED visualizza il numero corrispondente.
while True:
# Leggi i valori analogici del joystick
x_value = pin0.read_analog()
y_value = pin1.read_analog()
# Controlla il joystick
if x_value > JOYSTICK_CENTER_X + JOYSTICK_THRESHOLD:
play_note_and_show(NOTES["right"][0], NOTES["right"][1])
elif x_value < JOYSTICK_CENTER_X - JOYSTICK_THRESHOLD:
play_note_and_show(NOTES["left"][0], NOTES["left"][1])
elif y_value < JOYSTICK_CENTER_Y - JOYSTICK_THRESHOLD:
play_note_and_show(NOTES["up"][0], NOTES["up"][1])
elif y_value > JOYSTICK_CENTER_Y + JOYSTICK_THRESHOLD:
play_note_and_show(NOTES["down"][0], NOTES["down"][1])
③ Controlla se un pulsante è premuto, e riproduci il tono corrispondente per mezza battuta in sottofondo, e la matrice LED visualizza il numero corrispondente.
# Controlla i pulsanti
if not pin15.read_digital(): # Pulsante C
play_note_and_show(NOTES["C"][0], NOTES["C"][1])
elif not pin13.read_digital(): # Pulsante D
play_note_and_show(NOTES["D"][0], NOTES["D"][1])
elif not pin16.read_digital(): # Pulsante E
play_note_and_show(NOTES["E"][0], NOTES["E"][1])
elif not pin14.read_digital(): # Pulsante F
play_note_and_show(NOTES["F"][0], NOTES["F"][1])
sleep(100) # Breve ritardo per evitare letture eccessive e debounce
5.2.3.6 Risultato del Test

Dopo aver caricato il codice, inserisci la scheda micro:bit nello slot del gamepad (batterie installate) e sposta l’interruttore su “ON”. La matrice LED mostra “
” per prima.
Girando il joystick a destra si produce “Do (Tono Do Centrale)” con la visualizzazione che mostra “1”; girandolo a sinistra si produce “Re (Tono Re)” con “2”; girandolo verso l’alto si produce “Mi (Tono Mi)” con “3”; girandolo verso il basso si produce “Fa (Tono Fa)” con “4”. Premendo il pulsante C si produce “Sol (Tono Sol)” con “5”, premendo D si produce “La (Tono La)” con “6”, E produce “Si (Tono Si)” con “7”, e premendo F si produce un “Do (Diesis)” più alto mentre la visualizzazione torna a “1”.
Hai costruito il semplice pianoforte elettronico!

Suggerimento: Se non c’è risposta sulla scheda, premi il pulsante di reset sul retro della scheda micro:bit.



