IRKit といえば、スマフォから赤外線リモコンの学習リモコンとして使う一般的な用途はもちろんのこと、WiFi の httpd 経由で RESTful な API を通して赤外線を送受信できることから、開発者にとってハックしがいがあるデバイスである。
しかしながら、もう一つ IRKit は「オープンハードウェア」という視点からも非常にハックしがいがあるデバイスで、以下のデータが公開されている。
-
https://github.com/irkit/device/blob/master/case/
- IRKit のケース。
- ライセンスは CC BY-NC-SA 4.0
-
https://github.com/irkit/device/tree/master/hardware
- ハードウェア設計図。EAGLE などで開ける。*.partlist.csv にパーツリストも。
- ライセンスは CC BY-SA 3.0
-
https://github.com/irkit/device/tree/master/firmware
- Arduino Leonardo で動くファームウェア。普通に Arduino 環境で開発できる
- IRKit ファームウェア本体のライセンスは GPL v2
IRKit のファームウェアをカスタマイズする
前述の通り、IRKit は Arduino Leonardo との互換アーキテクチャを採用しており、その環境で開発することができる。
僕が大好き platformio を用いてファームウェアを書き込むには、firmware/src/platformio.ini を
[platformio]
src_dir = IRKit
[env:leonardo]
platform = atmelavr
framework = arduino
board = leonardo
# targets = upload
で用意し、あとは普通に
$ platformio run -t upload
で難なく書き込んで動かすことができる。かんたん!!!
また log.h を見るに、コンパイル時のビルドフラグでログ関係の物をいくつか定義すれば、シリアルコンソール経由でログが見れるのでセットしてみる。
[platformio]
src_dir = IRKit
[env:leonardo]
platform = atmelavr
framework = arduino
board = leonardo
# targets = upload
build_flags = -DMAINLOG -DGSLOG -DHTTPLOG -DHTTPLOG -DIRLOG -DKEYLOG
あとは再度書き込んで、シリアルコンソール経由で表示する
$ platformio run -t upload && platformio serialports monitor
これでログがいろいろと表示されるように。
CONNECT f
c< CONNECT f
OK
c< OK
c> AT+SSLOPEN=f,cacert
OK
c< OK
続いて正常接続時の LED の色を変えてみる。
diff --git a/firmware/src/IRKit/IRKit.ino b/firmware/src/IRKit/IRKit.ino
index 0a4c6a5..647131e 100644
--- a/firmware/src/IRKit/IRKit.ino
+++ b/firmware/src/IRKit/IRKit.ino
@@ -211,7 +211,7 @@ void process_commands() {
}
void on_irkit_ready() {
- color.setLedColor( 0, 0, 1, false ); // blue: ready
+ color.setLedColor( 1, 1, 1, false ); // white: ready
}
void on_ir_receive() {
これで白に。本当は PWM で出力弱めたかったんだけど、LED 接続してるピンが1ピンしか対応してない && そのピンでも何故かうまくいかない(timer割り込み周り?)ので白にしてみた。
そのほかの見所
Arduino Leonardo にのってるチップ、ATmega32U4 はプログラム用メモリが 32KB (正確にはアップロードできる最大サイズは 28672 Byte) のため、できる限りプログラムサイズを小さくすべく、ライブラリをそのまんま使わず必要な箇所だけ実装したりしてる(それでも標準で約 26000 Byte使ってる)。
WiFi のアクセスポイント実装
IRKit は最初の設定時、ホストのアクセスポイントになり、そのAPを叩くことで家庭のアクセスポイントのSSID, password などを記録し、その後ふつうの挙動になる。という実装も GSwifi.* 等を見ると WiFI チップの GS1011MxxS とどう AT コマンド経由でやりとりしてるのか解る。
test いろいろ
テストが書けるような作りを意識していて、firmware/t 以下にテストが沢山ある!!!
普通に gcc でコンパイルして動かせるようなユニットテストから、実機にアップロードして結合テストまで、いろいろなテストがあって素晴らしいなぁ…。
また C/C++ で使える "yet another TAP library for C/C++" の nanotap を使ってる箇所が多い。tokuhirom 作なのかー、知らなかった。
データの保持
最初、学習データ自体を IRKit 本体に保存してるのかと思ったけど、学習データは保存してない(= スマフォなどアプリ側に保存してる)。ATmega32U4 の EEPROM だけだと 1KB しか保存できないので、そうですよね。
終わりに
まだまだいろいろなことができる余地があり、例えば冒頭の写真のようにケースを開けるとピンヘッダの空きポートがあり、自分でさらにセンサー等を追加することもできる。
そんなこんなで、IRKit は WiFi 赤外線リモコンという通常の使い方以外でも大変面白いので、みなさん触ってみると良いと思いました!