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.
Es definitivamente conveniente comprar un kit completo, aquí está el enlace:
Nombre |
ARTÍCULOS EN ESTE KIT |
ENLACE |
|---|---|---|
Kit Raphael |
337 |
También puedes comprarlos por separado desde los siguientes enlaces.
INTRODUCCIÓN DEL COMPONENTE |
ENLACE DE COMPRA |
|---|---|
- |
|
- |
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.
Procedimientos experimentales
Paso 1: Construye el circuito.
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.