投稿

2017の投稿を表示しています

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!"と表示されれば、動作確認完了である。

7)評価キットがない時

イメージ
さまざまな理由で評価キットがお手元にない方もいらっしゃることだろう。 それでも書き込み器( DC9010B Eterna Serial Programmer )があれば、モジュール側にピンヘッダーを半田付けすることで、なんとか接続し書き込むことができる。 ETERNA2 Users Guide の8ページに書かれているが、1.27ピッチ 5X2のピンヘッダーをJ2に付ける。 オプションとされている1~6番の信号がフラッシュメモリーのアクセスに使用される。 コネクタの型番(Samtec MTMM-111-04-S-S-175-003)を検索してみたのだが、簡単に購入することができそうにない。 おすすめは こちら のものだが、位置決め用の出っ張りがじゃまになるので、ニッパーで出っ張りをカットして使うと良いだろう。 接続用のケーブル も販売されているので、同時に入手しておかれるとよい。 しかし、DC9010B側のケーブルは2mmピッチなのに、どうやってつなげるの? と思われる方もいるだろう。 Eterna Serial Programmer Guideの33ページの機能ブロック図を見ると、P3コネクタが内部に用意されていることがわかる。 DC9010Bのカバーを外して、ここにモジュール側のピンヘッダーJ2に挿したケーブルの反対側を挿せばOKだ。 この時、カバーを外す前に電源(USBケーブル)を抜き、1番ピンの方向を間違わないようにケーブルを挿すように注意していただきたい。 DC9010Bもないという場合はどうしたらよいだろうか。 モジュールの電源を書き込み器側から供給するのなら、簡単な回路でDC9010Bもどきを作ることができる。 回路図は下図のようになる。 FT4232HLの評価モジュールを買って改造してもよいだろう。 ESPも問題なく利用できるはずだ。 私が作ったものも快調に動作している。 時間があれば基板化してみたい。

6)binの書き込み

イメージ
いよいよESP(Eterna Serial Programmer software)を使用して、フラッシュメモリーに書き込んでみよう。 ESPを解凍したら、ESP.exeのあるホルダーを作業フォルダーに設定したコマンドプロンプトのショートカットを作っておくと便利である。 コマンドプロンプトからespと打つとヘルプが表示されるはずだ。 評価キットかDC9010Bとモジュールの接続に問題があるかも知れないので、まずはフラッシュの内容を読んでみよう。 esp -r bup5902_1.bin 読んだ内容を格納するファイル名を指定する必要があるので、ここでは bup5902_1.bin としている。 上図のように err = 0 で終わっていれば接続OKだ。 書き込みは、変更が必要な部分だけ書き換える場合と、全体を書き換える場合がある。 「コンパイルの準備」で書いたように、LTP590xモジュールには新旧がある。 旧モジュールにはそれぞれの品種(IPMA、PRA、IPRB、IPRC)にそれぞれのデフォルトイメージが書かれていたようだ。 新モジュールになってからしばらくは、それまで通りに品種別であったが、現在のハードウェアは LTP590xIPC-IPMA に統一され、ユーザー側でお好みのイメージを書くようになった。 品種別のジュールを購入して初めて書き込みを行う場合は、上記のように書かれているであろうデフォルトイメージを読んでバックアップを取っておくことをおすすめしたい。 購入時の状態に戻したいと思うことがあるためだ。 フラッシュ全体を書き換えるには、全消去 -> FUSE書き込み -> パーティション書き込み -> メイン書き込み -> ローダー書き込み の順に行う。 ESPコマンドを手で打つ場合は以下のようになる esp -E esp -P FT-LTP5902-IPMA-M4-115K-680-0241-0003REV1.bin 0 esp -P mote_part_r52074.bin 800 esp -P ocfdk_00_hello.bin 1000 esp -P loader_1_0_5_4.bin 77800 上記の例のモジ

5)フラッシュイメージ

イメージ
バイナリーファイル ocfdk_00_hello.bin ができたので、これをモジュールに書き込んで動作を確認しよう。 評価キット か DC9010B Eterna Serial Programmerをお持ちの方はESP(Eterna Serial Programmer software)を使用して書き込むことが可能だ。 ESPは DC9010B の紹介ページの下のリンクからダウンロードできる。 バイナリーファイルはモジュール内のフラッシュメモリーに書き込むのだが、書き込む場所が決まっている。 モジュール内のフラッシュメモリーイメージは下図のようになっている。  Board Specific Parameters はFuse Tables と呼ばれるパラメータを格納する場所だ。モジュールの品種によって設定値が異なり、ライブラリーと同様にMyLinearからダウンロードできる。先頭は0番地である。  Partition table はフラッシュイメージ中の各要素の位置を定義するものらしい。モート用とマネージャー用の2種類ある。Partition tableの先頭は800番地である。  Main exec ここにできあがったbinファイルを書き込む。先頭は1000番地である。  Loader はOTAP(Over the Air Programming)イメージの処理とメイン実行可能イメージの管理を行うと、 Eterna Serial Programmer Guide に書いてあるが、しばらくは変更されていないようだ。先頭は77800番地である。 以上のように4パートに分かれており、ESPを使用して書き込みを行う時に先頭アドレスの指定が必要なため、しつこく書いておいた。

4)コンパイルする

イメージ
いよいよビルドである。 こちら に書かれているようにOCSDKのonchipsdk-master/projects/iar/の下にあるall_projects.ewwをWクリックする。 EWARMが起動しサンプルアプリケーションが左側にずらりと表示される。 まずはhelloをビルドしてみよう。 サンプルの一番上にある00-hello - Debug が太字になっていなかったら、右クリックから「アクティブに設定」を行う。 さらに右クリックから「全てを再ビルド」を実行するとビルドを開始する。 エラーが無ければDOS窓が2回現れて終了する。 いくつかワーニングが出るかもしれない。 とりあえず30日期間限定の評価版ではコンパイルができるようだ。 onchipsdk-master\projects\iar\00-hello\Debug\Exe の下にocfdk_00_hello.bin ができるので、これをモジュールに書き込んで動作を確認しよう。

3)コンパイルの準備

イメージ
1)評価版のダウンロード ここ からコア→ARMを選択して、評価版をダウンロードした。バージョンは8.11だった。 2)OCSDKのダウンロード こちら からOCSDKをダウンロードする。 3)ライブラリーの入手 よく考えてみると、ライブラリーをお持ちでない方にとっては、ライブラリーの入手が一番大変そうだ。 こちらにある説明 によると、MyLinearのアカウントを作成し、 ソフトウェアリクエストフォーム にプロダクトキーと部品番号の記入してダウンロードの請求をしなければならないようだ。 プロダクトキーと部品番号はハードウェア購入時に添付される購入証明書(Proof-of-Purchase certificate)に記載されていると書かれている。最低でも何か1個は先に購入する必要があるということである。 モジュールの価格を見てみると、 チップワンストップ ではLTP5902IPC-IPMA1D0#PBFが\6,750@1pcsとなっていた。 また、デジキーでは LTP5901IPC-IPMA1D0#PBF 、 LTP5902IPC-IPMA1D0#PBF ともに\7,696@1pcsであった。 デジキーでは古い品番のものの方が安くなっている。古いか新しいかは、モジュールの写真を見て、2個載っている水晶発信器の内1個が黒い四角のものは古いものである。 詳しくは Eterna Serial Programmer Guide の40ページ以降を参照していただきたい。 評価するだけなら新旧どちらでも良く、また、モート(IPMA)でもマネージャー(IPRA、IPRB、IPRC)でもファームを書き換えれば同じなので、チップアンテナタイプが欲しい方は、デジキーの方が、今はお安く入手できる。 また、チップワンストップ、デジキーともに送料が無料になる価格に達している。 (価格は2017年5月11日現在のものです) ※追記  通販で購入した場合は購入証明書が添付されないことが多いようだ。最初の1個はLTC(AD)より直接購入することをおすすめする。 無事にMyLinearのアカウントを取得し、リクエストが通るとライブラリーをダウンロードすることができる。 ダウンロードしたライブラリー(incとlib)をOCSDKのsrcの下にコピーする。

2)OnChipSDKとは

OnChipSDK とは、モート(子機)のFWにオリジナルのアプリケーションを追加したセミカスタムFWを作るためのSDKである。 コンパイラーはIAR社の EWARM のみで、 dustcloudのドキュメント では、評価用EWARMの32KB限定版は使えない(コードが32KBを超える)ので、正式版を買い、さらにデバッガー(i-Jet)もeShopで買えと書いてある。 お試ししたいだけなのに、高いコンパイラを買うなんて無理ですよ。30日期間限定版で試せないんですかね?と前から思っていたので試してみようと思う。 Getting Started の手順に従って準備をしていく。

1)はじめに

2.4GHz(ISM)帯を使用した省電力センサーネットワークに SmartMesh IP という製品がある。これはリニアテクノロジー社(アナデバ)の製品だが、他の方式に比べて通信接続が切れにくく、消費電力を低くすることがやりやすい仕様になっている。 詳しくはこちら 以前から、このデバイスを使って何か作ってみたいと思っていたのだが、日本ではまだマイナーで、モジュールのお値段も少々お高いので、実行に移せないでいた。 利用者が増えれば、自ずと価格も下がるであろうと思い、また、日本語で細かいところを書いている方も少ないようなので、今まで疑問に思っていたことなどを実験して、ここに書いてみようと思う。