Vai al contenuto

Joystick con ESP32

Un joystick è un dispositivo di input utilizzato per controllare la posizione di un cursore o di un oggetto su uno schermo, soprattutto nei contesti di videogiochi, simulatori di volo o altre applicazioni interattive. Si tratta di una leva o di un dispositivo simile che può essere spostato in diverse direzioni per controllare il movimento di un cursore o di un'entità virtuale.

I joystick possono avere varie forme e dimensioni, ma in genere consistono in una leva che può essere inclinata o spostata in diverse direzioni.

Esso fornisce al processore i segnali elettrici relativi alla posizione di due, l'asse X e l'asse Y. Inoltre il joystick ha a disposizione anche l'asse Z che ci servirà per indicare la pressione o meno del joystick stesso.

esempio di joystick

In figura vediamo i collegamenti elettrici che il nostro joystick richiede:

  • Il collegamento al GND
  • L'alimentazione a 5V (3.3V per il nostro joystick)
  • L'asse X (valori da 0 a 4095)
  • L'asse Y (valori da 0 a 4095)
  • L'asse Z (valori da 0 a 1)

I due segnali VRX e VRY (per gli assi X e Y) sono due segnali analogici che andranno collegati direttamenti a due pin GPIO del componente ESP32 con funzione ADC di convertitore Analogico-Digitale.

Codice

I segnali elettrici collegati ai pin 13 e 14 vengono trasformati in segnali digitali (numeri) In pratica il valore di tensione in ingresso andrà da un valore di 0V a un valore di 3.3V a seconda della posizione del joystick. I corrispondenti valori digitali saranno 0 (per 0V) e 4095 (per 3.3V).

Al pin 12 arriverà in input o un valore basso (0 o LOW) o valore alto (1 o HIGH) a seconda se il pin verrà premuto o meno.

Il codice è sotto riportato.

from machine import ADC,Pin
import time

xVal=ADC(Pin(14)) #ADC sta per Analog-Conversion Converter
yVal=ADC(Pin(13))
zVal=Pin(12,Pin.IN,Pin.PULL_UP) #

xVal.atten(ADC.ATTN_11DB)
yVal.atten(ADC.ATTN_11DB)
xVal.width(ADC.WIDTH_12BIT)
yVal.width(ADC.WIDTH_12BIT)

while True:
  print("X,Y,Z:",xVal.read(),",",yVal.read(),",",zVal.value())
  time.sleep(1)

Quello che dovreste vedere sarà qualcosa del genere:

shell