2015年5月7日木曜日

Edisonで無線加速度計

完成しました。
EdisonのWiFiモジュールを活かして、無線で値を飛ばしてPC側でロギングする仕様。
以下次に向けた備忘録がてら。


EdisonでI2C通信

Edison Breakout BoardはADCモジュールを積んでいないので、加速度計はI2C/SPI出力のLIS3DHを使いました。今後別のモノ作る時にI2C通信のIMUも使っていきたいので、方式はI2Cを選択。
LIS3DH

I2Cクラスもmraaに用意されているので、メソッドの組み合わせでモジュールの仕様と合うように通信します。
例えばLIS3DHの通信仕様はデータシートによると
書き込み:書き込みアドレス-> レジスタ ->データ 
読み込み:書き込みアドレス->レジスタ->読み込みアドレス->データ
となっていたので、以下のようにしたら通信できます。

// アドレスの設定
i2c->address(LISadd);
 //読み込み
i2c->writeByte(whoami);
rbuff = LIS->readByte();
//書き込み
wbuff[0] = ctrl_reg1;
wbuff[1]= 0x77;
i2c->write(wbuff,2);

書き込みはwriteRegでも良さそうですが、何故かコンパイルが通らない・・・。環境の問題なんでしょうか。ちなみにw/rメソッドは呼ぶたびにアドレスが送信される仕様のようです。この時アドレス(7bit)後のRW(1bit)はw/rメソッドのどちらを使うかで、自動でつけてくれます。

Edisonでタイマ割り込み

サンプルのコードでは処理周期をsleep/usleep関数で調整してるのがほとんど。
これだと処理時間分だけサンプリング周波数がずれてしまうので、制御や信号処理の用途ではちょっと困ります・・・。

普通の組み込みマイコンなら、タイマー割り込み処理用のレジスタとか見れるんですが、
Edisonのタイマー割り込みはどこにやら。関数も mraa/upm/iotkit-comm-c といったところには無さげですが、どうやらLinuxカーネルで出来そう。





左がSleep関数で回した場合、右がカーネルのタイマー割り込みで回した場合です。1周期回す毎にインクリメントして計算した時間を1列目に出していま す。また、比較のため実時間を2列目に表示しています。左は実時間とインクリメント時間がどんどんずれていってますが、カーネルのインターバルタイマを 使った右はぴったり一致してます。細かくいうとLinuxの時間自体の精度はどうだ、という話もあるようですが、まずは良いかな。





*タイマーインターバルのやり方メモ

以下ヘッダをインクルード
    #include <sys/time.h> //インターバルタイマ
    #include <signal.h>      //割り込み登録
    ↓
割り込み処理関数の記述
    void timerInterrupt(int sigtime);
    ↓
割り込み処理の登録(インターバルタイマシグナルのSIGALRMと自前の割り込み処理関数の紐付)
    struct sigaction interrupt;
    memset(& interrupt, 0, sizeof(interrupt)); //メンバの初期化
    interrupt.sa_handler = timerInterrupt;
    interrupt.sa_flags = SA_RESTART
    sigaction(SIGALRM, &interrupt, NULL)
    ↓
インターバルタイマの設定
    struct itimerval Timer;
    memset(&Timer, 0, sizeof(Timer)); //メンバの初期化
    int samplingRate = 10*1000; //usec
    Timer.it_interval.tv_usec = samplingRate;
    Timer.it_value.tv_usec = samplingRate;
    setitimer(ITIMER_REAL, &Timer, NULL); //タイマスタート


EdisonでAPモード


加速度ロガーは屋外で用いる予定なので、Edison自体をアクセスポイントにしてPCと通信します。
本体のスイッチを2~7sec押すとAPモードで起動するので、これにEdisonのパスワードで接続するだけ。
デフォルトではEdisonのIPアドレスは192.168.42.1になっていました。
このIPアドレスでTCP/IP接続して、Edison側で掃いた値をPCで保存すれば簡易ロガーとして機能します。



あとは
側造って

電池つけて

完成です!
GWも完.orz

2 件のコメント:

  1. Hello, this is just what i am trying to achieve: read the lis3dh from the intel edison. Could i get the source code? I use java and mraa, but that should not be too difficult to translate. I could not understand the text, but the source code was good to read. Thanks in advance

    返信削除
  2. Hello, this is just what i am trying to achieve: read the lis3dh from the intel edison. Could i get the source code? I use java and mraa, but that should not be too difficult to translate. I could not understand the text, but the source code was good to read. Thanks in advance

    返信削除