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でタイマ割り込み
これだと処理時間分だけサンプリング周波数がずれてしまうので、制御や信号処理の用途ではちょっと困ります・・・。
普通の組み込みマイコンなら、タイマー割り込み処理用のレジスタとか見れるんですが、
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
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
返信削除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
返信削除