TinyGo - et si on codait une Pygamer

Tout comme je l'avais fait l'année dernière, je suis parti en vacances avec mon iPad mais cette fois avec quelques idées de code autour du language Rust.
J'ai appris pas mal de choses avec ce language mais il me manquait cette petite touche de fun que j'avais ressentie avec Go en 2020.

Et puis sur ma dernière semaine de congés, en changeant de lieu de villégiature, j'ai emporté de quoi essayer à nouveau la version embarquée de Go, connue sous le petit nom de TinyGo.
J'avais pris une série de cartes que j'ai, une micro:bit évidemment, mais également des M4 de Arduino et ma Pygamer.

Très rapidement, j'ai pu faire de chouettes progrès mais qui ont nécessité de fouiller pas mal Internet, Slack et Discord.
L'idée est de vous partager tout ça en une série d'articles, accompagnés d'un repository sur Gitlab.
Je remercie au passage Aurélie Vache qui m'a aidé à garder le focus, parfois sans le savoir, moi qui m'éparpille parfois, grâce à ces petits messages et ses expériences avec la Gameboy. (on en reparlera, promis) et ses articles sur Go.

Mais sans plus attendre, en avant pour le monde de TinyGo.

Je vous conseille de suivre simplement leur Getting Started qui m'a permis d'avoir un environnement fonctionnel autant sur mon Macbook que ma machine Linux.
J'ajouterai que j'ai essentiellement utilisé VSCode qui a de bonnes extensions pour Go qui m'ont suffit, le reste se passant dans le terminal, intégré c'est pratique.

Pour ce qui est de la Pygamer, la documentation de base se trouve dans la section microcontroller du site de TinyGo. Nous y reviendrons dans un prochain article, mais la documentation est très légère, les exemples quasi inexistants.
Comme ce n'est pas la première fois que je m'en fait la remarque, j'ai décidé d'essayer d'apporter ma petite pierre en écrivant cette série d'article, mais surtout en publiant un repository rassemblant des exemples très réduits sur ce qu'ils abordent pour permettre à chacun de se lancer.

Sans plus attendre, lançons nous dans notre premier code, le Hello World des micro contrôleurs, le clignotement d'une led ;)

Le code en lui même est assez simple, mais je vous conseille de prendre un tout petit peu de temps pour avoir les bases minimales du language Go.

package main

import (
    "machine"
    "time"
)

func main() {
    led := machine.LED
    led.Configure(
    	machine.PinConfig{Mode: machine.PinOutput} )
    for {
        led.Low()
        time.Sleep(time.Millisecond * 500)

        led.High()
        time.Sleep(time.Millisecond * 500)
    }
}

Je tacherai de conserver des exemples avec le moins de code possible, en me concentrant sur une fonctionnalité à la fois.

Ici, nous ferons appel à machine.LED qui correspond à la broche D13 si l'on lit la documentation du module machine pour la Pygamer.
Nous utiliserons ensuite les fonctions pour alterner l'état de cette broche entre l'état low avec led.Low()) et high avec led.High(). Cela correspondra à une alternance entre 0V et 3,3V sur la broche D13 qui correspond sur la Pygamer à une Led au dos, à côté de la prise USB et clairement indiquée D13.

Il ne restera plus qu'à compiler et flasher ce code sur la Pygamer avec la commande indiquée sur la page de documentation :

tinygo flash -target=pygamer

Je lance cette commande en étant dans le répertoire où se trouve mon code dans un fichier main.go.
La Pygamer va passer par un écran intermédiaire indiquant qu'elle est en mode flashable :

Puis l'écran redevient noir et la Led au dos se met à clignoter. Il s'agit de la Led rouge sur la photo, la Led orange est celle indiquant la charge en cours.

Il est possible que le premier flash ne se passe pas, auquel cas je vous invite à suivre la section troubleshooting de la documentation que je résume ici :

  • double appui sur la touche reset, pas trop vite.
  • la Pygamer apparait comme une clé USB appelée Pygamerboot et l'écran est celui montré plus haut.
  • vous pouvez flasher.

Vous voulà prêt.e.s à embarquer sur le navire TinyGo !
Je met tout le code que j'écris pour ces articles à disposition sur un repository Gitlab. Comme vous le verrez, j'ai d'autres exemples à votre disposition et ils feront l'objet de prochains articles.