Micropython sur TTGO T-Watch 2020

Il y a quelque temps, j’ai eu l’occasion de me procurer une smartwatch Lilygo T-Watch 2020. Il s’agit d’une montre totalement programmable avec un prix plutôt accessible, aux alentours de 30€. Son principal interêt, c’est les différents composants qu’elle embarque, à savoir :

  • Un chip ESP32
  • Un Module RTC PCF8563 (pour une montre c’est mieux)
  • Un écran LCD tactile
  • Un accéleromètre
  • Un vibreur
  • Un haut-parleur
  • Un emetteur infrarouge
  • Un chip WiFi 802.11 b/g/n
  • Un chip Bluetooth 4.2 et BLE

Du coup, c’est plutôt interessant à bricoler et les possibilités de “hack” sont assez importante. Bien que la montre se programme principalement en C++ à l’aide de l’éditeur Arduino, il semble possible de programmer en Python dessus via MicroPython. Du coup, c’est parti.

Créer l’image Micropython

Avant de pouvoir programmer en python sur la T-Watch, il est tout d’abord nécessaire de déployer un firmware avec Micropython dessus. Comme il n’éxiste pas de firmware officiel, nous allons compiler le notre, y inclure quelques librairies python permettant de jouer avec les composants de la montre et le déployer.

La première étape consiste à télécharger les sources de MicroPython et les différentes dépendances du projet :

mkdir twatch-micropython && cd twatch-micropython
# Téléchargement du code Micropython
git clone https://github.com/micropython/micropython/
# Téléchargement du framework de développement Espressif
git clone https://github.com/espressif/esp-idf.git
export ESPIDF=<PATH_TO_DIRECTORY>/esp-idf
# Téléchargement de la toolchain ESP32 Xtensa
wget https://dl.espressif.com/dl/xtensa-esp32-elf-linux64-1.22.0-80-g6c4433a-5.2.0.tar.gz
tar xzvf xtensa-esp32-elf-linux64-1.22.0-80-g6c4433a-5.2.0.tar.gz
export PATH=<PATH_TO_DIRECTORY>/xtensa-esp32-elf/bin:$PATH

# Préparation de l'environnement Micropython
cd micropython
git submodule update --init
make -C mpy-cross

Il est ensuite possible de compiler le firmware avec les commandes suivantes :

make -C ports/esp32 clean
make -C ports/esp32 all

Si tout s’est bien passé, le firmware est présent dans le dossier ports/esp32/build-GENERIC. Nous allons pouvoir le tester.

Tester le firmware

Pour déployer le firmware que nous venons de compiler, il suffit de brancher la T-Watch en USB à l’ordinateur puis d’entrer la commande suivante :

make -C ports/esp32 deploy

Il est ensuite possible de se connecter à un shell interactif python (REPL) via le port USB en série. Par exemple, à l’aide du logiciel picocom :

picocom /dev/ttyUSB0 -b115200

Il est ensuite possible d’entrer un simple code python :

from machine import Pin
buzz=Pin(4,Pin.OUT)

# Faire vibrer la montre
buzz.on()
# Arrêter le vibreur
buzz.off()

Si tout s’est bien passé, nous allons pouvoir passer à la préparation d’un firmware plus spécifique à la T-Watch. Pour quitter picocom, il suffit d’effectuer Ctrl+a Ctrl+x.

Préparer un framework spécifique

Comme nous avons pu le voir, le framework actuel permet d’interagir avec les composants de la montre. Néanmoins, il s’agit d’un environnement basique sans librairies permettant, par exemple, d’interagir facilement avec l’écran LCD ou la puce RTC.

Nous allons donc amener quelques bibliothèques dans notre firmware afin de pouvoir les utiliser sur notre montre. Ce type de bibliothèque est souvent chronophage à développer, heureusement, certains projet sur cette montre commence à pointer le bout de leur nez, c’est par exemple le cas de ce projet dont nous allons récupérer quelques fichiers utiles, à savoir :

Nous allons donc retourner dans nos sources de Micropython et télécharger ces fichiers dans un dossier spécifiques.

cd micropython/ports/esp32/modules
wget https://gitlab.com/mooond/t-watch2020-esp32-with-micropython/-/raw/master/bma423.py
wget https://gitlab.com/mooond/t-watch2020-esp32-with-micropython/-/raw/master/axp202c.py
wget https://gitlab.com/mooond/t-watch2020-esp32-with-micropython/-/raw/master/pcf8563.py
wget https://gitlab.com/mooond/t-watch2020-esp32-with-micropython/-/raw/master/st7789my.py
wget https://gitlab.com/mooond/t-watch2020-esp32-with-micropython/-/raw/master/focaltouch.py

Le dossier modules permet de déposer des bibliothèques écrite en python qui seront intégrées dans notre firmware. Maintenant que c’est fait, nous pouvons recompiler notre firmware et le déployer :

cd micropython/ports/esp32
make all
make deploy

Testons, notre module RTC avec le code suivant :

from machine import Pin,I2C
import pcf8563

i2c = I2C(0,scl=Pin(22), sda=Pin(21))
rtc = pcf8563.PCF8563(i2c)

# Doit renvoyer l'heure actuelle
print(rtc.hours())

# Changement d'heure
rtc.write_all(hours=12)
print(rtc.hours())

Et voilà, il ne reste plus qu’à ajouter quelques autres bibliothèques pour simplifier l’usage de python sur cette montre. Pourquoi pas l’ajout de LVGL pour créer de jolies interfaces ?

Ressources :

Whid Injector - Passer sur une keymap FR

Wifi HID Injector

Si vous avez fait l’acquisition d’une WHID Injector, vous avez pu être surpris lors de vos premiers test de remarquer que le payload que vous aviez préparé ne s’exécute pas comme prévu. Si vous êtes sur une station avec un clavier AZERTY, c’est tout à fait normal.

En effet, la WHID Injector est configurée, par défaut, pour fonctionner avec un layout QWERTY. Par conséquent, tous vos scripts de bon frenchy ne fonctionnent pas correctement. Pour gérer ce problème, il existe deux solutions :

  • Écrire un script qui convertit l’ensemble de vos payloads d’AZERTY vers QWERTY.
  • Flasher le firmware de la WHID Injector afin qu’elle gère nativement le layout AZERTY.

Pour la première solution, allez voir du côté du WHID Injector Toolkit qui convertit automatiquement les payloads vers le layout de Molière, plus particulièrement ce fichier. Ça fonctionne, c’est rapide et ça permet de passer rapidement d’un layout à l’autre.

Si vous n’avez que des cibles en AZERTY, autant passer par la deuxième solution, plus durable et plus instructive. En plus ça tombe bien, c’est cette solution qu’on couvre dans l’article.

Flash du firmware

Pourquoi flasher le firmware ?

Tout d’abord pourquoi ?

  • Parce que c’est plus drôle ;
  • Parce qu’on ne sait pas ce qu’il y a dans le firmware fournit par défaut ;
  • Parce que c’est comme ça.

Configuration de l’editeur ARDUINO

La WHID Injector est basée sur un chip ATMEGA 32u4 et peut donc être programmée à l’aide de l’éditeur Arduino. Il faut donc tout d’abord l’installer, si comme moi, vous utilisez ArchLinux :

pacman -S arduino

Il suffit ensuite d’ajouter le support de la board ESP8266 dans l’IDE. Pour ce faire, il suffit d’aller dans les préferences de l’IDE (Fichier > Préférences), puis d’entrer l’adresse https://github.com/esp8266/Arduino/releases/download/2.3.0/package_esp8266com_index.json dans le champ ‘URL de gestionnaire de cartes supplémentaires’.

Il est ensuite possible d’installer la carte ‘esp8266’ dans le gestionnaire de carte (Outils > Type de carte > Gestionnaire de carte).

Compilation

Une fois l’éditeur configuré correctement, il est maintenant nécessaire de récupérer le code d’ESPloitV2, de changer le layout de la librairie Keyboard , puis de mettre à jour l’équipement.

Keyboard library

Tout d’abord, il faut modifier la librairie Arduino afin de passer le layout de QWERTY à AZERTY.

cd /home/<user>/Arduino/libraries
git clone https://github.com/arduino-libraries/Keyboard

Une fois cloné, il suffit de modifier le fichier /home/<user>/Arduino/libraries/Keyboard/src/Keyboard.cpp en le remplaçant par le contenu de celui-ci.

Il est possible de gérer d’autres “keymap” que le français. Pour cela, il suffit de se rendre sur ce dépôt et de copier la variable _asciimap correspondant à la langue que l’on veut.

ESPloitV2

ESPloitV2 est le “logiciel” qui fait fonctionner la WHID Injector, c’est notamment lui qui fournit l’interface web de la clé. Pour récupérer le code, il faut le cloner depuis le dépôt Github suivant :

git clone https://github.com/exploitagency/ESPloitV2

Il suffit ensuite d’ouvrir le fichier ESPloitV2/source/Arduino_32u4_Code/Arduino_32u4_Code.ino dans l’éditeur Arduino, de le compiler, puis de l’envoyer sur la clé.

Pour ce faire, dans l’IDE Arduino, il est nécessaire de sélectionner le type de carte “LilyPad Arduino USB”, de cliquer sur “Téléverser” et voilà.

Ressources