読めるようにソフトウェアは改造してみたけど、肝心のセンサー自体はまだ何もつないでない。

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
% 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
これでうまくいけばfirmware.hexができる。


upload hex

IRKitをMacにUSB接続してすぐ書き込む。
Arduinoは電源入ってから数秒間だけファームウェア書き込みを受け付ける為。
% ino upload -m irkit

※注意:ブートローダー破壊する可能性あり(追記)

28672 byte以上書き込むとbootloader領域破壊するので、書き込み前にhexのサイズを確認するべき。詳しくは→IRKitのブートローダーを破壊したので直した

serial monitor

なおシリアルモニタで見るとIRKitがDNSをlookupしたり色々通信しているのが見れる。
% ino serial
ctrl+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; i gs.write( IR_get() );

gs.write関数はGSwifi.cppに書かれている。