ページ

2022/01/16

Raspberry Piで作るアルコールチェッカー④

 アルコールチェッカー、というよりはアルコール成分の有無検出器といったレベルのものができたのだが、もう少し追求してみる。

MQ-3Bのデータシートを頑張って読み解いて、測定電圧をアルコール濃度に変換しなければならない。こちらは残念ながら、比較対象となる正確なアルコール気体がないので、ただ自分が満足するレベルを追い求める世界。一応、世の中にはエタノール蒸気の濃度が保障された気体が販売されているようだが、趣味で手が出る金額ではなかった。

ちなみに自分でアルコール濃度を出力するプログラムを作り、自身の酒酔いの呼気を吹きかけてみた数字から概算すると、60~70ppmとなる。酒気帯びのサイトを調べると、これはそもそも死んでいる値ではなかろうか?センサー(MQ-3)を使ってラズパイからアルコールを計測してみたのサイト上だと0.6ppmとなり、これはまあそんなかんじかなという値である。

しかし、上記サイトはMQ-3のモジュール化キットのデータシートであり、今回使っているMQ-3Bというセンサ単体と同じにしてよいのかという疑問があるし、元のセンサのデータシートがなぜこんば記載になっているのかという話もある。きちんと英語を読めばわかるかもしれない。

調査を進めるうち、分かったのは、ppmとmg/lの単位変換は、測定対象の分子(量)により異なるということ。さらに、測定時点の温度、湿度、気圧も変換式のパラメータに入ってくる。きちんと変換式を通してみたら、それらしき値になった。

ラズパイには気圧計をつけていないので、気圧は1013hPaで固定でよいとしても、温湿度は手元にセンサがあるので合体させてみようか。

もう一点気になるのが、アルコールなしの状態の電圧V0が安定しないことだ。長時間測定していると、数百秒単位でトレンドが変化していくので、どれがV0だかわからない。これも温湿度の影響か?


どちらのグラフも、線が突出しているのはアルコール呼気を吹きかけてみた瞬間。

MQ-3Bのデータシートをみると、このセンサは使っていなかった期間によって初期エージングの必要期間がだいぶ変わる。1週間単位でつけっぱなしにしたので、エージングとしては問題ないと思うが。。例えば朝方に急に電圧が下がっていたりして、なんとも気持ち悪い。正確なV0がわからないと、アルコール濃度の絶対値もわからない。短時間で使う相対値チェッカーとしては使えるのだけども。

というわけで、温湿度を合わせて取ることにした。もしかするとVrefの安定化も必要かも。V0が安定しない原因は調査中だが、ADコンバータのVrefもそもそもブレているかもしれないと思い、Vrefとしてラズパイ出力の3.3V系を採用してみたが、結果に変化はなかった。

【 中級コース : RaspberryPi を改造してみましょう。 】

このサイトによると、ラズパイの3.3V系はすでにスイッチングレギュレーターが入っている。ノイズは入るが、平均値は正確そうである。逆に、ラズパイの5V系はACアダプタの性能がそのままでそうな構成。

うーん、5V電源を1回昇圧して、シャントレギュレータで5Vに落としてやれば安定なVrefやV0が得られるんだろうか。アルコール検知器にそこまでやってもしょうがないか?将来的にラズピコで動かすときは、正確性より省電力が重要になるだろうしな。

と、ここで問題発生。DHT11の実行結果でたまに温度湿度が0になるときがある。

DHT側のモジュールの中身を少しいじってエラーコードを詳細に吐き出すと、ERR_MISSINGDATA とERR_CRCという種別のエラーコードがぱらぱらでていた。

エラーコードが2種類混じるということは話がややこしいが、SPI通信とGPIO操作を同時に行うことがよくないのだろうか?

コードをさらに追いかけてみたが、自分の技術力では残念ながらそれ以上の原因がわからない。ちなみに前に作成した元の温湿度計測プログラムも、ログをよくよく見ると、データが取れていない瞬間がポロポロあった。

これ以上追いかけるのはやめることにした。GPIOのデータ転送を深堀しないとダメそう。測定値がゼロになってしまう頻度は低いので、前値保持にしてしまえば、実用上はそこまで問題にはならなそうである。

アルコールチェッカーの作成はここでおしまい。(ひとまず)


Raspberry Piで作るアルコールチェッカー③

 前回に引き続き、VddとVrefに3.3Vを入力した構成であれば、ラズパイへのデジタル出力までできるようになった。アルコールセンサは最大5V出力なので、Vrefをどう5V化するかが課題。

もともと考えていた分圧を成功させたい。

まず、Vdd=Vref=3.3Vのままでch0に5Vの電圧をつっこむと、ADコンバータがどんどん熱くなっていった。原理は不明だがこれは危険。前回最後にラズパイが強制再起動したのもこれが原因だろう。

その後、無事分圧に成功。Vdd=Vref=5.0Vとしつつ、Doutは出力電圧を3.3Vに減じ、アナログ電圧5Vまでをデジタル信号へ返還することができた。やはり、コーディングと同じで、配線はいきなり全部を組むのではなく、小規模から実験的に進めることが大事だと感じた。

分圧案がうまくいかなかったのは、元の配線案はVddを分圧して入れていたが、本来Doを分圧すべきだったということ。配線誤りというか、設計誤り。

そして、アルコールセンサとラズパイの接続に成功!酒臭い息を吹きかけると検出電圧が上がった(笑)

最終的な配線図は以下のようなイメージである。





Raspberry Piで作るアルコールチェッカー②

実装編。 

秋葉原で不足パーツを買ってきて、まずははんだづけの練習。
そして本番。MQ-3Bセンサを変換基盤へはんだづけ。2ピン目からこつをつかんでうまくできた。

そしてMCP3208をアダプタを介してブレッドボードにさそうとしたが、なんとささらない。というか、刺さってもブレッドボードのバネの力で押し戻される。結局MCP3208をブレッドボードに直差しにすることにしたが、アダプタとの分離が非常につらかった。アダプタは、上のチップを頻繁に差し替える場合などに有効なのだろうが、ブレッドボードというよりはユニバーサル基板で使用するのかな。

こういうことは各サイトに書いていないので、失敗して覚えるしかないが、一方で買うまえにどう見分ければよいのやら。

今回は今までで一番手づまりが発生した。

まず、回路をくみ上げてみてから電源投入の前に+とーのラインの抵抗をはかると、40Ωと低い。どこかショートしているのか?と思って調べたが、結局のところアルコールセンサのヒータ抵抗が出ているだけだった。しかし、データシートの抵抗値よりはかなり高い理由が、よくわからなかった。

次に、抵抗2個を使って5Vを3.3Vと1.7Vに分圧したつもりだが、0.8Vと4V超に分圧されている。買った抵抗は間違っていないはずだが。。どこで誤差が生じているのか、これも謎。Doutから、GPIOの耐力以上の電圧が出てラズパイが壊れても怖いので、Vddには5Vではなく、3.3Vを入れるよう暫定的に変更。これにより、アルコールセンサの上限値までは測定できなくなる。

次に、サンプルプログラムで0出力されてしまう。アルコールセンサを完全分離し、MCP3208のch0に3.3Vを入れてみるが反応なし。ということは、まずいのはMCP3208の配線か、プログラムということになる。

→結局配線ミスだった。SPI通信で使用するCLKとMISOの接続が互い違いになっていた。プログラムのデバックは慣れているんだが、物理配線のデバッグに相当する作業はどうやれば効率よくできるんだろうか。

また、配線を入れ替えている最中にラズパイ強制再起動発生。そしてMCP3208の表面がかなり熱くなっていた。きっと、まずいところをショートしてしまって、発熱してしまったんだろう。危ない危ない。


Raspberry Piで作るアルコールチェッカー①

 少し寄り道して、アルコールセンサを使ってみようと思う。

秋月のページでアルコールセンサ単体MQ-3Bを衝動買いしたが、モジュール化されたものを使っている参考サイトセンサー(MQ-3)を使ってラズパイからアルコールを計測してみたとは違い単体のセンサである。よって、試行錯誤が予想される。

早速つまづく。MQ-3Bのピンはブレッドボードに刺さらなかった。

MQガスセンサ用ピッチ変換キットが必要だった。さらにいうとMQ-3Bのデータシートから、4.7kΩの抵抗も必要だった。買いなおし。。きちんとデータシートを読んだり、設計作業をしないで行き当たりばったりだとこうなってしまう。

センサで検知した値はアナログ電圧というかたちで出力されるので、それをラズパイに取り込むにはADコンバータが必要。ADコンバータは参考サイトにあるMCP3208のまま使えるか不明だが、このままいってみよう。

余談だが、秋月電子のサイトにMCP3208は2種類売っている。調べたところ、下記のような違いだった。これも間違えると実装できないので注意。

  • MCP3208-CI/P・・・PDIP(Plastic Dual In-line Package)。プラスチック筐体。ムカデのような形で、ブレッドボードやユニバーサル基板ではこちらを選択。
  • MCP3208T-BI/SL・・・SMT(Surface Mount Technology:表面実装)。

他にもデータシートを見ると、温湿度により出力電圧が変わったり、長期間通電していないと長時間のエージングが必要だったり、なかなか扱いが難しそう。まあ、ホビーユースだから絶対値はいいかげんでもいいか。

もっと予習を進めると、

  • ADコンバータMCP3208のDout出力(ラズパイに対してデジタル信号を出力する端子)はVdd入力(MCP3208を駆動する電源入力)と同じ電圧
  • ラズパイのGPIO入力端子は最大3.3Vまで対応
  • MCP3208は0V~Vref端子電圧までをはかれる(厳密には0Vではなさそうだが)
  • Vref電圧の精度がとても重要。Vref端子に与える電圧がブレると、測定結果もブレる
  • MQ-3Bは最大5V出力

ということがわかる。特に1番目と2番目と5番目をあわせると、そのままではうまくいかないように見える。つまり、MQ-3Bの5V出力アナログ電圧を測定するには、MCP3208のVrefを5Vにしなければいけない。そのためにはVddを5Vにしなければいけない。すると、Doutが5Vになってしまう。すると、ラズパイの入力制限電圧を超えてしまう。

もう少し調べると、分圧するという手法があるようだ。つまりMCP3208からのデジタル信号が5V出力であっても、ラズパイのGPIOに入れるときには3.3Vになるように分圧する。

参考にしたサイト
Raspberry PiでADコンバータ(MCP3208)を使う
ラズパイでアナログ電圧を扱う (3) 使用するパーツ
ラズパイでアナログ電圧を扱う (2) MCP3208②

これらのサイトを見ると、12ビットADコンバータの分解能を生かすにはVrefを安定化させる仕組みをきちんと作らないといけないことがわかるが、今回は気にしないこととする。

この文書も抵抗の具体値など参考になった。
A-Dコンバータとアナログ入力の インターフェース

次回、実装。


2022/01/15

Raspberry PiのSPI通信による7セグメントLED制御

 お次はこれ。

青色7セグメントLEDシリアルドライバモジュール 完成品
データシート

7セグLEDをシリアル通信(SPI通信)で点灯してみたい。

Raspberry Piで秋月の7セグLEDシリアルドライバを使用する

このページを参考にした。5V接続。

サンプルコードコピペしただけでいとも簡単に動いた。しかも表示がラッチされる(プログラムを終了しても点灯状態が維持される)。素晴らしい。そしてモジュールってすごい楽。しかし楽な反面、SPI通信の仕組みについてはあまり勉強にならなかった。

Raspberry Pi GPIOを使用したSPI通信(温度センサ)

SPI通信の標準モード接続はこれ。ここによると、ラズパイのピン数だと2スレーブまでしか制御できないことになる。しかし、デイジーチェーン接続を使うと、より多くのデバイスを接続できる。

SPIデバイスのデイジーチェーン接続

と思いきや、このデイジーチェーン接続は、ところてんの様に各スレーブ間でデータが押し出されていく形式。つまり、各スレーブを完全に独自に制御できるわけではないということ。各スレーブから順々にデータを取り出していくことや、順々にデータを渡していく方式に使えそう。それ以外の複数デバイス制御には、任意のアドレスを指定できるためSPI通信ではなくI2C通信のほうが適していそうだ。

ちなみにこれ、表示がラッチされるが、GPIO1ピン16mAの電流制限はよいのだろうか。データシート上は45mAとなっているが。。と、いうことは、ナマの7セグモジュールをつなげてはだめで、電流制限抵抗が必要だったかもしれない。あるいはGPIOとは別の5V電源を用意するか。ラズパイはUSBから電流を供給されているのだから、GPIOピンの制限によらない電流供給も可能なように見えるが。それが1番ピンのことなのだろうか?

Raspberry PiのGPIOピンの電気的仕様

ここによると、3.3Vと5Vのピンは大きな電流を供給可能なようだ。よかった。

Raspberry Piをリモートデスクトップ(VNC)で操作する

 VNCの導入。これまではPCとラズパイのディスプレイを共用していた。PCで参照サイトをみて、ディスプレイの入出力を切り替えてラズパイ上でコーディング。これは非常に効率が悪い。一方でラズパイ上でブラウザを開くと、とても重い。。

というわけでリモートデスクトップ機能を導入した。

VNCでRaspberry Piにリモートデスクトップ接続 (Windows/Mac/Linux対応)

何も詰まらずすんなり成功。これでPC上からラズパイの画面を見られるので、効率が格段に上がった。もっと早くやればよかった。

Raspberry PiでSDカード・NASへのファイル入出力のテスト

 次はラズパイでファイル入出力に挑戦。SDカード内へのファイル入出力。

これは多少試行錯誤があったが成功。途中で、Thonnyにスペースとタブの使い方が悪い的な怒られ方をしたが、結局原因わからず迂回。Pythonはインデントで文章構造を理解しているようだが、これが裏目に出てしまうことがあるようだ。スペースもタブも改行も確認したが。。

次はLAN上にあるネットワークHDDへのアクセス。

PythonでWindows共有フォルダへアクセスを参考にした。

pipコマンドとaptコマンドの違いがようわからないが、言われた通りpipを実行。pysmbをインストールして最小構成コードを実行したが、動かない。import文のsmb.smbconnetionのsmbというモジュールが存在しないと怒られる。どのサイトを見ても最小構成コードは同じで、悩ましい。

pipではなく、ラズビアンのほうにsambaをインストールしてみたが、結果は同じ。このエラーの解消には結構労力をかけた。

Pip listコマンドをみてみると、smbパッケージが表示されない。もう1回pysmbインストールを行ってみると、python2のフォルダっぽいパスが表示される。これまで見たサイトで、python3とpython2の互換性がなさそうな表現があったので、確認すると、ラズパイにはpython2と3が両方入っていた。

Python3とPython2共存環境で3にpipでパッケージインストールする方法

このサイトに従い、python3のほうにpysmbパッケージをインストールしてみると・・・最小構成でエラーは出なくなった!pythonのどのバージョンを使っているのか、意識することを学んだ。Pip listコマンドでは相変わらずsmbが表示されないが。。

で、次。
「Unable to connect to shared device」の表示。ここからはsambaプロトコルとの闘いか?→大きな苦労をせずにネットワークHDDにテキストファイルを保存できた!これで、途中で電源が切れてもファイルは残せる。(OSはクラッシュするかもしれないが。。)

ラズパイとラズピコで分電盤センサを作成(14)

回路の実装図作成に取り掛かろうと思ったが、ここで一つ寄り道。 ADCへの入力前に交流電圧に対して直流バイアスをかける手段として、オペアンプを使う方法が出てきた。 アナデジ太郎の回路設計 というか、バイアスをかけたい場合、この方法の方がメジャー・・? と思ったのだが、オペアンプは以...