シルミノのしるし

シルミノが好きなもの・気になったことに関してノンジャンルで書いていくブログ。

Raspberry Pi 3 B+ をやっていくお話 3回目:温湿度センサからI2C通信で得たデータをCSVログとして書き出し

タイトルなげえな。

あ、シルミノです。

 

前の記事はこちら→https://blog.hatena.ne.jp/silumino/silumino.hatenablog.jp/edit?entry=26006613470659366 

 

出力が終わったら次は入力でA/D変換を学ぶのが筋だと思いますが、

あいにくPICとArduino経験者なので、どうなるかは予想がついているわけです。

だからI2C通信を選びました。

(これは半分嘘で、A/D変換で温湿度を返すセンサはなさそうだった)

 

んで、マイコンからだと保存先を用意(物理)するのが面倒なのであまりやらない、

CSVへのログ出力にもトライしました。

(用意カッコ物理の意味が分からない人へ:マイコンにはストレージが無いからSDカードとか用意して配線するんやで。そのための通信にはI2Cじゃない別の通信方法を使って以下略)

 

できた結果はこちらです。

コメント返しは動画じゃなくてこのブログの文末で!

 

以下、詳細です

(プログラム全文はQiitaにて。

 https://qiita.com/silumino/items/5a3c2c008e09664eb4f5 )

 

回路

・温湿度センサ

AM2320という温湿度センサを使いました。秋月で売っている中では一番精度がいいと思います(あと安い)

 

 AM2320仕様

http://akizukidenshi.com/catalog/g/gM-08663/

 

・ほか

メス-オス ジャンパ線があればいいんじゃないかな。

 

プログラム

・I2C

クロックの線とシリアル信号の線の2本+電源2本の計4本の線でできるお手軽通信。

通信をさわるのはArduinoでやったUART以来です。

SPIってのもあるよ。

今回のプログラムで何をやったかは説明できるけど、I2Cの関数とか全部言えっていわれるとつらいので参考サイトをば。

1件目は本家の説明書だから確実。(英語混じり)

 

参考サイト

https://raspberry-projects.com/pi/programming-in-python/i2c-programming-in-python/using-the-i2c-interface-2

https://aquarius-train.hatenablog.com/entry/Raspberry_Pi_3B%2B_のGPIOピン割り当ての解説

https://qiita.com/twinoze/items/c960eea23c57e342ea4b

http://nuneno.cocolog-nifty.com/blog/2018/08/am2320-77cb.html

https://qiita.com/tomkimra/items/914d5a5632223fb9a248

 

・割り込み(signal, threading)

いや割り込みじゃないだろ、OSのクロックと並列処理だろという方はマイコンでプログラムをしたことがないかもしれません。

これは割り込みです

何秒おきに、別のメモリを使って計算をさせるという処理に使ったので、割り込み(Interrupt)です。

調べた感じ、signalで時間を呼び出すのが正確っぽい(sleep+同名thread立ち上げ、while+sleepよりも)らしいので。

同名threadはクソだと思いますが、並列処理させたほうがメインループを守れることに気づかせてくれたのでよしとします。

まあ今回は守るメインループなんかなかったけどな!

 

参考サイト

https://qiita.com/miminashi/items/50a4f0906ab8f18b105d

https://news.mynavi.jp/article/python-32/

 

CSV

CSVをご存じない?文系ですか?

皆さん大好きCSVです。ちなみに私の環境ではデスクトップPCにエクセルが入っていないので無事死亡します。

ラズパイ内蔵のLibreOfficeに感謝です。

writeの引数にwと書くと上書きでaと書くと追記、rと書くと読取専用?っていうやつ、ソースどこやねん。本家のCSVの説明見てもわからないからファイル操作らへんに隠れてるんだろうけど…→「io」内の生ファイルioにありました。

 

参考サイト

https://qiita.com/tkyko13/items/9c0eb46c1b65129d2556

https://blog.codecamp.jp/python-file-data

 

悩んだこと

大事だと思うので書き残します。

 

read_i2c_block_data アドレスとコマンドしか引数にとれんが、なんでデータ数書いてるの(参考サイトのプログラムを見て)

→未解決w! バージョン違いかミスか…

 

・SDA, SCL 3-10kΩプルアップ抵抗  ラズパイどうなん

→gpio2,3と共通だから1.8kΩプルアップされてる

→i2c-0も1.6kΩプルアップ(カメラ専用?)

 AM2320データシートは3~10kΩがオススメって言ってるけど、そのへんどうなんですかね。センサを5Vで使うのなんとなく怖くなって3.3V運用にしたのはこのせいです。

 

・スレーブ信号 アドレス0x5cじゃねえよ0xB8なんだよ(データシート読んだ)1bitズレじゃい

pythonがI2C内で1bitアドレスを左にビットシフトしやがっているだと…

 ビットシフトの前なのか後なのか、それを明記しなかったAM2320が悪いと思います。(さすがにI2Cの処理手続きを知らないはずがないので)

 

・スレーブ信号0x5cを送ってもエラーが出る/ コンソールからi2c_detectできない(2回に1回出る)

→センサがスリープから復帰するのに0x5cが1回必要(なお返事無し)、もう一回0x5cを送ると返事する

 https://qiita.com/twinoze/items/c960eea23c57e342ea4b にて悩まれていた現象。

 一度スリープから復帰すると3秒ぐらいは起きていて、また寝るらしいです。

 そういう生活してえな。

 一回目は返事無しなので、try/exceptで例外処理しないとエラーになりました。

 なんでURL先の人はエラーになってないの。

 

 

 動画のコメント返し

そういえば次の動画を作るか見通しがない状態ではコメント返しができないことにさっき気づきました。

ではやっていきましょう。

 

LinuxのIndustrial I/O使えない?BME280ではできたけど

I2C通信にコメント。

BME280は別の温湿度センサ。 https://www.switch-science.com/catalog/2236/

Industrial I/O (=IIO)を調べましたが、どうも電気的にやっていることはI2CかSPI通信です。

たぶんそういう名前のライブラリ?クラス?ということですね。

(情報系の単語の使い方がとても怪しいので勘弁をば。)

I2CとかSPIとかは、電子系で言う場合の通信規格です。

 

ラズパイを部屋で腐らせてるんでこうすればこういうことが出来るよーって動画が見たい

確かにラズパイならではの活用法とか気になる

見せとるじゃろがい!

Arduino単品、マイコン単品ではできないと思ってたんですが違います?

ラズパイ単品で「I/Oピンがあること」「ストレージがあること」「画面出力が簡単なこと」「マウスとキーボードが利用できること」「無線接続できること」がラズパイならではです。

そういう意味では、

・i2c+pythonだと割と楽ちんだね

というコメントを書いた方は、界隈に詳しい方だと思います。「割と」がリアル。

ちなみに今回の動画のプログラムは、センサの値を「I/Oピンの機能の一種のI2C」で読み取り、CSVを「ストレージに保存」して、「無線LAN」経由でリモートコントロールをしてWindowsPCに「画面を出力」、WindowsPCの「マウス・キーボード操作で」CSVのグラフを作りました。完璧じゃん。※画面出力結果をWindowsPCで録画。

高度な計算だけならPCでいいんですが、PCにはI/OピンがないのでUSBでArduinoに接続するとかしないといけません。

ほかにも例がほしい!ということであればいろいろ言えそうです。

 

 

matplotlibでグラフ画像も自動生成してみても良いかもね

動画内でも言いましたが、疲れたというのと、「リアルタイム表示orログ」の狭間で戦った結果、ログのほうが保存できて便利だという結論になったのでこうなりました。

andでやる時間はなかったです。1/5(日曜)23時投稿ってので察して。

 

・threadingを使うとどういうメリットがあるん?単純な一つのwhile文内で全部処理するより良いところがあるん?

今回のプログラムでは意味がありません。

が、効果を発揮するのはメインループに何か処理をもっと書いている場合です。

時間にシビアな処理が行われていたりすると、threadingなしだとCSV書き出し処理中のラグで正常動作しなくなる場合があります。

で、7セグLEDのダイナミック点灯やPWMを使うモーターなんかは時間にシビアになる可能性がありました。

(※PWM:例えば19msオフ・1msオンの信号をひたすら出すようなやつ)

threadingだとメインの処理に関係なく動きます。

CSVのサイズが大きくなったら開くのに時間かかるでしょ?でもメインは動きます。

 

・アナログ使う場合はraspiよりbeaglebone black/greenのほうがDACとかPWMとかついてて個人的には好き

私はPICから始まりArduinoを経由してラズパイなので、beagleboneは知りませんが、DACとかPWMだったらPICでできますね。面倒だけど。

てかDACって音声にしか使わなくない…?ラズパイ、イヤホン端子あるけど。。

PWM、一応ラズパイもできるらしいですが動作が怪しいと評判ですね。

https://nw-electric.way-nifty.com/blog/2018/11/rpigpio-pigpio-.html

LEDとかモータなんかはどうでもいいですがサーボモータに使いにくいのは致命的です。URL先で紹介しているライブラリはいいかもしれないですね。

 

ほか、うぽつ等もありがとうございます!

そういえばアンケート。間違ってTwitterで「1日間だけ」アンケりましたが。

汎用?!意外です。

じゃあスタンドアロン機能なしでいいですか…?まあ普通に市販の温湿度計買えばいいか…。

ピンソケットだけ生やして、ボードは各自、みたいになりそうです。

※アイディアとしては、PICでも動かせるようにしておいて、電源ピンにスイッチかませれば切り替えられるかと思っていた。怪しいのはPICの各ピンを絶縁しなくてもいいのかどうか。

 

 

はい、以上です。

今後も適宜更新していきます。

ではでは。