Pour certaines applications, telles que les jeux, un joystick peut être utile, voire nécessaire. Comme celles-ci fonctionnent généralement de manière purement analogique, le signal doit être converti, ce que nous faisons avec la puce MCP3008. La connexion et la lecture d’un joystick sont présentées dans ce tutoriel.
Ces joysticks analogiques ont deux axes, qui permettent de faire passer une certaine tension à travers deux potentiomètres (résistance réglable). Pour que la position puisse également être lue numériquement sur le Raspberry, le MCP3008 est nécessaire. Le schéma de ce module est le suivant :
Sur la partie gauche se trouvent 8 entrées analogiques, dont 3 seulement sont nécessaires.
Sur la partie droite se trouvent les sorties numériques, où la transmission s’effectue via DIN et DOUT.
L’appareil MCP3008 est un convertisseur analogique-numérique de 10 bits. Cela signifie qu’il peut atteindre un maximum de 2 ^ 10, c’est-à-dire 1024 combinaisons de bits (les valeurs de 0 à 1023).
Avec une tension d’entrée de 3,3V, les 3,2mV environ sont des étapes qui peuvent être cartographiées (3,3V).
Accessoires
- Joystick (analogue)
- MCP3008 IC (convertisseur analogique-numérique)
- Breadboard
- Câble de démarrage mâle – femelle
- une résistance 10kΩ
Installation
Bien que le joystick ait une tension d’entrée de 5V, il fonctionne sans problème en utilisant 3,3V, ce qui est encore plus important lorsqu’on utilise le MCP3008. Le terme SW désigne le bouton qui est activé lorsque vous appuyez sur le joystick. Pour que cela soit 0 ou 1023 (enfoncé ou non enfoncé), une résistance 10kΩ est attachée au VCC. Sans cette résistance, des nombres invalides sont émis et ne peuvent pas être clairement attribués.
L’affectation de la broche du Raspberry ressemble à ceci :
Raspberry Pi | MCP3008 |
---|---|
Broche 1 (3,3V) | Broche 16 (VDD) |
Broche 1 (3,3V) | Broche 15 (VREF) |
Broche 6 (GND) | Broche 14 (AGND) |
Broche 23 (SCLK) | Broche 13 (CLK) |
Broche 21 (MISO) | Broche 12 (DOUT) |
Broche 19 (MOSI) | Broche 11 (DIN) |
Broche 24 (CE0) | Broche 10 (CS/SHDN) |
Broche 6 (GND) | Broche 9 (DGND) |
En suivant la connexion au joystick :
RPi / MCP3008 | Joystick |
---|---|
Raspberry Broche 6 (GND) | GND |
Raspberry Broche 1 (3,3V) | +5V |
Broche 1 (CH0) | SW |
Broche 2 (CH1) | VRx |
Broche 3 (CH2) | VRy |
Essais
Dans mon scénario, j’utilise la bibliothèque SpiDev. Si vous ne l’avez pas encore installée, vous devriez le faire avant de tester le joystick.
Comme mentionné précédemment, le MCP3008 renvoie une valeur comprise entre 0 et 1023. Si le joystick est à l’état « inactif », c’est-à-dire au milieu, environ 512 sera renvoyé. 0 est renvoyé à une extrémité d’un axe et 1023 à l’autre extrémité (à quelle extrémité cela dépend de la façon dont vous regardez le joystick).
Vous pouvez télécharger le fichier test
wget http://www.tutorials-raspberrypi.de/wp-content/uploads/scripts/joystick_test.py
ou le créer vous-même :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
#!/usr/bin/python import spidev import os import time # Define Axis Channels (channel 3 to 7 can be assigned for more buttons / joysticks) swt_channel = 0 vrx_channel = 1 vry_channel = 2 #Time delay, which tells how many seconds the value is read out delay = 0.5 # Spi oeffnen spi = spidev.SpiDev() spi.open(0,0) spi.max_speed_hz=1000000 # Function for reading the MCP3008 channel between 0 and 7 def readChannel(channel): val = spi.xfer2([1,(8+channel)<<4,0]) data = ((val[1]&3) << 8) + val[2] return data # endless loop while True: # Determine position vrx_pos = readChannel(vrx_channel) vry_pos = readChannel(vry_channel) # SW determine swt_val = readChannel(swt_channel) # output print("VRx : {} VRy : {} SW : {}".format(vrx_pos,vry_pos,swt_val)) # wait time.sleep(delay) |
Vous pouvez ensuite commencer le scénario par
sudo python joystick_test.py
et déplacez le joystick. Vous constaterez que 1024 étapes sont probablement trop, car la précision des doigts sur un petit joystick peut difficilement être atteinte. C’est pourquoi je recommanderais de définir des zones dans une application plutôt que de tester des valeurs individuelles (à part 0/1023).