🛠 GPIO, touche utilisateur ADC et PWM sur le connecteur 2×20 du Lichee RV
Objectifs
Le Dock expose la majeure partie des broches du module Lichee RV sur un connecteur 2×20 pas 2,54 mm (logique 3,3 V). Particularité à connaître : la touche utilisateur du Dock n'est PAS une broche GPIO mais une entrée du convertisseur analogique basse consommation LRADC de l'Allwinner D1 (« user key (ADC) » dans les specs du lancement CNX) — elle se lit donc en périphérique input, pas en gpiod. Ce tutoriel : découvrir le contrôleur PIO du D1 avec libgpiod, sortir un signal sur une broche libre, lire la touche ADC et comprendre la sortie PWM matérielle.
Matériel
- Lichee RV Dock sous image mainline avec
gpiod/python3-gpiodetevtest(apt install gpiod python3-gpiod evtest) - LED + résistance 1 kΩ (broches 3,3 V — jamais 5 V sur les entrées du D1)
- Buzzer passif sur une broche PWM pour la partie PWM
- Schéma officiel du Dock (dl.sipeed.com, dossier Lichee_RV-Dock/2_Schematic) pour la correspondance broches physiques ↔ broches D1
Code complet
# 0) Inventaire : broches D1 en banques PA..PG, 32 lignes par banque
gpiodetect # gpiochip « pio » (contrôleur pinctrl sun20i)
gpioinfo pio | less # lignes, noms du device tree, état (kernel-used ?)
# 1) Touche utilisateur = LRADC -> événements input, pas GPIO :
sudo evtest # choisir l'appareil « lichee-rv ... key » ; KEY_* à chaque appui
# (en Python : pip install evdev puis lire /dev/input/event*)
# 2) Sortie GPIO brute : ligne = index_banque*32 + offset
# PB3 -> banque B (1)*32 + 3 = ligne 35 (ADAPTER à votre broche libre)
gpioget pio 35
sudo gpiod toggle pio 35 --period 200ms # clignote jusqu'à Ctrl-C (gpiod >= 1.6)
#!/usr/bin/env python3
"""demo_pio.py — sortie clignotante sur le Lichee RV (libgpiod v1 Python)."""
import gpiod, time
chip = gpiod.Chip("pio") # nom vu par gpiodetect
ligne = 35 # PB3 = 1*32 + 3 — ADAPTER après gpioinfo
req = chip.request_lines(
config={ligne: gpiod.LineSettings(direction=gpiod.line.Direction.OUTPUT)},
consumer="licheerv-demo")
try:
for _ in range(10):
req.set_value(ligne, 1); time.sleep(0.1)
req.set_value(ligne, 0); time.sleep(0.1)
finally:
req.release_lines
# PWM : le GPIO brut ne remplace pas le PWM matériel. Le D1 a un contrôleur PWM
# (/sys/class/pwm) ; si aucun pwmchip n'apparaît, activer le nœud pwm par un
# overlay device tree, puis : echo 0 > export ; period/duty_cycle en nanosecondes.
Vérification attendue
gpiodetect liste un gpiochip nommé pio ; gpioinfo pio montre les lignes, leurs noms et celles revendiquées par le noyau. La LED clignote à 5 Hz sur la broche choisie (multimètre : 0 / ~3,3 V). evtest affiche un événement EV_KEY à chaque appui sur la touche utilisateur — preuve que c'est le LRADC et non un GPIO qui la lit. Si request_lines renvoie « Device or resource busy », la ligne est déjà prise (console UART, LED, DMIC) : changer de broche.
Erreurs fréquentes
- Chercher la touche utilisateur en GPIO : elle est sur le LRADC (diviseur de tension) ; en GPIO brut vous ne verrez jamais rien — passer par evtest/input.
- Numéroter comme un Raspberry Pi (BCM 1-27) : ici banque × 32 (PA=0..31, PB=32..63, PC=64..95…) ; vérifier avec gpioinfo avant de câbler.
- Injecter du 5 V : la logique du D1 est en 3,3 V ; une entrée 5 V peut détruire la broche.
- Oublier les broches revendiquées par le noyau : UART0 console (PB8/PB9), LED PC0/PC1, DMIC (PB11/PE17) sont déjà utilisées par le device tree.
- Suivre un tuto Raspberry Pi/gpiozero : gpiozero ne connaît pas le D1 ; utiliser libgpiod.
Autres tutoriels pour cette carte
- Premier boot du Lichee RV Dock avec Ubuntu 24.04 RISC-V
- LEDs du Lichee RV Dock : LED verte et RGB WS2812 pilotée par le LEDC du D1
- Audio sur le Dock : enregistrer au micro numérique et jouer sur le haut-parleur 3 W
- Wi-Fi et Bluetooth du module RTL8723DS sur le Lichee RV Dock
- Tina Linux : l'OpenWrt vendor d'Allwinner pour le Lichee RV, installation et sysconfig
- Construire une image mainline complète avec Buildroot (defconfig officiel du Dock)
Exemples de code pour cette carte
clignotante.pyPythonbouton-gpio.pyPythoncapteur-i2c.shBashsurveillance-temperature.shBashcapteur-dht11.pyPythonservo-pwm-sysfs.shBash