.. note::
Ciao, benvenuto nella SunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts Community su Facebook! Approfondisci le tue conoscenze su Raspberry Pi, Arduino e ESP32 insieme ad altri appassionati.
**Perché unirti a noi?**
- **Supporto esperto**: Risolvi problemi post-vendita e sfide tecniche con l'aiuto della nostra community e del nostro team.
- **Impara e condividi**: Scambia consigli e tutorial per migliorare le tue competenze.
- **Anteprime esclusive**: Ottieni l'accesso anticipato agli annunci di nuovi prodotti e anteprime esclusive.
- **Sconti speciali**: Approfitta di sconti esclusivi sui nostri prodotti più recenti.
- **Promozioni e omaggi festivi**: Partecipa a concorsi e promozioni in occasione delle festività.
👉 Pronto per esplorare e creare con noi? Clicca su [|link_sf_facebook|] e unisciti oggi stesso!
2.1.6 Joystick
================
.. note::
.. image:: img/mcp3008_and_adc0834.jpg
:width: 25%
:align: left
A seconda della versione del kit, identifica se hai **ADC0834** o **MCP3008** e procedi con la sezione corrispondente.
Introduzione
---------------
In questo progetto, impareremo come funziona un joystick. Manovreremo
il Joystick e mostreremo i risultati sullo schermo.
Componenti
-----------
.. image:: img/image317.png
Principio di Funzionamento
----------------------------
**Joystick**
L'idea di base di un joystick è quella di tradurre il movimento della leva
in informazioni elettroniche che un computer può elaborare.
Per comunicare all'intero intervallo di movimento al computer, un joystick
deve misurare la posizione della leva su due assi: l'asse X (sinistra-destra)
e l'asse Y (alto-basso). Come in geometria di base, le coordinate X-Y individuano
esattamente la posizione della leva.
Per determinare la posizione della leva, il sistema di controllo del joystick
monitora semplicemente la posizione di ciascun asse. Il design convenzionale del
joystick analogico fa questo con due potenziometri, o resistori variabili.
Il joystick ha anche un ingresso digitale che si attiva quando il joystick viene
premuto verso il basso.
.. image:: img/image318.png
Schema a Blocchi
-----------------
Quando vengono letti i dati del joystick, ci sono alcune differenze tra gli
assi: i dati degli assi X e Y sono analogici e richiedono l'uso dell'ADC0834
per convertire il valore analogico in valore digitale. I dati dell'asse Z sono
digitali, quindi è possibile utilizzare direttamente il GPIO per leggerli,
oppure utilizzare anche l'ADC.
.. image:: img/image319.png
.. image:: img/image320.png
Procedure Sperimentali
---------------------------
**Passo 1:** Costruisci il circuito.
.. image:: img/image193.png
:width: 800
Per Utenti Linguaggio C
^^^^^^^^^^^^^^^^^^^^^^^^^^
**Passo 2:** Vai alla cartella del codice.
.. raw:: html
.. code-block::
cd ~/davinci-kit-for-raspberry-pi/c/2.1.6/
**Passo 3:** Compila il codice.
.. raw:: html
.. code-block::
gcc 2.1.6_Joystick.c -lwiringPi
**Passo 4:** Esegui il file eseguibile.
.. raw:: html
.. code-block::
sudo ./a.out
Dopo aver eseguito il codice, ruota il Joystick: i valori corrispondenti di
x, y e Btn verranno visualizzati sullo schermo.
.. note::
Se non funziona dopo l'esecuzione o appare un messaggio di errore: \"wiringPi.h: No such file or directory\", consulta :ref:`faq_c_nowork`.
**Codice**
.. code-block:: c
#include
#include
#include
typedef unsigned char uchar;
typedef unsigned int uint;
#define ADC_CS 0
#define ADC_CLK 1
#define ADC_DIO 2
#define BtnPin 3
uchar get_ADC_Result(uint channel)
{
uchar i;
uchar dat1=0, dat2=0;
int sel = channel > 1 & 1;
int odd = channel & 1;
digitalWrite(ADC_CLK, 1);
delayMicroseconds(2);
digitalWrite(ADC_CLK, 0);
delayMicroseconds(2);
pinMode(ADC_DIO, OUTPUT);
digitalWrite(ADC_CS, 0);
// Bit di inizio
digitalWrite(ADC_CLK,0);
digitalWrite(ADC_DIO,1); delayMicroseconds(2);
digitalWrite(ADC_CLK,1); delayMicroseconds(2);
// Modalità Singola
digitalWrite(ADC_CLK,0);
digitalWrite(ADC_DIO,1); delayMicroseconds(2);
digitalWrite(ADC_CLK,1); delayMicroseconds(2);
// ODD
digitalWrite(ADC_CLK,0);
digitalWrite(ADC_DIO,odd); delayMicroseconds(2);
digitalWrite(ADC_CLK,1); delayMicroseconds(2);
// Selezione
digitalWrite(ADC_CLK,0);
digitalWrite(ADC_DIO,sel); delayMicroseconds(2);
digitalWrite(ADC_CLK,1);
digitalWrite(ADC_DIO,1); delayMicroseconds(2);
digitalWrite(ADC_CLK,0);
digitalWrite(ADC_DIO,1); delayMicroseconds(2);
for(i=0;i<8;i++)
{
digitalWrite(ADC_CLK,1); delayMicroseconds(2);
digitalWrite(ADC_CLK,0); delayMicroseconds(2);
pinMode(ADC_DIO, INPUT);
dat1=dat1<<1 | digitalRead(ADC_DIO);
}
for(i=0;i<8;i++)
{
dat2 = dat2 | ((uchar)(digitalRead(ADC_DIO))< 1 & 1;
int odd = channel & 1;
digitalWrite(ADC_CLK, 1);
delayMicroseconds(2);
digitalWrite(ADC_CLK, 0);
delayMicroseconds(2);
pinMode(ADC_DIO, OUTPUT);
digitalWrite(ADC_CS, 0);
// Bit di avvio
digitalWrite(ADC_CLK,0);
digitalWrite(ADC_DIO,1); delayMicroseconds(2);
digitalWrite(ADC_CLK,1); delayMicroseconds(2);
// Modalità Singola
digitalWrite(ADC_CLK,0);
digitalWrite(ADC_DIO,1); delayMicroseconds(2);
digitalWrite(ADC_CLK,1); delayMicroseconds(2);
......
Il processo operativo di questa funzione è dettagliato in 2.1.4 Potenziometro.
.. code-block:: c
while(1){
x_val = get_ADC_Result(0);
y_val = get_ADC_Result(1);
btn_val = digitalRead(BtnPin);
printf("x = %d, y = %d, btn = %d\n", x_val, y_val, btn_val);
delay(100);
}
VRX e VRY del Joystick sono collegati rispettivamente a CH0 e CH1 dell'ADC0834.
Quindi, la funzione getResult() viene utilizzata per leggere i valori di CH0 e
CH1, che vengono poi memorizzati nelle variabili x_val e y_val. Inoltre, viene
letto il valore di SW del joystick, memorizzato nella variabile Btn_val. Infine,
i valori di x_val, y_val e Btn_val vengono stampati con la funzione print().
Per gli utenti Python
^^^^^^^^^^^^^^^^^^^^^^^^^
**Passaggio 2:** Accedi alla cartella del codice.
.. raw:: html
.. code-block::
cd ~/davinci-kit-for-raspberry-pi/python/
**Passaggio 3:** Esegui.
.. raw:: html
.. code-block::
sudo python3 2.1.6_Joystick.py
Dopo aver eseguito il codice, sposta il Joystick e i valori corrispondenti di
x, y e Btn verranno visualizzati sullo schermo.
**Codice**
.. note::
Puoi **Modificare/Reimpostare/Copiare/Eseguire/Interrompere** il codice qui
sotto. Ma prima, devi accedere al percorso del codice sorgente come ``davinci-kit-for-raspberry-pi/python``.
.. raw:: html
.. code-block:: python
import RPi.GPIO as GPIO
import ADC0834
import time
BtnPin = 22
def setup():
# Imposta il metodo GPIO su BCM Numbering
GPIO.setmode(GPIO.BCM)
GPIO.setup(BtnPin, GPIO.IN, pull_up_down=GPIO.PUD_UP)
ADC0834.setup()
def destroy():
# Rilascia le risorse
GPIO.cleanup()
def loop():
while True:
x_val = ADC0834.getResult(0)
y_val = ADC0834.getResult(1)
Btn_val = GPIO.input(BtnPin)
print ('X: %d Y: %d Btn: %d' % (x_val, y_val, Btn_val))
time.sleep(0.2)
if __name__ == '__main__':
setup()
try:
loop()
except KeyboardInterrupt: # Quando si preme 'Ctrl+C', viene eseguita la funzione destroy().
destroy()
**Spiegazione del Codice**
.. code-block:: python
def loop():
while True:
x_val = ADC0834.getResult(0)
y_val = ADC0834.getResult(1)
Btn_val = GPIO.input(BtnPin)
print ('X: %d Y: %d Btn: %d' % (x_val, y_val, Btn_val))
time.sleep(0.2)
VRX e VRY del Joystick sono collegati rispettivamente a CH0 e CH1 dell'ADC0834.
La funzione getResult() viene quindi utilizzata per leggere i valori di CH0 e CH1,
che vengono memorizzati nelle variabili x_val e y_val. Inoltre, il valore di SW del
joystick viene letto e memorizzato nella variabile Btn_val. Infine, i valori di x_val,
y_val e Btn_val vengono stampati con la funzione print().
Immagine del Fenomeno
--------------------------
.. image:: img/image194.jpeg