Go Conference mini 2023 Winter IN KYOTO1の懇親会でsago35さんにsgkeyというマイクロパッドの組み立てキットをいただきました。元々自作キーボードが気になっていたというのもありますが、sago35さんの発表「続) TinyGo で作る自作キーボードの世界2」とそのライブコーディングが面白く興味が湧いたので、いろいろ買い揃えてsgkeyとTinyGoで遊んでみたいと思います3

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-keyboardVialに対応しており、これを使えばGUIでキー配置を変更できる&レイヤー配置が簡単にできるようです。

ブラウザで変更するとリアルタイムでsgkeyに反映されるのですが、どういう仕組みでsgkeyに書き込んでいるのでしょうか。最初にブラウザからデバイスの選択を促されるので、ブラウザとデバイス間での通信を許可するAPIでもあるのでしょうか。

今回はレイヤー1に12345を、レイヤー2に67890のキーを設定し、トグル形式でレイヤーを切り替えられるようにします。

こんな感じで6キーだけで10個の数字を入力できました。

液晶に現在のレイヤーを表示させても面白いかもしれません。

ちなみにサンプルのvial.jsonに書かれているProductIDとVendorIDは0x000a0x2e8aですが、xiaoでは0x802f0x2886です。なのでvial.jsonを書き換えた上でgo run cmd/gen-def/main.goを実行してdef.goを更新してみたのですが、書き換えても書き換えなくても動作は変わりませんでした。ここら辺は詳しくないのでよく分かりません。

終わりに

普段のGoの感覚で組み込みプログラムをかけるTinyGoすごいです。 せっかく電子工作の道具を買い揃えたので、もう少しいろいろやってみたいと思います4

sago35さんありがとうございました。


  1. 自分も発表したのでぜひこちらからスライドをご覧ください ↩︎

  2. https://sago35.hatenablog.com/entry/2023/12/05/095108 ↩︎

  3. 一緒にsgkeyを貰っていたmazreanさんは爆速で組み立ててました ↩︎

  4. keyball61が前から気になっています ↩︎