投稿

14)join

イメージ
joinするにはマネージャーが必要になる。 ここは覚悟をきめてもう1台準備しよう。 mote側のappは01-joinのjoin_app.cを使用するのだが、固定データを送るだけでは面白くないので、消費電流(Qtotal)、稼動時間(UpTime)、温度を送信してみよう。 これらの値は dnm_loc_getParameterCmd の DN_API_PARAM_CHARGE で取得できる。 呼び方はこのようになる。    dnErr = dnm_loc_getParameterCmd(       DN_API_PARAM_CHARGE,      // paramId       chargeBuf,                             // payload       0,                                         // txPayloadLen       &respLen,                             // rxPayloadLen       &rc                                       // rc    );    ASSERT(dnErr==DN_ERR_NONE);    ASSERT(rc==DN_ERR_NONE); バッファ(chargeBuf)に12バイトのデータが入る。 データ構造(dn_api_rsp_get_charge_t)は dn_api_param.h に書かれている。 /** \brief Payload of the request to get parameter #DN_API_PARAM_CHARGE. */ typedef dn_api_get_hdr_t dn_api_get_charge_t; /** \brief Payload of the response when getting parameter #DN_API_PARAM_CHARGE. */ typedef struct {    INT8U    rc;            ///< Return code, among values in #

13)こんどはI2Cで

イメージ
SPIの次はI2Cのネタを書くだろうと思われている方のご期待に沿うべく、I2Cでもやってみよう。 今回もPIC12F1822を使用する。 下図のように接続している。 I2CはSCLとSDAの2本だけで済むので、パッケージが8ピンでも空きピンが使えてデバッグしやすい。計数するパルスはT1CKI(RA5)を出力に設定して、主な処理の途中で出力を反転させた。 mote側のappは02-i2cのi2c_app.cを改造して、CLIコマンドにデバッグ用のコマンドを追加した。 リードコマンド(rddata)とライトコマンド(wrdata)、I2Cアドレス設定コマンド(wraddr)の3つである。 I2Cアドレスの初期値は0x66とした。 CLIから"rddata 2"と打つとカウント値2バイトが読める。 バイト数は32バイトまで設定できるが、3バイト以降は適当な値(0x02からインクリメント)を返すようにしている。 ライトコマンドも受け付けるが、PIC側で受けた値は捨てている。 下図は"rddata 2"を打った時の観測結果である。 Sleepから復帰して再度Sleepするまで約520usecになっている。 SPI改よりもさらに短くなった。 PICのクロックは2MHzに設定している。 PICのSSP割り込み処理の先頭で内部OSCの安定(HFIOHL=1)を待っている。 この時間は上図の左のカーソルからRA5の最初の立ち上がりまでなので、およそ140usecくらいだ。 その後、SSP1IFチェック、SSP1IFフラグクリア、SSP1BUF読み出しまでが最初のRA5=1の間の処理である。 RA5をクリア後、Read ModeとWrite Modeの振り分け、AddressとDataの振り分けを行う。 ここではRead(mote <- PIC)、Address検出なのでRA5をセットしTMR1のカウンター値の読み出し処理を行う。 2番目のRA5=1の部分が、TMR1のカウンター値の読み出し処理時間である。 カウンター値を読むまでにRA5の立ち上がりエッジは2回あるので、カウンター値の最初の値は0x0002になる。 SSP1CON3のAHEN=1

12)非同期パルス

イメージ
毎分数パルスから数十パルスのパルス数を、moteで観測するにはどうすればよいだろうか? GPIOの入力の変化で数えさせても可能なのだが、変化があるごとにアプリが起動することになるので、わりと電池を食ってしまいそうだ。 外付けの省電力マイコンのタイマーカウンターでカウントさせて、一定時間ごとにシリアル通信から読むのはどうだろう。 Sleepさせておいて、通信する時だけ起こせば消費電力を抑えられそうだ。 そこで手元にPIC12F1822があったので、試してみることにした。 シリアルI/FはSPIとI2Cのどちらにするか迷ったのだが、以前SPIで似たものをやったことがあったのでSPIを使うことにした。 (実はこれが後でやっかいなことになる。) 各信号(SS,SCLK,SDO,SDI)の接続は下図のようになる。 moteがMaster、PICがSlaveになる。 パルスカウントはTMR1を使う。 TMR1のクロック入力T1CKIはシュミットになっているので、バッファなしで大丈夫そうだ。 Sleep中もカウンターは動作するので、その点もクリアしている。 PICのクロックはHFINTOSCの16MHzに設定しておいて、動作確認後に落としていこうと思っていた。 PIC12F1822のProgram Memoryは2KWなので、ASMで組むことにした。 Sleepからの復帰はSSP1の割り込みで行えば良さそうだ。 moteのSPI通信のバイト長は2の倍数なので、4バイト長に設定して後半の2バイトにTMR1の16bitカウンター値を乗せるようにしたいと思った。 moteのFWはappの02-spiをほぼそのまま使用した。 SPI_TX_BUFFER_LENGTHを4に変更するだけで4バイトのSPI通信を1秒ごとに実行してくれる。 PIC側は割り込みサービスでほとんどの処理を行い、mainはSleepのみといった構成になる。 SSP1の割り込みが発生した時点で1バイト目のデータがSSP1BUFに入っているので、フラグをクリアして2バイト目以降を待つ。 2バイト目以降はSSP1STATのBFが1になるのを待って、TMR1Hの値を2バイト目の終了時、TMR1Lの値を3バイト目の終了時にSSP1BUFに書き込めばよいはずだ。 PI

11)Lチカ

イメージ
最初はどーしてもLチカをやりたいという方もいらっしゃるのではないだろうか。 評価ボードをご使用の方は、なんの苦労もなくできるのだが、私と同様に評価ボードを買う予算が無い「ボロは着てても心の錦」的な御仁はどうすればよいだろう。 フラッシュの書き込みのために、J2にピンヘッダーを付けたので、この10ピンの内のどれかでLEDが駆動できれば楽だ。 データーシート を見てみると、GPIOにはType1とType2があり、Type2の方が引っ張れる電流が大きいようだ。 検討した結果、IPCS_MISO(GPIO6)がType2で、出力に設定してもライター側とぶつからないので、よさげである。 Lチカ用のサンプル02-gpioのgpio_app.cを編集する。 gpio_app.cを別名で保管しバックアップしておく。(例えばgpio_app_org.c) 編集箇所は17行目のピン番号を6に変更するだけでOKだ。 #define PIN_TOGGLE      DN_GPIO_PIN_6_DEV_ID gpio_app.cに上書き保存してEWARMでビルドしてみよう。 いくつかワーニングが出るかもしれない。 ocfdk_02_gpio.binをESPで書き込み、動作を確認しよう。 今回もメインだけ書き直せばよいので、私は以下のようなbatを作成した。 esp -e  1000 237 esp -P ocfdk_02_gpio.bin 1000 書き込みがうまくいったら、J2からケーブルを抜いて配線を行う。 J2の7番ピンからVCC(赤)、5番ピンからIPCS_MISO(青)を取り出す。 LEDと制限抵抗(330Ω)はブレッドボードに挿して配線を行った。 配線後、電池をいれたらLEDが1秒ごとにチカチカするはずだ。

10)電池ホルダー

イメージ
さらなる実験には、電池駆動ができたほうがよいなと思ったので、むかし千石で買った単四×2本の電池ホルダーを付けた。 電池ホルダーから出ているリード線をモジュールのスルーホールに半田付けするだけである。 半田付けする場所は下図のようになる。 +はすぐ隣りのスルーでもよく、-はすぐ上のスルーでもよい。 できあがりはこのような感じだ。 これで省電力ぽくなった。

9)resetの追加

イメージ
helloを改造して、CLIコマンドにリセットを追加してみよう。 CLIコマンドを追加するには  (1)CLIタスクヘッダーファイルの参照  (2)CLIコマンドハンドラの関数プロトタイプの追加  (3)コマンド宣言配列 cliCmdDefs[] の追加     ・配列の内容      a)コマンドハンドラへのポインタ      b)コマンド名      c)ヘルプテキスト      d)ユーザーレベル  (4)CLIタスクの初期化  (5)CLIコマンドハンドラ関数の追加 が必要である。 それではhello_app.cを編集してみよう。 hello_app.cを別名で保管しバックアップしておく。(例えばhello_app_org.c) (1)CLIタスクヘッダーファイルの参照 ヘッダーファイル"cli_task.h"の#includeを追加する。 #include "dn_common.h" #include "dn_exe_hdr.h" #include "dnm_ucli.h" #include "dnm_local.h" #include "app_task_cfg.h" #include "Ver.h" #include "cli_task.h" (2)CLIコマンドハンドラの関数プロトタイプの追加 prototypesの下の適当な場所に追加する。 //=========================== prototypes ====================================== //===== locNotifTask static void        locNotifTask(void* unused); //===== CLI handlers dn_error_t cli_resetCmdHandler(char const* arg, INT32U len); (3)コマンド宣言配列 cliCmdDefs[] の追加 追加するre

8)helloの実行結果

イメージ
このサンプルアプリケーションはCLIに文字列 "Hello, World!" を吐き出すよと、 こちら に書かれている。 CLIとは Command Line Interface の略で、シリアルポート接続でターミナルプログラムからコマンドを発行し、モートの状態やパラメータの設定を行うためのマンマシーンインターフェースである。 CLIコマンドの詳細については SmartMesh IP Mote CLI Guide を参照していただきたい。 私はターミナルプログラムとしてTeraTermを使用している。 使用される方は こちらからダウンロード してセットアップを行っていただきたい。 以下はTeraTermを使用した場合の説明となる。 モジュールにフラッシュイメージを書き込んだ直後の状態から、TeraTermを起動してシリアルを選択する。 FT-4232HLは仮想COMポートが4つ認識される。 COM3~COM6に割り当てられた場合はCOM5(下から2番目)がCLIポートになる。 下図の例ではCOM5を選択する。 シリアルポートの設定を確認しておこう。 設定 -> シリアルポート からシリアルポート設定を表示させる。 下図のようになっていればOKだ。 Enterキーを押して > が返ってくれば接続OKだ。 評価キットをお使いの方はRESETスイッチを押すと"Hello, World!"と表示されるはずだ。 そうでない方は、コマンドプロンプトからESPコマンドの -c を発行することでもRESETがかかる。 たとえば esp -c 1 "Hello, World!"と表示されれば、動作確認完了である。