🛠 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

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

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

Autres tutoriels pour cette carte

Exemples de code pour cette carte

← Retour à la fiche 🛠 Tous les tutoriels