.. note::
Ciao, benvenuto nella SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts Community 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 comunità e del nostro team.
- **Impara & Condividi**: Scambia consigli e tutorial per migliorare le tue competenze.
- **Anteprime Esclusive**: Ottieni accesso anticipato agli annunci dei nuovi prodotti.
- **Sconti Speciali**: Godi di sconti esclusivi sui nostri prodotti più recenti.
- **Promozioni Festive e Omaggi**: Partecipa a omaggi e promozioni speciali per le festività.
👉 Pronto a esplorare e creare con noi? Clicca su [|link_sf_facebook|] e unisciti oggi stesso!
2.1.6 Joystick
================
.. note::
.. image:: ../img/mcp3008_and_adc0834.jpg
:width: 25%
:align: left
A seconda della versione del kit, identifica se hai **ADC0834** o **MCP3008** e procedi con la sezione corrispondente.
Introduzione
--------------
In questo progetto, impareremo il funzionamento del joystick. Muoveremo il
joystick e visualizzeremo i risultati sullo schermo.
Componenti
-----------
.. image:: ../img/image317.png
Schema a Blocchi
------------------
Quando vengono letti i dati del joystick, ci sono alcune differenze tra gli
assi: i dati degli assi X e Y sono analogici e richiedono l'uso di ADC0834
per convertire i valori analogici in digitali. I dati dell'asse Z sono digitali,
quindi è possibile leggerli direttamente tramite GPIO oppure utilizzare ADC.
.. image:: ../img/image319.png
.. image:: ../img/image320.png
Procedure Sperimentali
-------------------------
**Passo 1:** Costruisci il circuito.
.. image:: ../img/image193.png
**Passo 2:** Vai alla cartella del codice.
.. raw:: html
.. code-block::
cd ~/davinci-kit-for-raspberry-pi/nodejs/
**Passo 3:** Esegui il codice.
.. raw:: html
.. code-block::
sudo node joystick.js
Dopo l'esecuzione del codice, ruota il joystick e vedrai i valori
corrispondenti di x, y e Btn visualizzati sullo schermo.
**Codice**
.. code-block:: js
const Gpio = require('pigpio').Gpio;
const ADC0834 = require('./adc0834.js').ADC0834;
const adc = new ADC0834(17, 18, 22);
const btn = new Gpio(25, {
mode: Gpio.INPUT,
pullUpDown: Gpio.PUD_UP,
});
setInterval(async() => {
x_val = await adc.read(0);
y_val = await adc.read(1);
btn_val = btn.digitalRead();
console.log(`x = ${x_val}, y = ${y_val}, btn = ${btn_val}\n`);
}, 100);
**Spiegazione del Codice**
.. code-block:: js
const ADC0834 = require('./adc0834.js').ADC0834;
Importiamo un costruttore ``ADC0834`` per utilizzare il modulo adc0834.
.. code-block:: js
setInterval(async() => {
x_val = await adc.read(0);
y_val = await adc.read(1);
btn_val = btn.digitalRead();
console.log(`x = ${x_val}, y = ${y_val}, btn = ${btn_val}\n`);
}, 100);
Quando si leggono i valori di più canali di ADC0834 contemporaneamente,
è necessaria la programmazione asincrona. Creiamo qui una funzione di
tipo promise e utilizziamo l'istruzione await della funzione async per
gestire elegantemente questo compito asincrono complesso.
* `Promise `_
* `Async Function `_
Immagine del Fenomeno
-------------------------
.. image:: ../img/image194.jpeg