🛠 GPIO, touche utilisateur ADC et PWM sur le connecteur 2×20 du Lichee RV

Sipeed Lichee RV Dock (Allwinner D1 / T-Head XuanTie C906) · intermediaire · Schéma : IMG-sipeed-lichee-rv-dock-intermediaire-2-licheerv-gpio-lradc-pwm.svg — connecteur 2×20 broches 2,54 mm du Lichee RV Dock : broche GPIO avec résistance et LED vers GND, touche utilisateur lue sur l'entrée LRADC (diviseur de tension interne du D1), broche PWM vers un buzzer, logique 3,3 V

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

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

Otros tutoriales para esta placa

Ejemplos de código para esta placa

← Volver a la ficha 🛠 Todos los tutoriales