Skip to content

Incrémenter des variables avec un Joystick

Ce que l'on va faire ici

Dans ce programme Micropython, nous allons voir comment incrémenter des variables à l'aide d'un Joystick, ce qui est finalement la base de l'utilisation utile d'un Joystick pour des réglages, etc.

Un joystick est l'association :

  • de 2 résistances variables, une pour chaque axe X et Y
  • d'un bouton poussoir.

Matériel

  • une carte Pi Pico flashée avec MicroPython et préparée pour utilisation en vertical sur plaque d'essai

  • un module "prêt à câbler" Joystick

  • une petite plaque d'essai

  • quelques jumpers

Le montage à réaliser

  • On utilise ici la carte Pi Pico en vertical sur la plaque d'essai.

On utilise les broches suivantes :

  • le bouton poussoir est sur GP22
  • X est sur ADC0
  • Y est sur ADC1

Le module est connecté par ailleurs au 3.3V et à GND.

Le code

Info

Toute la "difficulté" est d'évaluer rapidement l'état d'un axe... et une façon simple de le faire est de considérer 3 "sections" de la mesure :

  • si on est entre 0 et 1/3, alors c'est -1
  • si on est entre 1/3 et 2/3, alors c'est 0
  • si on est entre 2/3 et 1, alors c'est +1

Une façon simple de faire çà est de réaliser une opération de division entière // entre la mesure et le 1/3 de la pleine échelle à savoir 21845+1=21846. Et de retrancher 1 au résultat, ce qui donnera directement la valeur à ajouter à la variable concernée.

  • pour chaque axe X et Y, on déclare un objet ADC basé sur la broche ADC0 (X) et ADC1 (Y)
  • on met en entrée avec rappel au plus la broche sur laquelle est connecté le bouton poussoir
  • on lit les valeurs à intervalle régulier, à l'aide d'un Timer

La fonction read_u16() renvoie une valeur 16 bits, bien que la mesure soit en 12 bits.

# code Micropython - www.micropython.fr - CC-BY-SA

from machine import Pin, ADC, Timer

bp=Pin(22,Pin.IN, Pin.PULL_UP) # rappel au plus
axisX=ADC(0) # axe X
axisY=ADC(1) # axe Y

x,y,a=0,0,0 # valeurs initiales des variables de comptage

timer=Timer()

def loop(timer):

    global x,y,a # utilise variables globales

    #print("X="+str(axisX.read_u16()))
    #print("Y="+str(axisY.read_u16()))
    #print("BP="+str(bp.value()))

    dx=(axisX.read_u16()//21846)-1 # division entiere
    #print(dx)
    x=x+dx
    print("x:"+str(x))

    dy=(axisY.read_u16()//21846)-1 # division entiere
    #print(dx)
    y=y+dy
    print("y:"+str(y))

    da=bp.value()
    a=a+da
    print("appuis:"+str(a))

timer.init(freq=5, callback=loop)

Résultat

Les variables s'incrémentent en fonction de la position du joystick dans chaque axe et si appui sur le BP.

Note

On peut imaginer toutes sortes de variations :

  • bloquer le comptage / décomptage avec une valeur supérieure/inférieure
  • prévoir une progression plus fine, avec incrément de 0.5... et du coup en prévoyant 5 "sections" au lieu de 3
  • etc.

Durée exécution

Si on teste la durée d'exécution de ce code en faisant :

from machine import Pin, ADC, Timer
import utime

bp=Pin(22,Pin.IN, Pin.PULL_UP) # rappel au plus
axisX=ADC(0) # axe X
axisY=ADC(1) # axe Y

x,y,a=0,0,0 # valeurs initiales des variables de comptage

timer=Timer()

def loop(timer):

    start=utime.ticks_us()

    global x,y,a # utilise variables globales

    #print("X="+str(axisX.read_u16()))
    #print("Y="+str(axisY.read_u16()))
    #print("BP="+str(bp.value()))

    dx=(axisX.read_u16()//21846)-1 # division entiere
    #print(dx)
    x=x+dx
    #print("x:"+str(x))

    dy=(axisY.read_u16()//21846)-1 # division entiere
    #print(dx)
    y=y+dy
    #print("y:"+str(y))

    da=bp.value()
    a=a+da
    #print("appuis:"+str(a))

    print(utime.ticks_diff(utime.ticks_us(),start)/1000)

timer.init(freq=5, callback=loop)

On trouve :

  • 9ms avec les print
  • 0.1ms sans les print (sauf le timeit... ) ce qui est donc assez rapide, malgré le calcul.