Nota

¡Hola, bienvenido a la comunidad de entusiastas de SunFounder Raspberry Pi & Arduino & ESP32 en Facebook! Sumérgete más en Raspberry Pi, Arduino y ESP32 con otros entusiastas.

¿Por qué unirse?

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

  • Aprende y comparte: Intercambia consejos y tutoriales para mejorar tus habilidades.

  • Avances 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 festivas y sorteos: Participa en sorteos y promociones de temporada.

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

2.1.9 Joystick (MCP3008)

Introducción

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

Componentes requeridos

En este proyecto, necesitamos los siguientes componentes.

img/image317-Copy.png

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

Nombre

ARTÍCULOS EN ESTE KIT

ENLACE

Kit Raphael

337

Raphael Kit

También puedes comprarlos por separado desde 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, hay algunas diferencias entre los ejes: los datos de los ejes X e Y son analógicos, por lo que se necesita usar MCP3008 para convertir el valor analógico a valor digital. Los datos del eje Z son digitales, por lo que se pueden leer directamente usando el GPIO, o también puedes usar el ADC para leerlos.

../_images/schematic_2.1.9_joystick_mcp3008_js.png

Procedimientos experimentales

Paso 1: Construye el circuito.

../_images/2.1.9_Joystick_js.png

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

cd ~/raphael-kit/nodejs/

Paso 3: Ejecuta el código.

sudo node joystick-2.js

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

Código

const Gpio = require('pigpio').Gpio;
const mcpadc = require('mcp-spi-adc');

// Abrir canal 1 (eje X)
const xChannel = mcpadc.openMcp3008(1, { speedHz: 1350000 }, (err) => {
if (err) {
    console.error('Error al abrir el canal X:', err);
    process.exit(1);
}
});

// Abrir canal 2 (eje Y)
const yChannel = mcpadc.openMcp3008(2, { speedHz: 1350000 }, (err) => {
if (err) {
    console.error('Error al abrir el canal Y:', err);
    process.exit(1);
}
});

// Entrada del botón en GPIO22 con resistencia pull-up
const btn = new Gpio(22, {
mode: Gpio.INPUT,
pullUpDown: Gpio.PUD_UP,
});

// Bucle de lectura
setInterval(() => {
xChannel.read((errX, xReading) => {
    if (errX) {
    console.error('Error al leer canal X:', errX);
    return;
    }

    yChannel.read((errY, yReading) => {
    if (errY) {
        console.error('Error al leer canal Y:', errY);
        return;
    }

    const x_val = Math.round(xReading.value * 1023);
    const y_val = Math.round(yReading.value * 1023);
    const btn_val = btn.digitalRead();

    console.log(`x = ${x_val}, y = ${y_val}, btn = ${btn_val}\n`);
    });
});
}, 100);

Explicación del código

const mcpadc = require('mcp-spi-adc');

Esta línea importa el módulo mcp-spi-adc, que permite la comunicación con el MCP3008 utilizando la interfaz SPI de hardware de la Raspberry Pi.

const xChannel = mcpadc.openMcp3008(1, { speedHz: 1350000 }, ...);
const yChannel = mcpadc.openMcp3008(2, { speedHz: 1350000 }, ...);

Estas líneas abren los canales de entrada analógica 1 y 2 del MCP3008 para leer las señales de los ejes X e Y del joystick, respectivamente. La velocidad de comunicación SPI se establece en 1,35 MHz.

const btn = new Gpio(22, {
  mode: Gpio.INPUT,
  pullUpDown: Gpio.PUD_UP,
});

Inicializa el pin GPIO 22 como entrada digital con una resistencia pull-up interna habilitada. Este pin se utiliza para leer el estado de un botón pulsador.

setInterval(() => {
  xChannel.read(...);
  yChannel.read(...);
}, 100);

Esta función se ejecuta cada 100 milisegundos. Lee los valores de los ejes X e Y del joystick a través de los canales 1 y 2 del MCP3008 utilizando SPI. Los valores de punto flotante (rango 0.0–1.0) se convierten en enteros de 10 bits (0–1023). También lee el estado del botón usando digitalRead() en GPIO22, devolviendo 0 cuando está presionado y 1 cuando está liberado. Todos los valores se imprimen en la consola.