.. note::
Ciao, benvenuto nella Community di appassionati SunFounder Raspberry Pi & Arduino & ESP32 su Facebook! Approfondisci Raspberry Pi, Arduino ed ESP32 insieme ad altri appassionati.
**Perché unirti?**
- **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 anteprima agli annunci dei nuovi prodotti e alle anticipazioni.
- **Sconti speciali**: Godi di 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.6_js_pi5_mcp3008:
2.1.6 Joystick (MCP3008)
========================
Introduzione
------------
In questo progetto impareremo come funziona un joystick.
Manipoliamo il joystick e visualizziamo i risultati sullo schermo.
Componenti necessari
--------------------
In questo progetto, abbiamo bisogno dei seguenti componenti.
.. image:: ../img/image317-copy.png
Schema elettrico
----------------
Quando si leggono 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 valore digitale.
I dati dell’asse Z sono digitali, quindi è possibile leggere direttamente il valore tramite il GPIO oppure utilizzare comunque l’ADC.
.. .. image:: ../img/image319.png
* - Nome T-Board
- Fisico
- 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
Procedura sperimentale
----------------------
**Passo 1:** Montare il circuito.
.. image:: ../img/2.1.9_Joystick_js.png
**Passo 2:** Spostarsi nella cartella del codice.
.. raw:: html
.. code-block::
cd ~/davinci-kit-for-raspberry-pi/nodejs/
**Passo 3:** Eseguire il codice.
.. raw:: html
.. code-block::
sudo node joystick-2.js
Dopo l'esecuzione del codice, spostando il joystick verranno visualizzati sullo schermo i valori corrispondenti di x, y e Btn.
**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 lettura canale X:', errX);
return;
}
yChannel.read((errY, yReading) => {
if (errY) {
console.error('Errore 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’MCP3008 ADC 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 leggere rispettivamente i 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 resistenza pull-up interna attivata.
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 usando l’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 con ``digitalRead()`` sul GPIO22, che restituisce 0 quando è premuto e 1 quando è rilasciato.
Tutti i valori vengono stampati sulla console.