sgkeyを組み立ててTinyGoで遊ぶ
Go Conference mini 2023 Winter IN KYOTO1の懇親会でsago35さんにsgkeyというマイクロパッドの組み立てキットをいただきました。元々自作キーボードが気になっていたというのもありますが、sago35さんの発表「続) TinyGo で作る自作キーボードの世界2」とそのライブコーディングが面白く興味が湧いたので、いろいろ買い揃えてsgkeyとTinyGoで遊んでみたいと思います3。
#kyotogo の懇親会でお配りした sgkey の作り方はここにあります。追加で買わないといけないのは、以下です。続く返信で購入場所例を書きます。
— takasago (@sago35tk) December 4, 2023
* ピンソケット 1x7 * 2
* XIAO RP2040
オプションで以下。
* 液晶モジュール
* 抵抗 10kΩ
* ピンソケット 1x4https://t.co/ptszji4qxb
sgkeyの組み立て
ガイドに従います。自分はSeeeduino XIAO(RP2040ではない)とオプションの液晶を用意しました。
順番にダイオード・抵抗・ピンソケット・キースイッチをはんだ付けしていきます。中学生以来なので下手です。
その後キーキャップ・XIAO・液晶モジュールをはめて、最後にゴム足をつけたら完成です。
TinyGoでsgkeyを動かす
サンプル
最初にサンプルのプログラムを書き込みます。ターゲットはxiao-rp2040ではなくxiaoを選びます。
$ tinygo flash -target=xiao -size=short .
code data bss | flash ram
81744 2284 7332 | 84028 9616
この時点でmacOSからはキーボードと認識されました。ここら辺はsago35/tinygo-keyboardが良い感じにやってくれているようです。
6つのキーでtinygoと打てて、液晶にも表示されていることがわかります。すごい。
Lチカ
次にLチカをやってみます。Seeeduino XIAOにはLEDが4つあり、そのうち3つは操作できるようです。青色のLEDのうちの一つ(LED2)を点滅させてみます。
package main
import (
"machine"
"time"
)
func main() {
led := machine.LED2
led.Configure(machine.PinConfig{Mode: machine.PinOutput})
for {
led.High()
time.Sleep(500 * time.Millisecond)
led.Low()
time.Sleep(500 * time.Millisecond)
}
}
青色LEDが点滅していることがわかります。緑色LEDは常に点灯しているものです。もっと厳つく光らせても良かったかも。
Vialでsgkeyを動かす
sago35/tinygo-keyboardはVialに対応しており、これを使えばGUIでキー配置を変更できる&レイヤー配置が簡単にできるようです。
ブラウザで変更するとリアルタイムでsgkeyに反映されるのですが、どういう仕組みでsgkeyに書き込んでいるのでしょうか。最初にブラウザからデバイスの選択を促されるので、ブラウザとデバイス間での通信を許可するAPIでもあるのでしょうか。
今回はレイヤー1に12345を、レイヤー2に67890のキーを設定し、トグル形式でレイヤーを切り替えられるようにします。
こんな感じで6キーだけで10個の数字を入力できました。
液晶に現在のレイヤーを表示させても面白いかもしれません。
ちなみにサンプルのvial.json
に書かれているProductIDとVendorIDは0x000a
と0x2e8a
ですが、xiaoでは0x802f
と0x2886
です。なのでvial.json
を書き換えた上でgo run cmd/gen-def/main.go
を実行してdef.go
を更新してみたのですが、書き換えても書き換えなくても動作は変わりませんでした。ここら辺は詳しくないのでよく分かりません。
終わりに
普段のGoの感覚で組み込みプログラムをかけるTinyGoすごいです。 せっかく電子工作の道具を買い揃えたので、もう少しいろいろやってみたいと思います4。
sago35さんありがとうございました。
一緒にsgkeyを貰っていたmazreanさんは爆速で組み立ててました ↩︎