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