3月 202014
<< Jawbone Upの再起動 || irkitコマンドで家の外からIRKitを操作する >>
読めるようにソフトウェアは改造してみたけど、肝心のセンサー自体はまだ何もつないでない。
IRKitはArduino派生のハードウェアなので、ファームウェアの改造もできる。
ファームウェアに関しては特にドキュメント読まなかった(というか何も無かった)けど、Arduinoの作法に従ってやればさくさくといじれた。プラットフォームは偉大。
とりあえずGET /messagesすると赤外線データだけでなくADコンバータ0〜5を読んでJSONに混ぜて返すようにできた
freqの次のsensorの配列がそれ。
Macでやる。多分Linuxでもできる。Windowsでは使ってるツール(ino)が動かなくて無理な気がする。
ソースをgithubからclone
https://github.com/irkit/device/wiki% git clone git@github.com:irkit/device.git
% cd device
firmwareディレクトリ以下がソレ。
なお今いじってるリビジョンはMar 18 16:03:26 の 992a4a58b4d73d213f4083c285c8d7bac39533b3
なんか動かなくなったら
% git checkout v1.3.5して安定版でビルドして書き込めば治せると思う。多分。
inoとは
ビルドとファームウェアの書き込みにはinoを使う。そういえば以前紹介してた。ino使うとCUIでArduinoをビルドできて便利
inoはArduino.appを参照して使うpythonスクリプトなのでArduino.appもインストールしておく。
update boards.txt
inoはboards.txtを読んでビルドや書き込み時の設定とするので、boards.txtにirkitを追加する。それぞれ以下にある
Mac
/Applications/Arduino.app/Contents/Resources/Java/hardware/arduino/boards.txt
Ubuntu
/usr/share/arduino/hardware/arduino/boards.txt
% patch -u /Applications/Arduino.app/Contents/Resources/Java/hardware/arduino/boards.txt < firmware/boards.txt.patch
irkitが使えるようになってるかチェック
% ino list-models
build
firmware/build.shを参考にした。しかし中でなんかrmしてたり、~/src/ino/bin/inoを使っていたりとハードコーディングしていたのでbuild.shを使わず手動でやった。
% cd firmwareこれでうまくいけばfirmware.hexができる。
% VERSION=`git describe --tags --long | sed -e "s/^v//" | sed -e "s/\-/./g"`
% sed -e "s/__VERSION__/$VERSION/" src/IRKit/version.template > src/IRKit/version.c
% ino build -m irkit
upload hex
IRKitをMacにUSB接続してすぐ書き込む。Arduinoは電源入ってから数秒間だけファームウェア書き込みを受け付ける為。
% ino upload -m irkit
※注意:ブートローダー破壊する可能性あり(追記)
28672 byte以上書き込むとbootloader領域破壊するので、書き込み前にhexのサイズを確認するべき。詳しくは→IRKitのブートローダーを破壊したので直したserial monitor
なおシリアルモニタで見るとIRKitがDNSをlookupしたり色々通信しているのが見れる。% ino serialctrl+a ctrl+xで終了。
ファームウェア改造
return analog sensor values on HTTP-GET /messages · 8a89128 · shokai/irkit-device
firmware/src/IRKit/IRKitHTTPHandler.cpp がHTTPのハンドラなので、
static int8_t on_get_messages_request関数にanalogReadを追加するなどした。
gs.write("{\"format\":\"raw\",\"freq\":"); // format fixed to "raw" for now
gs.write(IrCtrl.freq);
+
+ gs.write(",\"sensor\":[");
+ for(char i = 0; i < 6; i++){
+ gs.write((uint8_t) analogRead(i));
+ if(i < 5) gs.write(",");
+ }
+ gs.write("]");
+
gs.write(",\"data\":[");
for (uint16_t i=0; igs.write( IR_get() );
gs.write関数はGSwifi.cppに書かれている。