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.
Aprender y compartir: Intercambia consejos y tutoriales para mejorar tus habilidades.
Vistas previas exclusivas: Obtén acceso anticipado a anuncios de nuevos productos y adelantos.
Descuentos especiales: Disfruta de descuentos exclusivos en nuestros productos más nuevos.
Promociones y sorteos festivos: Participa en sorteos y promociones de temporada.
👉 ¿Listo para explorar y crear con nosotros? Haz clic en [Aquí] y únete hoy mismo.
2.1.6 Joystick (MCP3008)
Introducción
En este proyecto, vamos a aprender cómo funciona un joystick. Manipularemos el joystick y mostraremos los resultados en la pantalla.
Componentes necesarios
En este proyecto, necesitaremos los siguientes componentes.
Diagrama esquemático
Al leer los datos del joystick, existen algunas diferencias entre ejes: los datos de los ejes X y Y son analógicos, por lo que es necesario usar el MCP3008 para convertir el valor analógico a valor digital. Los datos del eje Z son digitales, por lo que puedes leerlos directamente con el GPIO, o también puedes usar el ADC para leerlos.
Procedimiento experimental
Paso 1: Montar el circuito.
Paso 2: Ir a la carpeta del código.
cd ~/davinci-kit-for-raspberry-pi/nodejs/
Paso 3: Ejecutar 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('No se pudo 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('No se pudo 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 de lectura del canal X:', errX);
return;
}
yChannel.read((errY, yReading) => {
if (errY) {
console.error('Error de lectura del 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 ADC MCP3008 utilizando la interfaz SPI por 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 y 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 interna pull-up habilitada. Este pin se utiliza para leer el estado de un pulsador.
setInterval(() => {
xChannel.read(...);
yChannel.read(...);
}, 100);
Esta función se ejecuta cada 100 milisegundos.
Lee los valores de los ejes X y Y del joystick a través de los canales 1 y 2 del MCP3008 usando SPI.
Los valores en punto flotante (rango 0.0–1.0) se convierten a enteros de 10 bits (0–1023).
También lee el estado del botón utilizando digitalRead() en el GPIO22, devolviendo 0 cuando está presionado y 1 cuando está liberado.
Todos los valores se imprimen en la consola.