RaspberryPi Helix

この記事は自作キーボード #2 Advent Calendar 2018 - Adventarの25日目の記事です。 昨日は@zeriyoshiさんの ALPS メカニカルキースイッチとその歴史でした。

TL;DR

f:id:yskoht:20181225032751j:plain

  • HelixのコントローラとしてRaspberry Pi Zero Wを使った
  • Bluetoothキーボードをエミュレートした
  • LEDを制御した

デモ

構成

f:id:yskoht:20181225220443p:plain

リポジトリ


以下、作業メモです。

Raspberry Pi Zero Wのセットアップ

上記の記事がとても丁寧に書かれているので、これに従って設定していきます。以下に要点をメモっておきます。

OSイメージのダウンロード

今回使ったイメージは2018-11-13-raspbian-stretch-lite.img です。

イメージのインストール

$ sudo ./install 2018-11-13-raspbian-stretch-lite.img

設定

$ touch /Volumes/boot/ssh  # ssh有効化
$ vi /Volumes/boot/cmdline.txt  # "modules-load=dwc2,g_ether"を追記
$ echo "dtoverlay=dwc2" >> /Volumes/boot/config.txt

インターネット共有

f:id:yskoht:20181225015209p:plain

$ ssh pi@raspberrypi.local

Wifiの設定

$ sudo sh -c 'wpa_passphrase "wifi_ssid" < wifi_password >> /etc/wpa_supplicant/wpa_supplicant.conf'
$ sudo wpa_cli reconfigure

ここまででラズパイが使えるようになりました。


Bluetoothキーボードのエミュレート

次はこの記事に従ってラズパイをBluethoothキーボードとして使えるようにします。

ツールのインストール

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get install python-gobject bluez bluez-tools bluez-firmware python-bluez python-dev python-pip python-gtk2
$ sudo pip install evdev 

元記事からpython-gtk2を追加しています。

Bluethoothデーモンの設定

$ sudo /etc/init.d/bluetooth stop
$ sudo /usr/sbin/bluetoothd --nodetach --debug -p time

一度Bluethoothデーモンを止めて、立ち上げ直します。

ソースコードのクローン

元記事のソースをクローンしてきます。

$ git clone https://github.com/yaptb/BlogCode.git

DBUSの設定

$ cd BlogCode/btkeyboard/dbus
$ sudo cp org.yaptb.btkkbservice.conf /etc/dbus-1/system.d

Bluetoothデバイスの有効化

$ sudo hciconfig hcio up

sudo hciconfig hcioでBluetoothデバイスアドレスをメモっておき、BlogCode/btkeyboard/server/btk_server.pyMY_ADDRESSを書き換えます。

エミュレーターサーバーの起動

$ cd BlogCode/btkeyboard/server
$ sudo python btkserver.py

ペアリング

$ sudo /usr/bin/bluetoothctl
# agent on
# default-agent
# scan on
# discoverable on

パスキーの確認が出たらyesとタイプしてペアリング完了。

文字を送信してみる

$ cd BlogCode/btkeyboard/keyboard
$ sudo python send_string.py hello_bluetooth!

ここまででラズパイをBluetoothキーボードとして使えるようになりました。


ラズパイとHelixをつなげる

あとはHelixとラズパイを配線し、キーマトリクスの状態をGPIOで読み出してやればオーケーなはずです。

配線図

f:id:yskoht:20181225032203p:plain

Colは左右で共用しています。VCC, GNDは省略しています。

f:id:yskoht:20181225032719j:plain

ファームウェア


LEDの制御

せっかくなのでLED制御もします。Helixに使われているLEDはSK6812MINIですが、 これでググっても情報が出てこないのでws2812 raspberry piなどでググります。1

すると、しっかりとライブラリがあったので、次はこの記事をなぞります。

ツールのインストール

$ sudo apt-get install build-essential scons swig

ライブラリのインストール

$ git clone https://github.com/jgarff/rpi_ws281x.git
$ cd rpi_ws281x && sudo scons && cd python && sudo python setup.py install

元記事はwgetを使っていますが、gitで。

配線

f:id:yskoht:20181225032208p:plain

VCC, GNDは省略しています。

サンプルプログラムの実行

ピンとLED数を修正してrpi_ws281x/python/examples/strandtest.pyを実行します。


まとめ

  • ファームはすごい適当ですが、思ったよりもちゃんと動いていた
  • レイヤー機能がないです。ちゃんと使うなら必要
  • LEDのパターンを増やしていきたい


この記事はpakbdを使って書かれました。


おまけ:うまくいかなかったこと

USB HIDデバイス化

最初は有線でラズパイをHIDデバイスとして使うことを考えていました。試して見ましたがうまくいきませんでした。OSのアップデートが原因っぽい?

スマートキーボード化

Google Assistant SDKを動かして"OK Helix!"とやりたかったんですが、 やってみるとAssistant単体では動くんですが、キーボードのファームに組み込むとLEDが光らなくなりうまくいきませんでした。

ライブラリ内部で使っている何かが競合しているのか、単にタイミングの問題なのか、まだよくわかってないです。



  1. QMKのファームを読んでみたらws2812と書いてあったのを見つけました