.. note::
Bonjour et bienvenue dans la communauté SunFounder Raspberry Pi & Arduino & ESP32 sur Facebook !
Plongez plus profondément dans l’univers Raspberry Pi, Arduino et ESP32 avec d’autres passionnés.
**Pourquoi rejoindre ?**
- **Support d’experts** : Résolvez les problèmes après‑vente et les défis techniques avec l’aide de notre communauté et de notre équipe.
- **Apprendre et partager** : Échangez des astuces et des tutoriels pour améliorer vos compétences.
- **Aperçus exclusifs** : Obtenez un accès anticipé aux annonces de nouveaux produits et aux avant‑premières.
- **Réductions spéciales** : Profitez de remises exclusives sur nos derniers produits.
- **Promotions et concours festifs** : Participez à des concours et promotions de vacances.
👉 Prêt à explorer et à créer avec nous ? Cliquez sur [|link_sf_facebook|] et rejoignez‑nous dès aujourd’hui !
.. _2.1.9_py_mcp3008:
2.1.9 Joystick (MCP3008)
=========================
.. note::
.. image:: ../img/mcp3008_and_adc0834.jpg
:width: 25%
:align: left
Selon la version de votre kit, veuillez identifier si vous avez **ADC0834** ou **MCP3008** et suivre la section correspondante.
Introduction
------------
Dans ce projet, nous allons apprendre comment fonctionne un joystick.
Nous manipulons le joystick et affichons les résultats à l’écran.
Composants requis
-----------------
Dans ce projet, nous avons besoin des composants suivants :
.. image:: ../img/image317 - Copy.png
Il est bien sûr pratique d’acheter un kit complet, voici le lien :
.. list-table::
:widths: 20 20 20
:header-rows: 1
* - Nom
- ÉLÉMENTS DANS CE KIT
- LIEN
* - Kit Raphael
- 337
- |link_Raphael_kit|
Vous pouvez également les acheter séparément à partir des liens ci‑dessous.
.. list-table::
:widths: 30 20
:header-rows: 1
* - INTRODUCTION DU COMPOSANT
- LIEN D’ACHAT
* - :ref:`cpn_gpio_extension_board`
- |link_gpio_board_buy|
* - :ref:`cpn_breadboard`
- |link_breadboard_buy|
* - :ref:`cpn_wires`
- |link_wires_buy|
* - :ref:`cpn_resistor`
- |link_resistor_buy|
* - :ref:`cpn_joystick`
- \-
* - :ref:`cpn_mcp3008`
- \-
Schéma
------
Lors de la lecture des données du joystick, il existe des différences entre les axes :
les données des axes X et Y sont analogiques, nécessitant l’utilisation du MCP3008 pour convertir la valeur analogique en valeur numérique.
Les données de l’axe Z sont numériques ; vous pouvez donc utiliser directement un GPIO ou également lire via l’ADC.
.. .. image:: ../img/2.1.9_joystick_schematic_1.png
* - Nom T‑Board
- physique
- WiringPi
- BCM
* - SPICE0
- pin24
- 10
- 8
* - SPIMOSI
- pin19
- 12
- 10
* - SPIMISO
- pin21
- 13
- 9
* - SPISCLK
- pin23
- 14
- 11
* - GPIO22
- pin15
- 3
- 22
.. image:: ../img/schematic_2.1.9_joystick_mcp3008.png
Procédure expérimentale
-----------------------
**Étape 1 :** Construire le circuit.
.. image:: ../img/july24_2.1.9_joystick_mcp3008.png
**Étape 2 :** Configurer l’interface SPI et installer la bibliothèque ``spidev``
(voir :ref:`spi_configuration` pour les instructions détaillées). Si vous avez déjà effectué ces étapes, vous pouvez les ignorer.
**Étape 3 :** Aller dans le dossier contenant le code.
.. raw:: html
.. code-block::
cd ~/raphael-kit/python
**Étape 4 :** Exécuter le programme.
.. raw:: html
.. code-block::
sudo python3 2.1.9-2_Joystick.py
Après l’exécution du programme, tournez le joystick : les valeurs correspondantes de X, Y et Btn s’afficheront à l’écran.
.. warning::
Si un message d’erreur ``RuntimeError: Cannot determine SOC peripheral base address`` apparaît, reportez‑vous à :ref:`faq_soc`.
Code
----
.. note::
Vous pouvez **Modifier/Réinitialiser/Copier/Exécuter/Arrêter** le code ci‑dessous.
Mais avant cela, vous devez vous placer dans le chemin du code source, comme ``raphael-kit/python``.
Après modification, vous pouvez exécuter directement le programme pour voir l’effet.
.. raw:: html
.. code-block:: python
#!/usr/bin/env python3
import RPi.GPIO as GPIO
import spidev
import time
# Définir la broche GPIO pour le bouton du joystick (broche SW)
BTN_PIN = 22
# Configurer le mode GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(BTN_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP) # Utiliser la résistance pull-up interne
# Initialiser la communication SPI avec le MCP3008
spi = spidev.SpiDev()
spi.open(0, 0) # Bus SPI 0, CE0
spi.max_speed_hz = 1000000 # 1 MHz
def read_adc(channel):
"""
Lit la valeur analogique du canal MCP3008 spécifié (0–7)
:param channel: numéro du canal ADC (0–7)
:return: valeur entière sur 10 bits (0–1023)
"""
if channel < 0 or channel > 7:
return -1
adc = spi.xfer2([1, (8 + channel) << 4, 0])
value = ((adc[1] & 0x03) << 8) | adc[2]
return value
try:
# Boucle principale pour lire et afficher les valeurs du joystick et l’état du bouton
while True:
# Lire les valeurs X et Y à partir des canaux 1 et 2 du MCP3008
x_val = read_adc(1) # Joystick VRX connecté à CH1
y_val = read_adc(2) # Joystick VRY connecté à CH2
# Lire l’état du bouton du joystick (SW)
Btn_val = GPIO.input(BTN_PIN) # 0 = appuyé, 1 = relâché
# Afficher les valeurs lues
print('X: %d Y: %d Btn: %d' % (x_val, y_val, Btn_val))
time.sleep(0.2)
except KeyboardInterrupt:
pass
finally:
spi.close()
GPIO.cleanup()
Explication du code
-------------------
.. code-block:: python
#!/usr/bin/env python3
import RPi.GPIO as GPIO
import spidev
import time
Cette section importe les bibliothèques nécessaires :
- ``RPi.GPIO`` est utilisée pour gérer l’entrée GPIO (bouton du joystick).
- ``spidev`` est utilisée pour communiquer avec la puce ADC MCP3008 via SPI.
- ``time`` est utilisée pour introduire des temporisations entre les lectures.
.. code-block:: python
BTN_PIN = 22
GPIO.setmode(GPIO.BCM)
GPIO.setup(BTN_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)
spi = spidev.SpiDev()
spi.open(0, 0)
spi.max_speed_hz = 1000000
Cette section configure le mode GPIO ``BCM``, initialise le bouton du joystick sur la broche 22 avec résistance pull‑up,
et configure l’interface SPI avec le MCP3008 (bus 0, CE0) à 1 MHz.
.. code-block:: python
def read_adc(channel):
if channel < 0 or channel > 7:
return -1
adc = spi.xfer2([1, (8 + channel) << 4, 0])
value = ((adc[1] & 0x03) << 8) | adc[2]
return value
La fonction ``read_adc()`` lit une valeur analogique sur un canal spécifique du MCP3008.
Elle envoie trois octets via SPI et interprète la réponse pour retourner une valeur sur 10 bits (0–1023).
.. code-block:: python
try:
while True:
x_val = read_adc(1)
y_val = read_adc(2)
Btn_val = GPIO.input(BTN_PIN)
print('X: %d Y: %d Btn: %d' % (x_val, y_val, Btn_val))
time.sleep(0.2)
except KeyboardInterrupt:
pass
finally:
spi.close()
GPIO.cleanup()
Cette boucle principale lit et affiche toutes les 200 ms les positions analogiques X/Y du joystick et l’état de son bouton.
Si le script est interrompu via le clavier (Ctrl+C), le SPI et les GPIO sont correctement libérés.