Utilisation d’un joystick sur le Raspberry Pi à l’aide d’un MCP3008

Utilisation d'un joystick sur le Raspberry Pi à l'aide d'un MCP3008

En parcourant eBay en regardant des trucs électroniques, j’ai trouvé quelques éléments intéressants à connecter au Pi. Le premier élément était un petit joystick analogique à 2 axes. Ils sont similaires aux manettes que vous trouveriez sur une manette de console de jeux moderne. Ces modules sont bon marché et faciles à connecter à un circuit, j’ai donc décidé d’en acheter un. Les sorties sont analogiques, vous avez donc besoin d’un mécanisme pour que le Pi lise ces tensions.

Dans cet article, je vais montrer comment vous pouvez utiliser cet appareil avec le Pi. Une fois qu’il fonctionne, il peut être utilisé comme périphérique d’entrée pour toutes sortes de projets. Peut-être un jeu Python écrit à l’aide du module Pygame ?

Joystick analogiqueL’appareil que j’ai acheté était étiqueté « Keyes_SJoyes ». Il se compose de deux potentiomètres qui donnent une tension analogique basée sur la position horizontale et verticale de la manette. Une pression sur le manche active un petit interrupteur. Il n’y a pas de composants sophistiqués sur la carte et parce qu’il ne s’agit vraiment que de deux résistances variables, cela fonctionne bien avec 3,3 V malgré l’étiquette PCB 5V.

Brochage du MCP3008Afin de mesurer les tensions X et Y, j’ai décidé d’utiliser un convertisseur analogique-numérique 10 bits MCP3008. Ces appareils sont bon marché, faciles à installer et permettent la lecture de 8 entrées analogiques par le Pi à l’aide de son interface SPI. Dans ce tutoriel, nous n’aurons besoin que de trois de ses entrées.

Voir mon article précédent sur le MCP3008 pour plus de détails sur la façon dont j’en ai utilisé un pour lire les niveaux de lumière et la température.

Circuit de planche à pain

Voici mon circuit d’essai. Le brochage de mon joystick est légèrement différent du symbole Sparkfun que j’ai utilisé dans ce schéma, mais le codage couleur du fil correspond aux photos.

Circuit MCP3008 et joystick

Voici les informations de câblage pour le module joystick :

Joystick          Pi/MCP3008              Wire Colour
--------------    ----------------------  ----------------
GND  (Ground)     Pi GPIO Pin 6 (Ground)  Black
5V   (3.3V)       Pi GPIO Pin 1 (3.3V)    White
SW   (Switch)     MCP3008 Pin 1 (CH0)     Purple
VRx  (X voltage)  MCP3008 Pin 2 (CH1)     Blue
VRy  (Y voltage)  MCP3008 Pin 3 (CH2)     Green

Le MCP3008 est câblé comme dans mon post précédent :

MCP3008           Pi                      Wire Colour
--------------    ----------------        -----------
Pin 1  (CH0)      -                       Purple
Pin 2  (CH1)      -                       Blue
Pin 3  (CH2)      -                       Green
Pin 9  (DGND)     Pin 6  (Ground)         Black
Pin 10 (CS)       Pin 24 (GPIO8)          Orange
Pin 11 (DIN)      Pin 19 (GPIO10)         Yellow
Pin 12 (DOUT)     Pin 21 (GPIO9)          Green
Pin 13 (CLK)      Pin 23 (GPIO11)         Blue
Pin 14 (AGND)     Pin 6  (Ground)         Black       
Pin 15 (VREF)     Pin 1  (3.3V)           Red
Pin 16 (VDD)      Pin 1  (3.3V)           Red

Joystick analogiqueDans ce cas, nous utilisons trois des entrées analogiques. Vous pouvez lire la valeur Switch à l’aide d’une broche GPIO normale, mais dans ce cas, j’ai décidé d’utiliser une entrée analogique pour plus de commodité.

La résistance de 10K est utilisée pour tirer l’entrée du commutateur High (3,3V). Lorsque l’interrupteur est enfoncé, l’entrée est connectée à la masse (0V). Sans la résistance, l’entrée serait dans un état indéfini lorsque le commutateur n’était pas enfoncé et lisait des valeurs aléatoires. Essaie.

Configuration Pi SPI

Pour utiliser le MCP3008, nous devons d’abord configurer le bus SPI sur le Pi. Plutôt que de répéter les instructions ici, ouvrez le didacticiel Capteurs analogiques sur le Raspberry Pi à l’aide d’un MCP3008 dans une nouvelle fenêtre de navigateur et complétez les sections :

  • Activer le SPI matériel
  • Installer Python SPI Wrapper

Script de test Python

Espérons que si vous l’avez câblé correctement et que l’interface SPI est configurée, nous sommes prêts à exécuter un script Python pour lire les valeurs du joystick.

L’ADC est de 10 bits, il peut donc signaler une plage de nombres de 0 à 1023 (2 à la puissance 10). Une lecture de 0 signifie que l’entrée est de 0V et une lecture de 1023 signifie que l’entrée est de 3,3V. Dans notre circuit, le commutateur indiquera 3,3 V (1023) jusqu’à ce qu’il soit enfoncé et indiquera 0 V (0). Les valeurs du joystick X et Y varieront entre 0 et 1023 lorsqu’elles sont déplacées d’un extrême à l’autre. En position centrale, nous nous attendrions à une valeur de 511,5. En réalité cela va varier entre 509 et 514.

#!/usr/bin/python
#--------------------------------------
# This script reads data from a
# MCP3008 ADC device using the SPI bus.
#
# Analogue joystick version!
#
# Author : Matt Hawkins
# Date   : 17/04/2014
#
# https://www.raspberryme.com/
#
#--------------------------------------

import spidev
import time
import os

# Open SPI bus
spi = spidev.SpiDev()
spi.open(0,0)

# Function to read SPI data from MCP3008 chip
# Channel must be an integer 0-7
def ReadChannel(channel):
  adc = spi.xfer2([1,(8+channel)<<4,0])
  data = ((adc[1]&3) << 8) + adc[2]
  return data

# Define sensor channels
# (channels 3 to 7 unused)
swt_channel = 0
vrx_channel = 1
vry_channel = 2

# Define delay between readings (s)
delay = 0.5

while True:

  # Read the joystick position data
  vrx_pos = ReadChannel(vrx_channel)
  vry_pos = ReadChannel(vry_channel)

  # Read switch state
  swt_val = ReadChannel(swt_channel)

  # Print out results
  print "--------------------------------------------"
  print("X : {}  Y : {}  Switch : {}".format(vrx_pos,vry_pos,swt_val))

  # Wait before repeating loop
  time.sleep(delay)

Vous pouvez télécharger ce script directement sur votre Pi en utilisant :

wget https://bitbucket.org/MattHawkinsUK/rpispy-misc/raw/master/mcp3008/mcp3008_joystick.py

Cela peut ensuite être exécuté en utilisant :

sudo python mcp3008_joystick.py

Si tout a fonctionné correctement, vous devriez voir une sortie qui ressemble à quelque chose comme :

Sortie du joystick MCP3008

La lecture du commutateur varie mais est toujours >1010 lorsqu’il n’est pas enfoncé et <10 lorsqu'il est enfoncé.

Lorsque vous déplacez la manette, vous devriez voir les valeurs X et Y changer. Vous pouvez réduire la valeur de la variable « delay » pour augmenter le taux de mise à jour.

Maintenant que vous pouvez lire les valeurs à partir d’un joystick, vous n’avez plus qu’à penser à un projet dans lequel l’utiliser ! Vous pouvez ajouter un module supplémentaire et utiliser trois autres canaux sur le MCP3008.

Voici quelques photos du circuit de test et du module joystick à manette :

Vous remarquerez peut-être que ma planche à pain sur les photos a quelques fils supplémentaires (long fil rouge, long fil bleu et fil noir plié). Ceux-ci ont été hérités des didacticiels MCP3008 précédents et peuvent être ignorés.

Voici quelques autres articles de blog que j’ai trouvés en utilisant un joystick analogique à 2 axes avec un Raspberry Pi :

http://devilqube.blogspot.co.uk/2014/02/analog-thumbstick-and-raspberry-pi.html

https://learn.adafruit.com/cupcade-raspberry-pi-micro-mini-arcade-game-cabinet