Nota
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 [Qui] e unisciti oggi stesso!
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.
È sicuramente conveniente acquistare un kit completo, ecco il link:
Nome |
ELEMENTI IN QUESTO KIT |
LINK |
|---|---|---|
Kit Raphael |
337 |
Puoi anche acquistarli separatamente dai link sottostanti.
INTRODUZIONE COMPONENTE |
LINK DI ACQUISTO |
|---|---|
- |
|
- |
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.
Procedure sperimentali
Passo 1: Monta il circuito.
Passo 2: Vai alla cartella del codice.
cd ~/raphael-kit/nodejs/
Passo 3: Esegui il codice.
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
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
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.
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.
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.
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.