.. note:: Ciao, benvenuto nella Community su Facebook di appassionati di SunFounder Raspberry Pi, Arduino & ESP32! Esplora più a fondo il mondo di Raspberry Pi, Arduino ed ESP32 insieme a altri appassionati. **Perché unirti a noi?** - **Supporto Esperto**: Risolvi i problemi post-vendita e le 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**: Ottieni un accesso anticipato ai nuovi annunci di prodotti e alle anteprime. - **Sconti Speciali**: Goditi sconti esclusivi sui nostri prodotti più recenti. - **Promozioni Festive e Giveaway**: Partecipa a giveaway e promozioni festive. 👉 Sei pronto per esplorare e creare insieme a noi? Clicca [|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 il funzionamento del joystick. Manipoleremo il joystick e mostreremo i risultati sullo schermo. Componenti ----------- .. image:: img/image317.png Principio di Funzionamento ---------------------------- **Joystick** Il principio di base di un joystick è tradurre il movimento della leva in informazioni elettroniche che un computer può elaborare. Per comunicare un’intera gamma di movimenti al computer, il joystick deve misurare la posizione della leva su due assi — l’asse X (sinistra-destra) e l’asse Y (alto-basso). Come in geometria, 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 lo fa con due potenziometri, o resistori variabili. Il joystick dispone anche di un input digitale attivato quando il joystick viene premuto verso il basso. .. image:: img/image318.png Schema Elettrico --------------------- Quando si legge il dato del joystick, ci sono delle differenze tra gli assi: i dati degli assi X e Y sono analogici e necessitano dell'ADC0834 per convertire il valore analogico in digitale. Il dato dell'asse Z è digitale, quindi è possibile utilizzare direttamente il GPIO per leggerlo, oppure si può usare l'ADC. .. image:: img/image319.png .. image:: img/image320.png Procedure Sperimentali -------------------------- **Passo 1:** Costruisci il circuito. .. image:: img/image193.png :width: 800 **Passo 2:** Accedi 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 l'esecuzione del codice, muovi il joystick: i valori corrispondenti di x, y e Btn saranno visualizzati sullo schermo. .. note:: Se non funziona dopo l'esecuzione, o compare un messaggio di errore: \"wiringPi.h: No such file or directory\", fai riferimento a :ref:`faq_c_nowork`. **Spiegazione del 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 avvio digitalWrite(ADC_CLK,0); digitalWrite(ADC_DIO,1); delayMicroseconds(2); digitalWrite(ADC_CLK,1); delayMicroseconds(2); // Modalità single-end digitalWrite(ADC_CLK,0); digitalWrite(ADC_DIO,1); delayMicroseconds(2); digitalWrite(ADC_CLK,1); delayMicroseconds(2); // Valore 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à single-end digitalWrite(ADC_CLK,0); digitalWrite(ADC_DIO,1); delayMicroseconds(2); digitalWrite(ADC_CLK,1); delayMicroseconds(2); ...... Il processo di funzionamento della funzione è descritto in dettaglio nella sezione 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. La funzione getResult() viene chiamata 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 salvato nella variabile Btn_val. Infine, i valori di x_val, y_val e Btn_val vengono visualizzati con la funzione print().