mica2dot
今日、mica2dotからTinyDBで光のセンサデータを取得することに成功しました。詳細は以下のようになります。
まず、moteのセンサを動かすためには、moteのタイプ毎につんであるセンサが違うので、それぞれのデバイスに対するドライバが必要です(たぶん)。ドライバは、/opt/tinyos-1.x/tos/sensorsboardsに入っています。ここには、micasbというmica2用のドライバがあるのだけど、mica2dot用のドライバが見当たりません。
/opt/tinyos-1.x/apps/Makerulesファイルに、
195 #Sensor Board Defaults
196 ifeq ($(SENSORBOARD),)
200 ifeq ($(PLATFORM),mica2)
201 SENSORBOARD = micasb
202 endif
209 ifeq ($(PLATFORM),pc)
210 SENSORBOARD = micasb
211 endif
212 ifeq ($(PLATFORM),mica2dot)
213 SENSORBOARD = basicsb
214 endif
215 endif
と書いてあるように、196行目から(おそらく)SENSORBOARDの値が定義されてなかったら、213行目でmica2dotのSENSORBOARDをbasicsbにするようになっている。まぁ、ここは蛇足。
で、問題は、/opt/tinyos-1.x/apps/TinyDBApp/Makefileで、
COMPONENT=TinyDBApp
SENSORBOARD=micasb
PFLAGS=-I%T/lib/Events -I %T/lib/Util -I%T/lib/Attributes -I%T/lib/Commands -I%T/lib/TinyDB
- I%T/lib/MintRoute -I%T/lib/Queue -I%T/lib/FS -I%T/lib/TinyDB/Aggregates -fno-strict-aliasing
MSG_SIZE=49
include ../Makerules
となっていて、SENSORBOARDが常にmicasbになってしまっている。
肝心のドライバの中身は、センサを動かすためのいくつかのnesCファイルと、sensorboard.hヘッダファイルがある。
それで、/opt/tinyos-1.x/tos/sensorboards/micasb/sensorboard.hファイルを見てみると、
45 enum {
46 TOSH_ACTUAL_PHOTO_PORT = 1,
47 TOSH_ACTUAL_TEMP_PORT = 1,
48 TOSH_ACTUAL_MIC_PORT = 2,
49 TOSH_ACTUAL_ACCEL_X_PORT = 3,
50 TOSH_ACTUAL_ACCEL_Y_PORT = 4,
51 TOSH_ACTUAL_MAG_X_PORT = 6,
52 TOSH_ACTUAL_MAG_Y_PORT = 5
53 };
54
55 enum {
56 TOS_ADC_PHOTO_PORT = 1,
57 TOS_ADC_TEMP_PORT = 2,
58 TOS_ADC_MIC_PORT = 3,
59 TOS_ADC_ACCEL_X_PORT = 4,
60 TOS_ADC_ACCEL_Y_PORT = 5,
61 TOS_ADC_MAG_X_PORT = 6,
62 // TOS_ADC_VOLTAGE_PORT = 7, defined this in hardware.h
63 TOS_ADC_MAG_Y_PORT = 8,
64 };
73 TOSH_ALIAS_PIN(PHOTO_CTL, INT1);
74 TOSH_ALIAS_PIN(TEMP_CTL, INT2);
75 TOSH_ALIAS_OUTPUT_ONLY_PIN(MIC_CTL, PW3);
76 TOSH_ALIAS_OUTPUT_ONLY_PIN(SOUNDER_CTL, PW2);
77 TOSH_ALIAS_OUTPUT_ONLY_PIN(ACCEL_CTL, PW4);
78 TOSH_ALIAS_OUTPUT_ONLY_PIN(MAG_CTL, PW5);
79 TOSH_ALIAS_OUTPUT_ONLY_PIN(MIC_MUX_SEL, PW6);
なんか、気になるような単語ばかりが並んでいますねぇ。なんの数字でしょう?
答えは、xbowの MTS/MDA Mote Sensor and DAQ Manual[PDF]に書いてありました。以下にまとめておきましょう。
mica2 | 取得データ | 取得条件 | データ出力ポート |
---|---|---|---|
マイク | PW3 | ADC2 | |
加速度 | PW4 | ADC3(x),ADC4(y) | |
磁気 | PW5 | ADC5(x),ADC6(y) | |
温度 | INT2 | ADC1 | |
光 | INT1 | ADC1 | |
バッテリ | ?? | ADC7 | |
mica2dot | マイク | PW1 | ADC2 |
加速度 | PW0 | ADC3(x),ADC4(y) | |
光 | PW0 | ADC7 | |
温度 | ¬PW6&PW7 | ADC1 | |
バッテリ | ¬PW7&PW5 | ADC1 |
ここにあるように、mica2では温度と光のセンサデータを同時に取得できないし、mica2dotでは、温度のセンサデータと電圧のデータを同時に取得できない。
まぁ、これらより、mica2dotを使うためには、sensorboard.hをmica2dot用に書き換えればいいわけですね。とりあえず、
46 TOSH_ACTUAL_PHOTO_PORT = 7,
73 TOSH_ALIAS_PIN(PHOTO_CTL, PW0);
と書き換えて、焼きなおしてみました。ばっちり光センサの値が取れるようになりました。(TOS_ADC_・・・ってなんのためにあるのでしょう・・・?)
ヘッダを書き換えたので、他のセンスできる値に変化がないことを確認してみました。すると、mica2dotでは、バッテリ(電圧)が取得できていた(つもりだった)んだけど、それが取れなくなっていまいました。というか、光と同じ値を出力するようになってました。
ちょっと考えて、すぐに答えが出ました。
さっきの/opt/tinyos-1.x/tos/sensorboards/micasb/sensorboard.hに
62 // TOS_ADC_VOLTAGE_PORT = 7, defined this in hardware.h
こういう行がありました。というわけで、/opt/tinyos-1.x/tos/platform/mica2/hardware.hです。
205 enum
206 {
207 TOSH_ACTUAL_CC_RSSI_PORT = 0,
208 TOSH_ACTUAL_VOLTAGE_PORT = 7,
209 TOSH_ACTUAL_BANDGAP_PORT = 30, // 1.23 Fixed bandgap reference
210 TOSH_ACTUAL_GND_PORT = 31 // GND
211 };
光センサの出力ポートと、電圧値の出力ポートが一緒になっていたんですね。