じーろぐ

日々の記録。コンピュータやプログラミングの話題が多め。

TWELITEのタグアプリでADCを4ポート全て使うための設定

TWELITE+無線タグアプリでアナログセンサーのデータを送信する

TWELITEのADC(アナログ-デジタル変換回路)が4ポート(TWELITE REDの場合は6ポート)搭載されているため、アナログセンサーの値を最大4(または6)個取得して送信することが仕様上可能です。センサーデータを親機に定期送信するには、無線タグアプリを使うと簡単で、やり方はモノワイヤレス株式会社の以下のページに回路例、設定、出力例が詳しく出ています。

www.mono-wireless.com

要約すると、センサーのアナログ出力をAI1,AI3(ピン番号22,23)に接続し、インタラクティブモードでSensor Mode(センサー種別)を0x10(アナログセンサ)に設定すると、センサーの出力電圧が送られてくるわけです。

ただ、デフォルトだと2ポート分しかデータが送れないので3つ以上センサーを接続してデータを送信することができません。せっかく、4ポートもADCインターフェースがついているのに何で2つだけなんだよ!ってなりますが、意外と簡単な方法で4ポート全部のデータが送信できるようにできます。

実は無線タグアプリはADC4ポート分のデータ送信をサポートしている

無線タグアプリは2020年3月現在、Ver.2.1.5が最新版ですが、ソースコードをダウンロードして、Version.mkを見てみると、Ver.2.1.1で密かにADC 4ポート対応していることがわかります。

# 2.1.5 親機の出力形式にカンマ区切りを追加
# 2.1.4 SHT3x/SHTC3の対応
# 2.1.3 新ネットワーク方式に対応
# 2.1.2 DIモードにて複数入力、定期送信に対応
# 2.1.1 ADC 4ポート対応
# 2.1.0 ADXL34x FIFOモードの機能を修正。設定を16パターン保存できるように修正

4ポート分のデータ送信に対応している事実だけで、どうやってADC4ポート使うかは何処にも書いてないです。。そこで、ソースコードを確認すると以下のファイルに何箇所か、ADC4ポート使うための処理をしている部分が見つかります(こういうとき、オープンソースだと自分で調べられて良いですね。)。

//ProcessEv_Standard.cより引用
if( sAppData.sFlash.sData.u8mode == PKT_ID_STANDARD && (sAppData.sFlash.sData.i16param&0x0001) ){
    sAppData.sSns.u16Adc1 |= 0x8000;       // ADCを4ポート使用してますよビット
    S_BE_WORD(sAppData.sSns.u16Adc1);
    S_BE_WORD(sAppData.sSns.u16Adc3);
    S_BE_WORD(sAppData.sSns.u16Adc2);
    S_BE_WORD(sAppData.sSns.u16Adc4);
}else{
    S_BE_WORD(sAppData.sSns.u16Adc1);
    S_BE_WORD(sAppData.sSns.u16Adc2);
    S_BE_WORD(sAppData.sSns.u16PC1);
    S_BE_WORD(sAppData.sSns.u16PC2);
}
//EndDevice_input.cより引用
if( sAppData.sFlash.sData.u8mode == PKT_ID_STANDARD && (sAppData.sFlash.sData.i16param&0x0001) ){
    vPortDisablePullup(0);
    vPortDisablePullup(1);
    sAppData.sObjADC.u8SourceMask =
            TEH_ADC_SRC_VOLT | TEH_ADC_SRC_ADC_1 | TEH_ADC_SRC_ADC_2 | TEH_ADC_SRC_ADC_3 | TEH_ADC_SRC_ADC_4;
    u8ADCPort[0] = TEH_ADC_IDX_ADC_1;
    u8ADCPort[1] = TEH_ADC_IDX_ADC_2;
    u8ADCPort[2] = TEH_ADC_IDX_ADC_3;
    u8ADCPort[3] = TEH_ADC_IDX_ADC_4;
}else{
    sAppData.sObjADC.u8SourceMask =
            TEH_ADC_SRC_VOLT | TEH_ADC_SRC_ADC_1 | TEH_ADC_SRC_ADC_2;
    u8ADCPort[0] = TEH_ADC_IDX_ADC_1;
    u8ADCPort[1] = TEH_ADC_IDX_ADC_2;
}

u8modeをPKT_ID_STANDARDに、i16paramを0x0001にセットするとADC4ポートモードになるようです。

それぞれの定義は以下にあります。

//appsave.hより引用
uint8 u8mode;           //!< センサの種類
int16 i16param;         //!< 選択したセンサ特有のパラメータ
//common.hより引用
#define PKT_ID_STANDARD 0x10

結論

長くなりましたがまとめると、タグアプリで センサー固有パラメータを1にセット するとアナログ入力の値が4ポート分送られてくるみたいです。

 m: set Sensor Mode (0x10)
 p: set Sensor Parameter (1)

無線タグアプリのインタラクティブモードの説明では、アナログセンサーは固有パラメータなしと言うことになってますが…(マニュアルが更新されてないみたいですね)

実際、上記の設定を行うことで無線タグアプリVer.2.1.5をインストールしたTWELITE REDでADC4ポート分のデータが送られてくるのを確認しました。 以下は実際にデータを定期的に取得し可視化した例です。

f:id:z_logger:20200304010050p:plain
TWELITEから送られてくるADC4ポート分のデータを取得し可視化した例。3番だけセンサーをつないでないが、4ポート全てのデータが送られてきている。

可視化とデータの収集に使ったPythonスクリプトのソースは以下においてあります。ADC2/4ポートいずれにも対応済みです。

github.com

参考サイト