TinyGo - Show time !

Après les deux premiers articles, vous êtes maintenant capables de manipuler l'écran et la led arrière de la Pygamer.

Mais est ce que ce ne serait pas mieux de pouvoir faire un petit show lumineux avec les 5 Neopixels en façade ?
Voyons voir ce que l'on peut faire.

Comme d'habitude, je vous donne le code tout de suite pour le commenter ensuite.

package main

import (
	"image/color"
	"machine"
	"time"

	"tinygo.org/x/drivers/ws2812"
)

var (
	black = color.RGBA{R: 0, G: 0, B: 0}
	red   = color.RGBA{R: 255, G: 0, B: 0}
	green = color.RGBA{R: 0, G: 255, B: 0}
	blue  = color.RGBA{R: 0, G: 0, B: 255}
)

func main() {
	// color intensity does not seems to work but you got the idea ;)
	reds := make([]color.RGBA, 5)
	reds[0] = color.RGBA{R: 50, G: 0, B: 0}
	reds[1] = color.RGBA{R: 100, G: 0, B: 0}
	reds[2] = color.RGBA{R: 150, G: 0, B: 0}
	reds[3] = color.RGBA{R: 200, G: 0, B: 0}
	reds[4] = color.RGBA{R: 255, G: 0, B: 0}

	colors := make([]color.RGBA, 5)

	neopixels := ws2812.New(machine.NEOPIXELS)
	neopixels.Pin.Configure(machine.PinConfig{Mode: machine.PinOutput})

	for {
		for i := range [5]int{0, 1, 2, 3, 4} {
			clear(colors)
			colors[i] = reds[i]
			neopixels.WriteColors(colors)
			time.Sleep(time.Millisecond * 500)
		}
	}
}

func clear(colors []color.RGBA) {
	colors[0] = black
	colors[1] = black
	colors[2] = black
	colors[3] = black
	colors[4] = black
}

Pour manipuler les Neopixels, nous allons utiliser le driver tinygo.org/x/drivers/ws2812 que vous voyez dans les imports.

neopixels := ws2812.New(machine.NEOPIXELS)
neopixels.Pin.Configure(machine.PinConfig{Mode: machine.PinOutput})

De manière assez similaire à la Led, nous déclarons ensuite un objet pour nos Neopixels et nous configurons la broche correspondante.
Une fois de plus, le module machine nous fournit la référence qu'il nous faut.

Pour manipuler les Neopixels, nous utiliserons ici la fonction WriteColors. Cette fonction a besoin d'un paramètre qui sera un tableau avec chaque couleur de chaque Led.
Ce tableau est créé sur la ligne :

colors := make([]color.RGBA, 5)

Le tableau contiendra donc 5 couleurs RGBA, une pour chaque Neopixel de la Pygamer.

for i := range [5]int{0, 1, 2, 3, 4} {
	clear(colors)
	colors[i] = reds[i]
	neopixels.WriteColors(colors)
	time.Sleep(time.Millisecond * 500)
}

Cette boucle est alors en charge de s'assurer que chaque Neopixel est éteinte, puis on affecte la couleur rouge à une Neopixel à la fois, la boucle passant de l'une à l'autre.
Je laisse volontairement mon code ainsi, il n'est pas tout à fait complet par rapport à ce que je visais. Je cherchais à reproduire un effet "K2000" ou "Cylon" mais je me suis aperçu que l'intensité ne semblait pas être prise en charge par le driver actuel.
Cela fera l'objet d'un prochain article et d'une mise à jour du code si je parviens à résoudre ce point.

Voilà, il ne vous reste plus qu'à flasher la Pygamer :

tinygo flash -target=pygamer

Profitez du spectacle !

Sorry, your browser doesn't support embedded videos.

Bien entendu, cet exemple est disponible dans le repository dédié aux exemples TinyGo.

Merci, n'hésitez pas à me faire parvenir vos remarques par email ou par le biais d'issues sur le repository.