TinyGoでRaspberryPi Picoに入門してみた
TinyGo Advent Calendar 2024の19日目の記事です.
入門するに至ったきっかけ
私は普段Wasmネタを追っているのですが,その中でGo言語のWasmサポート状況などをたまに確認したりしています.GoのWasmの話はTinyGoが結構遊べる状況で,過去にAsakusa.goでTinyGoを使ってVSCodeの拡張機能を作れるという話を発表したりしています.
そんな中Asakusa.goやVimConfなどで何度か@ysaitoさんにお会いし,「この自作キーボードのマイコンはPicoで,ドライバはTinyGoで書いている」という話を聞いて「PicoにTinyGoからビルドしたコードが載せれるのか!?」と驚いたのが今回のきっかけです (後押しありがとうございます).
RaspberryPi Picoが発売された当初にとりあえず買っておいたPicoが手の元にあるので,この機会に入門してみようと思いました.
TinyGoを使ったPicoの入門記事はすでにTinyGoやGoのアドカレ,その他の記事にすでにたくさんあります.今回それらの記事を参考に,入門してみた所感を書いていこうと思います.
Tour of TinyGo
TinyGoにもGoでお馴染みの「Tour of 〜」があるというのをTinyGo Advent Calendar 2024の16日目の記事で知りました.
ブラウザ上でLチカの擬似体験ができるようになっていて,Pico上でどう動作するのかが事前にわかるというのがすでに体験が良いです❤️
ビルドする
Tour of TinyGoのサイト上にある,Flashボタンを押すと実行用のバイナリファイルをダウンロードできるようですが,今回は手元でビルドしてみます.
package main
import (
"machine"
"time"
)
func main() {
led := machine.LED
led.Configure(machine.PinConfig{Mode: machine.PinOutput})
for {
led.High()
time.Sleep(time.Millisecond * 100)
led.Low()
time.Sleep(time.Millisecond * 900)
}
}
このコードを出力ファイル名を指定せずにビルドすると,.elf
という拡張子のついたファイルが作成されました.
tinygo build -target=pico .
$ xxd hello.elf | head -n 1
00000000: 7f45 4c46 0101 0100 0000 0000 0000 0000 .ELF............
.elf
は確かLinuxのブートローダなどに使われているバイナリだった記憶があり「あれ,なんか違うような?」と思い,あたらめて.uf2
の拡張子を持つ出力ファイル名を指定してビルドしたところ,想定したバイナリが作成されました.
tinygo build -target=pico -o=hello.uf2 .
$ xxd hello.uf2 | head -n 1
00000000: 5546 320a 5751 5d9e 0020 0000 0000 0010 UF2.WQ].. ......
RaspberryPi Picoにプログラムを書き込む
PicoをPC (ここではmacOS)に接続するとボリュームとして認識[1]します.
この状態で,ボリュームに対してバイナリファイルをコピーするだけで書き込むことができます.
cp hello.uf2 /Volumes/RPI-RP2
もしくはtinygo
のflash
コマンドを使って直接ビルドしたファイルを書き込めます.
tinygo flash -target=pico .
昔この手のものをやろうとした時は書き込むために色々やらないといけなかったような記憶があり,それが敬遠していた理由の一つだったのですが,コピペだけで書き込めるのは控えめに言って 感動しました (え,簡単じゃん).
書き込むとボリュームがアンマウントされてPico上でプログラムが動いているのを確認できます.
そういえばTinyGo Advent Calendar 2024の18日目の記事でSequoiaでtinygo flash
が動作しないという記事が出ていたのですが,私の環境 (macOS 15.1.1)では普通に動きました (なんだろう).
まとめ
マイコン入門,なんだかもっと面倒な印象があったので,tinygo
以外の事前準備が必要なくLチカできたことに今回驚きました.
こんなに簡単なら来年は何か作ってみたいですね.
おまけ
マウントした時のINDEX.HTMLやINFO_UF2.TXTのタイムスタンプが2008年9月8日16時20分なのはなぜだろうと思ったら,Raspberry Piという名前が決まった瞬間のメールのタイムスタンプのようでした.
-
ROMが空の状態の初回,もしくはBOOTSELボタンを押しながらPCに接続した場合 ↩︎
Discussion