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.

../_images/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.

../_images/schematic_2.1.9_joystick_mcp3008_js.png

Procedura sperimentale

Passo 1: Montare il circuito.

../_images/2.1.9_Joystick_js.png

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.