Nota

¡Hola, bienvenido a la Comunidad de Entusiastas de SunFounder Raspberry Pi & Arduino & ESP32 en Facebook! Sumérgete en el mundo de Raspberry Pi, Arduino y ESP32 junto a otros entusiastas.

¿Por qué unirse?

  • Soporte experto: Resuelve problemas postventa y desafíos técnicos con la ayuda de nuestra comunidad y equipo.

  • Aprender y compartir: Intercambia consejos y tutoriales para mejorar tus habilidades.

  • Preestrenos exclusivos: Obtén acceso anticipado a nuevos anuncios de productos y adelantos.

  • Descuentos especiales: Disfruta de descuentos exclusivos en nuestros productos más recientes.

  • Promociones y sorteos festivos: Participa en sorteos y promociones especiales de temporada.

👉 ¿Listo para explorar y crear con nosotros? Haz clic en [Aquí] y únete hoy mismo.

2.1.9 Joystick (MCP3008)

Nota

../_images/mcp3008_and_adc0834.jpg

Dependiendo de la versión de tu kit, identifica si tienes ADC0834 o MCP3008 y procede con la sección correspondiente.

Introducción

En este proyecto, aprenderemos cómo funciona el joystick. Manipulamos el joystick y mostramos los resultados en la pantalla.

Componentes requeridos

En este proyecto, necesitamos los siguientes componentes.

../_images/image317-copy1.png

Es definitivamente conveniente comprar un kit completo, aquí tienes el enlace:

Nombre

ELEMENTOS EN ESTE KIT

ENLACE

Kit Raphael

337

Raphael Kit

También puedes comprarlos por separado en los siguientes enlaces.

INTRODUCCIÓN DEL COMPONENTE

ENLACE DE COMPRA

Placa de Extensión GPIO

COMPRAR

Protoboard

COMPRAR

Cables de Puente

COMPRAR

Resistor

COMPRAR

Módulo Joystick

-

MCP3008

-

Diagrama esquemático

Cuando se leen los datos del joystick, existen algunas diferencias entre los ejes: Los datos de los ejes X e Y son analógicos, lo que requiere usar el MCP3008 para convertir el valor analógico a digital. Los datos del eje Z son digitales, por lo que puedes leerlos directamente desde el GPIO o también usando un ADC.

Nombre

T-Board

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

Procedimientos experimentales

Paso 1: Construye el circuito.

../_images/july24_2.1.9_joystick_mcp30081.png

Paso 2: Configura la interfaz SPI e instala la librería spidev (consulta Configuración de SPI para obtener instrucciones detalladas). Si ya has completado estos pasos, puedes omitirlos.

Paso 3: Ve a la carpeta del código.

cd ~/raphael-kit/python-pi5

Paso 4: Ejecuta el programa.

sudo python3 2.1.9-2_Joystick_zero.py

Después de ejecutar el código, mueve el joystick y se mostrarán en pantalla los valores correspondientes de X, Y y Btn.

Advertencia

Si aparece el error RuntimeError: Cannot determine SOC peripheral base address, consulta Si «gpiozero» no funciona.

Código

Nota

Puedes Modificar/Restablecer/Copiar/Ejecutar/Detener el siguiente código. Pero antes de eso, necesitas ir a la ruta del código fuente como raphael-kit/python-pi5. Después de modificar el código, puedes ejecutarlo directamente para ver el efecto.

#!/usr/bin/env python3

from gpiozero import Button
import spidev
import time

# Inicializa el botón conectado al pin GPIO 22 (pin SW del joystick)
BtnPin = Button(22)

# Inicializa la comunicación SPI con el MCP3008
spi = spidev.SpiDev()
spi.open(0, 0)  # Abrir bus SPI 0, dispositivo CE0
spi.max_speed_hz = 1000000  # Velocidad SPI: 1 MHz

def read_adc(channel):
    """
    Lee el valor analógico del canal especificado del MCP3008 (0–7)
    :param channel: número de canal ADC (0–7)
    :return: valor entero de 10 bits (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:
    # Bucle principal para leer y mostrar valores del joystick y estado del botón
    while True:
        # Leer valores de X y Y desde los canales 0 y 1 del MCP3008
        x_val = read_adc(0)  # Joystick VRX conectado al CH0
        y_val = read_adc(1)  # Joystick VRY conectado al CH1

        # Leer el estado del botón del joystick (SW)
        Btn_val = BtnPin.value  # 0 = presionado, 1 = liberado

        # Imprimir los valores leídos
        print('X: %d  Y: %d  Btn: %d' % (x_val, y_val, Btn_val))

        # Esperar 0.2 segundos antes de la siguiente lectura
        time.sleep(0.2)

# Manejo de interrupción con Ctrl+C
except KeyboardInterrupt:
    spi.close()

Explicación del código

  1. Esta sección importa las librerías necesarias:

    • gpiozero.Button se usa para leer el estado digital del botón del joystick (pin SW).

    • spidev se usa para la comunicación SPI con el chip ADC MCP3008.

    • time se usa para los retrasos entre lecturas.

    #!/usr/bin/env python3
    from gpiozero import Button
    import spidev
    import time
    
  2. Inicializa el botón conectado al pin GPIO22 (pin SW del joystick) y configura la interfaz SPI en el bus 0, chip select 0 (CE0). La velocidad SPI se establece en 1 MHz.

    BtnPin = Button(22)
    spi = spidev.SpiDev()
    spi.open(0, 0)
    spi.max_speed_hz = 1000000
    
  3. Define la función read_adc(channel) para leer el valor analógico de un canal específico del MCP3008 (0–7). Envía tres bytes usando el protocolo SPI y devuelve un valor de 10 bits (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. En el bucle principal, lee los valores analógicos de VRX (conectado a CH0) y VRY (conectado a CH1), así como el estado del botón del joystick. Los valores se imprimen en la consola cada 0.2 segundos. Cuando se presiona Ctrl+C, la interfaz SPI se cierra correctamente.

    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()