Depois de um período muito grande com meus microcontroladores engavetados, conhecer o TinyGo foi o que me fez querer voltar a estudar o assunto. A linguagem nativa do Arduino era uma ferramenta pessoalmente limitante, pois apesar de C++ não ser uma linguagem muito fora do meu contexto, ter que me adaptar a uma linguagem diferente é algo que atrapalha o “compromisso” com os estudos de automação, entra então o TinyGo, que compila projetos orientados a embarcados e WASM.
Antes da configuração, um disclaimer: o TinyGo tem um compilador próprio, e algumas das bibliotecas, mesmo as nativas da linguagem, sofrem com incompatibilidade, o que é notável neste link. Apesar desse incomodo, o Golang tem uma grande vantagem ao C++ que se repete nesse cenário: conseguimos utilizar concorrência, que passa a ser algo usual quando trabalhamos com diversos dispositivos no “loop”.
Como meu ambiente de estudos está configurado em um Windows, vamos dar uma olhada nas ferramentas necessárias para enviar nosso código para um Arduino Uno:
- scoop - instalador de ferramentas para o PowerShell
- golang - linguagem que vamos utilizar
- tinygo - compilador para microcontroladores
- avrdude - ferramenta utilizada para enviar o binário para o arduino
Instalando o ferramental
Começamos instalando o scoop, executando os comandos abaixo no PowerShell:
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
irm get.scoop.sh | iex
Mesmo que já tenha o Golang instalado na máquina, certifique que o mesmo está na versão mais atual, pois o tinygo pode gerar conflito com versões antigas. Fica a recomendação de reinstalar o CLI da linguagem:
scoop install go
Instalamos então o tinygo:
scoop install tinygo
E finalizamos instalando o avrdude:
scoop install avrdude
Configurando IDEs
Uma vez criado um projeto de exemplo, precisamos configurar nossas IDEs. Para os usuários do Visual Studio Code, vai ser necessária a instalação da extensão, como também a configuração de um arquivo .vscode/settings.json
:
{
"go.toolsEnvVars": {
"GOOS": "linux",
"GOARCH": "arm",
"GOROOT": "{{ tinygo_path }}",
"GOFLAGS": "-tags=avr,baremetal,linux,arm,atmega328p,atmega,avr5,arduino,tinygo,math_big_pure_go,gc.conservative,scheduler.none,serial.uart"
}
}
Os dados do GOFLAGS e GOROOT podem ser obtidos ao executar o tinygo info
, a partir dos dados “build tags” e “cached GOROOT”, respectivamente.
A configuração no Goland é mais simples, só necessita da instalação do plugin.
⚠️ Aqui fica como ponto de atenção a flag
scheduler.none
, que pode ser substituída porscheduler.tasks
quando for necessário utilizar goroutines.
Uma vez configurada IDE, nosso código passa a interpretar as bibliotecas específicas do compilador, como principalmente a machine
.
Rodando um código de exemplo
Criando um projeto novo, e configurado a sua IDE de preferência, vamos tentar executar o código abaixo seguindo em partes o tutorial blinky ,que liga e desliga a luz interna ao Arduino Uno:
package main
import (
"machine"
"time"
)
func main() {
led := machine.LED
led.Configure(machine.PinConfig{Mode: machine.PinOutput})
for {
led.Low()
println("led off")
time.Sleep(time.Millisecond * 500)
led.High()
println("led on")
time.Sleep(time.Millisecond * 500)
}
}
Podemos compilar nosso código e enviá-lo ao Arduino executando o comando:
tinygo flash -scheduler tasks -target arduino -port COM3 .
O único detalhe acima é a flag -port
, que pode ser identificada qual o seu valor correto ao abrir o Device Manager:
Com isso, caso não tenham ocorrido problemas no caminho, seu código já deve estar no Arduino, e você pode conferir os logs (ou a saída da porta serial) com o comando:
tinygo monitor