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

../_images/mcp3008_and_adc0834.jpg

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.

../_images/image317-copy1.png

È sicuramente comodo acquistare un kit completo, ecco il link:

Nome

ARTICOLI IN QUESTO KIT

LINK

Raphael Kit

337

Raphael Kit

Puoi anche acquistarli separatamente dai link sottostanti.

INTRODUZIONE COMPONENTE

LINK DI ACQUISTO

Scheda di estensione GPIO

ACQUISTA

Breadboard

ACQUISTA

Cavi Jumper

ACQUISTA

Resistore

ACQUISTA

Modulo Joystick

-

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.

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

../_images/schematic_2.1.9_joystick_mcp30081.png

Procedure sperimentali

Passo 1: Costruisci il circuito.

../_images/july24_2.1.9_joystick_mcp30081.png

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

  1. 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.

    from gpiozero import Button
    import spidev
    import time
    
  2. 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
    
  3. 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
    
  4. 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()