前回の件がキッカケでたまには練習台を変更するかと思い立ちました。以前にTinyGoのオブジェクトを走らせたことはあったものの、その後ご無沙汰のラズパイPicoに白羽の矢?が立ちました。ぶっちゃけ「遊休」状態だったから。吉例Lチカは簡単に動いたものの、環境を変えてみると気づくこともまたある、と。
※「GoにいればGoに従え」Go関連記事の総Index
※実機動作確認は Arm Cortex-M0+コアのRP2040チップ搭載、みんな大好き Raspberry Pi Pico機にTinyGoのオブジェクトを書き込んで行っています。
結構「酷使」してきた BBC micro:bit v2機、とうとう端子2本壊してしまったようです。他の機能は正常に動作しているみたいなので捨てたりしないケド。まあ、これを機会にTinyGoの練習台を変更してみることにいたしました。ターゲット機は
Raspberry Pi Pico
です。実はかなり前の別シリーズで、Raspberry Pi Pico 上でTinyGoしてます。
Pico三昧(15) PicoでもGo!Flash書き込み方法教えてもらった+VSCode
上記では開発用のホストとしてRaspberry Pi 4 model B機を使ってました。もともとC/C++SDK開発に使用していたのでデバッグ環境などもインストール済。ホストのラズパイ4機からはデバッグI/F経由してラズパイPicoにTinyGoのオブジェクトを書き込んで走らせてました。
今回は、今まで BBC micro:bit v2機用のオブジェクトを作成していたWindows11環境をそのまま「流用」してラズパイPicoを使用してみることにいたしました。
備忘のため、ちょいちょい見たくなるURLを以下に列挙しました。
-
- Raspberry Pi Pico and Pico W 御本家ページ、ピン配とかデータシートとか
- Raspberry Pi Pico(TinyGo)
- pico(TinyGoのMachine package)
ラズパイPicoのFlashing、「ひと手間」必要だったね
今までのBBC micro:bit v2(v1でも)の場合、Windows PCのUSBに接続すれば自動的にフラッシュ書き込み用のドライブとして認識されてました。そこでTiny Goのソースが格納されているプロジェクトフォルダ内で以下のようにすればTiny Goのオブジェクトがビルドされ、自動認識されたmicro:bitへ書き込まれるようにできてました。
$ tinygo flash --target microbit-v2
この辺の使い手の良さはmicro:bitは小さいクセに御供のデバッグ用MCUを搭載しているためかと思われます。
しかしラズパイPicoの場合、ただUSB接続すればフラッシュ書き込み可能な状態になるわけではなかったです。久しぶりで忘れてました。BOOTSELボタンを押しながらRESETかけるか、USBを再接続(当然いったん電源切れるのでRESETかかる)しなおさないとフラッシュ書き込み可能なブートモードには入ってくれません。
今回使用した上記のブレッドボードでは、RESET端子(ラズパイPico的にはRUN端子と呼ばれているが。。。)に、皆さんもやられているであろうプルダウン用のプッシュボタンを取り付けてあります。上の白いBOOTSELボタンを押しながら、下の黒いRUNボタンを押して離し、BOOTSELを離すという「指先のひと手間」が必要だったんであります。
コマンドライン引数
上記のひと手間後、以下のようにすればラズパイPicoにTiny Goのオブジェクトが書き込まれます。
$ tinygo flash -target=pico
あれあれ、よく見たら今までの micro:bit v2のときと target引数の書式が違ってないかい。microbit-v2とpicoの違いは当然だけれど、–targetだったり、-targetだったり、=記号使っていたり、使わなかったり。以下の「公式」ドキュメントを参照してみます。
https://tinygo.org/docs/reference/usage/subcommands/
上記を見ると、-target=pico と書くべきみたいです。しかし、実際にはどちらでもよいみたいっす。今まで通りの書き方でも問題なく動作します。
$ tinygo flash --target pico
どっちでもいいんかい。
吉例Lチカ
実験に使用した吉例Lチカのソースは以下です。
package main import ( "machine" "time" ) func main() { led := machine.LED led.Configure(machine.PinConfig{Mode: machine.PinOutput}) for { led.Low() time.Sleep(time.Second * 1) led.High() time.Sleep(time.Second * 1) } }
オンボードにユーザーLEDが搭載されている開発ボードであれば、machine.LEDが定義済と思われるので、多分、どのボードでも動作するのではないかと。
マイコン機種依存性が極力少なくなっているのはTiny Goの良いところの一つかと。次回からは久しぶりのラズパイPicoでTiny Go!っと。