
L’Odroid-GO a été commercialisé en 2018 pour célébrer le 10-ième anniversaire de la société Handkernel. Conçu autour d’un esp32, il présente les caractéristiques suivantes:
MCU | Custom ESP32-WROVER(16 MB Flash Memory) | |
CPU & RAM | 80MHz – 240MHz(Adjustable), 4MB PSRAM | |
Wi-Fi | 802.11 b/g/n 2.4GHz – 2.5GHz | |
Bluetooth | Bluetooth v4.2 BR/EDR, BLE | |
Display | 2.4inch 320×240 TFT LCD (SPI interface) | |
Battery | Li-Polymer 3.7V/1200mAh, Up to 10 hours of continuous game playing time | |
Speaker | 0.5Watt 8Ω Mono | |
Micro SD card slot | 20Mhz SPI interface | |
Micro USB port | Battery charging(500mA) and USB-UART data communication | |
Expansion Port | 10Pin port(I2C, GPIO, IRQ at 3.3Volt) | |
Input Buttons | Menu, Volume, Select, Start, A, B, Direction Pad | |
Power consumption | Game emulation: 100~115mA, Sleep mode: 5.3~5.8mA, Power off: 0.1mA |
L’objectif de cet article est d’illustrer comment l’on peut développer en micropython sur ce matériel. A notre connaissance, il semble que le micropython proposé par Handkernel ne puisse pas gérer simultanément l’écran et la carte mémoire car ces deux composants utilisent le bus SPI avec des vitesses différentes. Aussi, nous proposons de démarrer avec un micropython générique esp32.
Installation de micropython
Une solution simple est d’utiliser Thonny pour installer micropython

Cliquer « Installer ou mettre à jour MicroPython (esptool) »

Cliquer sur « Installer »
Module odroidtools
Ce module permet de gérer les différents composants de l’Odroid-Go : l’écran, les boutons, l’état de la batterie et les connexions wifi.
REMARQUE : il est nécessaire de commencer une application avec l’appel de la fonction init_lcd()
hello.py
Au démarrage, la fonte standard est de dimension 5×5. Cette fonte minimum permet de n’afficher que les lettres minuscules, les lettres majuscules, les chiffres et les symboles courants:
[‘ ‘, ‘!’, ‘ »‘, ‘#’, ‘$’, ‘%’, ‘&’, « ‘ », ‘(‘, ‘)’, ‘*’, ‘+’, ‘,’, ‘-‘, ‘.’, ‘/’, ‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’, ‘:’, ‘;’, ‘<‘, ‘=’, ‘>’, ‘?’, ‘@’, ‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’, ‘G’, ‘H’, ‘I’, ‘J’, ‘K’, ‘L’, ‘M’, ‘N’, ‘O’, ‘P’, ‘Q’, ‘R’, ‘S’, ‘T’, ‘U’, ‘V’, ‘W’, ‘X’, ‘Y’, ‘Z’, ‘[‘, ‘\’, ‘]’, ‘^’, ‘_’, ‘`’, ‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’, ‘g’, ‘h’, ‘i’, ‘j’, ‘k’, ‘l’, ‘m’, ‘n’, ‘o’, ‘p’, ‘q’, ‘r’, ‘s’, ‘t’, ‘u’, ‘v’, ‘w’, ‘x’, ‘y’, ‘z’, ‘{‘, ‘|’, ‘}’, ‘~’]
Documentation des fonctions graphiques
get_chars_font()
Description:
Cette fonction retourne la liste des caractères définis dans la police actuellement utilisée. Elle est utile pour connaître les caractères disponibles pour l’affichage.
color565(r, g, b)
Description:
Convertit une couleur définie par ses composantes RGB (Rouge, Vert, Bleu) en un format 16 bits compatible avec les écrans ou dispositifs qui utilisent ce format.
Paramètres:
r
(int) : Intensité de la composante rouge (0-255).g
(int) : Intensité de la composante verte (0-255).b
(int) : Intensité de la composante bleue (0-255).
Retour:- Valeur entière représentant la couleur en format 16 bits.
set_fore_color(r, g, b)
Description:
Définit la couleur du premier plan (texte ou tracé) en utilisant les composantes RGB spécifiées.
Paramètres:
r
(int) : Intensité de la composante rouge (0-255).g
(int) : Intensité de la composante verte (0-255).b
(int) : Intensité de la composante bleue (0-255).
set_back_color(r, g, b)
Description:
Définit la couleur d’arrière-plan en utilisant les composantes RGB spécifiées.
Paramètres:
r
(int) : Intensité de la composante rouge (0-255).g
(int) : Intensité de la composante verte (0-255).b
(int) : Intensité de la composante bleue (0-255).
set_font_size(n)
Description:
Modifie la taille de la police utilisée pour afficher du texte.
Paramètres:
n
(int) : Taille de la police.
fill_rect(x, y, w, h, max_data=4096)
Description:
Remplit un rectangle de couleur unie aux coordonnées spécifiées.
Paramètres:
x
(int) : Coordonnée en X du coin supérieur gauche.y
(int) : Coordonnée en Y du coin supérieur gauche.w
(int) : Largeur du rectangle.h
(int) : Hauteur du rectangle.max_data
(int) : Limite optionnelle de données envoyées à la fois. Ne pas modifier pour l’Odroid-Go
pixel(x, y)
Description:
Affiche un pixel à une position spécifique sur l’écran avec la couleur de premier plan.
Paramètres:
x
(int) : Coordonnée en X du pixel.y
(int) : Coordonnée en Y du pixel.
clear_screen()
Description:
Efface entièrement l’écran ou le dispositif en appliquant la couleur d’arrière-plan.
draw_char(char, x, y, transparence=True)
Description:
Dessine un caractère à une position spécifique.
Paramètres:
char
(str) : Caractère à dessiner.x
(int) : Coordonnée en X de la position.y
(int) : Coordonnée en Y de la position.transparence
(bool) : Indique si l’arrière-plan doit rester transparent.
draw_string(d, x, y, transparence=True)
Description:
Affiche une chaîne de caractères à une position donnée.
Paramètres:
d
(str) : Chaîne de caractères à afficher.x
(int) : Coordonnée en X de la position de départ.y
(int) : Coordonnée en Y de la position de départ.transparence
(bool) : Indique si l’arrière-plan doit rester transparent.
draw_line(x1, y1, x2, y2)
Description:
Trace une ligne entre deux points spécifiés.
Paramètres:
x1
(int) : Coordonnée en X du point de départ.y1
(int) : Coordonnée en Y du point de départ.x2
(int) : Coordonnée en X du point d’arrivée.y2
(int) : Coordonnée en Y du point d’arrivée.
draw_oval(xc, yc, a, b, fill=False)
Description:
Dessine une ellipse centrée sur des coordonnées spécifiques.
Paramètres:
xc
(int) : Coordonnée en X du centre.yc
(int) : Coordonnée en Y du centre.a
(int) : Demi-grand axe.b
(int) : Demi-petit axe.fill
(bool) : Indique si l’ellipse doit être remplie.
draw_circle(xc, yc, r, fill=False)
Description:
Dessine un cercle centré sur des coordonnées spécifiques.
Paramètres:
xc
(int) : Coordonnée en X du centre.yc
(int) : Coordonnée en Y du centre.r
(int) : Rayon du cercle.fill
(bool) : Indique si le cercle doit être rempli.
Utilisation du wifi
connect_wifi(ssid, password, maxtry=10)
Description:
Cette fonction permet de connecter l’Odroid-Go à un réseau Wi-Fi donné en utilisant un SSID (nom du réseau) et un mot de passe. Elle tente de se connecter plusieurs fois jusqu’à ce qu’une connexion réussie soit établie ou que le nombre maximal de tentatives soit atteint. Si la connexion réussit, l’adresse IP du dispositif est retournée, sinon une adresse IP par défaut (0.0.0.0
) est retournée.
Paramètres:
ssid
(str) : Le nom du réseau Wi-Fi auquel se connecter.password
(str) : Le mot de passe du réseau Wi-Fi.maxtry
(int) : Le nombre maximal de tentatives pour se connecter (optionnel, valeur par défaut : 10).
Retour:
- Si la connexion réussit avant d’atteindre le nombre maximal de tentatives, l’adresse IP du dispositif est retournée (sous forme de chaîne de caractères).
- Si la connexion échoue après le nombre maximal de tentatives, la fonction retourne
"0.0.0.0"
.
Détails:
- La fonction active l’interface réseau en mode station (
STA_IF
) et tente de se connecter au réseau spécifié par le SSID et le mot de passe. - Elle essaie de se connecter jusqu’à ce qu’une connexion réussie soit établie ou que le nombre de tentatives soit épuisé.
- Après chaque tentative, la fonction attend 1 seconde avant de réessayer.
- Si la connexion réussit, l’adresse IP du dispositif est obtenue via
wifi.ifconfig()[0]
et retournée. - Si la connexion échoue après
maxtry
tentatives, l’adresse IP"0.0.0.0"
est retournée.
Mesure de la tension de la batterie
get_voltage()
Description:
Cette fonction mesure la tension analogique sur la broche spécifique (broche GPIO 36) en utilisant un convertisseur analogique-numérique (ADC) et retourne la valeur correspondante en volts. Elle effectue plusieurs lectures pour obtenir une moyenne plus stable de la valeur mesurée.
Retour:
- La fonction retourne la tension mesurée en volts de la batterie de l’Odroid-Go.
Paramètres:
Aucun paramètre d’entrée.
Pour la batterie Li-Polymer 3.7V équipant l’Odroid-Go, voici les différentes plages de tension qui indiquent son état de charge :
- Batterie chargée :
- Plage de tension : Environ 4.1V à 4.2V.
- Une batterie Li-Polymer est considérée comme complètement chargée lorsque sa tension atteint environ 4.2V, mais cela peut légèrement varier selon le modèle de la batterie.
- Batterie en charge :
- Plage de tension : Entre 4.0V et 4.2V.
- Lorsque la batterie est en cours de charge, la tension peut fluctuer entre ces valeurs en fonction de la phase de charge (charge rapide, fin de charge, etc.).
- Batterie en tension critique (déchargée) :
- Plage de tension : Environ 3.3V à 3.4V.
- Lorsque la tension de la batterie descend en dessous de 3.4V, la batterie est considérée comme déchargée ou proche de l’état critique. En dessous de 3.0V, il peut y avoir des risques de dégradation de la batterie.
- Batterie complètement déchargée :
- Plage de tension : En dessous de 3.0V.
- Une batterie Li-Polymer peut être endommagée si sa tension descend en dessous de 3.0V, donc il est important d’éviter de laisser la batterie descendre à cette valeur.
Récapitulatif :
- Chargée : 4.1V – 4.2V
- En charge : 4.0V – 4.2V
- Critique/déchargée : 3.3V – 3.4V
- Complètement déchargée : Moins de 3.0V
Utilisation des boutons
ButtonHandler
Description:
La classe ButtonHandler
est utilisée pour gérer l’interaction avec des boutons physiques connectés à un microcontrôleur, en particulier pour éviter les rebonds du bouton (debouncing). Lorsqu’un bouton est pressé, la fonction spécifiée (fonction
) est exécutée, tout en s’assurant que les presses successives ne déclenchent pas la fonction trop rapidement.
Attributs:
last_press_time
(int) : Le timestamp (en millisecondes) du dernier appui sur le bouton. Cet attribut est utilisé pour gérer le temps entre deux pressions successives et éviter les rebonds.debounce_time_ms
(int) : Le temps de debounce (en millisecondes) à appliquer entre deux pressions pour les considérer comme distinctes. Par défaut, cette valeur est de 300 ms.tpin
(dict) : Dictionnaire qui associe des noms de boutons à des numéros de broche (GPIO) du microcontrôleur.pin
(Pin) : ObjetPin
qui représente la broche GPIO à laquelle le bouton est connecté. Ce pin est configuré en entrée avec une résistance de tirage vers le haut (Pin.PULL_UP
).
Méthodes:
__init__(self, nom, fonction, debounce_time_ms=300)
Description:
Le constructeur initialise le gestionnaire de boutons. Il prend en entrée le nom du bouton, la fonction à exécuter lors d’un appui, et le temps de rebonds en millisecondes.
Paramètres:
nom
(str) : Le nom du bouton de l’Odroid-Go à gérer :- « A » , « B » , « MENU » , « SELECT » , « VOLUME » , « START »
fonction
(function) : La fonction qui sera appelée chaque fois que le bouton est pressé.debounce_time_ms
(int, optionnel) : Le temps de rebonds en millisecondes (par défaut, 300 ms).
La fonction crée un objet Pin
associé à la broche spécifiée, configure une interruption (irq
) pour détecter un appui sur le bouton (IRQ_FALLING
), et appelle la fonction spécifiée après un délai de rebonds.
Détails:
- Un dictionnaire
tpin
mappe des noms de boutons à des numéros de broche GPIO. - Lorsqu’un appui sur le bouton est détecté, une fonction de gestion est appelée via une interruption, en vérifiant que suffisamment de temps s’est écoulé depuis la dernière pression pour éviter les rebonds.
- Si le temps entre deux pressions consécutives est supérieur au délai de rebonds, la fonction spécifiée est exécutée.
Modules SDCard et bmp
Les modules SDCard et bmp permettent respectivement d’accèder à la sdcard et d’afficher une image bmp sur l’écran. Les images bmp doivent être non compressées et en couleur 24 bits. Exemple d’utilisation:
Goodie Page de code 850
La page de code 850 est une page de code définie par IBM et qui est utilisée en Europe occidentale avec le système DOS et d’autres systèmes de la même époque. C’est une extension de l’ASCII sur 8 bits, partiellement compatible avec la page de code 437 dont elle est dérivée et qu’elle modifie.
v · d · m | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x | NUL | SOH | STX | ETX | EOT | ENQ | ACK | BEL | BS | HT | LF | VT | FF | CR | SO | SI |
1x | DLE | DC1 | DC2 | DC3 | DC4 | NAK | SYN | ETB | CAN | EM | SUB | ESC | FS | GS | RS | US |
2x | SP | ! | « | # | $ | % | & | ‘ | ( | ) | * | + | , | – | . | / |
3x | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | : | ; | < | = | > | ? |
4x | @ | A | B | C | D | E | F | G | H | I | J | K | L | M | N | O |
5x | P | Q | R | S | T | U | V | W | X | Y | Z | [ | \ | ] | ^ | _ |
6x | ` | a | b | c | d | e | f | g | h | i | j | k | l | m | n | o |
7x | p | q | r | s | t | u | v | w | x | y | z | { | | | } | ~ | DEL |
v · d · m | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
8x | Ç | ü | é | â | ä | à | å | ç | ê | ë | è | ï | î | ì | Ä | Å |
9x | É | æ | Æ | ô | ö | ò | û | ù | ÿ | Ö | Ü | ø | £ | Ø | × | ƒ |
Ax | á | í | ó | ú | ñ | Ñ | ª | º | ¿ | ® | ¬ | ½ | ¼ | ¡ | « | » |
Bx | ░ | ▒ | ▓ | │ | ┤ | Á | Â | À | © | ╣ | ║ | ╗ | ╝ | ¢ | ¥ | ┐ |
Cx | └ | ┴ | ┬ | ├ | ─ | ┼ | ã | Ã | ╚ | ╔ | ╩ | ╦ | ╠ | ═ | ╬ | ¤ |
Dx | ð | Ð | Ê | Ë | È | ı | Í | Î | Ï | ┘ | ┌ | █ | ▄ | ¦ | Ì | ▀ |
Ex | Ó | ß | Ô | Ò | õ | Õ | µ | þ | Þ | Ú | Û | Ù | ý | Ý | ¯ | ´ |
Fx | SHY – | ± | ‗ | ¾ | ¶ | § | ÷ | ¸ | ° | ¨ | · | ¹ | ³ | ² | ■ | NBSP |
La première moitié de la table correspond à la norme ISO 646 (dont les caractères de la variante américaine US-ASCII sont utilisés et montrées sur fond vert). Les caractères de contrôle conservent dans cette table normale leur interprétation conforme à la norme ISO 646 et sont montrés sur fond rouge avec leur désignation symbolique usuelle. Les caractères correspondant à certaines interprétations spéciales dans d’autres variantes nationales de l’ISO 646 sont sur fond jaune.
La seconde moitié de la table sur fond bleu en est l’extension sur 8 bits telle que définie dans la page de code 850. Les différences avec la page de code 437 sont affichées avec un fond plus foncé.
Table de codage graphique
Dans certaines utilisations (lorsque les codes correspondants sont stockés dans la mémoire d’affichage des consoles en mode texte), les caractères de contrôle sont remplacés par des caractères graphiques, spécifiques des pages de code graphiques pour PC (ce sont ici les mêmes que ceux de la page de code 437). Les autres positions ne sont pas modifiées.
Le programme suivant implémente une fonte 8×8 correspondant à cette page de code
SOURCES
odroidtools.py
sdcard.py
bmp.py