Nota
Ciao, benvenuto nella Community Facebook di appassionati SunFounder Raspberry Pi & Arduino & ESP32! Approfondisci Raspberry Pi, Arduino ed ESP32 con altri appassionati.
Perché unirsi?
Supporto esperto: Risolvi problemi post-vendita e sfide tecniche con l’aiuto della nostra community e del nostro team.
Impara e condividi: Scambia suggerimenti e tutorial per migliorare le tue competenze.
Anteprime esclusive: Ottieni accesso anticipato agli annunci di nuovi prodotti e alle anteprime.
Sconti speciali: Goditi sconti esclusivi sui nostri prodotti più recenti.
Promozioni festive e giveaway: Partecipa a giveaway e promozioni festive.
👉 Pronto a esplorare e creare con noi? Clicca [Qui] e unisciti oggi stesso!
2.1.9 Joystick (MCP3008)
Nota
A seconda della versione del kit, identifica se hai ADC0834 o MCP3008 e procedi con la sezione corrispondente.
Introduzione
In questo progetto impareremo come funziona un joystick. Muoveremo il joystick e visualizzeremo i risultati sullo schermo.
Componenti richiesti
In questo progetto, abbiamo bisogno dei seguenti componenti.
È sicuramente comodo acquistare un kit completo, ecco il link:
Nome |
ARTICOLI IN QUESTO KIT |
LINK |
|---|---|---|
Raphael Kit |
337 |
Puoi anche acquistarli separatamente dai link sottostanti.
INTRODUZIONE COMPONENTE |
LINK DI ACQUISTO |
|---|---|
- |
|
- |
Schema elettrico
Quando vengono letti i dati del joystick, esistono alcune differenze tra gli assi: i dati degli assi X e Y sono analogici, quindi è necessario utilizzare MCP3008 per convertirli in valori digitali. I dati dell’asse Z sono digitali, quindi puoi leggerli direttamente tramite GPIO o utilizzare l’ADC.
Nome T-Board |
fisico |
WiringPi |
BCM |
|---|---|---|---|
SPICE0 |
pin24 |
10 |
8 |
SPIMOSI |
pin19 |
12 |
10 |
SPIMISO |
pin21 |
13 |
9 |
SPISCLK |
pin23 |
14 |
11 |
GPIO22 |
pin15 |
3 |
22 |
Procedure sperimentali
Passo 1: Costruisci il circuito.
Passo 2: Configura l’interfaccia SPI e installa la libreria spidev (vedi Configurazione SPI per istruzioni dettagliate).
Se hai già completato questi passaggi, puoi saltarli.
Passo 3: Vai alla cartella del codice.
cd ~/raphael-kit/python-pi5
Passo 4: Esegui.
sudo python3 2.1.9-2_Joystick_zero.py
Dopo l’esecuzione del codice, muovi il joystick: i valori corrispondenti di x, y e Btn verranno visualizzati sullo schermo.
Avvertimento
Se compare il messaggio di errore RuntimeError: Cannot determine SOC peripheral base address, fai riferimento a If gpiozero doesn’t work.
Codice
Nota
Puoi Modificare/Resettare/Copiare/Eseguire/Fermare il codice qui sotto.
Prima, però, devi andare al percorso del codice sorgente, ad esempio raphael-kit/python-pi5.
Dopo aver modificato il codice, puoi eseguirlo direttamente per vederne l’effetto.
#!/usr/bin/env python3
from gpiozero import Button
import spidev
import time
# Inizializza il pulsante collegato al pin GPIO 22 (pin SW del joystick)
BtnPin = Button(22)
# Inizializza la comunicazione SPI con MCP3008
spi = spidev.SpiDev()
spi.open(0, 0) # Apri bus SPI 0, device CE0
spi.max_speed_hz = 1000000 # Imposta la velocità SPI a 1 MHz
def read_adc(channel):
"""
Legge il valore analogico dal canale specificato di MCP3008 (0–7)
:param channel: numero del canale ADC (0–7)
:return: valore intero a 10 bit (0–1023)
"""
if channel < 0 or channel > 7:
return -1
adc = spi.xfer2([1, (8 + channel) << 4, 0])
value = ((adc[1] & 0x03) << 8) | adc[2]
return value
try:
# Ciclo principale per leggere e stampare i valori del joystick e lo stato del pulsante
while True:
# Leggi i valori X e Y dai canali 0 e 1 di MCP3008
x_val = read_adc(0) # Joystick VRX collegato a CH0
y_val = read_adc(1) # Joystick VRY collegato a CH1
# Leggi lo stato del pulsante del joystick (SW)
Btn_val = BtnPin.value # 0 = premuto, 1 = rilasciato
# Stampa i valori letti
print('X: %d Y: %d Btn: %d' % (x_val, y_val, Btn_val))
# Attendi 0,2 secondi prima della prossima lettura
time.sleep(0.2)
# Gestione pulita dell'interruzione con Ctrl+C
except KeyboardInterrupt:
spi.close()
Spiegazione del codice
Questa sezione importa le librerie richieste:
gpiozero.Buttonviene utilizzata per leggere lo stato digitale del pulsante del joystick (pin SW).spidevviene utilizzata per la comunicazione SPI con il chip ADC MCP3008.timeviene utilizzata per inserire ritardi temporali tra le letture.
from gpiozero import Button import spidev import time
Inizializza il pulsante collegato a GPIO22 (pin SW del joystick) e configura l’interfaccia SPI su bus 0, chip select 0 (CE0). La velocità SPI è impostata a 1 MHz.
BtnPin = Button(22) spi = spidev.SpiDev() spi.open(0, 0) spi.max_speed_hz = 1000000
Definisce una funzione
read_adc(channel)per leggere il valore analogico da un canale specifico di MCP3008 (0–7). Invia tre byte tramite protocollo SPI e restituisce un valore a 10 bit (0–1023).def read_adc(channel): if channel < 0 or channel > 7: return -1 adc = spi.xfer2([1, (8 + channel) << 4, 0]) value = ((adc[1] & 0x03) << 8) | adc[2] return value
Nel ciclo principale vengono letti i valori analogici da VRX (collegato a CH0) e VRY (collegato a CH1), oltre allo stato del pulsante del joystick. I valori vengono stampati sulla console ogni 0,2 secondi. Quando si preme Ctrl+C, l’interfaccia SPI viene chiusa correttamente.
try: while True: x_val = read_adc(0) y_val = read_adc(1) Btn_val = BtnPin.value print('X: %d Y: %d Btn: %d' % (x_val, y_val, Btn_val)) time.sleep(0.2) except KeyboardInterrupt: spi.close()