@dan1001

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Arduino シリアル通信

初めまして、自宅でArduinoを使って電子工作しているものです。

今、加速度センサ(SPI通信)より得たデータをPCにシリアル通信をしているのですが、

上手くいきません。。どなたかアドバイスお願いできますでしょうか。

(送信環境)
ボーレート:115200bps
加速度センサー1600Hz:16bitデータ32個 通信周期40msecAr⇒PC)
64byte当たりの通信周期4msec(オシロ単体接続時)

(受信環境)
115200bps
VBA

シリアル形式として、文字列⇒charではなく、 2バイトをバイナリ形式でそのまま送ってます。。
(加速度センサから得た16bitをそのまま送ってます)

しかし、VBAで受けている値が少しおかしいです。

10000
10001
10001
10002
9999
9998



50004
50003

など表示されます。
オシロに確認している限りは、値は正しく出るはずなのですが・・・

0 likes

1Answer

こんにちは。
SPIのセンサをシリアルで通信するためにArduinoで中継する構成なのかなと読み取れます。

Arduino側とVBA側での変数の型はそろえてますか?
デバッグのために一旦センサーを外してArduinoからmillis()の値をPCに送信してみてはどうでしょうか。

Arduinoの種類やセンサの型式、ソースコードのヒントもないのでなぞなぞを解いているようです(笑)

0Like

Comments

  1. @dan1001

    Questioner

    お返事頂き、有難うございます。

    言葉足らずで申し訳ございません。
    Arduinoは、MKR wifi 1010
    センサは、LIS2DW12です。

    まず加速度センサーのデータをint16 変数Aで受け取り、
    その16bitを変数B,Cに振り分けてます。
    送信順が合うように、片方を2分割(ビットシフト)して、二つの変数で送信しています。(変数は全て16bitですが、下位の8bitが送信されるとおもってます。。)

    試しに、forループ(0 = i , to 30 , i++)
    変数A = 3000 - i として仮値を与えて、出力をした際には、VBA側できちんと受信が出来ました。VBA側も、2分割したものを合わせる処理をしているので間違ってはいないと思います。。VBAも、3000~2970までの値を受け取りました。


    MicroSecondsを用いて、Arduinoのシリアルモニタを見たら、送信間隔は、6msec程でした。シリアルモニタの値が正しいのか不安だったので、
    シリアル送信コマンドの後に、Arduinoの空いている出力ポートにフラグパルスを打ち、それをオシロスコープで見ていると、3.8msec程でした。
    (この時は、PCとの通信していません。)

    PCと実際に通信を行った際には、この3.8msecの速度は、出ないということでしょうか。。
    ちなみに、2分割データ×加速度32個送っているので、64byte送ってます。



  2. こんにちは。
    私もわかる範囲でしかアドバイスできないのでアレなんですが・・・。

    SPI通信がうまくいってることは確認できてますか?
    データシート見ると
      WHO_AM_I (0Fh)
    があるので、これで44hが返ってくるかどうかで疎通の確認は取れると思います。

    試してるかもしれませんが、情報量を減らしてZ軸の上位ビットだけとか温度だけとかのシンプルな通信にして原因分析できるかと思います。

    あとはソースコードと配線を見ないとなんともというところですかね。
  3. @dan1001

    Questioner

    有難うございます。
    spiは稼働しておりました。
    問題は、arduino内で変数AからBに移すときに
    B = int16_t A
    のint16型宣言なしで、書いてしまってました。
    あとはPCとシリアル通信しながらオシロで確認すると送信周期が20ms±2msの誤差が出てしまってデータの抜けや重複があるようです。。
    抜けなく取得するには、cpuの性能を上げたほうが良いのでしょうか。。
    mills関数で割りこめばより正確でしょうか、、
    もしお分かりでしたらご教授下さい。
  4. こんにちは。

    データの抜けって言ってるのはPC側のバッファが足りなくなってるんじゃないでしょうか?
    加速度センサとのことなので、エクセルでデータロガーにする用途かと想像しますが、VBAは一般的にほかの言語に比べて動作速度は遅いのでバッファが不足してデータの回収が間に合わずに消えているのかと想像します。

    またもし設定してなかったらですが、エクセルの画面更新をしない
    Application.ScreenUpdating = False
    に設定すると改善するかもしれません。
    データ取得の回数や時間が決まってないならポップアップで切り替えるなどできると思います。

    真っ当にやるなら、受信した数値をアスキー化してCSV形式で保存するプログラムをVBA以外で作って、そのファイルをエクセルで読み込ませるのが間違いないように思います。
  5. @dan1001

    Questioner

    有難うございます。

    色々原因探った結果、シリアル通信が非同期だったので、受信のタイミングで、取得情報がずれていたみたいです。

    同期させて試したいと思います!
    MergeCellsさんのお陰で前に進みました!

Your answer might help someone💌