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.

../_images/image317-copy.png

È sicuramente conveniente acquistare un kit completo, ecco il link:

Nome

ELEMENTI IN QUESTO KIT

LINK

Kit Raphael

337

Raphael Kit

Puoi anche acquistarli separatamente dai link sottostanti.

INTRODUZIONE COMPONENTE

LINK DI ACQUISTO

Scheda di estensione GPIO

ACQUISTA

Breadboard

ACQUISTA

Cavi Jumper

ACQUISTA

Resistore

ACQUISTA

Modulo Joystick

-

MCP3008

-

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.

../_images/schematic_2.1.9_joystick_mcp3008_js.png

Procedure sperimentali

Passo 1: Monta il circuito.

../_images/2.1.9_Joystick_js.png

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.