🛠 GPIO, touche utilisateur ADC et PWM sur le connecteur 2×20 du Lichee RV
Objetivos
El Dock expone la mayor parte de los pines del módulo Lichee RV en un conector de 2×20 con paso de 2,54 mm (lógica de 3,3 V). Una particularidad a conocer: el botón de usuario del Dock NO es un pin GPIO, sino una entrada del convertidor analógico de bajo consumo LRADC del Allwinner D1 (« user key (ADC) » en las especificaciones del lanzamiento de CNX) — por lo tanto, se lee como un dispositivo de entrada (input), no mediante gpiod. Este tutorial: descubrir el controlador PIO del D1 con libgpiod, generar una señal en un pin libre, leer el botón ADC y comprender la salida PWM por hardware.
Material
- Lichee RV Dock con imagen mainline que incluya
gpiod/python3-gpiodyevtest(apt install gpiod python3-gpiod evtest) - LED + resistencia de 1 kΩ (pines de 3,3 V — nunca 5 V en las entradas del D1)
- Buzzer pasivo en un pin PWM para la parte de PWM
- Esquema oficial del Dock (dl.sipeed.com, carpeta Lichee_RV-Dock/2_Schematic) para la correspondencia entre pines físicos ↔ pines del D1
Código completo
# 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.
Verificación esperada
gpiodetect lista un gpiochip llamado pio; gpioinfo pio muestra las líneas, sus nombres y las que están reclamadas por el kernel. El LED parpadea a 5 Hz en el pin elegido (multímetro: 0 / ~3,3 V). evtest muestra un evento EV_KEY en cada pulsación del botón de usuario — prueba de que es el LRADC y no un GPIO quien lo lee. Si request_lines devuelve « Device or resource busy », la línea ya está ocupada (consola UART, LED, DMIC): cambiar de pin.
Errores frecuentes
- Buscar el botón de usuario como GPIO: está en el LRADC (divisor de tensión); con GPIO en bruto nunca verás nada — usa evtest/input.
- Numerar como en una Raspberry Pi (BCM 1-27): aquí es banco × 32 (PA=0..31, PB=32..63, PC=64..95…); verifica con gpioinfo antes de cablear.
- Inyectar 5 V: la lógica del D1 es de 3,3 V; una entrada de 5 V puede destruir el pin.
- Olvidar los pines reclamados por el kernel: la consola UART0 (PB8/PB9), los LED PC0/PC1 y el DMIC (PB11/PE17) ya están utilizados por el device tree.
- Seguir un tutorial de Raspberry Pi/gpiozero: gpiozero no conoce el D1; usa libgpiod.
Otros tutoriales para esta placa
- 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)
Ejemplos de código para esta placa
clignotante.pyPythonbouton-gpio.pyPythoncapteur-i2c.shBashsurveillance-temperature.shBashcapteur-dht11.pyPythonservo-pwm-sysfs.shBash