Nota
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 [Qui] e unisciti oggi stesso!
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.
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.
Procedura sperimentale
Passo 1: Montare il circuito.
Passo 2: Spostarsi nella cartella del codice.
cd ~/davinci-kit-for-raspberry-pi/nodejs/
Passo 3: Eseguire il codice.
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
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
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.
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.
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.
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.