.. note::
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 [|link_sf_facebook|] e unisciti oggi stesso!
.. _2.1.9_py_pi5_mcp3008:
2.1.9 Joystick (MCP3008)
=========================
.. note::
.. image:: ../img/mcp3008_and_adc0834.jpg
:width: 25%
:align: left
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.
.. image:: ../python_pi5/img/image317-copy.png
È sicuramente comodo acquistare un kit completo, ecco il link:
.. list-table::
:widths: 20 20 20
:header-rows: 1
* - Nome
- ARTICOLI IN QUESTO KIT
- LINK
* - Raphael Kit
- 337
- |link_Raphael_kit|
Puoi anche acquistarli separatamente dai link sottostanti.
.. list-table::
:widths: 30 20
:header-rows: 1
* - INTRODUZIONE COMPONENTE
- LINK DI ACQUISTO
* - :ref:`cpn_gpio_extension_board`
- |link_gpio_board_buy|
* - :ref:`cpn_breadboard`
- |link_breadboard_buy|
* - :ref:`cpn_wires`
- |link_wires_buy|
* - :ref:`cpn_resistor`
- |link_resistor_buy|
* - :ref:`cpn_joystick`
- \-
* - :ref:`cpn_mcp3008`
- \-
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.
.. list-table::
:widths: 30 30 30 30
:header-rows: 1
* - 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
.. image:: ../python_pi5/img/schematic_2.1.9_joystick_mcp3008.png
Procedure sperimentali
--------------------------
**Passo 1:** Costruisci il circuito.
.. image:: ../python_pi5/img/july24_2.1.9_joystick_mcp3008.png
**Passo 2:** Configura l'interfaccia SPI e installa la libreria ``spidev`` (vedi :ref:`spi_configuration` per istruzioni dettagliate).
Se hai già completato questi passaggi, puoi saltarli.
**Passo 3:** Vai alla cartella del codice.
.. raw:: html
.. code-block::
cd ~/raphael-kit/python-pi5
**Passo 4:** Esegui.
.. raw:: html
.. code-block::
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.
.. warning::
Se compare il messaggio di errore ``RuntimeError: Cannot determine SOC peripheral base address``, fai riferimento a :ref:`faq_soc`
**Codice**
.. note::
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.
.. raw:: html
.. code-block:: python
#!/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.Button`` viene utilizzata per leggere lo stato digitale del pulsante del joystick (pin SW).
* ``spidev`` viene utilizzata per la comunicazione SPI con il chip ADC MCP3008.
* ``time`` viene utilizzata per inserire ritardi temporali tra le letture.
.. code-block:: python
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.
.. code-block:: python
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).
.. code-block:: python
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.
.. code-block:: python
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()