あさがおIoT観察日記⑬:ArduinoからRaspberryPiにデータを渡す④【大人の自由研究】

Arduino
この記事は約3分で読めます。


前回まで/次回以降の取り組みはこちらから。

今日やっと、すべてのセンサのデータをRaspberry Piに渡せるようになりました。

今回の完成図

こんな感じ。

気温・湿度・大気圧・照度・土の水分量・給水タンクの水検知を表示してます。

左半分にはタイムラプス撮影した最新の写真を表示しとこうかと思ってます。

Arduinoスケッチ

すべてのセンサデータを連続で送っていると「どれがどのセンサの値か」が分からなくなります。

今回は、Raspberry PiからArduinoに「d」という1文字を送り、Arduinoは「d」を受け取ったら各センサの値を順番に1回ずつ送信する仕様にしました。

ちなみにdetaの「d」です。

pythonプログラム

つまづきポイント

またしょーもないところでハマったので、記録して晒しておきます。

※起こったこと・解決策・自分の理解したことを書いています。間違ってるかもしれません。
 悲惨な間違いなどあれば教えていただけると大変助かります。
 私pythonやオブジェクト指向プログラミングについてはまだまだ勉強中なので…。

で、今回ハマったのはシリアル通信。
当初、シリアル通信を担当する「Serial_com」クラスの__init__プロシージャでシリアル通信を始めるserial.Serial()命令を書いていました。

ところが、待てど暮らせどデータが送られてこない、それどころかフリーズして時計が止まる。
という症状が出てきて悩まされました。

問題を切り分けていくと、2つのことが分かりました。

  1. 通信開始→データ読み取りを2秒以上待てばフリーズしない
  2. millis命令の値が変わっていない

結論、

  • シリアル通信開始命令のたびにArduinoがリセットされている

みたいです。

まず、シリアル通信を始めてからデータのやり取りをするまでに時間を置けばフリーズしないことが分かりました。1秒だとフリーズ、2秒以上ならデータが送られてきます。

次に、センサデータの代わりにArduinoのmillis()命令(スケッチが走り始めてからの時間を取得する命令)のデータを送ってみたところ、通信開始後2秒待つ状態で常にほとんど同じ値(1318~1319)が返ってきました。

どうやら、ArduinoとRaspberry Piがシリアル通信を始めるときに、Arduino側は毎回リセットがかかっているようです。
そのリセットにかかる時間はおそらく700ms程度、リセットしきらないうちに通信をしようとするとフリーズ、という具合です。

でも、センサの値を取得するためにArduinoに「d」という文字を送り、センサの値を受け取る、sensor_refreshという関数の中でSerialComクラスをインスタンス化している(≒シリアル通信を始める命令がある)以上どうしようもない…。
つまり、sensor_refreshという関数を呼び出すたびにArduinoはリセットされてしまう…。
一度始めたシリアル通信を止めない方法はないものか…。

…と悩むこと数時間(マジで数時間悩みました)、

メイン部分でインスタンス化したら、呼び出した関数でもそのまま使える

…っぽいことが分かりました。
というか、ダメもとでやってみたらエラーなく動いたっていうのが正確な所です。

…実は正直まだインスタンス化とか、クラスとか、オブジェクト指向とか、いまいちよくわかっていません。

まだまだ勉強ですね。

 


 

まだまだ続きます。

コメント

タイトルとURLをコピーしました