arduinoと加速度センサ
Arduino加速度センサー
Arduinoを用いて加速度センサーのデータをPC側にシリアル通信をしたいです。(usbケーブルにて)
spiで繋いだ加速度センサーより
20msecおきに1600Hzの信号をx,y,z軸それぞれ16ビットデータを32個分データをFIFOより引っ張ってきて、各軸512個のデータをArduinoのグローバル変数data[512]にストック、配列内をずらす作業を行い、シリアル通信をしています。
シリアル通信は、8ビットなので、上位と下位に分けて送り、PC側でくっつけてます。
ですが、PC側で信号を見る限り、途中で、一部ノイズみたいな波形で出て来ており、非常に困ってます。
x,y,zで決まった箇所、決まった量はありません
解析をするとノイズのようなデータは、元の信号が8ビットずれていたデータでした、、
コード例(x軸のみ)
Timer.Tick (A部20msec)
A部
for l = 0; l < 32 ; l ++ //得たデータを配列内で後ろにずらす
data[480+l] = data[448+l]
data[448+l] = data[412+l]
.....省略
data[32+l] = data[l]
for i = 0 ; i <32 ; i++ //最終データ取得
(int16-t) data[i]=accl-x[i] //accl-xは20msec毎に更新
B部
for j= 511; j<-1;j--
(int16-t) data2[j]= data[j] //下位
data[j] = data[j] >> 8 //上位
Serial.Send(data[j])
Srial.flush()
Serial.Send(data2[j])
Serial.flush()
電源ON時はA部をTimerでぐるぐる回しており、手動スイッチで、B部に変わります。その時は、pcのポートは開放しています。
シリアル通信自体はおかしくないようです。
加速度センサからのデータではなく、定数を与えるときちんとPC側で受け取ってました(accl-xの箇所を49等)
シリアル通信の解析ソフトを使用してもPCアプリ側の受信データとパケット内容は一致してました。
パリティ、ストップビット、ボーレートを変えても効果がありません。
加速度センサのレジスタ設定も、ノイズフィルターの機能はつけてます。Arduino側もセンサー値の取得サンプリング時間をオシロで確認しています。
この加速度センサー値取得と受け渡し、ループで回す処理がArduinoにとって負荷がかかってるのでしょうか。
そう思い、配列内操作をせずに1-32,33-64と順に一回のみ格納という形の動作は変わりませんでした。。
Srial.flushとdelayを挟んでも変わりません。
Arduino自体が振動している状況が、悪いのでしょうか。。
Serial送信時に、usbポートの接点が、機械的に浮くとそういった現象が起こりますか。。?
ちなみにPC側はVBAです。
前に一度質問した時には、PC側のバッファが、足りないのではと言われたので、受信バッファは、40000くらいにしてますが、、PC側の回収が遅いのでしょうか。
一回ごとのserial.sendにdelayをかけても改善はされなかったですが、、シリアル送信時に64バイトと決まってるとかいないとかは、聞いたことはあるのですが、、
説明が下手で申し訳ないですが、どなたかアドバイス頂けないでしょうか。。
大分悩んでます。。