.. note:: ¡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 [|link_sf_facebook|] y únete hoy mismo. .. _2.1.9_js_pi5_mcp3008: 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. .. image:: ../img/image317 - Copy.png Es definitivamente conveniente comprar un kit completo, aquí está el enlace: .. list-table:: :widths: 20 20 20 :header-rows: 1 * - Nombre - ARTÍCULOS EN ESTE KIT - ENLACE * - Kit Raphael - 337 - |link_Raphael_kit| También puedes comprarlos por separado desde los siguientes enlaces. .. list-table:: :widths: 30 20 :header-rows: 1 * - INTRODUCCIÓN DEL COMPONENTE - ENLACE DE COMPRA * - :ref:`cpn_gpio_board` - |link_gpio_board_buy| * - :ref:`cpn_breadboard` - |link_breadboard_buy| * - :ref:`cpn_wires` - |link_wires_buy| * - :ref:`cpn_resistor` - |link_resistor_buy| * - :ref:`cpn_joystick` - \- * - :ref:`cpn_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. .. .. image:: ../img/image319.png * - Nombre T-Board - physical - WiringPi - BCM * - SPICE0 - pin24 - 10 - 8 * - SPIMOSI - pin19 - 12 - 10 * - SPIMISO - pin21 - 13 - 9 * - SPISCLK - pin23 - 14 - 11 * - GPIO22 - pin15 - 3 - 22 .. image:: ../img/schematic_2.1.9_joystick_mcp3008_js.png Procedimientos experimentales ----------------------------- **Paso 1:** Construye el circuito. .. image:: ../img/2.1.9_Joystick_js.png **Paso 2:** Ve a la carpeta del código. .. raw:: html .. code-block:: cd ~/raphael-kit/nodejs/ **Paso 3:** Ejecuta el código. .. raw:: html .. code-block:: 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 ------ .. code-block:: js 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 ---------------------- .. code-block:: js 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. .. code-block:: js 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. .. code-block:: js 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. .. code-block:: js 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. .. **Imagen del fenómeno** .. ------------------------ .. .. image:: ../img/image194.jpeg