📘

TinyGoでRaspberryPi Picoに入門してみた

2024/12/19に公開

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

https://zenn.dev/micchiebear/articles/aee6c437e10f11

TinyGoにもGoでお馴染みの「Tour of 〜」があるというのをTinyGo Advent Calendar 2024の16日目の記事で知りました.

https://tinygo.org/tour/blink/onboard/

ブラウザ上でLチカの擬似体験ができるようになっていて,Pico上でどう動作するのかが事前にわかるというのがすでに体験が良いです❤️

Tour of TinyGoのサイト上で擬似的にLチカをしている様子

ビルドする

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にプログラムを書き込む

https://zenn.dev/mattn/articles/453893e3fde4b1

PicoをPC (ここではmacOS)に接続するとボリュームとして認識[1]します.

ボリュームマウントされているRaspberryPi Pico

この状態で,ボリュームに対してバイナリファイルをコピーするだけで書き込むことができます.

cp hello.uf2 /Volumes/RPI-RP2

もしくはtinygoflashコマンドを使って直接ビルドしたファイルを書き込めます.

tinygo flash -target=pico .

昔この手のものをやろうとした時は書き込むために色々やらないといけなかったような記憶があり,それが敬遠していた理由の一つだったのですが,コピペだけで書き込めるのは控えめに言って 感動しました (え,簡単じゃん).

書き込むとボリュームがアンマウントされてPico上でプログラムが動いているのを確認できます.

https://zenn.dev/senoue/articles/33e7ab63f8cc45

そういえば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という名前が決まった瞬間のメールのタイムスタンプのようでした.

https://forums.raspberrypi.com/viewtopic.php?t=317617

脚注
  1. ROMが空の状態の初回,もしくはBOOTSELボタンを押しながらPCに接続した場合 ↩︎

Discussion