.. note:: Ciao, benvenuto nella Community SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts su Facebook! Approfondisci Raspberry Pi, Arduino ed ESP32 con altri appassionati. **Perché unirsi?** - **Supporto esperto**: Risolvi problemi post-vendita e sfide tecniche con l'aiuto della nostra community e del nostro team. - **Impara e condividi**: Scambia suggerimenti e tutorial per migliorare le tue competenze. - **Anteprime esclusive**: Accedi in anticipo agli annunci dei nuovi prodotti e alle anteprime. - **Sconti speciali**: Goditi sconti esclusivi sui nostri prodotti più recenti. - **Promozioni festive e giveaway**: Partecipa a giveaway e promozioni festive. 👉 Pronto a esplorare e creare con noi? Clicca [|link_sf_facebook|] e unisciti oggi stesso! .. _2.1.9_js_pi5_mcp3008: 2.1.9 Joystick (MCP3008) ========================== Introduzione -------------- In questo progetto impareremo come funziona un joystick. Manipoleremo il joystick e visualizzeremo i risultati sullo schermo. Componenti necessari ------------------------------- In questo progetto sono necessari i seguenti componenti. .. image:: ../img/image317-copy.png È sicuramente conveniente acquistare un kit completo, ecco il link: .. list-table:: :widths: 20 20 20 :header-rows: 1 * - Nome - ELEMENTI IN QUESTO KIT - LINK * - Kit Raphael - 337 - |link_Raphael_kit| Puoi anche acquistarli separatamente dai link sottostanti. .. list-table:: :widths: 30 20 :header-rows: 1 * - INTRODUZIONE COMPONENTE - LINK DI ACQUISTO * - :ref:`cpn_gpio_extension_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` - \- Schema elettrico ----------------- Quando vengono letti i dati del joystick, ci sono alcune differenze tra gli assi: i dati degli assi X e Y sono analogici, quindi è necessario utilizzare l’MCP3008 per convertire il valore analogico in un valore digitale. I dati dell’asse Z sono digitali, quindi è possibile utilizzare direttamente il GPIO per leggerli oppure utilizzare l'ADC. .. image:: ../img/schematic_2.1.9_joystick_mcp3008_js.png Procedure sperimentali ----------------------- **Passo 1:** Monta il circuito. .. image:: ../img/2.1.9_Joystick_js.png **Passo 2:** Vai alla cartella del codice. .. raw:: html .. code-block:: cd ~/raphael-kit/nodejs/ **Passo 3:** Esegui il codice. .. raw:: html .. code-block:: sudo node joystick-2.js Dopo l'esecuzione del codice, muovi il joystick, quindi i valori corrispondenti di x, y e Btn vengono visualizzati sullo schermo. **Codice** .. code-block:: js const Gpio = require('pigpio').Gpio; const mcpadc = require('mcp-spi-adc'); // Apri il canale 1 (asse X) const xChannel = mcpadc.openMcp3008(1, { speedHz: 1350000 }, (err) => { if (err) { console.error('Impossibile aprire il canale X:', err); process.exit(1); } }); // Apri il canale 2 (asse Y) const yChannel = mcpadc.openMcp3008(2, { speedHz: 1350000 }, (err) => { if (err) { console.error('Impossibile aprire il canale Y:', err); process.exit(1); } }); // Pulsante su GPIO22 con pull-up const btn = new Gpio(22, { mode: Gpio.INPUT, pullUpDown: Gpio.PUD_UP, }); // Ciclo di lettura setInterval(() => { xChannel.read((errX, xReading) => { if (errX) { console.error('Errore di lettura canale X:', errX); return; } yChannel.read((errY, yReading) => { if (errY) { console.error('Errore di lettura canale 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); **Spiegazione del codice** .. code-block:: js const mcpadc = require('mcp-spi-adc'); Questa riga importa il modulo ``mcp-spi-adc``, che consente la comunicazione con l’ADC MCP3008 utilizzando l’interfaccia SPI hardware del Raspberry Pi. .. code-block:: js const xChannel = mcpadc.openMcp3008(1, { speedHz: 1350000 }, ...); const yChannel = mcpadc.openMcp3008(2, { speedHz: 1350000 }, ...); Queste righe aprono i canali di ingresso analogico 1 e 2 dell'MCP3008 per la lettura dei segnali degli assi X e Y del joystick. La velocità di comunicazione SPI è impostata a 1,35 MHz. .. code-block:: js const btn = new Gpio(22, { mode: Gpio.INPUT, pullUpDown: Gpio.PUD_UP, }); Inizializza il pin GPIO 22 come ingresso digitale con una resistenza di pull-up interna abilitata. Questo pin viene utilizzato per leggere lo stato di un pulsante. .. code-block:: js setInterval(() => { xChannel.read(...); yChannel.read(...); }, 100); Questa funzione viene eseguita ogni 100 millisecondi. Legge i valori degli assi X e Y del joystick tramite i canali 1 e 2 dell'MCP3008 utilizzando SPI. I valori in virgola mobile (intervallo 0.0–1.0) vengono convertiti in interi a 10 bit (0–1023). Viene inoltre letto lo stato del pulsante utilizzando ``digitalRead()`` su GPIO22, che restituisce 0 quando premuto e 1 quando rilasciato. Tutti i valori vengono stampati sulla console.