@dan1001

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

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バイトと決まってるとかいないとかは、聞いたことはあるのですが、、

説明が下手で申し訳ないですが、どなたかアドバイス頂けないでしょうか。。
大分悩んでます。。

0 likes

5Answer

解決できるかどうかわからないのですが、コードを見せていただきたいです。
加速度センサも、わかるのであれば品番等教えて下さい。

0Like

ありがとうございます。
センサは、LIS2DW12です。
コードは、できる限り最初の投稿に追記します

0Like

ありがとうございます、確認しました。

私が見る限りですが、回答させていただきます。
センサについて
・LIS2DW12は使用したことがありません。申し訳ない。
負荷について
・おそらくArduino/Serial(USB)/PC共に問題ないと思います。
 ご参考までに、私の環境を書き留めておきます。
 [ArduinoMega/Sloeber] 115200bpsでintデータを読み込んでも問題無し。
コードについて
・あまり理解できませんでした、申し訳ない。
USB接点について
・Arduinoを振動させたことがないので、わかりません。
 ケーブルの劣化等なければ問題ないと思いますが、可能であれば「他のケーブルを使用」「振動させた状態でテストデータの送受信」等を試したほうがいいかもしれません。
Delayについて
・私の環境ではms単位では動作ができないので、DelayMicrosecondを使っています。私はDCMとSTPMとサーボと7SEGLEDの同時動作がうまく行かないときに、一周の動作に何秒かかっているのかをチェックすると原因がわかりました。

Loop内
static unsigned long time;
Serial.println(micros()-time);
time=micros();
※micros()は数時間でオーバーフローするため気をつけて

シリアル送信時の64Byteは聞いたことがありません。
緊急事態の方に本をおすすめするのもおかしい話ですが、私は困ったときには「Arduinoをはじめよう」を必ず読むようにしています。
最終手段は関数Libraryから標準関数のコードを引っ張り、自作することもあります。大変なのでおすすめはしません。

一つ気になった点は、Serial.begin()は定格にしていますか?
BPSに対してデータの読み取りがずれているのではないかと思いました。
Arduino 日本語リファレンス

CCF_000099.jpg

月曜日にArduinoに詳しい方とお会いするので、その方にも聞いてみます。

0Like

ご丁寧に有難うございます。現状をもう少しノートに書いてみました。

シリアルの速度設定はしております。serial.begin
ボーレートと、パリティ等の設定も、、
spiの速度も1MHzで足りるとは思うのですが、、

加速度センサからデータ貰うときにおかしくなるのでしょうか、、16ビット*3のままごそっと貰ってるだけなのですが、
IMG_20210404_222926.jpg

0Like

ノートありがとうございます、仕組みは大体理解できました。
専門の方にお聞きしましたが、「オシロでのテストやプログラムを見る限りコードは問題ないと思う。タイミングに関するアルゴリズムに問題がないのであれば、ハードの限界か不良しか考えられない。」とのことでした。
私はnanoを使ったことがないので、nanoが少し怪しいなと思いました。
無駄金になってしまうかもしれませんが、最終手段はハードの交換・新仕様などになるかと思います。
大変悔しいのですが、これ以上はわからないです。

0Like

Comments

  1. @dan1001

    Questioner

    親身にご回答有難うございました。
    色々探ってみた結果ですが、、VBAの方がバイナリモードではなく、アスキーモードだったため、改行か何かで、引っかかってたのかなと思います(汗)
    VBAとArduinoをアスキーで送信受信仕様にすると、問題なく受信出来ました。
    VBAの方は、バイナリ仕様でも、検証したのですが、どうしてもエラーが出て動作できませんでしたのでら予想でしかないですが。。
    お手数おかけして、申し訳ないです。
    お知り合いの方にも聞いて頂いて有難うございました。

Your answer might help someone💌