Please check the build logs for more information.
See Builds for ideas on how to fix a failed build, or Metadata for how to configure docs.rs builds.
If you believe this is docs.rs' fault, open an issue.
embassy-ky023-joystick
Driver asynchrone no_std pour le module joystick double-axe KY-023 (compatible PS2),
conçu pour le framework Embassy sur RP2040 (Raspberry Pi Pico 1)
et RP2350 (Raspberry Pi Pico 2).
Description matérielle
Le module KY-023 est un joystick analogique double-axe avec un bouton poussoir intégré. Il expose trois signaux :
| Broche | Type | Description |
|---|---|---|
| VRx | Analogique | Axe X : tension proportionnelle à la position |
| VRy | Analogique | Axe Y : tension proportionnelle à la position |
| SW | Numérique | Bouton actif bas (GND = enfoncé, VCC = relâché) |
┌──────────────┐
GND ───────┤ GND │
VCC ───────┤ +5V │
VRx ───────┤ VRx KY-023 │
VRy ───────┤ VRy │
SW ───────┤ SW │
└──────────────┘
Câblage recommandé
Raspberry Pi Pico 1 & 2
| KY-023 | Pico | Rôle |
|---|---|---|
| GND | GND | Masse commune |
| +5V | 3V3(OUT) | Alimentation 3.3 V |
| VRx | GP26 (ADC0) | Axe X → canal ADC 0 |
| VRy | GP27 (ADC1) | Axe Y → canal ADC 1 |
| SW | GP22 | Bouton (pull-up interne) |
Note : le KY-023 tolère 3.3 V malgré l'étiquette « +5V ». Relier à
3V3(OUT)évite tout risque de dommage sur le RP2040/RP2350.
Fonctionnalités
- Asynchrone :
Adc::readEmbassy pour les axes, sans blocage no_std:zéro allocation, compatible bare-metal- Gestion d'erreurs typée :
JoystickError<AdcError>, jamais deunwrap - Normalisation symétrique :valeurs brutes ou normalisées dans
[-1.0, +1.0] - Zone morte configurable :filtre le bruit mécanique au repos, re-normalisée
- Builder validé :
JoystickConfig::builder()avec validation à la construction - defmt optionnel: logging léger via feature
defmt - Lecture partielle : axes seuls ou bouton seul si besoin
Installation
Ajoutez dans votre Cargo.toml :
[]
= { = "0.1", = ["rp235xa"] }
Pour le Pico 1 (RP2040) :
[]
= { = "0.1", = ["rp2040"] }
Avec le support de logging defmt :
[]
= { = "0.1", = ["rp235xa", "defmt"] }
embedded-f32-sqrtetembedded-trig-f32sont des dépendances directes du driver (même auteur). Cargo les résout automatiquement.
Utilisation
Exemple minimal
use Spawner;
use ;
use ;
use bind_interrupts;
use ;
use Timer;
bind_interrupts!;
async
Configuration personnalisée
use ;
let config = builder
.resolution // natif RP2040/RP2350
.deadzone // 8 % de zone morte
.
.expect;
Lecture des axes seuls (sans bouton)
let axis = joystick.read_axes.await?;
let = axis.normalized;
let magnitude = axis.magnitude; // intensité du déplacement [0.0, √2]
let angle = axis.angle_radians; // direction en radians [-π, +π]
Lecture du bouton seul (synchrone, infaillible)
use ButtonState;
if joystick.read_button == Pressed
Exemple d'intégration — Défilement de scènes 3D sur SSD1306
Le joystick pilote l'axe X pour naviguer entre les scènes 3D (cube, pyramide, octaèdre) et l'axe Y pour ajuster la vitesse de rotation. Le bouton SW réinitialise l'angle à zéro.
use Spawner;
use ;
use ;
use bind_interrupts;
use ;
use ;
use I2C0;
use Ssd1306;
use Graphics;
use ;
use Timer;
use TAU;
use ;
use rp2350_linker as _;
bind_interrupts!;
!
const FRAME_MS: u64 = 50; // 20 FPS
const NUM_SCENES: u32 = 3;
const SCENE_THRESHOLD: f32 = 0.6;
async
Comportement :
| Entrée joystick | Effet |
|---|---|
| X > +0.6 | Scène suivante (cube → pyramide → octaèdre → …) |
| X < −0.6 | Scène précédente |
| Y vers le haut (+1.0) | Rotation rapide (~0.12 rad/frame) |
| Y vers le bas (−1.0) | Rotation lente (~0.01 rad/frame) |
| Bouton SW enfoncé | Réinitialise l'angle à 0 |
API
Joystick<'d>
| Méthode | Signature | Description |
|---|---|---|
new(...) |
→ Self |
Crée le driver |
read().await |
→ Result<JoystickState, JoystickError<AdcError>> |
Lit axes + bouton |
read_axes().await |
→ Result<Axis, JoystickError<AdcError>> |
Lit axes uniquement |
read_button() |
→ ButtonState |
Lit le bouton (synchrone) |
config() |
→ &JoystickConfig |
Configuration active |
set_config(c) |
→ () |
Mise à jour à la volée |
release() |
→ (Adc, Channel, Channel, Input) |
Récupère les périphériques |
JoystickState
| Méthode | Description |
|---|---|
normalized() |
(x, y) dans [-1.0, +1.0] |
button_pressed() |
true si SW enfoncé |
is_idle() |
true si centré et bouton relâché |
.axis |
Accès direct à [Axis] |
.button |
Accès direct à [ButtonState] |
Axis
| Méthode | Description |
|---|---|
normalized() |
(x, y) dans [-1.0, +1.0] |
is_centered() |
true si dans la zone morte |
magnitude() |
Intensité du déplacement [0.0, √2] |
angle_radians() |
Direction en radians [-π, +π] |
.raw_x, .raw_y |
Valeurs ADC brutes [0, 4095] |
JoystickConfig
| Méthode | Description |
|---|---|
default() |
12 bits, zone morte 5 % |
builder() |
Démarre le builder validé |
resolution() |
Retourne la résolution configurée |
deadzone() |
Retourne la zone morte configurée |
JoystickError<AdcErr>
| Variant | Cause |
|---|---|
AdcError(e) |
Conversion ADC échouée |
InvalidConfig { field } |
Paramètre de configuration invalide |
Features
| Feature | Description | Défaut |
|---|---|---|
rp2040 |
Active le support RP2040 via embassy-rp |
non |
rp235xa |
Active le support RP2350A via embassy-rp |
non |
rp235xb |
Active le support RP2350B via embassy-rp |
non |
defmt |
Active le logging via defmt |
non |
Zone morte
La zone morte (deadzone) filtre le bruit électronique et mécanique
au repos. Elle est exprimée en fraction de la plage totale.
Valeur brute ADC (12 bits) :
0 ──────── 2047.5 ──────── 4095
center (f32)
Après normalisation (deadzone = 5 %) :
-1.0 ──── -0.05 │ 0.0 │ +0.05 ──── +1.0
deadzone
La normalisation est symétrique : le diviseur max × 0.5 est identique
des deux côtés, garantissant des pentes égales vers −1.0 et +1.0.
La plage restante est re-normalisée pour que ±1.0 soit toujours atteint.
Compatibilité
| Carte | Feature requis |
|---|---|
| Raspberry Pi Pico (RP2040) | rp2040 |
| Raspberry Pi Pico 2 (RP2350A) | rp235xa |
| Raspberry Pi Pico 2W (RP2350B) | rp235xb |
Licence
Ce projet est distribué sous licence GPL-2.0-or-later. Voir le fichier LICENSE pour les détails.
Copyright (C) 2026 Jorge Andre Castro