ODROID-GO

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:

MCUCustom ESP32-WROVER(16 MB Flash Memory)
CPU & RAM80MHz – 240MHz(Adjustable), 4MB PSRAM
Wi-Fi802.11 b/g/n 2.4GHz – 2.5GHz
BluetoothBluetooth v4.2 BR/EDR, BLE
Display2.4inch 320×240 TFT LCD (SPI interface)
BatteryLi-Polymer 3.7V/1200mAh, Up to 10 hours of continuous game playing time
Speaker0.5Watt 8Ω Mono
Micro SD card slot20Mhz SPI interface
Micro USB portBattery charging(500mA) and USB-UART data communication
Expansion Port10Pin port(I2C, GPIO, IRQ at 3.3Volt)
Input ButtonsMenu, Volume, Select, Start, A, B, Direction Pad
Power consumptionGame 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

Python

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:

  1. 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.
  2. Elle essaie de se connecter jusqu’à ce qu’une connexion réussie soit établie ou que le nombre de tentatives soit épuisé.
  3. Après chaque tentative, la fonction attend 1 seconde avant de réessayer.
  4. Si la connexion réussit, l’adresse IP du dispositif est obtenue via wifi.ifconfig()[0] et retournée.
  5. 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 :

  1. 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.
  2. 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.).
  3. 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.
  4. 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) : Objet Pin 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:

  1. Un dictionnaire tpin mappe des noms de boutons à des numéros de broche GPIO.
  2. 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.
  3. 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:

Python

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 0123456789ABCDEF
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
!« #$%&()*+,./
3x0123456789:;<=>?
4x@ABCDEFGHIJKLMNO
5xPQRSTUVWXYZ[\]^_
6x`abcdefghijklmno
7xpqrstuvwxyz{|}~ 
DEL
 v · d · m 0123456789ABCDEF
8xÇüéâäàåçêëèïîìÄÅ
9xÉæÆôöòûùÿÖÜø£Ø׃
AxáíóúñѪº¿®¬½¼¡«»
BxÁÂÀ©¢¥
Cxãä
DxðÐÊËÈıÍÎϦÌ
ExÓßÔÒõÕµþÞÚÛÙýݯ´
FxSHY
±¾§÷¸°¨·¹³² 
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.

 v · d · m 0123456789ABCDEF
0x 
1x§
7x 

Le programme suivant implémente une fonte 8×8 correspondant à cette page de code

Python

SOURCES

odroidtools.py

Python

sdcard.py

Python

bmp.py

Python

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *