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)
Nota
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 vamos a aprender cómo funciona un 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 en 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 en valor digital. Los datos del eje Z son digitales, por lo que puedes usar directamente el GPIO para leerlos, o también puedes usar el ADC.
Procedimientos experimentales
Paso 1: Construye el circuito.
Paso 2: Ve a la carpeta del código.
cd ~/raphael-kit/c/2.1.9-2/
Paso 3: Compila el código.
gcc 2.1.9_Joystick.c -o joystick -lwiringPi
Paso 4: Ejecuta el archivo compilado.
./joystick
Después de ejecutar el código, mueve el joystick, entonces los valores correspondientes de x, y, Btn se mostrarán en la pantalla.
Nota
Si no funciona después de ejecutarlo, o aparece un mensaje de error: "wiringPi.h: No such file or directory", por favor consulta Instalar y verificar WiringPi.
Código
#include <wiringPi.h>
#include <wiringPiSPI.h>
#include <stdio.h>
#define SPI_CHANNEL 0
#define SPI_SPEED 1000000 // 1 MHz
#define BtnPin 3 // WiringPi 3 = BCM GPIO22
// Leer del canal MCP3008 (0–7)
int read_ADC(int channel) {
if (channel < 0 || channel > 7) return -1;
unsigned char buffer[3];
buffer[0] = 1; // Bit de inicio
buffer[1] = (8 + channel) << 4; // Configuración de canal
buffer[2] = 0;
wiringPiSPIDataRW(SPI_CHANNEL, buffer, 3);
int result = ((buffer[1] & 0x03) << 8) | buffer[2];
return result;
}
int main(void) {
if (wiringPiSetup() == -1) {
printf("¡Falló la configuración de WiringPi!\n");
return 1;
}
if (wiringPiSPISetup(SPI_CHANNEL, SPI_SPEED) == -1) {
printf("¡Falló la configuración de SPI!\n");
return 1;
}
pinMode(BtnPin, INPUT);
pullUpDnControl(BtnPin, PUD_UP);
while (1) {
int x_val = read_ADC(0); // VRX en CH0
int y_val = read_ADC(1); // VRY en CH1
int btn_val = digitalRead(BtnPin); // Botón SW
printf("x = %d, y = %d, btn = %d\n", x_val, y_val, btn_val);
delay(100);
}
return 0;
}
Explicación del código
Esta sección inicializa las bibliotecas necesarias para la comunicación GPIO y SPI.
#include <wiringPi.h> #include <wiringPiSPI.h> #include <stdio.h> #define SPI_CHANNEL 0 #define SPI_SPEED 1000000 // 1 MHz #define BtnPin 3 // WiringPi 3 = BCM GPIO22
Define una función
read_ADC()para leer datos analógicos del MCP3008. Se comunica mediante SPI para solicitar datos de un canal determinado (0–7), luego analiza la respuesta para obtener un resultado ADC de 10 bits.int read_ADC(int channel) { if (channel < 0 || channel > 7) return -1; unsigned char buffer[3]; buffer[0] = 1; buffer[1] = (8 + channel) << 4; buffer[2] = 0; wiringPiSPIDataRW(SPI_CHANNEL, buffer, 3); int result = ((buffer[1] & 0x03) << 8) | buffer[2]; return result; }
La función principal inicializa las interfaces WiringPi y SPI, configura el pin del botón del joystick y lee continuamente los valores del joystick imprimiéndolos en la consola.
int main(void) { if (wiringPiSetup() == -1) { printf("¡Falló la configuración de WiringPi!\n"); return 1; } if (wiringPiSPISetup(SPI_CHANNEL, SPI_SPEED) == -1) { printf("¡Falló la configuración de SPI!\n"); return 1; } pinMode(BtnPin, INPUT); pullUpDnControl(BtnPin, PUD_UP); while (1) { int x_val = read_ADC(0); // VRX a CH0 int y_val = read_ADC(1); // VRY a CH1 int btn_val = digitalRead(BtnPin); // SW a GPIO22 printf("x = %d, y = %d, btn = %d\n", x_val, y_val, btn_val); delay(100); } return 0; }
En este programa:
El VRX del joystick está conectado al CH0 del MCP3008.
El VRY está conectado al CH1.
El botón (SW) está conectado al GPIO22 (pin 3 de WiringPi).
La función
read_ADC()se usa para leer valores analógicos de VRX y VRY.El valor digital del botón del joystick se lee usando
digitalRead().Todos los valores se imprimen continuamente cada 100 milisegundos.