未来を創る、テックコミュニティー

RaspberryPiでアルコール検知器を作ってみた

シンラボ編集部
2020/09/10

ラボ活ブログ初投稿になります!
シンラボ管理人の宮澤と申します。

みなさんは、電子工作をしたことはありますか?
この記事は、ラズパイ初心者である管理人が、アルコール検知器を作ってみた話です。

ちなみに、Arduinoというマイコンボードを使えばもう少し安価に作ることができますが、
なぜラズパイにしたのかと言うと、他でもいろいろ使えそうだったのと、ネーミングがかわいかったからです笑

それでは、さっそく作っていきましょう。

1. 準備

用意したものは、下記です。
・RaspberryPi3(Raspbian OS インストール済)
・GrovePi+(http://wiki.seeedstudio.com/GrovePi_Plus/
・Groveアルコールセンサー(http://wiki.seeedstudio.com/Grove-Alcohol_Sensor/
・スピーカー(100均で入手)

GrovePi+とは何か?を簡単にご説明しますと、

・seeed studio社製の基板部品で、ラズパイの上に重ねて接続して使用します。
・いろいろなセンサーをコネクタに接続することができるので、半田付け不要(ありがたい!)
・今回のアルコールセンサーはアナログのデータが出力されるので、GrovePi+の中にデジタル変換する機能がついていて、ここでデータを変換することでラズパイで使えるようになります。

全て接続してみた図が、サムネイルの画像になります。

・GrovePi+基板をラズパイのGPIOコネクタピンに接続
・アルコールセンサーをGrove Pi+の「A0」端子(アナログデータ入力)に接続
・スピーカーをラズパイのイヤホンジャックに接続
・電源コードをラズパイのmicroUSB端子に接続

このほか、開発をするときは、ラズパイのHDMI端子にディスプレイ、USB端子にマウス、さらにBluetooth経由でキーボードをつないで作業しました。もはや小さいパソコンですね!笑

2. ドライバパッケージのインストール

接続したら、ラズパイにGrovePi+のパッケージをインストールします。
最初はこちらのページを参考にさせていただきました。
http://kmth23.hatenablog.com/entry/2016/05/03/005833

僕が引っかかったところは、install.shを実行したとき、最後のほうでエラーログが出てしまい、インストールが失敗したかのように見えていました。しかし、その後の手順に従い、再起動してからi2cdetectを実行したところ、正常な応答が返ってきたので、どうやらインストールは成功していたようです。ドライバ開発をしている友人に聞いたところ、こういう結果オーライなことはよくあるそうです笑

3. GrovePi+のファームウェアのアップデート

Grove+のパッケージをインストールすると、GrovePi/Software/Python/フォルダの中に、各種センサー向けのサンプルプログラムが入っています。アルコールセンサー向けのプログラムは残念ながら入っていなかったため、他のセンサーのプログラムを流用しました。

プログラムの中身は、センサーのアナログデータを取得するanalogReadという関数を一定の周期で繰り返し実行しているだけだったので、そのまま使っても何かセンサーからデータが取れるだろうと考えて、pythonで実行してみました。

ところが、
TypeError: ‘int’ object is not subscriptable
というエラーが出てしまいました!

調べてみたところ、同じような症状の方がいました。
https://qiita.com/a-r-i/items/080875d13d92d4fc2a9a

どうやら、GrovePiに書き込まれているファームウェアのバージョンが古いと、analogReadの関数が動かないようです。
そこで、上記リンクの手順に従い、ファームウェアのアップデートを試みたのですが、全く症状が変わりませんでした・・・

そこでさらに調べたところ、下記のような情報がありました。
https://qiita.com/PINTO/items/15361ccad06af68413c8

現在のラズパイのバージョンでは、ファームウェアのアップデートのコマンドは正常に通らず、別の方法で強引に書き換える必要があるとのこと。

上記の手順にしたがってファイルを編集するために、ルート権限を切り替える必要があったりとか、いろいろなところでLinux系のOSの知識が必要になってきます。

ラズパイのコンセプトは手軽さがウリなのに、こういう導入編のところでつまづく状態になっているのが、もったいないなと感じました。

いろいろ苦戦した結果、一定の周期で数字がコマンドプロンプトに表示されるようになったのでファームウェアのアップデートはできました!

ここで余談ですが、意外と大事なのが、ファームウェアをアップデートしたら、必ずラズパイの電源を一度落として、再度起動する必要があるということです。普段Windowsでドライバのアップデートをする時は、メッセージで促されて再起動するのであまり意識しませんが、ラズパイではメッセージが出ないので、これが盲点だったりします。

僕の場合は再起動せずにリトライしていたので、結局うまくいかないまま諦めて寝落ちして、朝起きて起動したらデータが取れるようになっていて気づきました笑

4. アルコールセンサーのデータ取得

いろいろありましたが、これで一定周期で謎の数値がセンサーから取得できる状態になりました。そこで、実はすでにきちんと動いているのではないか?と思って、ビールを飲んで息を吹きかけてみました。

ところが、数字は全く変化しませんでした。ビールじゃアルコールが弱いのか?と思って、梅酒ロックでも試しましたが、全く意味ありませんでした笑

さすがに他のセンサー向けのファイルを流用したので、そのまま動くほど甘くなかったです。。

アルコールセンサーの仕様を調べ始めました。
http://wiki.seeedstudio.com/Grove-Alcohol_Sensor/
このページをパッと見たところ、気になるところが2つ。

①センサーがベストコンディションを発揮するには、48時間の予熱時間が必要
②「Platform Supported」のところで、Arduinoしかサポートされていない

 ・・・マジで?せっかくここまで準備したのに。。

やる気が砕けそうになるところを踏ん張って、もう少し詳しく読みました。

①については、そもそも、センサーは絶対値ではなく相対値とのこと。つまり、判定条件をアルコール濃度の絶対値を閾値にするのではなく、値の変化量に閾値を設けて判定できれば、予熱が不十分でもアルコールを検出できるのではないかと考えました。

②については、サポートされていないというのは、センサーの初期設定のサンプルコードが提供されていないという意味だと予想し、arduino向けのサンプルコード(java)を参考にPythonで実装することにしました。(ちなみにPythonは初心者なので、その場で文法を勉強しました苦笑)

ここで補足しますと、センサーを動かすためには、電源を入れた後に初期設定をする必要があり、その設定方法はセンサーごとに異なり、センサーのデータシートに記載されています。

今回の場合は、センサーのheaterSelPinというピンに関して、モードを「出力」にし、値を「Low」に設定することで、センサーの予熱が開始され、動くようになります。

そして、他のセンサーのサンプルコードを参考にPythonでセンサーの初期設定を実装し、1秒おきにanalogRead関数を実行するようにしてみたところ・・・

息を吹きかけるのに応じて値が変化するようになりましたー!!

ここまでくればあとは閾値の調整です。

暫定で、3段階の閾値を設定して、None、Low、Middle、Highの4つのパターンで酔い具合を検知できるようにしてみました。

5. 音を鳴らす

せっかくなので、検知したことを音を鳴らしてお知らせするようにしたい!ということで、下記ページを参考に、ラズパイに音を鳴らすライブラリと処理を追加しました。
https://qiita.com/Nyanpy/items/cb4ea8dc4dc01fe56918#1pygame

Low、Middle、Highの3パターンで好きなmp3音源を指定できるようにしました。
フリー音源でアニメ声のセリフなどを使ってみると、人工知能が載っているみたいな雰囲気が出てきたり、楽しくなってきます

6. ワイヤレス化

最後に、デモ向けに、PCから遠隔操作できるようにします。
下記ページを参考にして、ラズパイに起動時に自動でVNCサーバが起動するようにしました。
http://yamaryu0508.hatenablog.com/entry/2014/08/16/202441

これにより、いちいちディスプレイ、キーボード、マウスをラズパイに繋いでデスクトップPC状態にしなくても、ノートPCから無線LAN経由でリモート接続し、ラズパイの画面を表示して操作することができます。

…最初からこの環境で開発すればよかったですね笑

—————-

以上で完成です。開発期間はトータルで3日ほどかかりました。

感想としては、
わかりやすい説明書がないので、ネット上の先人の知恵がとてもありがたいです。
また、センサーを使いこなすには、データシートを読める予備知識がないと、きついところもあると感じました。

しかし、やっぱり自分が作ったものが実際に動いた時の感動はひとしおです♪
自分のスキルがレベルアップして自信がつくと、他にも手を出したくなりますね!
また機会があれば何か作りたいと思います。

最後に、飲み過ぎには注意です^ ^

参考文献
http://wiki.seeedstudio.com/GrovePi_Plus/
http://wiki.seeedstudio.com/Grove-Alcohol_Sensor/
http://kmth23.hatenablog.com/entry/2016/05/03/005833
https://qiita.com/a-r-i/items/080875d13d92d4fc2a9a
https://qiita.com/PINTO/items/15361ccad06af68413c8
http://wiki.seeedstudio.com/Grove-Alcohol_Sensor/
https://qiita.com/Nyanpy/items/cb4ea8dc4dc01fe56918#1pygame
http://yamaryu0508.hatenablog.com/entry/2014/08/16/202441

この記事を書いた人
シンラボ編集部
エディター