2021/11/13 にオンラインで開催された Go Conference 2021 Autumn Online の中で TinyGo ハンズオン (Workshop) を開催しました。 13:10-14:10 と 14:20-15:20 の 2 コマで、各 5 名の参加者に対してハンズオンを実施、という形でした。 このページでは、 TinyGo ハンズオンの振り返りとして、企画段階、本番に向けた準備、実際の本番の様子などをまとめていきます。
TinyGo ハンズオンの企画段階
私自身は umeda.go という関西 (主に大阪) の Go コミュニティの運営の一人だったわけですが、今回の Go Conference 2021 Autumn Online が kyoto.go を中心として準備が進む中 umeda.go もお誘いいただき 2021/05/20 に一緒に Go Conference を準備していくことになりました。 で、参加したその日のうちに以下のようなやり取りがあって、よし TinyGo ハンズオンをやるぞ!となりました。
なんだか振り返ると懐かしい。
ターゲットボードの選定と Seeed さんとのやり取り
ハンズオンを実施するという事でターゲットボードを何にするかを決める必要がありました。 この時点で以下の理由より、 Seeed さんの Wio Terminal が第一候補となりました。 自分自身が TinyGo への Wio Terminal 対応の PR を作っていたこともあり Wio Terminal を良く知っていた、というのもあると思います。
- TinyGo で 2021/08 時点で最も手厚くサポートされている atsamd51 マイコンを搭載していること
- ネットワークに接続できるため IoT 機器としての活用が可能であること
- ※2021/08 時点で WiFi 対応、 BLE 未対応
- 組込み初心者でも扱いやすいデバイス (画面、ボタンセンターが一体) であること
- 購入しやすい値段であること
- Grove および背面端子により、今後の拡張性が高い事
- Grove のエコシステムにより、ハンズオン後に十分に想像性を発揮できる事
この時点ではターゲットボードは各自で購入してもらって参加してもらう、その際買いやすい価格帯である事、というのを条件としていました。 が、 Go Conference という日本最大の Go のイベント内で TinyGo ハンズオンを行うというせっかくの機会でもあり Seeed さんに今回はスポンサーをしていただけないかを打診しました。 諸々の調整を行い、合計 10 台を提供いただくことが決定しました。
これが 2021/08/31 の時点でした。
Go のイベントで Seeed さんのスポンサーロゴが掲載されている、ってのは割とセンセーショナルで界隈 (どこ?) がややざわついてました。
Go Conference 2021 Autumn が 2021/11/13 にオンラインで開催されます。今回、お願いして Seeed さんにスポンサーになっていただきました。もう少しで詳細を発表出来る予定です。楽しみにしていてください。https://t.co/twRlkC9eoG pic.twitter.com/OPt0ajmo7s
— takasago (@sago35tk) 2021年9月17日
最終的には 「Go x Wio Terminal ジャンプスタート企画 by Seeed」 という企画として、参加者 (当選者) に Seeed さんから Wio Terminal を事前送付する形で実施しました。 Seeed さん本当にありがとうございます。
TinyGo に Wio Terminal の対応を追加したのは私なのですが、そこからまさかこのような形になるとは夢にも思わず。
ハンズオンの構成の検討
Go のカンファレンスなので Go は体験済みの人が多い一方、組み込みの経験者は少ないだろう、という予測の元、最低限以下を満たすようにしました。
- 環境の立ち上げ
- (Hello World 代わりに) L チカ
- 自身のプロジェクトを書き始めて、動作確認、 printf debug が出来る
- 外部 package を使用したプロジェクトを作成できる
一方で、時間や機材の関係で以下は検討段階で省きました。 恐らく以下の項目があれば、もっと楽しく TinyGo で遊べるようになるとは思うので、今後別の機会/記事で紹介していきたいと思います。
- I2C や SPI といった機能を使った driver の作成方法
- 外部端子を使ったデバッグ
ハンズオン資料の作成とリハーサル
ハンズオン資料の初版を 2021/08/26 に作成し、 Go Conference 運営メンバーでハンズオンのリハーサルというか、ハンズオンのイメージ合わせ、時間配分などを確認していきました。私自身は Windows と Linux (ubuntu 20.04) 環境はあるが macOS が無い事、そして Intel チップ以外に M1 チップ版が発売された事、などからそのあたりも確認をしていきました。初回の TinyGo ハンズオン素振りは luccafort さん、 senoue さん、 uji さんに手伝ってもらいました。何と皆さんリハーサルに向けて Wio Terminal を購入しているという準備の良さ。
この時点で、 2021/11/13 実施分とおおよその流れは同じ形に仕上がっていました。ただ、この時点ではハンズオンの目玉を何にするか、が決まっていませんでした。
ハンズオンの告知
Seeed さんから提供いただいた 10 台の抽選、会場入りの人を決めるべく、 Go Conference 本編とは別で connpass を立ち上げました。 connpass の機能により自動的に抽選も実施できるので楽でした。
告知は以下の Tweet にて。
2021/11/13開催のGo Conference 2021 Autumn にて Go言語で組込マイコン開発ができる #TinyGo のハンズオンを実施します。ハンズオンで使うボード Wio Terminal はSeeed株式会社さん @SeeedJP にスポンサーいただきました。以下から参加申し込み&応募してください。 #goconhttps://t.co/xSMy4ZucMc
— Go Conference (@goconjp) 2021年10月4日
Seeed さんからスポンサーしていただくにあたり TinyGo ハンズオンの参加者を「Wio Terminal を持っていない人」に絞って募集していたこともあり、以下のような発言がありました。この発言をみて YouTube 配信を検討していくことになりました。この時点で本番一か月前の 2021/10/04 でした。 (ちなみにこの発言を見るまでは、 Remo で残り 3 席あるし、そこでいいかなぁ、などと思っていました)
tinygoハンズオン、私も登録して怒られないだろうかとか思いながら眺めてる
— Kenta IDA (@ciniml) 2021年10月4日
別にWioTerminal欲しいわけじゃないので、眺めてるだけ枠とかあるとうれしいが。
YouTube にも配信することを決定
YouTube にも配信することにしたので構成を検討しトライアルを行いました。最終的には以下のような構成となりました。
- connpass の参加者 (Wio Terminal を送付済み) の人は Remo で双方向のやり取り
- それ以外の人は YouTube Live で配信を行う
- この時、参加者への配慮として YouTube には私の画面と映像と声だけが入るようにしました
YouTube Live への配信は Go Conference としては StreamYard を使っていたので特に違和感なく準備が可能でした。 ただ、 Remo への配信、 YouTube (StreamYard) への配信、カメラ 2 台の合成、といった形だったため配信 PC の処理負荷が思ったよりも高く Ryzen 7 3700X で常時 CPU 使用率が 90% ~ 100% というような状況でした。 いつもはすぐに終わる TinyGo の build がなかなか終わらないという初めての体験ができました。
#gocon のハンズオンは、OBS Studioでカメラx2を合成した映像を1920x1080モニターに出してRemoとStreamYard(→YouTube)に共有してました。カメラはLogicool Captureで前処理している分とiVCamの 2 台体制でした。この状態でRyzen 7 3700Xが約90%のCPU使用率。spec的に余裕かと思いきや想像以上に重い。
— takasago (@sago35tk) 2021年11月16日
ハンズオンの目玉を本番前日に作り始める
元々以下の example の静止画バージョンを目玉?にしようと思っていたけどインパクト足りないよなぁ、という事で急遽前日である 2021/11/12 に作り始めました。
今日の TinyGo ハンズオンの目玉?として作った example はコレ。目を動かせるようになってて、時々瞬きします。組込 Rust 本と #スタックチャン の合せ技的な奴。カワイイ。#gocon #goconC pic.twitter.com/Vpc0Ts1Kfo
— takasago (@sago35tk) 2021年11月13日
で完成した、と思って最終確認してたらハンズオンで使う予定の TinyGo 0.20.0 だと何故か crash するという問題が発生しました。自分がメインで使ってる最新の開発版 (dev branch) だと発生しないので気づくのが遅れました。何とかパッチできる程度だったので事なきを得ましたが危ない。
最後の最後で goroutine 使おうとして tinygo 0.20.0 だと変な動きしてしまうケースに遭遇した。普段使ってる dev branch 最新だと発生しないので気づくのが遅れた。危ない。で、とりあえず問題は出ない程度に実装を修正して逃げた。
— takasago (@sago35tk) 2021年11月12日
ちなみにこの example では瞬きは goroutine + channel で実装しているため、とてもすっきりした実装になっています。
この程度の処理だと別に goroutine 使わなくても簡単に書けますが、 goroutine を使うとさらに楽、って感じで書けます。
↑ で crash する、と書いたのは以下でいう eyeCh に eyeClosed
とかの状態を送るようにすると発生していました。
色々試してると struct{}{}
を送るだけなら crash しなかったのでこちらを採用、となりました。
ちょっと意図が伝わりにくいコードにはなってしまいますが。
11_spi_ili9341/main.go#L79-L86
go func() { for { eyeCh <- struct{}{} time.Sleep(1500 * time.Millisecond) eyeCh <- struct{}{} time.Sleep(300 * time.Millisecond) } }()
TinyGo ハンズオン本番
当日の様子 (↓ は 13:10 - 14:10 のコマ) は以下のような感じでした。 途中 mattn さんが Remo 席に来てくれて つい話しかけてしまうシーンがありましたが、全体的にスムーズに進行することができました。 都合 2h というのか準備含めて当日 3h ぐらい集中し続けてたのもあり非常に疲れましたが、それもまた良し。
ハンズオン内で使用した資料は以下です。
最後に
Go Conference 2021 Autumn のスタッフとして運営をしながらハンズオンの作り込み、という形で後半は割と大変な状況でしたが、何とか無事に終わりました。
特に、参加者のほとんどが Gopher 表示まで進むことができたのが、とても良かったと思います。 そこまでいかなかった人も、外部パッケージを使用したコードを動かす所までは進んだので最低限自走できる状態にはなったと思います。
とりあえず動いたのでよし! #gocon pic.twitter.com/8vHp51IrWI
— akeno (@akeno_0810) 2021年11月13日
#gocon
— もりはや (@morihaya55) 2021年11月13日
Gopherくん、手元に来た!!! pic.twitter.com/twu9H2ywlX
あと、以下のように、面白かった、と言ってもらえてとても嬉しかったです。
昨日の #gocon で Ebiten の発表された星一さんのリポジトリから(one-time で申し訳ないが)投げ銭した。今回は TinyGo のハンズオンとこの Ebiten の発表がいっちゃん面白かった。感謝!
— Der Spiegel 🪞 im Spiegel 🪞 (@spiegel_2007) 2021年11月14日
https://t.co/Qt8BxGwyq7
ってことで、皆さん、 Go Conference 2021 Autumn Online は終わりましたが、 Blog を書くまでがイベントなので感想などどしどし書いてくださいね。 次回は Go Conference 2022 Spring で会いましょう。