はじめての電子工作超入門

第2回 ラズパイでAIカメラを自作しよう!ボタンとウェブサーバー機能を付けて、カメラ、マイクを操作

こんにちは、ヨシケンです!
小型LinuxコンピュータRaspberry Pi(以下ラズパイ)を使って、おしゃべり機能やAIが使えるスマート・デバイスを作っていく記事の第二回です。
前回はラズパイに、目となるカメラ、耳になるマイク、口になるスピーカーを追加しました。もしこれらの設定が済んでいない方は、前回の記事を参照して、準備しておいて下さいね。

ボタン追加やウェブサーバー化して、デバイスを操作する

デバイスをスマートにするまで、今回もあと少し準備を進めます。
まずラズパイに物理的なボタンを付けて、それを押すことにより、カメラやマイクを使えるようにします。
またラズパイをウェブサーバーにして、撮った写真などを確認したり、簡単な操作ができるようにもして行きます。

ラズパイに物理的なボタンを付けて、カメラやマイクを使えるようにします

今回の記事で必要なもの一覧

Raspberry Pi 3 Model B

小型USBマイク

小型スピーカー

パイ・カメラ

LED付きタクト・スイッチ(例えばこのような赤や緑に光るスイッチです)
LED付きタクト・スイッチ
ブレッドボード、抵抗、ケーブルなど(必要に応じて)

今回の記事の流れ

1.ラズパイにボタンを追加する
2.ラズパイをウェブサーバー化する
3.ボタン、ウェブサーバーを自動起動して使う
4.まとめ

1.ラズパイにボタンを追加する

前回まではコマンドラインだけの操作でしたが、物理的なボタンを付けて、カメラなどを使えるようにしていきます。

ボタン(タクト・スイッチ)をつなぐ

ボタンとして、押している間だけ通電するタクト・スイッチを使っていきます。今回は、ボタンの中に予めLEDが入っているものなので、ボタン自身が光ってステータスなどの確認ができるので便利です。実際のLED付きスイッチの端子は、このようになっています。
タクト・スイッチ
このスイッチの接続は図のように、LEDのアソード側(細い長い端子)をGPIOの16番につなぎ、短い方をGNDにつなぎます。またスイッチ側(2本端子が2組ある方)の片側をGPIO20と3.3V、反対側をGNDにつなぎます。適宜抵抗をはさんで下さい。
スイッチの接続
実際ブレッドボードを使ってつないだ写真はこちらです。(黒いコードがGND、黄色がLEDでGPIO16に、青がスイッチでGPIO20につながっています。)

実際ブレッドボードを使ってつないだ写真

ボタンのプッシュ回数を検知する

ボタンの操作としては、ワンプッシュ、ダブルプッシュ、長押し、の三種類のアクションに対応できるようにします。
ボタンのプッシュに応じたPythonプログラムを書いていきます。ボタンを押した回数により、その数が表示され、1.5秒以上押すと長押しとして0を表示させるようにします。サンプル・スクリプトbutton_led.pyはこのようになります。

[button_led.py]

さあ、このプログラムを流してみましょう。

ボタンを一回押したり、長押ししたりする事で、LEDが光ったり、コマンドラインに押した数が表示されたでしょうか?

ボタン・プッシュに応じて、動きを変える

では更に、ボタンのプッシュに応じてカメラ、マイクなどを動作させます。
ここでは、ワンプッシュで写真を撮影する事にします。またボタン長押しで、録音を開始(5秒間)するようにします。LEDは押された数だけ点滅し、録音中は点灯するようにします。
さきほどのプログラムにカメラ、マイクなどの呼び出し(前回の記事を参照)を追加し、button_action.pyとしています。

[button_action.py]

さあこれで、ボタンを一回押して、LEDが赤く光り、写真が1枚撮影できたでしょうか?ここでは撮った時間を写真のファイル名にしています。
また1.5秒以上長押しすると、LEDが点滅し、5秒間録音をします。
作られたファイルをダウンロードし、確認してみて下さい。

2.ラズパイをウェブサーバー化する

ボタンにより画像撮影、録音などを操作できるようになりましたが、毎回結果をダウンロードして確認するのは手間がかかります。
ラズパイをWifiにつないで、ウェブサーバーにする事で、簡単にラズパイのファイルにブラウザ経由でアクセスできるようになりますので、この機会に設定しておきましょう。

ウェブサーバーのCGIスクリプト

ラズパイのWifiへの接続方法などは、こちらの最初のセットアップの記事などにまとまっていますので、参照しながらWifiにつながるようにして下さい。
ラズパイをウェブサーバーにするのですが、apacheなど本格的なサーバーを使う方法もありますが、ここではラズパイ内のデータの確認、簡単なコマンド操作だけなので、cgi(common gateway interface、ウェブ上でのプログラム)を動かせるスクリプトを作ります。

[web_server.py]

ウェブサーバーの起動

今回のディレクトリ構成としては、サーバー(web_server.py)は/home/pi/webというディレクトリに配置します。またこの下にimageというフォルダを作り、写真ファイルはそちらに保存するようにします。
また今後このサーバー下で動く実行プログラムなどは、cgi-binというフォルダに入れるようにします。

[ラズパイ上のウェブサーバーのディレクトリ構成]

さきほどのweb_server.pyを流す事により、ウェブサーバーを立ち上げます。&を付けることによりバックグラウンド処理になります。
[cgiserver.py]

これで、同じWifi環境下にあるパソコンのブラウザから http://localhost:8000/ にアクセスしてみましょう。ウェブのホーム以下(ここでは/home/pi/web/)にあるフォルダやファイルが見られると思います。
また先ほど撮った写真が保存されたimageフォルダに行ってみましょう。日付の入ったjpgファイルがあったら、ブラウザで選んで開いてみて下さい。ちゃんと写真が見られたでしょうか?

日付の入ったjpgファイル

3.ボタン、ウェブサーバーを自動起動して、カメラ、マイクをまとめて使う

それでは最後に、ボタン機能やサーバーをラズパイ起動時に自動的に立ち上げるようにして、デジカメのように使って行きましょう。
ラズパイ、ボタン、バッテリーなどを一つの箱に入れて、全体的に動くかどうかの確認もします。

ラズパイ、ボタン、バッテリーなどを一つの箱に入れて、全体的に動くかどうかの確認

自動起動サービスの設定

ラズパイ起動時のプログラム実行は、systemdというサービスを設定します。
/etc/system/system/の下に、xxxx.serviceというファイルを作っていきます。まずウェブサーバーの方のファイル設定です。

[webd.service]

このサービスに対するパーミッションや起動コマンドは、以下のようなものです。

これで、ウェブサーバーのサービスを登録する事ができました。ログファイルなどは/var/log/syslogの場所にあります。

同様に、ボタン機能の登録も行います。

[buttond.service]

ボタンの方も同じようにサービスの登録、スタート、ステータス確認などを行います。

ボタン、ウェブサービス、カメラなどをまとめて使ってみる

それでは、一度ラズパイをリブートして、正常に立ち上がっているか確認しましょう。
再立ち上げすると、自動でLEDが三回点滅するようにしているので、それまで待って下さい。
その後、ボタンをワンプッシュして、写真を撮る事ができたでしょうか?ブラウザからこのラズパイにアクセスして、写真を確認してみて下さい。
またボタン長押しで録音ができる事も確認してください。

ボタン、ウェブサービス、カメラなどをまとめて使ってみる

実際に写真撮影、録音などを行っている動画はこちらです。

まとめ

今回はデバイスの準備として、ラズパイにボタンを付け、ワンプッシュするとカメラのように写真を撮ったり、長押しにより録音をできるようにしました。簡易デジカメやレコーダーのようになったのではないでしょうか?
またラズパイをウェブサーバーにして、撮影した写真などをブラウザから確認できるようにもしました。

次回は、いよいよ頭脳となるAPIやAI機能を、ラズパイに導入していきたいと思います。
お楽しみに!

NHK学生ロボコン2016 出場ロボット解剖計画
ヨシケン(吉田 顕一)

普通の会社に勤めるサラリーマンですが、モノ作りが好きな週末メイカーで、電子書籍MESHBOOKを出したり、ブログを書いたりしています!

http://blog.ktrips.net