Quantcast
Channel: はじめての電子工作超入門 – Device Plus –デバプラ
Viewing all 58 articles
Browse latest View live

第4回 ラズパイでAIカメラを自作しよう!撮った画像を読み上げる、おしゃべりカメラにしよう

$
0
0

こんにちは、ヨシケンです!
前回記事では、写真に写っている料理や風景などを、画像APIにより解析するようにしました。だんだんスマートなカメラになってきたのではないかと思います。
今回はもう一歩進めて、スピーカーを使ってこのデバイスに口を付け、画像解析した結果をしゃべってくれる面白いカメラにして行きたいと思います。

スピーカーを使ってこのデバイスに口を付け、画像解析した結果をしゃべってくれる面白いカメラ

音声合成APIを使って、様々な声でカメラをしゃべらせる

前回に引き続き、docomo APIの中から音声合成APIを使って、テキストを発話させます。
男女、及び動物風な声まであらかじめ用意されていて、このAPIを使うだけで様々な声を出すデバイスを作ることができます。
音声合成APIが使用できるように、Docomo Developer Supportページから、機能を追加しておいて下さい。

Docomo Developer Support

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

Raspberry Pi 3 Model B

小型スピーカー

パイ・カメラ

LED付きタクト・スイッチ

小型バッテリー

上記が入るような箱(ここでは100均で売っている紙製お弁当箱のようなものを使いました)

今回の記事の流れ

1.ボタンを押して画像解析を行う
2.音声合成APIを導入して、発話機能を追加
3.カメラケースを作って、撮影、読み上げをまとめて行う
4.まとめ

1.デバイスのボタンを押して画像解析

それではまず前回のプログラムに、カメラのシャッターを切るようにボタンを押して、撮った画像を解析するようにします。
紙製の箱の中に、ラズパイ、バッテリー、カメラ、ボタンなどを収納しておきます。

紙製の箱の中に、ラズパイ、バッテリー、カメラ、ボタンなどを収納

カメラで写真を撮るファンクションとして、camera()を追加しました。写真を保存する時、フォルダ名を日付、ファイル名を撮った時間で作成しています。

ボタンを押すのを待ち受ける部分は、第2回の記事と同様の仕組みです。
背景に水色が付いている部分が、前回のプログラムから追加する部分です。

このプログラムを流して、ボタンを一回押すと写真撮影、画像解析ができる事を確かめておいて下さい。
ちなみにパイ・カメラで写真を撮るとき、日付別のファイルを作っているので管理者権限のsudo pythonで流してくださいね。
また、modelパラメータに何も指定しない場合、解析カテゴリを一つづつ順に適用してくれるようにしています。

sudo python button_cat_camera.py

解析カテゴリを一つづつ順に適用
ゆで卵
ちょっとピンボケですが、ちゃんと“ホワイト系”の“ゆで卵”と識別してくれました。その他の項目も拾ってしまったのは、ご愛敬ですね。

2.音声合成APIの導入

それでは今度は、この解析結果を読み上げる事ができるようにします。docomo APIには、音声合成の機能もあるので、それを使っていきます。

音声合成API

音声合成APIにも幾つかあるのですが、このPowered by HOYAの音声機能は、声の種類を色々選べたり、感情も変えたりする事ができます。

APIの詳細などは、こちらの機能別リファレンスに詳しく載っていますので、適宜参照して下さい。

このAPIのパラメータには以下のようなものがあり、話者や感情、しゃべる速さなどが選べます。今回は一番標準的な速度、感情で、harukaという女性の声を使ってみます。

キー 必須 説明 制限・初期値
text 合成するテキスト。エンコーディングは UTF-8。Unicode で 200 文字以内。
speaker 話者名。以下のいずれかを指定します。
show (男性)
haruka (女性)
hikari (女性)
takeru (男性)
santa (サンタクロース)
bear (凶暴なクマ)
emotion 感情カテゴリの指定。以下のいずれかを指定します。
happiness(喜)
anger (怒)
sadness(悲)
話者 haruka、hikari、takeru、santa、bear にのみ使用できます。
emotion_level 感情レベルの指定。1または2を指定できます。数値が大きいほど感情が強くなります。 初期値:1
pitch 音の高低を数値で指定します。値が小さいほど低い音になります。 初期値:100(%),
範囲:50(%)から200(%)
speed 話す速度を数値で指定します。値が小さいほど遅い話し方になります。 初期値:100(%),
範囲:50(%)から400(%)
volume 音量を数値で指定します。値が小さいほど小さい音になります。 初期値:100(%),
範囲:50(%)から200(%)
format 音声ファイルフォーマット。以下のいずれかを指定します。
wav(圧縮なし)
ogg(Ogg Vorbisフォーマットでの圧縮)
初期値:wav

 

では前段のPythonプログラムに、この音声APIを追加していきます。

まず、合成音声APIのURLに、以下をセットします。

URL_SPEECH= ‘https://api.apigw.smt.docomo.ne.jp/voiceText/v1/textToSpeech?APIKEY=’

次にspeech()というファンクションを作って、音声APIにヘッダー、パラメータを指定します。

そして、画像から取得したobject情報を、messageとして音声APIに渡します。

message += objects.encode(‘utf-8’) + “が写っているかもしれません!”

code, data = speech(message, speaker, VOLUME)

合成音声APIにより音声ファイル(speech.wav)が作られ、これをaplayコマンドにより、スピーカーから出力します。スピーカーには、以前調べたDEVICE番号、CARD番号を指定します。

aplay -D plughw:DEVICE, CARD speech.wav

これらの仕組みを、これまでのプログラムに追加して、button_cat_speech_camera.pyとしました。
こちらにzipファイルとして保存していますので、解凍して参照してみて下さい。

3.カメラケースを作って、撮影、読み上げをまとめて行う

それではやっと工作っぽいところまで来て、カメラのような外観を作っていきます。ラズパイやカメラ、ボタンなどがまとめて入るカメラケースを作ります。
ここでは、100均で売っている紙の入れ物を使って、カッターで穴を開けて、作っています。ラズパイ、カメラの形に合わせて、それが通る穴をカッターで開けて下さいね。
前面(写真左側)に、ペンでカメラっぽい装飾を施すと、より雰囲気が出てきます。

カメラのような外観

パイ・カメラを、裏側から穴にはめて、留めます。ラズパイ、バッテリーなども箱に入れ、ボタンは外に出るように伸ばします。

ラズパイ、バッテリーなども箱に入れ、ボタンは外に出るように

最後に、音声ジャックを差す穴を開けて、そこに上からスピーカーをセットして、AIカメラの完成です!

スピーカーをセットして、AIカメラの完成

使い勝手を考えて、シャッターを切るボタンの位置や、ラズパイの電源が入りやすいように工夫して下さいね。

それでは、ラズパイの電源、スピーカーをオンにして、カメラとして全ての機能を通しで使ってみましょう。

ボタンを押して写真を撮ってみましょう

さきほどの音声API機能付きのプログラムを流して、ボタンを押して写真を撮ってみましょう。

sudo python button_cat_speech_camera.py

まず手近にあったこんな食べ物を撮ってみました。

中華まん

そうすると、まず「食事・料理」シーンというのを判別してくれて、ちゃんと「中華まん」というのが分かってくれました。トレイが黒いのでブラック系は分かりますが、他のメッセージはちょっと不思議ですね。

yoshiken4-11

そして、harukaちゃんの声で、「中華まん、が写っているかもしれません」としゃべってくれました!

その際の動画はこちらです。音を出して再生してもらえると、音声合成APIの発話がクリアなのが分かってくれると思います。

次にこんなものも撮ってみました。

食パン

こちらもちゃんと「無地、ホワイト系、食パンが写っているかもしれません!」と発話してくれました。

ホワイト系、食パン

結構かわいい声で読み上げてくれて、ちょっと愛着が湧いてきましたね!

カメラで手近なものの写真を撮って、喋らせてみて下さい。またプログラム中のパラメータを変えると、他の声や感情にする事もできますので、色々試してみて下さい。

4.まとめ

今回は、ボタンを押すことで、写真撮影、画像解析するようにしました。

また音声合成APIを追加して、ラズパイから喋る事もできるようになりました。

紙製ですがカメラ風なケースも作り、シャッターを切って画像解析プログラムを動かすという一連の動作ができるようになりました。
撮った写真を解析して、写った情景や料理を、人間のような声で発話してくれます。かなり未来のカメラのようになってきましたね!

最終的なプログラムはこちら[button_cat_speech_camera.py]にあります(前出のものと同じです)。適宜参照して下さいね。

次回は、もっと多くの物や文字なども読み取る事ができる機能も付けて、よりAIなカメラにしていきたいと思います。
それでは、お楽しみに!


第5回 ラズパイでAIカメラを自作しよう!顔や文字などを読み取って、自動でメールする

$
0
0

こんにちは、ヨシケンです!
前回までの記事では、風景や食べ物などを識別して、それをしゃべってくれるカメラになりました。
今回は、更にdocomo APIで識別できるものを増やして、顔や文字なども読み取れるようにします。
また、画像解析でよくある検出部分を赤枠で囲む処理をして、その写真を自動でメールなどに送る機能も付けます。
画像解析でよくある検出部分を赤枠で囲む処理をして、その写真を自動でメールなどに送る機能も付けます

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

Raspberry Pi 3 Model B

小型スピーカー

パイ・カメラ

LED付きタクト・スイッチ

小型バッテリー

今回の記事の流れ

1.物体検出APIで、写真の顔、お札を囲んでみる
2.文字認識APIを使って、文字を読み取る
3.撮った写真、メッセージをメールで自動送信
4.プッシュ回数に応じて、機能を変えるカメラにする
5.まとめ

 

1.物体検出APIを使って、写真の顔、お札を囲んでみる

既にカテゴリ認識として、食べ物、風景やファッションなどを検知できていると思いますが、それに追加して、顔やお札などを抜き出せる物体検出APIも付け加えます。
このAPIを使用できるようDocomo Developer Supportページから、機能を追加しておいて下さい。

物体検出API
この物体検出では、体の部位や日本の通貨を特定する事ができます。
また検出したものの画像中の位置も取れるので、どこに何が写っているかも写真中にマップする事もできます。
物体検出

 
これまでのプログラムに、物体APIのURLと、体を特定するbodyPart、お札のcurrencyというmodelを追加します。

“url”: “https://api.apigw.smt.docomo.ne.jp/imageRecognition/v1/objectDetection/detect/?APIKEY=”
“model”: “[‘currency’, ‘bodyPart’]”

 
また、この物体検出APIでは、検出した物の画像中の位置も補足できるので、その座標も取得します。

x = int(can[‘xMin’])
y = int(can[‘yMin’])
x2= int(can[‘xMax’])
y2= int(can[‘yMax’])

 
そしてcv2.rectangle()、cv2.putText()という関数を使って、検出物体の四角形の囲いと文字を写真に追加します。

cv2.rectangle(img, (x, y), (x2, y2), (0, 0, 255), thickness=2)

cv2.putText(img, message.encode(‘utf-8’), (10, 20), cv2.CV_AA, 0.6, (255, 0, 0), 1, cv2.CV_AA)

 
このプログラムによって、写真の中の顔を抽出した部分を枠で囲み、face(92.1%)のような検出率を入れる事ができるようになります。
写真の中の顔を抽出した部分を枠で囲み、検出率を入れる事ができる

全体のプログラムは一番最後にまとめて付けています。
引き続き、文字認識APIの方も見ていきます。

 

2.文字認識APIを使って、文字を読み取る

更に追加で、画像中に文字がある場合に、それを抜き出す文字認識APIを使っていきます。
文字認識

 
文字認識APIのURL、モデル名は以下のようなものです。

“url”: “https://api.apigw.smt.docomo.ne.jp/characterRecognition/v1/scene”
“model”: “[‘word’]”

文字認識に関しては、まず情景画像要求 getImage(fname, modelName, lang) を行い、そこで得られたidを次の結果取得 getWordList(img_id) に渡して、文字を取り出します。

 
先程と同様に、文字認識部分の位置もx, yで返してくれるので、それを取得します。

x = int(can[‘shape’][‘point’][0][‘@x’])
y = int(can[‘shape’][‘point’][0][‘@y’])
x2= int(can[‘shape’][‘point’][2][‘@x’])
y2= int(can[‘shape’][‘point’][2][‘@y’])
cv2.rectangle(img, (x, y), (x2, y2), (0, 0, 255), thickness=2)

そうすると、Device Plusの記事を読み取ったのですが、このように文字の部分を抜き出してくれます。
文字部分の認識
いくつか、不思議な文字を読み取ってしまっていますが、「電子工作」や「読み上げ」「おしゃべり」など正確に検出してくれています。
文字認識

 

3.撮った写真、メッセージをメールで自動送信

カメラで色々な解析写真を撮る事ができるようになりましたが、その画像をいちいちチェックするよりも、メールで自分のアドレスに送るようにしましょう。面白い写真が撮れたら、Twitterなどでシェアするのもいいかもしれません。
ラズパイにメール関連のライブラリを導入し、メッセージと画像をGmailで送れるような機能をつけていきます。この部分はプログラムを流す際パラメータにして、メールを送る、送らない、を指定できるようにしておきます。

 
まずラズパイに、シンプルなSMTPサーバーのsSMTPをインストールします。
設定は、ssmtp.confというファイルに自分のGmailアカウントなどを登録します。

sudo apt-get install ssmtp
sudo vi /etc/ssmtp/ssmtp.conf
root = xxx@gmail.com # 自分のGmailアカウント
mailhub = smtp.gmail.com:587 # Gmailのサーバー
AuthUser = xxx@gmail.com # 自分のGmailアカウント
AuthPass = pswd # Gmailパスワード
AuthLogin=YES # Gmailへのログイン許可
UseSTARTTLS = YES # メールの暗号化設定

ここでAuthPassには、Gmailそのもののパスワードでも可能ですが、このアプリ専用のパスワードを設定しておいた方が安心です。こちらのGoogleのページからアプリ用のパスワードの生成をし、それをAuthPassにセットできます。

アプリパスワード

次に、画像添付も含めたメールの送信に、Muttというメールクライアントを使います。これをラズパイにインストールし、sSMTPと共に使います。
以下コマンドでmuttをインストールします。その後ラズパイのホーム以下に.muttrcという設定ファイルを作り、そこにメールサーバーなどの情報を定義します。

sudo apt-get install mutt
sudo vi $HOME/.muttrc
set sendmail = “/usr/sbin/ssmtp” #先程のssmtpを指定
set realname = “Sender name” #送信者の名前
set from = xxx@gmail.com # 送信者メールアドレス

 
さあ、設定が終わったら、ラズパイからmuttコマンドでメールを送ってみましょう。
mutt -s “題名” “送信先メールアドレス” -c “CCメールアドレス” -a “添付ファイルの絶対パス” < “メール本文のテキストファイル” といった形でメールを送る事ができます。

mutt -s “Test subject” “abc@hotmail.com” -c “” -a “/home/pi/web/image/yyyymmdd/hhmmss_o.jpg” < "/home/pi/web/image/yyyymmdd/hhmmss_msg.txt"

 
テストで、これまで撮った写真を使って実行してみると、こんなメールが飛んできました。
送られてきたメール

カメラがメールを送ってくれるというのはちょっと面白いかもしれませんね。ちゃんと日本語にも対応してくれています。
それでは最後にこれらをまとめて、カメラから使えるようにします。

 

4.プッシュ回数に応じて、機能を変えるカメラにする

これまで追加した画像解析を、カメラのボタンを押した回数に応じて、切り替えるようにします。
シングル・プッシュなら1: カテゴリ認識(風景や料理など)、ダブル・プッシュなら2: 物体(人やお金)、そして三回連続押したら3: 文字認識を行うような形です。それぞれに対応したurl、モデル名を、jsonで定義しておきます。

また、前回使ったaplayでの発話機能をtalk(message) ファンクションにして、これから何の解析を行うのか、カメラ自身にしゃべってもらいます。

例えば、シャッターを二回連続で押すと、model_descが”物体検出”になるので、「物体検出をします!」としゃべってくれるはずです。

それでは、こちらが全体のサンプル・プログラムbutton_obj_speech_camera.pyになります。以前からの追加部分をそれぞれ、物体検出は黄色、文字認識は青、それ以外の部分は緑でハイライトしています。

 
それでは、通して流してみましょう。メールの宛先は–mail で自分のアドレスなどをセットしておきます。

python button_obj_speech_camera.py –mail abc@hotmail.com

Press 1 (category), 2 (body, ccy), 3 (word) times!

 
シャッターを一回だけ押すとカテゴリ解析、ダブル・プッシュで物体解析を行います。
また「(メールアドレス)にメールを送ります」と言って、プログラムを流すときに設定したアドレスに、メッセージと写真が届いたでしょうか?

 
メールを送ります

三回連続で押すと、文字解析をしてくれます。色々なものを撮ってみて下さいね。

文字解析をしてくれます

 

5.まとめ

今回はカメラに、物体検出API(顔、体、お札)と文字認識APIを追加しました。これで風景や料理などの他に、人の顔や看板の文字なども認識できるようになりました。

顔や文字を認識した部分を囲う事もできるようになったので、より画像認識の精度が見て取れると思います。
また、ラズパイにメールサーバー機能を付けて、メッセージと画像を添付して、Gmailを送信できるようにもしました。
カメラのシャッターを押した回数に応じて、写った文字や情景、人の存在などを、話したり、メールで送ったりしてくれます。かなり未来のカメラのようになって、面白く使えるのではないでしょうか?

では次回は、このカメラに耳も付けて、人の話を聞くことが出来るようにします。話しかけた内容に応じて、写真を撮る内容を変えてくれたら、もうAIカメラと呼んでもいいでしょう!

それでは、お楽しみに!

第6回 ラズパイでAIカメラを自作しよう!人の話を聞いて、写真撮影、画像解析するAIカメラを完成させる!

$
0
0

こんにちは、ヨシケンです!
これまで、目となるカメラで画像を読取り、口となるスピーカーで、解析した結果を喋ってくれるデバイスにしてきました。
総まとめとなる今回は、耳となるマイクを付けて、「自撮りして!」や「文字を読んで」など話しかけると、それに応じて解析内容を変えてくれるようにします。ここまでくれば、話を聞いて、判別して、しゃべってくれるAIカメラの完成です!

人の話を聞いて、写真撮影、画像解析するAIカメラを完成

 

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

Raspberry Pi 3 Model B
Raspberry Pi 3 Model B

小型スピーカー
小型スピーカー

パイ・カメラ
または、USBカメラ(今回は小型で安価なこちらを使いました)
USBカメラ

LED付きタクト・スイッチ(例えばこのような赤や緑に光るスイッチです)
LED付きタクト・スイッチ

小型USBマイク
小型USBマイク

マルチカラーLED(今回はこのBLINKTを使いました。)
BLINKT

小型バッテリー

 

今回の記事の流れ

1.ラズパイに、カメラ、スピーカー、マイクを付け、カメラケースに収納
2.マルチLEDをセットして、カラフルに光らせる
3.音声認識APIを導入して、話を聞き取る
4.マイク、写真撮影、スピーカーをまとめて、カメラを完成させる
5.まとめと機能拡張

 

1.ラズパイに、カメラ、スピーカー、マイクを付け、カメラケースに収納

今回は、ラズパイを使ったAIカメラの一連の流れをおさらいします。
というのも、これまで使っていたラズパイ公式のパイ・カメラがハード的に壊れてしまい(ちょっと扱いが手荒だったかもしれません)、代わりに手近にあった小型USBカメラで代用した為です。そのUSBカメラに合わせて、カメラケースも作り直したので、最初から復習していきましょう。

 
まず、ラズパイにUSBカメラをつないで使う設定をし直します。(これまで通り標準のパイ・カメラを使っている方は、第1回記事のままで変える必要はありません。)
ラズパイのUSB経由で写真を撮る場合は、これまでのraspistillの代わりに、fswebcamというコマンドだけで、写真撮影、保存する事ができます。
fswebcamをインストール後、以下コマンドで画像解像度などのオプションを付けて、試しに撮ってみて下さい。

 
次に、若干カメラのレンズの大きさが変わったので、紙の箱でカメラケースを作り直し、組み立てていきます。
写真のように、カメラのレンズ、USBを通す穴、バッテリーをオンオフする窓、スピーカーを差す部分などをカッターで切り抜きました。こちらはあくまで参考なので、どんなものでケースを作っても構いません。
ケース

 
そこに、ラズパイ、カメラ、ボタンなどを収納します。今回は声を聞き取るための小型マイクをUSBに差しています。
小型マイクを差し込む

 
それでは紙の箱の中心にレンズをはめ、カメラ部分を固定します。
エンズをはめカメラに固定  

 
マイクは外に出るように、横に窓を作っておきます。スピーカーは、ラズパイのジャックに差し、ちょうどいい位置に出るようにして下さい。スピーカー、マイクの設定は、第1回記事にありますので、事前に確認しておいて下さいね。
マイクを外に出るように窓を作る  

 
また、シャッターを切るタクト・スイッチもこのように押しやすい場所に留めます。設定方法は、第2回記事のようにやってみて下さい。
タクトスイッチを推しやすい場所に収める  

 
全体を箱の中に収め、最後にバッテリーも入れます。今回は、電源プラグから充電できるようなものにしています。
全体を箱の中に収め

 

2.マルチカラーLEDをセットして、カラフルに光らせる

このカメラには色々な機能が加わったので、それを視覚的にも分かりやすく、またカメラのフラッシュ的に使うようにLEDをセットします。今回はPimoroni社が出しているBLINKTというマルチカラーLEDを使っています。ライブラリで様々な色、光の動きを付けられるので、おススメです。

 
ではこのLEDもカメラケースにセットしていきます。
BLINKTとラズパイGPIOの20番と、26番、そして5Vにケーブルでそれぞれつないで下さい。(ラズパイのピンにそのまま差すこともできますが、今回はカメラっぽい位置にセットする為、ケーブルでつないでいます。)
ケーブルをつなぐ  

では、BLINKTのページを参照して、セットアップやライブラリのインストールをして下さい。

 curl https://get.pimoroni.com/blinkt | bash

 
ここではblinktというライブラリをimportして、r,g,bで色を指定して、全面を光らせたり(blinkt_all)、パルスのようにLEDの左から右に光って流れる(blinkt_pulse)関数を作りました。

 
実際流してみると、こんな感じです。結構未来的なカメラになってきました。
実際に流して光らせてみる

 

3.音声認識APIを導入して、話を聞き取る

これまでdocomo APIを導入して、様々な機能を追加してきました。画像認識API(第3回)のカテゴリ分析により、料理や花、風景などを言い当てられるようにしました。第4回の音声合成APIで、撮った内容を話してくれるカメラになりました。物体検出APIや文字認識API(第5回)で、人間やお札、文字も読み取れるようになりました。
そして最後に、音声認識APIを追加して、人の話を聞いて、それをテキストに変換できるようにします。日本語の会話に関して、NTT docomoのしゃべってコンシェルなどのデータ、蓄積を元に、かなり正確に発話内容を認識してくれます。
これにより、例えば「自撮りして」と言うだけで、カメラを離してセルフ写真を撮れ、顔認識などを行う命令を伝える事ができるようになります。

 
これまでのようにDocomo Developer Supportページから、音声認識APIを追加しておいて下さい。また機能別リファレンスも参照しておいて下さい。
DOCOMO音声認識API

この音声認識APIのURLを使って、(recognize)関数を作ります。
この中でまず、rec_timeの間、話を録音し、音声データ(.wav)を保存します。このデータをAPIに適用する事により、その内容を日本語のテキストに変換します。

また指示内容から各アクションを区分ける言葉をmodelsとして定義しておきます。「風景を撮って」なら”scene”モデルを、「自撮りして」ならbodyPartモデルなどと判別できるようにします。この聞き取り語句は使い方に合わせて、自由に追加して下さいね。

最後に、シャッターボタンを長押し(ここでは1.2秒以上で、count=0となるようになっています)したら、この聞き取りが始まるようにします。rec_timeで指定した秒数の間話を聞きます。
APIにより変換された言葉からモデル(料理や顔、文字など)が分かったら、それぞれのAPI処理に分岐させます。その際カメラに話させる「何を撮りますか?」や「○○と言ったのですか」などはお好みで変えて下さいね。

4.全てをまとめて使ってみる

では、全体を通してAIカメラとして使ってみましょう。全てが入ったプログラムサンプルbutton_listen_speech_camera.pyは、この記事の一番下に付けています。
このプログラムを、ラズパイのスタート時に自動起動させるようにしておくと、電源を入れたらすぐカメラとして使えるようになります。第2回の後半に自動起動の登録方法があるので、試してみて下さい。
パラメータにメールアドレスを指定してプログラムを流すと、前回作ったように、解析写真をメールで送ってくれるようになっています。

 
sudo python button_listen_speech_camera.py –mail abc@hotmail.com

Press 1 (category), 2 (body, ccy), 3 (word) times, or hold to listen!

 

全体を通してAIカメラとして使う

 
実際の撮っている様子は動画や、写真を見てみて下さいね。

写真を撮ってメールで送ってくれる

 

5.これまでのまとめと機能拡張

それではこれまで全6回に渡って、ラズパイを使ったAIカメラを作ってきました。
ラズパイと、カメラやスピーカー、マイクなどのハードウェアの設定方法に始まって、AIを使ったAPIの導入から、会話を聞き分ける機能まで作りました。ご自分で工作する際は、ある部分だけを使ってもいいですし、最初から順番にやってもらってもいいと思います。

 
ここまで画像解析や音声APIを使ってきましたが、docomoにはそれ以外にも様々なAPIがあります。例えば、日本語の語彙を熟知したAPIとして、発話内容を「天気」や「知識」、「トレンド」などに区分けにしてくれる『発話理解API』があります。ここから更に『知識Q&A』や『トレンド記事』などのAPIを連動させたり、様々な会話に対応してくれる『雑談API』を使うと面白いと思います。APIを組み合わせて、こんなお喋りロボットだって作る事ができます。(ロボット筐体(※右下写真の白いロボット)の中にラズパイとマイク、スピーカーなどが入っていて、話しかけると動きながら雑談などをしてくれます。)

対話AI

 
またラズパイ用に、GoogleやAmazonなどからも先進的なAPI/AIが公開されているので、これまで作ったAIカメラ以外にも、Google Home/Alexa両用おしゃべりスピーカー(写真左側)など、驚くようなガジェットを自分で作る事ができるのです。
6-14

是非、ラズパイを使って、様々な事にチャレンジしてみて下さい!
それでは、また!

サンプルプログラム:button_listen_speech_camera.py

ラズパイでスマートスピーカーを自作しよう!第1回: Google AIYを使って、日本語対応スマートスピーカーをサクッと作る

$
0
0

こんにちは、ヨシケンです!
ラズパイではさまざまなものを作ることができますが、AIを搭載して話しかけたら応えてくれるスマートスピーカーを作ってみたくはないでしょうか?
特にGoogleのおしゃべりスピーカーGoogle Homeと同様の機能が、Google AIY Projectsとして提供されています。そしてこのAIY Voice Kitが今年に入ってからアップグレードされ、日本語にも対応するようになりました。
ラズパイに最低限の部品を追加するだけで、驚くほど簡単にスマートスピーカーが作れてしまいますので、この機会にラズパイ+スマートスピーカーの世界に足を踏み入れてみてはいかがでしょうか?

voicekit.AIY projects
スマートスピーカー

 

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

・Raspberry Pi 3 Model B
Raspberry Pi 3 Model B

・小型USBマイク
小型USBマイク

・パソコン(ラズパイにsshでつなぐ場合。ここではWindows10パソコンを使っています。)
・スマホ(Google Assistantアプリで日本語設定をするため)

これにイヤフォンがあれば、とりあえずのGoogle Home機能を作ることができます。

 

今回の記事の流れ

1.Google AIYに関して
2.ラズパイにGoogle AIYをインストール
3.Google Cloud/Assistantのセットアップ
4.OK Googleしてみる
5.まとめ

1.Google AIYに関して

Googleでは、スマートスピーカーGoogle Homeの機能を、誰にでも簡単に使えるようにするために、SDKが公開されています。そしてGoogle社自身が、AI YourselfというコンセプトでAIY Projectsとして、このような自作キットも提供しています。
https://aiyprojects.withgoogle.com/voice/

voice kit
このキットは日本でもスイッチサイエンス社などから、3500円程度(ラズパイ含まず)で販売されています。ただこのキットを買わなくても、ソフトウェア部分は基本的に無料で提供されているので、最低限の部品だけ用意すれば、自分でもGoogle Homeのようなスマートスピーカーを作ることができます。

ここでは、このAIY Projects (Voice Kit)を使って、ラズパイ・スマートスピーカーを作っていきます。

2.ラズパイにGoogle AIYをインストール

まずGoogleのこちらのページにアクセスして、Voice KitのSDイメージをダウンロードして下さい。

Voice KitのSDイメージをダウンロード

イメージをダウンロードしたら、DiskImagerなどのソフトでSDカードに書き込んで、使っていきます。
デバプラのこちらのページを参照して、イメージを使ったラズパイの起動SDカードを作ってください。

できたSDカードをラズパイに差して、ディスプレイにつなぐと、このようにAIYの壁紙が付いたラズパイが立ち上がっていると思います。

4

ラズパイのロケールやキーボード、Wi-Fiなど最低限の設定は、こちらの記事を参考に行ってください。

この後はGoogleの公式サイトUsers guideに従って、Google Cloudの設定をしていきます。
(既にGoogle Cloudの登録や、Assistant APIを有効化している方は、4項まで飛ばして下さいね。)

3.Google Cloud/Assistantのセットアップ

まず最初のステップは、Google Cloud上でAPIなどをデバイスで使えるようにします。
こちらのGoogle Cloudコンソールにアクセスし、設定を進めます。
https://console.cloud.google.com/

3.1 Google Cloudプロジェクトの作成

Google Cloudにプロジェクトが無い場合は、真ん中上のメニューから、新しいプロジェクトを作成して下さい。

3.2 Google Assistant APIの有効化

プロジェクトができたら(aiy-prjとしています)、Google Assistant APIを検索し、有効化させます。(課金設定なども必要ですが、範囲内なら無料で使うことができます。)

Google cloud platform

3.3 認証情報の作成

次に、Googleコンソールの左側メニューの“APIとサービス”から、“認証情報の作成”を選びます。
そこで“OAuthクライアントID”を作成します。
クライアントIDの作成で、“その他”を選んで、名前を付けます。

認証情報の作成

3.4 認証情報のダウンロード、ラズパイでの登録

作成された認証ファイルを、“JSONをダウンロード”というボタンから、作業しているパソコンにダウンロードして下さい。

ダウンロードした認証情報を、scpを使ってパソコンからラズパイのホーム直下に転送します。以下記述の”download_file.json”の部分は実際にダウンロードしたJSONファイルの名前を使い、これをラズパイ側でassistant.jsonという名前に変更しています。

(パソコンのコンソールなどから) scp download_file.json pi@xxx.local:assistant.json

ラズパイの方から、Googleの認証ツールで先ほどのassistant.jsonを読み込み、デバイス認証IDを登録します。

google-oauthlib-tool –scope https://www.googleapis.com/auth/assistant-sdk-prototype –save —
headless –client-secrets /home/pi/assistant.json

デバイス認証IDの登録

ここで、”Please visit this URL”と書いてある所の後ろのURLを、ブラウザに貼り付けてGoogleアカウントでログインします。その後、出力されるキーをラズパイ側の”Enter the authorization code”とある部分に貼り付けて、認証完了です。

認証完了

3.5 アクティビティ管理の追加

またGoogleデバイスのアクティビティ管理画面から、以下の項目を有効化させます。
https://myaccount.google.com/activitycontrols

  1. ウェブとアプリのアクティビティ
  2. 端末情報
  3. 音声アクティビティ

アクティビティ管理

3.6 デバイスの登録

あともう少しです!直近のアップグレードで、Googleデバイスの登録が必須になったので、こちらのGoogle Actionページにアクセスし、デバイスを登録します。
https://console.actions.google.com/

“(+) Add/improve project”とある部分をクリックして、デバイスのプロジェクト名(aiyprjなどとして)入れます。
その後、左側の”Connected properties”というところで、”DEVICE MODELS”の登録を行います。
ここでは、プロダクト名(device1としています)、Device Model IDを先ほどのプロジェクト名+プロダクト名(ここでは、aiyprj-device1としました)として登録します。

DEVICE MODELの登録

また”traits”という、特別の命令項目も選択しておきます。(こちらは後でカスタム命令に使います)

Register model
ここまで色々な設定がありましたが、次項目で最後にラズパイ側の設定をして、話しかけられるようになります!

4.OK Googleしてみる

ラズパイのUSBにマイク、音声ジャックにイヤフォン又はスピーカーをつなぎます。
OK Googleしてみる

4.1 ラズパイの音声確認

ここで、マイク、音声出力など、ラズパイで音声が扱えるかを確認しておきます。
Google AIYのSDイメージですと、キットのマイクを使うことを想定しているので、ラズパイ標準の音声管理がOFFになっている場合があります。そのため、こちらのconfig.txt中の”dtparam=audio=on”という部分を確認して、コメントアウト(#)されていたら、この#を消して、有効化させます。
変更を保存した後、ラズパイを再起動してください。

sudo vi /boot/config.txt

13

その後、以下画面のように”aplay -l”コマンドでスピーカーなどの出力を、”arecord -l”でマイクの確認を行います。”card 0: ”、”card 1: “のように出てきたら出力、マイクが使えるようになっているはずです。alsamixerコマンドで、音量の調節もしておいて下さい。
14

4.2 Google音声の日本語化

最後の最後、最近になって可能になったGoogle音声の日本語化をします。
これはスマホからGoogle Assistantアプリをダウンロードし、右上の“設定”からデバイスの言語を「日本語」に変更します。自分で登録した“device1”などのデバイスがスマホから見えていると思います。

設定完了
これで設定は全部完了!ついにOK Googleしてみましょう!

4.3 Googleに話しかけてみる

まずラズパイで一行目のシェルを実行し、Googleコマンドなどが読み込める環境にします。
その後二行目のgooglesamplesのhotwordというコマンドを起動します。その際、先ほど登録したプロジェクト名(ここではaiy-prj)と、モデル名(aiy-prj-device1)を指定して、エンターを押します!

./bin/AIY-projects-shell.sh

googlesamples-assistant-hotword –project_id aiy-prj –device_model_id aiy-prj-device1

ここで”ON_START_FINISHED”まで出てきたら、”OK Google”と英語風に話しかけてみて下さい。その後日本語で「天気教えて」などと言うと、その発した言葉がtextに日本語で表示され、Googleが応えてくれるはずです!
16

こちらがGoogle Homeのように受け答えをしている動画です。
受け答えをする

「面白い話をして」や「愚痴聞いてタンバリン」など色々話しかけてみて下さい。

5.まとめ

どうだったでしょうか?前半のGoogle Cloud、デバイスの設定などは、今後も使っていきますので、めげずに最後までやってみて下さい。要は、Google Cloudプロジェクト、APIをラズパイと紐づけ、デバイスを登録し、言語を日本語に変える、という流れです。
“OK Google”の発音は、今のところ英語風にする必要があり、日本版のように「ねえ、グーグル」などの起動ワードにはまだ対応していないようです。今後のアップデートが望まれますね。
ただその後の受け答えは、完璧に日本語で行え、ほぼGoogle Homeのようにできたのではないでしょうか?

今回は、ラズパイに無料のGoogle Home(AIY Voice Kit)機能を導入し、まずは”OK Google”を実現してみました。
次回は、もう少し電子工作っぽく、LEDプッシュボタンやスピーカーなどを自作し、ラズパイに追加したいと思います。100均の部品などを流用して1,000円程度で作り、Google Push to Talkという、ボタンを押したら話し始めるようにします。
お楽しみに!

ラズパイでスマートスピーカーを自作しよう!第2回: 部品を自作して、押したらGoogleがしゃべり出すPush to Talkを完成させる

$
0
0

こんにちは、ヨシケンです!
ラズパイでスマートスピーカー、活用していますでしょうか?
もし、「OK Google」と話しかけるのが気恥ずかしい、またはGoogle AIYキットのようにボタンで話し始めたいのであれば、今回は大きなLEDボタンとスピーカーを付けて、押したら話し出すPush to Talkを作りましょう。
ボタンやスピーカーなどは100円ショップなどの部品をフル活用すれば1,000円程の追加で、自作スマートスピーカーができあがります。(外装のセンスに関しては皆さんにお任せします!)

完成イメージ

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

最低限必須なモノ:
・Raspberry Pi 3 Model B
Raspberry Pi 3 Model B

・小型USBマイク
小型USBマイク

・アンプキット(秋月電子などで手に入ります)
アンプキット

ここから先は100円ショップで手に入れた部品達です。

・耳元スピーカー(スピーカーは入っていますが、耳元で聞こえる程度の音量です)
耳元スピーカー

・プッシュLEDボタン(100円でよく売っていますよね)
プッシュLEDボタン

・小型バッテリー(こちらはダイソーで500円で購入した3,000mAhのものです)
小型バッテリー

 

今回の記事の流れ

1.Google AIY Voice Kitのチェック
2.アンプ付きスピーカーを自作する
3.プッシュLEDを改造する
4.ラズパイにPush to Talk機能を設定する
5.全体を組み込んで、プッシュGoogleデバイスを完成させる
6.まとめ

 

1.Google AIY Voice Kitのチェック

ラズパイにGoogle AIY Voice Kitをインストールしておいて下さい。
https://aiyprojects.withgoogle.com/voice/
まだの方は、前回の記事を見て、Google AIYが動くようにしておいて下さいね。
本記事では、これを前提にAIYをカスタマイズしていきます。

そもそもGoogle AIY Voice Kitはケースやスピーカー、ボタンと共にキットとして売っているので、そのソフトを入れただけだとボタンなどの機能は動きません。
ここでは、自分でスピーカーやボタンなどを作って、それをAIYと連動させて、動かせるようにします。

 

2.アンプ付きスピーカーを自作

前回は市販のイヤフォンやスピーカーなどを使ったと思いますが、今回は100円ショップ等の部品でお安くスピーカーをラズパイで使えるように自作します。

例えば、100円ショップ等でこのような「耳元スピーカー」が売られているのですが、これにはアンプなどが入っていないため、ラズパイの音声ジャックに直接差しても、大きな音が出ません。
このスピーカーにアンプキットを接続すれば、音声を増幅し、離れていても聞こえる音量にすることができます。これにより今後の工作でも、安価で、小型化など自分の形にあったスピーカーを作ることができるようになります。
まずスピーカー本体のケースを開け、ケーブルを途中で切断します。

スピーカー本体のケースを開け、ケーブルを途中で切断

切断したスピーカー・ケーブルの中には、赤(プラス)と黒(又は白、マイナス)の二本のケーブルが出ているので、これを引き出します。

アンプキットの方は、全部で6本の端子があるのですが。この配線に従ってハンダ付けなどしてつなぎます。入力がスピーカーのジャックから、電源がラズパイにあたります。

シングルエンド入力での使用例

シングルエンドという構成をとるので、差動入力(-)の所はGNDとつないで下さい。(上手で青い部分、写真では緑の端子でつないでいます。)
きれいなハンダ付けで無く申し訳ありませんが、つないだ形はこの写真のようになります。真ん中の赤と白のケーブルは、ラズパイの赤が電源と、白がGNDとつながります。左側の黒いコードがジャックで、それをラズパイに差します。

黒いコードがジャックで、それをラズパイに差します

さあ、これでラズパイから音を出して確認してみましょう。音量はラズパイ側のalsamixerを使って調整して下さい。

alsamixer #音量の調整、Escで元の画面に戻ります
aplay -l #スピーカーの確認、card番号を覚えておいて下さい
arecord -l #マイクの確認、card番号を覚えておいて下さい
arecord -f cd -Dhw:1 | aplay -Dhw:1 #Dhw:1の部分はarecord, aplayで確認したカード番号を入れて下さい

これで自分が話した声がオウム返しに聞こえたら、マイクもスピーカーもちゃんと動いているのが確認できます。

 

3.プッシュLEDボタンの改造

次に、押したら光ってGoogleが動きだすボタンを作成します。こちらも、100円ショップ等でよくあるLEDプッシュボタンを改造します。

プッシュLEDボタンの改造

このボタンを分解して、このような配線を行います。ここではボタンとつながった黄色いケーブルをGPIO16につないでいます。

ボタンとケーブルをつなぐ

まずはこのような簡単なプログラムで動くかどうか確認しましょう。

$ sudo pip install rpi.gpio
$ sudo vi button.py

このプッシュLEDボタンでは、ボタンを押し下げるとLEDが点灯し常時通電状態になります。その間、ずっと“ON”が出力されたでしょうか?軽く押すようにすると、一瞬LEDがONになって、また元のOFFに戻る様になります。

4.ラズパイにPush to Talk機能を設定

それでは、自前で付けたボタンをGoogle AIYから使えるようにします。
Push to Talkのプログラムは、こちらにありますので、まずバックアップを取って、以下3点を変更します。

cd /usr/local/lib/python3.5/dist-packages/googlesampels/assistant/grpc/ #この下にpushtotalk.pyというプログラムがあります
sudo cp pushtotalk.py pushtotalk.py.original #コピーしてバックアップを取っておきます
sudo vi pushtotalk.py #以下3点を編集します

#GPIO Pin Setの部分
#GPIO Pin Setの部分

#GPIO setupの部分
#GPIO setupの部分

#GPIO Button Addの部分
#GPIO Button Addの部分

それではボタンを押して、Googleに話しかけてみましょう!
Push to Talkを日本語で動かすには、パラメータとして–langにja-JPを付けます。事前にAIYのシェルを起動しておいて下さいね。

./bin/AIY-projects-shell.sh

googlesamples-assistant-pushtotalk –project-id aiy-prj –device-model-if aiy-prj-device1 –lang ja-JP

ここでEnterキーを押すか、自分のボタンを押すと、Googleが聞く状態に入ります。例えば、「今日の天気は何ですか」など話しかけると、この画面のようにちゃんと読み取ってくれます。
Googleが読み取ってくれる

Googleがちゃんと受け答えしてくれたでしょうか?ボタンを押し下げた状態ですと、続けて話をすることができます。

5.全体を組み込んでプッシュGoogleデバイスの完成

最後に、ボタン、スピーカー、ラズパイ、電源などを全て組み込んで、スマートスピーカーを完成させましょう。
この組み合わせ方はあくまで一例です。外装は皆さんのセンスに任せて形作ってみて下さい。

組み合わせてみる

これで完成!ボタンが大きくて、つい押したくなってしまう形ですね!

つい押してみたくなるボタン

では最後に、このPush to Talk機能が、ラズパイを起動したら自動的に動き出すようにしておきましょう。
それにはまず、Google環境を設定するシェルスクリプトを以下の様に変更して、AIY-pushtotalk-jp.shなどとして保存します。

Google環境を設定するシェルスクリプト1
その後、このシェルを自動起動させるサービスを以下のような内容で、AIY-pushtotalk-jp.serviceなどとして作ります。
Google環境を設定するシェルスクリプト2

そしてサービスを有効化させ、起動させれば自動的に動き出すようになります!

sudo systemctl enable AIY-pushtotalk-jp.service #サービスの有効化
sudo systemctl start AIY-pushtotalk-jp.service #サービスのスタート
sudo systemctl status AIY-pushtotalk-jp.service #サービスのステータス確認

statusでサービスが設定されたのを確認した後、ラズパイを再起動して下さい。

Google環境を設定するシェルスクリプト3

再起動後、少し待ってボタンを押すと、ちゃんとGoogleが受け答えしてくれたでしょうか?
こちらが動いているところの動画です。けっこう健気に動いてくれて、愛着が湧いてくるのではないでしょうか?

 

6.まとめ

今回は、手軽な部品を改造して、スピーカー、LEDボタンを自作してみました。またGoogle AIYに変更を加え、これらの自作パーツからPush to Talkを動かせるようにしました。
外装を自分で作ると愛着が湧き、ポーンとたたくと応えてくれるのは、なかなか楽しいのではないかと思います。色々話しかけて、自作スマートスピーカーとして活用してみて下さい。

次回は、このGoogle Home機能以外にも、リアルタイム音声認識の機能を使って、便利なデバイスを作っていきたいと思います。
Make AI Yourself!(AIを自作して、自分のものに!)

ESP32とRTCで「二度寝防止アラーム時計」を作ろう!

$
0
0

毎朝、みなさんはどのようなアラーム時計で目覚めていますか?一般的なアラーム時計でやってしまいがちな、「ベッドから手を伸ばして、アラームを止めて二度寝する」ということが簡単にできてしまう問題。

そこで今回、ESP32を使って、この問題を解決する「二度寝防止アラーム時計」を作ってみることにしました。

今回の電子工作レシピ

完成までの時間目安:120分

名前 購入元 値段
ESP32-DevKitC(2個) 秋月電子通商 1,480円
DS3231モジュール Amazonなど 300円程度
LIR2032(ボタン充電池) Amazonなど 360円程度
スピーカー 秋月電子通商など 100~200円程度
2.8インチSPI接続320×240ピクセル液晶ディスプレイ Amazonなど 1,480円程度

※上記のほかに、タクトスイッチ1個、LED1個、100Ω程度の抵抗1個も必要
photo1

 

今回の記事の流れ

  • 今回作るアラーム時計について
  • 日時を刻む「RTC」
  • 液晶ディスプレイに日時を表示
  • MP3モジュールでアラーム音を出す
  • アラーム時計本体の配線
  • 子機の配線
  • ライブラリとフォントファイルのインストール
  • アラーム時計本体のプログラム
  • 子機のプログラム
  • 動作の確認
  • まとめ

今回作るアラーム時計について

ESP32を使って、一般的なアラーム時計のように日付や時刻をディスプレイに表示し、指定した時刻にアラーム音を出せるようにしてみます。さらに「二度寝防止アラーム時計」にするために、アラーム時計本体と、アラームを止めるためのボタンがついた子機を別々の場所に置き、起き上がって子機のところまで歩かないとアラームを止められないという仕組みを考えてみました。

以下の動画のように、ESPを2つ使って、片方を本体、もう片方を子機にします。動画では本体と子機が隣にありますが、WiFiで接続できる範囲であれば、離して置くことが可能です。

本体と子機を離した場所に置くために、ESP32のWiFiの機能を活用します。2つのESP32をWebサーバーかつクライアントとして動作させて、HTTPで図1のように通信するようにします。

図2

図1 本体と子機の間の通信

 

日時を刻む「RTC」

Arduinoなどのマイコンでは、起動時からの経過時間を取得できることが一般的です。それを応用して、時計の表示に使うこともできなくはありません。ただ、得られる時刻があまり正確ではありませんし、電源を切ると経過時間がリセットされるという問題もあります。

ESP32なら、WiFiを経由してインターネットに接続することができますので、インターネット上のNTPサーバーから定期的に日時を取得し、それをESP32に設定して利用することも可能です。しかし、Arduino Unoなど、インターネット接続機能がないマイコンもあり、日時を扱いやすくする仕組みがあると便利です。

そこで、「RTC」(Realtime Clock)というICを使うことがよくあります。RTCは、一定周期の信号を発する素子を元にして、時刻を刻むことができるICです。また、電池などの外部電源を接続して、マイコン本体の電源がオフの間でも時刻を刻み続けることができます。RTCにはいろいろな製品がありますが、今回は「DS3231」というRTCがモジュール化されたものを使います。

DS3231のモジュールは、電子工作で使うRTCモジュールの中ではポピュラーで、入手しやすいものです。接続はI2Cなので、線は4本で済みます。また、RTCの機能だけでなく、温度センサーの機能もあります(ただし、温度センサーは今回の記事では使いません)。

なお、写真1のDS3231では、マイコンの電源を切っても日時を刻み続けるように、「LIR2032」というボタン電池を取り付けます。LIR2032はCR2032と同じ大きさの電池ですが、充電池になっている点が異なります。

写真1 DS3231のモジュール

写真1 DS3231のモジュール

 

液晶ディスプレイに日時を表示

時計は現在の日時の確認に使うものですので、日時を分かりやすく表示できることが必要です。日時を表示するのに使うデバイスとしては、以下のようなものがあります。

  • 7セグメントLED
  • マトリックスLED
  • OLEDディスプレイ
  • キャラクタ液晶ディスプレイ
  • グラフィック液晶ディスプレイ

デバイスによってライブラリが違いますし、プログラムの方法も違いがあります。また、作りたいものに適しているかどうかも異なってきます。例えば、7セグメントLEDは数字だけを安価に表示するのに適していますが、細かな表示には向いていません。上記の中では、グラフィック液晶ディスプレイが最も汎用的で、様々な工作に活用できるため、今回はそちらを使うことにしました。

液晶ディスプレイモジュールにもいろいろなものがありますが、今回は「ILI9341」というコントローラを搭載していて、SPI接続のものを使います(写真2)。液晶ディスプレイモジュールの中ではよく見かけるものであり、また2.2インチ/2.4インチ/2.8インチの3つの大きさの製品が販売されていますので、工作するものに合わせて使い分けやすいというメリットがあります。

写真2 ILI9341コントローラの2.8インチ液晶ディスプレイ

写真2 ILI9341コントローラの2.8インチ液晶ディスプレイ

 

MP3モジュールでアラーム音を出す

アラーム時計なので、指定の時刻に音を出すことも必要です。ESP32にブザーを接続して単音を出すこともできますが、できれば自分の好きな音を使いたいところです。そこで、任意のMP3データを再生することができる「DFPlayer Mini」というモジュールを使うことにします(写真3)。

DFPlayer Miniは、シリアル接続でコマンドを送ることで、microSDカード内のMP3を再生することができるモジュールです。スピーカー出力のピンに、小さなスピーカーを接続して音を出すことができます。

写真3 DFPlayer Mini

写真3 DFPlayer Mini

 

アラーム時計本体の配線

それでは、実際の制作に入りましょう。まず、アラーム時計本体の配線を行います。

2枚のブレッドボードを使い、1枚にESP32とDS3231、もう1枚に液晶ディスプレイとDFPlayer Miniを接続します。各パーツの配線は図2のようになります。

ESP32は幅が広く、通常のブレッドボードだと片側にしかジャンプワイヤを刺すことができません。そこで、電源ラインが片側だけで、その代わりに穴が1列多いブレッドボードを使います(サンハヤトのSAD-101など)。
ESP32と液晶ディスプレイはSPIで接続します。ESP32ではSPIを2系統使うことができますが(VSPIとHSPI)、VSPI(18/19/23番ピン)を使います(表1)。

ESP32とDS3231は、I2Cで接続します。ESP32では任意のピンにI2Cを割り当てることができますが、標準のピン(SDA=21番、SCL=22番)を使います(表2)。

DFPlayer Miniはシリアルで接続します。ESP32では3系統のシリアルを使うことができますが、16番ピンと17番ピンの組み合わせのものを使います(表3)。また、DFPlayer Miniの「SPK1」と「SPK2」のピンにスピーカーを接続します。

図3 アラーム時計本体の配線

図2 アラーム時計本体の配線

 

ESP32のピン 液晶ディスプレイのピン
5V VCC
GND GND
5 CS
4 RESET
2 DC
23 MOSI
18 SCK
19 MISO

表1 ESP32と液晶ディスプレイの接続

 

ESP32のピン DS3231のピン
5V VCC
GND GND
21 SDA
22 SCL

表2 ESP32とDS3231の接続

 

ESP32のピン DFPlayer Miniのピン
5V VCC
GND GND
16 TX
17 RX

表3 ESP32とDFPlayer Miniの接続

 

子機の配線

次に、子機も配線します。こちらの配線は図3のようになります。

ESP32にスイッチとLEDを接続するだけです。スイッチの片側をESP32の3V3のピンに接続し、もう片方を4番ピンに接続します。また、ESP32の13番ピンから、抵抗→LEDと経由して、GNDに接続します。

なお、スイッチの状態を読み取る回路では、本来ならプルアップ抵抗もしくはプルダウン抵抗を入れます。ただ、ESP32では内蔵の抵抗でプルアップ/プルダウンを行うことができますので、外付けの抵抗は省略します。

図4 子機の配線

図3 子機の配線

 

ライブラリとフォントファイルのインストール

配線ができたら、今度はプログラムを作っていきます。まず、以下の各ライブラリをインストールします。

  • Adafruit GFX
  • Adafruit ILI9341
  • RTCLib
  • DFRobotDFPlayerMini

インストールの手順は以下の通りです。

  1. Arduino IDEを起動します。
  2. 「スケッチ」→「ライブラリをインクルード」→「ライブラリを管理」メニューを選び、ライブラリマネージャを開きます。
  3. 「検索をフィルター」の欄に「Adafruit GFX」と入力します。
  4. ライブラリの一覧にAdafruit GFXが表示されますので、「インストール」ボタンをクリックします(図4)。
  5. 同じ要領で、各ライブラリを順にインストールします。

なお、RTCLibとDFPlayerのライブラリは、似たような名前の物が複数あります。RTCLibは「RTCLib by Adafruit」を、DFPlayerは「DFRobotDFPlayerMini by DFRobot」をインストールします。

図5 Adafruit GFXライブラリのインストール

図4 Adafruit GFXライブラリのインストール

また、時刻を大きな文字で表示するために、フォントファイルもインストールします。以下のZipファイルをダウンロードして解凍すると、「FreeSans40pt7b.h」というファイルができます。
Arduino IDEの標準のスケッチ保存先フォルダを開き、その中にある「libraries」→「Adafruit_GFX_Library」→「Fonts」フォルダを開いて、そこにフォントのファイルをコピーします。

 

アラーム時計本体のプログラム

次に、Arduino IDEでアラーム時計本体のプログラムを作り、ESP32に書き込みます。プログラムの内容はリスト1のようになります。

リスト1 アラーム時計本体のプログラム

ただし、17行目〜21行目は、以下のように書き換えることが必要です。

・17/18行目
お手持ちのWiFiルーターのSSID/パスワードに合わせて書き換えます。
・19行目
ESS32に割り当てるIPアドレスを指定します。お手持ちのWiFiルーターのネットワーク構成に合わせて、ご自分でIPアドレスを決めます。
なお、通常のIPアドレスは4つの数値をピリオドで区切りますが、この行では関数の引数の形になっていますので、4つの数値をコンマで区切ります。
・20行目
ネットワークのデフォルトゲートウェイのIPアドレスを指定します。通常はWiFiルーターのIPアドレスになります。IPアドレスの4つの数値はコンマで区切ります。
・21行目
子機のESP32に割り当てるIPアドレスに合わせて書き換えます。

例えば、表4のように設定したい場合、17〜21行目をリスト2のように書き換えます。

項目 設定値
WiFiルーターのSSID my_wifi
WiFiルーターのパスワード my_password
本体のESP32に割り当てるIPアドレス 192.168.1.101
デフォルトゲートウェイのIPアドレス 192.168.1.1
子機のESP32に割り当てるIPアドレス 192.168.1.102

表4 本体のネットワーク関係の設定の例

リスト2 17〜21行目の書き換えの例

const char *ssid = “my_wifi”;
const char *pass = “my_password”;
IPAddress ip(192, 168, 1, 101);
IPAddress gateway(192, 168, 1, 1);
const char* notify_url = “http://192.168.1.102/alarm”;

 

子機のプログラム

一方、子機のプログラムはリスト3のようになります。
なお、リストの5〜9行目は、アラーム時計本体と同じ要領で書き換えます。ただし、7行目には子機に割り当てるIPアドレスを指定します。また、9行目の「本体のIPアドレス」には、アラーム時計本体のIPアドレスを指定します。

リスト3 子機のプログラム

 

動作の確認

本体/子機ともにプログラムの書き込みが終わったら、動作を確認します。手順は以下の通りです。

  1. 32GB以下のmicroSDカードを用意し、「mp3」というフォルダを作ります。
  2. アラーム音に使いたいMP3ファイルを用意し、「0001.mp3」というファイル名を付けて、1のmp3フォルダに保存します。
  3. microSDカードをDFPlayer Miniに装着します。
  4. 本体および子機を起動します。
  5. しばらくするとWiFiなどの初期化が終わり、本体に現在の日時が表示されます。
  6. 本体/子機と同じネットワークにあるパソコンなどでWebブラウザを起動し、「http://本体のIPアドレス/」のアドレスに接続します。
  7. 写真4のようにWebブラウザにアラーム設定のフォームが表示されますので、時刻を指定して「アラーム設定」ボタンをクリックします。

    写真4 アラームの設定

    写真4 アラームの設定

  8. 「アラームを 10:00:00 に設定しました。」のようにアラームをセットした時刻が表示されます。
  9. アラームをセットした時刻に、本体で音が鳴ることを確認します。
  10. アラームをセットした時刻に、子機のLEDが点灯することを確認します。
  11. 子機のスイッチを押して、アラームが止まることを確認します。

なお、アラームの設定を解除するには、Webブラウザで「http://本体のIPアドレス/」のアドレスに接続し、「アラームOff」のボタンをクリックします。

 

まとめ

ESP32はWiFiでネットワークに接続することができます。インターネットに接続するのはもちろんのこと、今回の事例のように、ネットワーク内の機器同士の接続に使うこともでき、様々な電子工作に活用することができます。

Arduinoで「セルフ記者会見セット」を作ってみよう!

$
0
0

Arduinoでの電子工作をはじめるときに誰もが最初に行う「Lチカ」。チュートリアルを見ながら自分の手で書いたプログラムが初めて動く瞬間はめちゃめちゃ楽しいですよね。

この感動を友達や恋人、家族に伝えたいところですが、電子工作の空気感がわからないと「なんか…点滅しているねぇ…うん。」って温度差になりがちです。まあ実際そうですから仕方ない。

今回の記事では、電子工作をしたことがない方でも「面白い!」と言わざるを得ない、圧倒的非日常体験を提供するLチカデバイスを作っていこうと思います。

作品名は…「セルフ記者会見セット」です!

「おや…?聞いたことあるぞ…?」と思った方もいらっしゃるでしょう。
そう、Maker Faireでの出展で話題になっていたあの作品です。

セルフ記者会見セット – NEXT+α(ネクストアルファ)

マスコミの方々がいなくても、不祥事を起こさなくても、テレビでよく見るあの記者会見のフラッシュとシャッター音を浴びる体験できるというとんでもないデバイスです。
そんなクレイジーなデバイスを作ったのはこちらの4名のメンバー。

inoue hamada higuma matsumoto
井上 康平 濵田 佳祐 日隈 裕一朗 松本 康平

今回は作者の皆様にご承諾をいただきまして、セルフ記者会見セットを真似して作らせていただけることになりました!本当にありがとうございます!
(筆者もNEXT+αのメンバーの一人で、いろいろと作品を作っています)

本記事では、Arduinoを使って

  • 高輝度LEDを使った記者会見っぽいフラッシュの再現
  • MP3モジュールを使ったフラッシュ音の再生
  • 距離センサで誠意のこもったお辞儀の検出

を行っていき、解説を交えながら「セルフ記者会見セット」を製作します。

セルフ記者会見セットのレシピ

Arduino UNO Arduino UNO
MP3モジュール(Grove) MP3モジュール(Grove)
超音波センサ(HC-SR04) 超音波センサ(HC-SR04)
ACアダプター(9V 2A) ACアダプター(9V 2A)
カーボン抵抗 3kΩ カーボン抵抗 3kΩ
ユニバーサル基板 Bタイプ ユニバーサル基板 Bタイプ
自動車用LED(3W) 自動車用LED(3W)
ブレッドボード用DCジャックDIP化キット ブレッドボード用DCジャックDIP化キット
タクトスイッチ(黒色) タクトスイッチ(黒色)
Nch パワーMOSFET(R6015KNX) Nch パワーMOSFET(R6015KNX)
マイクロSDカード
スピーカー(USB給電)
タブレットスタンド

 

今回の記事の流れ

  1. 高輝度LEDを使った記者会見っぽいフラッシュの再現
  2. MP3モジュールを使ったフラッシュ音の再生
  3. 距離センサで誠意のこもったお辞儀の検出
  4. 全機能を統合して「セルフ記者会見セット」を作る

 

1. 高輝度LEDを使った記者会見っぽいフラッシュの再現

記者会見の主役と言うと語弊がありますが、セルフ記者会見セットで最も重要となるLEDの点滅です。
LEDの点滅は通常であればArduinoのデジタル出力ポートにLEDと抵抗を直列に接続するだけですが、今回は自動車に使われる3Wの高輝度LEDを使用するため通常よりも高い電圧を加えて、大きな電流(250mA程度)を流す必要があります。

自動車用LED(3W)

自動車用LED(3W)

少し大きな電流を制御するときにはバイポーラトランジスタがよく使われます。有名な型番のものだと「2SC1815」というNPN型のトランジスタがいろんなところで使われていますが、2SC1815はコレクタ電流の定格は150mAなので今回の要求となる250mAよりも残念ながら小さいです。そのため、もうちょっと大きな電流を流せるトランジスタを使う必要があります。

そこで今回はLEDのスイッチングには「パワーMOSFET」を使用します。
パワーMOSFETは、Arduinoを使った電子工作においては2SC1815のようなトランジスタと似たような使い方をすることができるスイッチング素子で、モータなどの大電流(数アンペア~数十アンペア級)を必要とするものを動かすときによく使われます。

NchパワーMOSFET R6015KNXは、ドレイン電流15Aまで使うことができる素子なので、今回の用途では明らかにオーバースペックですが、これを持っておけば今回のようなLEDやモータ、ソレノイドなど、いろんなものを動かすことができるのでいくつかストックしておくと便利です。

今回の回路で使う部品と、組み立てる回路の回路図・配線図は以下のとおりです。

  • Arduino UNO
  • 抵抗器3kΩ
  • Nch パワーMOSFET(R6015KNX)
  • 自動車用LED
  • DCジャック(DC9VのACアダプターを接続)
  • ACアダプター(9V 2A)

 

LED制御回路の回路図

LED制御回路の回路図

 

LED制御回路の配線図

LED制御回路の配線図

この回路ではArduinoの8番ポートをHIGHにするとFETのスイッチングがONになりLEDが点灯し、LOWにするとLEDが消灯します。LEDは自動車用なので12Vを加えるのが一般的ですが、実験したところ9Vでも光ったので今回は9Vで点灯させることにしましょう。

LEDを点灯させてみたら、そこそこまぶしい。

LEDを点灯させてみたら、そこそこまぶしい。

このLEDをただLチカさせるだけなら「1秒点灯→1秒消灯」を繰り返せばいいのですが、今回作るのは「セルフ記者会見セット」です。記者会見っぽいフラッシュを作る必要があるのです。

記者会見っぽいフラッシュといえば、オリンピック選手がメダルを笑顔で見せたり、謝罪会見で「申し訳ありませんでした」と頭を下げたりしたときに一斉に焚かれるあの不規則な光の点滅。あれをプログラミングして再現してみましょう。

ソースコードは以下のとおりで、digitalWrite関数によってLEDのON/OFFを繰り返していますが、その点滅間隔のdelay関数の引数にrandom(10,50)を入れています。このrandom関数では10~50の間で整数をランダムに生成するので、delay関数で待機する時間は10ミリ秒~50ミリ秒の間のランダムな値になります。


これを実行してみると、不思議なことに「記者会見っぽいフラッシュ」を再現できるのです。

 

2. MP3モジュールを使ったフラッシュ音の再生

記者会見っぽいフラッシュは作ることができましたが、より記者会見っぽくするには音も再現したいところです。MP3再生モジュールを使って、「記者会見のシャッター音」の音声データを再生します。
今回の回路で使う部品と、組み立てる回路の配線図は以下のとおりです。

  • Arduino UNO
  • MP3モジュール(Grove)
  • マイクロSDカード(中に再生するMP3ファイルを入れる)
  • スピーカー(USB給電)
  • タクトスイッチ

まずはMP3モジュールで再生するMP3ファイルを準備します。
今回はフリーの効果音素材を使わせていただきます。下記リンクのウェブサイト「効果音ラボ」より「記者会見のシャッター音」をダウンロードします。
効果音ラボ – https://soundeffect-lab.info/

SDカードにMP3ファイルを保存するとき、ファイル名は「0001.mp3」にします。これによってMP3モジュールでファイルを指定できるようになります。

img5

MP3ファイルをSDカードに保存したら、MP3モジュールとタクトスイッチをArduinoに配線していきましょう。

MP3モジュール制御回路の配線図

MP3モジュール制御回路の配線図

6番ポートに接続しているタクトスイッチを利用して、「タクトスイッチが押されたら、音声データ0001.mp3を再生する」という動作のプログラムを作成します。MP3モジュールはシリアル通信によって制御することができ、Arduinoのソフトウェアシリアル機能を使って2番・3番ピンに接続して制御を行います。
MP3モジュールにはUSB給電のスピーカーを接続します。

MP3モジュール制御回路の外観

MP3モジュール制御回路の外観

ソースコードは以下のとおりです。

これでMP3ファイルを再生できるようになりました。

 

3. 距離センサで誠意のこもったお辞儀の検出

記者会見っぽいフラッシュの再現、記者会見のシャッター音の再生はできるようになりました。
しかし記者会見には重要な要素がもう一つあります。

そう、「誠意のこもったお辞儀」です。

記者会見と言いつつ、もうすでに「謝罪会見」にターゲットが絞られてしまっていますが、まあ良しとしましょう。祝福の会見もなんとかすればきっと適応できます。
誠意のこもったお辞儀の検出には「超音波センサ」を使います。超音波センサによってお辞儀をする人の頭とセンサ間の距離を測定し、お辞儀したことを検出することを目指します。

今回の回路で使う部品と、組み立てる回路の配線図は以下のとおりです。

  • Arduino UNO
  • 超音波センサ HC-SR04

 

超音波センサ制御回路の配線図

超音波センサ制御回路の配線図

超音波センサHC-SR04はTrig端子にトリガー信号を入力するとセンサから超音波が出力され、それが対象物で反射してセンサに音波が帰ってくるまでの時間を計測することで距離を測定することができます。

超音波センサ制御回路の外観

超音波センサ制御回路の外観

以下のソースコードでは、Trig端子へのトリガー信号入力、Echo端子からの音波到達時間(単位:マイクロ秒)の取得を行い、対象物との距離(単位:cm)を算出してシリアルモニタに表示する動作が行われます。

これで物体との距離を計測できることがわかりました。
会見をする人の頭に超音波センサを向ければ、誠意のこもったお辞儀を検出できそうですね。

 

4. 全機能を統合して「セルフ記者会見セット」を作る

これまでのプロトタイピングを通して以下の3つを試作することができました。

  • 高輝度LEDを使った記者会見っぽいフラッシュの再現
  • MP3モジュールを使ったフラッシュ音の再生
  • 距離センサで誠意のこもったお辞儀の検出

これら3つの機能を統合することで「セルフ記者会見セット」は完成します。
統合する際にそのままブレッドボードを使用しても作ることができますが、今回は写真・動画撮影の都合によりユニバーサル基板に回路や端子の配線を行いました。また、フラッシュの光量を増やすためにLEDも4つ取り付けることにしました。

作成したユニバーサル基板の回路

作成したユニバーサル基板の回路

ソースコードは以下のとおりです。

60cm以内の距離に対象物を検知(誠意のこもったお辞儀を検知)したら、カメラのシャッター音のMP3再生と記者会見っぽいフラッシュを行うようにプログラムしています。

誠意のこもったお辞儀を検出するには超音波センサをうまいこと頭に向ける必要があります。今回は百円ショップ等で購入できるタブレットスタンドを使っていいかんじに設置してみようと思います。

百円ショップ等で購入できるタブレットスタンド

百円ショップ等で購入できるタブレットスタンド

完成した「セルフ記者会見セット」の姿が…
こちらです!

image5

 

超音波センサは謝罪する人の頭を検知する向きに設置します

超音波センサは謝罪する人の頭を検知する向きに設置します

それでは早速、謝罪してみましょう。
謝罪って気が進まないはずなのですが、今は妙にワクワクします。

うまくできましたね!謝罪会見!
誠意のこもったお辞儀の検出もバッチリです。
このセルフ記者会見セットを使って謝罪をすれば、冷蔵庫のプリンを勝手に食べたこともきっと許してもらえるでしょう。

Aruduino Megaで電子工作!FeliCaリーダーで入退室記録システムを作ろう

$
0
0

今回は、「FeliCa」を使って、ある場所の入退室時刻を記録するようなものを作ってみたいと思います。これがあれば、会社や研究室などに誰が何時に出入りしているのか?、FelicaやSuicaをかざすことで記録できるようになります!
今回作るのは、部屋に入ったり出たりする際に、FeliCaリーダーにFeliCaカードやFeliCa対応のスマートフォンなどをタッチすると、その時の日時をSDカードに保存する、というものです。

■今回の電子工作レシピ

完成までの時間目安:120分

名前 購入元 値段
Arduino Mega 2560 Rev.3 Amazonなど 純正品は6,000円前後
互換品で代用可能(1,200円~1,500円)
FeliCa リーダー・ライター RC-S620S スイッチサイエンス 3,600円
FeliCa RC-S620S/RC-S730 ピッチ変換基板のセット(フラットケーブル付き) スイッチサイエンス 540円
FeliCaカード Amazonなど 5枚組で1,500円程度
FeliCa内蔵のクレジットカードやスマートフォンで代用可能
20文字×4行キャラクタ液晶ディスプレイ
(I2C接続アダプタ付き)
Amazonなど 900円前後
DS3231モジュール Amazonなど 300円前後
LIR2032(ボタン充電池) Amazonなど 360円程度
SDカードリーダーモジュール Amazonなど 150円程度
基板取付用スピーカー 秋月電子通商 50円

※上記のほかに、LED3個、100~200Ω程度の抵抗3個も必要です

完成図

写真1 完成図

■目次

Arduino Megaで作る、“FeliCa入退室記録システム”

NFCとは何か? NFCの1つの規格である「FeliCa」
●NFCの基本
●NFCの1つの規格であるFeliCaとは
●個々のFeliCaカード等を識別する「IDm」

FeliCaリーダー・ライターRC-S620Sについて

Arduino MegaとRC-S620Sなどを接続する
●今回使う「Arduino Mega 2560」

プログラムの作成と動作
●接続の手順
●RC-S620Sのライブラリの準備
●LiquidCrystal_I2Cライブラリのインストール
●プログラムの書き込み
●RTCの日時を合わせる
●IDmとユーザー名の登録
●入退室日時のファイルを扱う

まとめ

Arduino Megaで作る、“Felica入退室記録システム”

カードの持ち主ごとに、入室時刻と退出時刻を記録できるシステムを作ります。
それぞれの日で、1回目にタッチした時刻を「入室時刻」、また、最後にタッチした時刻を「退室時刻」として保存します。さらに、複数のFeliCaカードなどを識別し、それぞれの持ち主の入退室時刻を別々に保存します。FeliCaカードなどには「IDm」という識別情報が記録されていて、それによってそれぞれのカードなどを識別します。
SDカードには、日ごとにCSV形式でデータを保存します。Excel等でそのファイルを読み込んで、入退室の時刻を見ることができます。

下記の動画は、実際に動作させたところです。2枚のFeliCaカードと、1枚のSuicaクレジットカードを使っています。また、FeliCaカード2枚のうち、1枚は持ち主の情報をプログラムに登録していない状態にしています。

持ち主を登録してあるカードでタッチすると、1回目のタッチでは入室(Enter)、2回目のタッチでは退室(Leave)として認識し、液晶ディプレイに結果を表示し、その日時をSDカードに記録します。また、持ち主を登録していないカードでタッチすると、「Unknown user」と液晶ディスプレイに表示します。

 

NFCとは何か? NFCの1つの規格である「FeliCa」

今回の工作でキーとなるのが、「FeliCa」です。工作に入る前に、まずはFeliCaの概要を理解しておきましょう。

●NFCの基本

FeliCaは「NFC」(Near Field Communication)の一種ですので、まずNFCについて解説します。
私たちの生活の中で、様々な「ICカード」が使われています。ICカードは、カードにICが内蔵されていて、情報が保存されているものです。クレジットカードやキャッシュカードなど、様々な分野のICカードがあります。
ICカードには、リーダーと接触させて使うもの(接触型)と、リーダーに近づけて無線で通信するもの(非接触型)があります。
非接触型のICカードは、通信距離によって「密着型」「近接型」「近傍型」などの種類があり、それぞれに国際規格があります。このうちの、「近接型」のICカードで使われている通信方式のことを、狭義に「NFC」と呼んでいます。

●NFCの1つの規格であるFeliCaとは

NFCは、複数のメーカーがそれぞれで開発を進めたことから、規格が複数あります(表1)。FeliCaもその中の1つです。
Type-A/Type-B/FeliCaともに、「ISO/IEC 14443」という国際規格に沿っています。通信距離は10cm以下で、13.56MHzの周波数で通信するという点は共通しています。しかし、変調方法や符号化方法がそれぞれ異なります。
FeliCaとType-Aは似た規格ですが、FeliCaはType-Aよりも通信速度が速く、セキュリティも高いというメリットがあります。しかし、その分高価なため、本記事執筆時点では、残念ながら世界的にはあまり普及していません(世界全体でみるとType-Aが普及)。しかし、日本国内では電子マネーなどで非常に普及しています。
また、AppleのiPhone 8以降では、世界標準モデルにFeliCaが搭載されています。そのため、今後は国外でもFeliCaが広く使われるようになる可能性があります。

名前 メーカー 日本での用途
Type-A(MIFARE) NXPセミコンダクターズ taspo
テレホンカード
Type-B モトローラ マイナンバーカード
ICカード運転免許証
FeliCa ソニー 交通系ICカード(Suicaなど)
電子マネー(楽天Edy、nanacoなど)
おサイフケータイ

表1 NFCの規格

●個々のFeliCaカード等を識別する「IDm」

FeliCaカードなどにはFeliCaのICチップが内蔵されています。そのICチップには、「IDm」という固有の値が保存されています。IDmは8バイトのデータで、他のFeliCaのICチップと重複しない値が記録されています。また、IDmを書き換えることは不可能です。そのため、IDmを使って、個々のFeliCaカードなどを識別することができます。

 

FeliCaリーダー・ライターRC-S620Sについて

Arduinoなどの電子工作でFeliCaを扱う際には、ソニーの「RC-S620S」というFeliCaリーダー・ライターを使うことが一般的です(写真2)。基板の上にFeliCaカードなどをかざすと、そのFeliCaカードの情報を読み書きすることができます。
また、ソニーからArduino用のライブラリが公開されていますので、それを使ってプログラムを作ることができます。

写真2

写真2 FeliCaリーダー・ライター「RC-S620S」(SONY)

RC-S620Sは「FFC」(Flexible Flat Cableの略)というフィルム状のケーブルで他の機器と接続するようになっています。ただ、ケーブルの中に0.5mm間隔で電線が通っていて、人間が手作業でArduinoなどに接続するのはかなり難しいです。
そこで、「ピッチ変換基板」というものを使って、ブレッドボードに刺せるようにします。ピッチ変換基板には、FFCを差し込むコネクタとピンヘッダがあり、基盤上で両者の間が接続されています。これで、ピンヘッダをブレッドボードに刺して使えるようになります。
RC-S620Sと変換基板は、どちらもスイッチサイエンスで販売されています。

・RC-S620S
・FeliCa RC-S620S/RC-S730 (フラットケーブル付き)

ピッチ変換基板は、買ってきたばかりの状態(写真3)では、ピンヘッダが基板に半田付けされていませんので、自分で半田付けします。

写真3

写真3 FeliCa RC-S620S/RC-S730 ピッチ変換基板のセット(フラットケーブル付き)

その後、RC-S620Sとピッチ変換基板との間を、FFCで接続します。FFCの片面の両端が青くなっていますが、その面を上にして接続します(写真4)。

RC-S620S側は、FFCを少しずつスライドさせてコネクタに差し込んでいきます。FFCの青い部分はFFC本体に貼り付けられているような感じになっていて、指の爪が少しひっかかります。爪で少しずつ押すようにすると、FFCがコネクタに入っていきます。

一方の変換基板側は、黒いロックを「SWITCHSCIENCE」の字の方に1mmほどずらして解除し、FFCを差し込んだ後、ロックを元に戻します。

写真4

写真4 RC-S620Sとピッチ変換基板を接続

 

Arduino MegaとRC-S620Sなどを接続する

RC-S620Sの準備ができたら、Arduinoと接続します。また、SDカードリーダーなども順に接続していきます。

●今回使う「Arduino Mega 2560」

Arduinoにはバリエーションが多数あり、最もよく使われているのは「Arduino Uno」です。しかし、今回はArduino Unoではなく、「Arduino Mega 2560」を使います(写真5)。

写真5 Arduino Mega 2560

写真5 Arduino Mega 2560

RC-S620SとArduinoとの通信では、115,200bpsのシリアルで接続します。Arduino Unoでもシリアル通信自体は可能ですので、Arduino Unoで作ることはできなくはありません。

ただ、Arduino Unoで115,200bpsのシリアル通信を行うには、「ハードウェアシリアル」(0番ピンと1番ピンを接続)を使う必要があります。任意のピンで接続する「ソフトウェアシリアル」もありますが、ソフトウェアシリアルでは115,200bpsでの高速な通信を安定して行うことができません。

ハードウェアシリアルは、パソコンからプログラムを書き込むときにも使われますし、シリアルモニタでも使われます。そのため、RC-S620SをハードウェアシリアルでArduino Unoに接続する場合、プログラムの書き込みの際にはRC-S620Sの接続を外す必要がありますし、RC-S620Sの動作中にはシリアルモニタを使えなくなってしまいます。このようなことから、RC-S620Sを使って何かを作る場合、Arduino Unoでは不便があります。

一方、Arduino Mega 2560では、0/1番ピンを使うハードウェアシリアルの他に、3系統のハードウェアシリアルを使うことができます。そのため、Arduino Unoとは異なり、RC-S620Sを接続したままで、プログラムを書き込んだり、シリアルモニタを使ったりすることができます。

●接続の手順

今回作る物での接続は、図1のようになります。接続するものが複数ありますので、順番に接続していきます。また、5VとGNDは複数の部品で使いますので、Arduino Mega 2560の5VとGNDを、ブレッドボードの+/−のラインに接続して、そこから各部品に接続するようにします。

図1

図1

まず、メインとなるRC-S620S(の変換基板)と、Arduino Mega 2560の間を接続します。変換基板にはピンが6本ありますが、そのうちの1本は使われていないので、残り5本を接続します。
変換基板にはピンの名前が表示されていませんが、実際には図2のようになっています。これらのピンとArduino Mega 2560の間を、表2のように接続します。

図2

図2

Arduino Mega 2560 ピッチ変換基板
5V VDD
GND GND
TX1(18番) RXD
RX1(19番) TXD

表2 Arduino Mega 2560とピッチ変換基板の接続

タッチ状態の表示などは、20文字×4行のキャラクタ液晶ディスプレイで行います。本来は16本のピンを接続するものですが、それでは面倒なので、I2C接続のアダプタ付きの物を使い、表3のように接続します。

Arduino Mega 2560 キャラクタ液晶ディスプレイ
5V VCC
GND GND
SDA(20番) SDA
SCL(21番) SCL

表3 Arduino Mega 2560とキャラクタ液晶ディスプレイの接続

入退室管理では、入退室の日時を記録することが必要です。Arduino Mega 2560にはRTC(リアルタイムクロック)の機能はなく、電源を入れると内蔵のクロックが初期化されるので、RTC(DS3231のモジュール)も別途接続します(表4)。なお、RTCについては前回の記事(ESP32とRTCで「二度寝防止アラーム時計」を作ろう!)もご参照ください。

SDAとSCLはキャラクタ液晶ディスプレイにも接続しますので、Arduino Mega 2560のSDA/SCLからのジャンプワイヤをいったんブレッドボードに接続し、そこからキャラクタ液晶ディスプレイ/RTCの両方に接続するような形を取ります。

Arduino Mega 2560 RTC
5V VCC
GND GND
SDA(20番) SDA
SCL(21番) SCL

表4 Arduino Mega 2560とRTCの接続

入退室の日時はSDカードに保存しますので、SDカードリーダーモジュールも接続します。接続は表5の通りです。

Arduino Mega 2560 SDカードリーダーモジュール
5V +5
GND GND
50番 MISO
51番 MOSI
52番 SCK
53番 CS

表5  Arduino Mega 2560とSDカードリーダーモジュールの接続

最後に、スピーカーとLEDを接続します。スピーカーは、FeliCaをタッチしたときに音を出すために使います。また、LEDはタッチされたときの状態(入室/退室/エラー)を表すために使います。
Arduino Megaの2番ピンにスピーカーの片側を接続し、もう片側をGNDに接続します。また、Arduino Megaの3〜5番ピンのそれぞれから、抵抗→LED→GNDと順に接続します。

 

プログラムの作成と動作

ハードができたところで、プログラムを書き込んで動作させます。

●RC-S620Sのライブラリの準備

RC-S620Sのライブラリは、ソニーから配布されています。
こちらからダウンロードすることができます。

Arduinoのライブラリのフォルダに、「RC-S620S」というフォルダを作り、その中にダウンロードしたZipファイルの中身を解凍します。ライブラリのフォルダは、通常は以下になっています。

・Windowsの場合
「ドキュメント」 > 「Arduino」 > 「libraries」
・Macの場合
「書類」 > 「Arduino」 > 「libraries」

ただ、このライブラリは2010年11月にリリースされた古いもので、またArduino Unoを前提としているので、そのままではArduino Mega 2560の2系統目のハードウェアシリアルで動作させることができません。
そこで、「RC-S620S」フォルダにある「RCS620S.cpp」ファイルの以下の各箇所を書き換えます。10行目では「Wprogram.h」を「Arduino.h」に変えます。残りの行では、「Serial」を「Serial1」に変えます。

書き換え前 書き換え後
10 #include “Wprogram.h” #include “Arduino.h”
312 Serial.write(data, len); Serial1.write(data, len);
327 if (Serial.available() > 0) { if (Serial1.available() > 0) {
328 data[nread] = Serial.read(); data[nread] = Serial1.read();
338 Serial.flush(); Serial1.flush();

表6 RCS620S.cppの書き換え箇所

●LiquidCrystal_I2Cライブラリのインストール

キャラクタ液晶ディスプレイに状態を表示するために、「LiquidCrystal_I2C」というライブラリをインストールします。手順は以下の通りです。

  1. Arduino IDEで「スケッチ」 > 「ライブラリをインクルード」 > 「ライブラリを管理」メニューを選び、「ライブラリマネージャ」を開きます。
  2. ライブラリマネージャ右上の入力欄に「LiquidCrystal」と入力します。
  3. ライブラリが多数検索されますので、その中の「LiquidCrystal I2C by Fcank de Brabander」のライブラリを選び、「インストール」ボタンをクリックします(図3)。

 

図3

図3

 

●プログラムの書き込み

ライブラリの準備ができたら、Arduino IDEにリスト1のプログラムを入力し、「ツール」 > 「ボード」メニューで「Arduino/Genuino Mega or Mega 2560」を選んでから、「スケッチ」 > 「マイコンボードに書き込む」メニューでArduino Mega 2560に書き込みます。
なお、書き込みが終わってもキャラクタ液晶ディスプレイに何も表示されないときは、11行目の最後にある「0x3F」を「0x27」に変えて、再度書き込みます。
【ダウンロード】書き込むプログラム[リスト1]

●RTCの日時を合わせる

今回作った物では、Arduino Mega 2560の電源を切っても日時を刻み続けるように、RTCを取り付けています。RTCの日時を合わせるには、日時を入れたファイルをSDカード保存しておき、起動時に読み込むという仕組みを取ります。手順は以下の通りです。

  1. Arduino Mega 2560の電源を切ります。
  2. SDカードリーダーからSDカードを取り出し、パソコンに差し込みます。
  3. SDカードに「TIME.TXT」という名前のファイルを作り、「YYYY/MM/DD hh:mm:ss」という形式で合わせたい日時を入れます。
  4. SDカードをSDカードリーダーに戻します。
  5. Arduino Mega 2560の電源を入れます。

例えば、TIME.TXTファイルに「2019/01/23 01:23:45」と入れておくと、RTCの日時を2019年1月23日1時23分45秒に設定することができます。

●IDmとユーザー名の登録

このプログラムでは、複数のFeliCaカード等の情報を登録して、それぞれの持ち主の入退室日時を記録するようになっています。登録されていないfeliCaカード等でタッチしても、入退室日時は記録されません。

FeliCaカード等の情報を登録するには、それぞれのIDmを調べ、IDmと持ち主の対応の情報をプログラムに記述します。
まず、Arduino Mega 2560をUSBケーブルでパソコンにつなぎ、Arduino IDEで「ツール」 > 「シリアルモニタ」メニューを選んで、シリアルモニタを開きます。

この状態で、未登録のFeliCaカード等をRC-S620Sにタッチすると、シリアルモニタに「Unknown FeliCa: IDm = XXXXXXXXXXXXXXXX」のように表示されます(「XXXXXXXXXXXXXXXX」は16桁の16進数)。使いたいそれぞれのFeliCaカード等をタッチして、それぞれのIDmを調べ、メモしておきます。
その後、リスト1の13行目〜21行目の部分を書き換えて、FeliCaカード等のIDmと、その持ち主の名前を対応させます。名前はアルファベット19文字以下で指定します。
リスト1ではFeliCaカード等を3つ使う前提になっていますが、数を増やしたい場合は、IDm004、IDm005…やname004、name005…などの定数を追加し、またIDmsとnamesの配列にそれらの定数も追加します。

例えば、IDmと持ち主の対応を表8のようにしたい場合、リスト1の13行目〜21行目をリスト2のように書き換えます。

IDm 持ち主
0111111111111111 Yamada
012222222222222 Tanaka
0133333333333333 Suzuki
0144444444444444 Takahashi
0155555555555555 Sato

表8 IDmと持ち主の対応の例

 

const char IDm001[] PROGMEM = “0111111111111111”;
const char IDm002[] PROGMEM = “0122222222222222”;
const char IDm003[] PROGMEM = “0133333333333333”;
const char IDm004[] PROGMEM = “0144444444444444”;
const char IDm005[] PROGMEM = “0155555555555555”;
const char* const IDms[] PROGMEM = { IDm001, IDm002, IDm003, IDm004, IDm005 };
const char name001[] PROGMEM = “Yamada”;
const char name002[] PROGMEM = “Tanaka”;
const char name003[] PROGMEM = “Suzuki”;
const char name004[] PROGMEM = “Takahashi”;
const char name005[] PROGMEM = “Sato”;
const char* const names[] PROGMEM = { name001, name002, name003, name004, name005 };

リスト2 表8のようにする場合のリスト1の書き換え方

●入退室日時のファイルを扱う

入退室日時の情報は、日ごとにSDカードに保存されます。ファイル名は「YYYYMMDD.CSV」のような形になります。例えば、2019年1月23日の入退室日時の情報は、「20190123.CSV」というファイル名で保存されます。
CSVファイルの各行は、以下のような形式になっています。ExcelでCSVファイルを開けば、中身を見ることができます。
IDm,持ち主の名前,入室日時,退室日時
なお、SDカードの中身を見る際には、Arduino Mega 2560の電源を切ってから、SDカードを抜くようにします。

まとめ

ソニーのRC-S620Sを使うと、FeliCa対応のICカードやスマートフォンなどを認識することができます。IDmの情報を使って、特定のICカード等だけを認識させることもできます。
今回の例ではタッチした日時をSDカードに保存しましたが、他の動作に応用することも考えられます(例:電化製品の電源を入れる、サーボモータで鍵を回す、etc.)。皆さんも試してみてください。


Arduino Nanoでチェーンプログラムロボットを動かそう(前編:構想〜パーツ組み立て)

$
0
0

タミヤさんといえば、プラモデルのメーカーとして有名ですよね。作ったことがある、という方も多いのではないでしょうか。そんなタミヤのプラモデル、実はマイコンを組み込んでさらに複雑な動きができるロボットにパワーアップできることはご存知ですか?
今回は、昨年12月に発売された、タミヤの「チェーンプログラムロボット」をArduino Nanoで制御してみたいと思います。前編(当記事)では、今回の電子工作の構想部分と、土台〜頭の組み立てまでを行なっていきます。

■今回の電子工作レシピ

完成までの時間目安:300分(前後編合わせて)

名前 購入元 値段
Arduino Nano Amazonなど 純正品は2,800円前後
互換品で代用可能(400円程度)
チェーンプログラムロボット工作セット Amazonなど 定価3,400円
サーボモータSG90 Amazonなど 秋月電子通商で1個400円
Amazonで10個組が2,100円程度
BD65496MUV搭載モータドライバ(2個) スイッチサイエンス 1個637円
WS2812B(2個) akiba LED ピカリ館 10個380円
PP-006NH(006P電池ボックス) ヨドバシカメラなど 200円程度
電池ボックス 単3電池3本 Bスナップ 秋月電子通商 50円
ジャンパーワイヤ付バッテリースナップ(2個) 秋月電子通商 1個40円
ユニバーサルプレートセット タミヤショップオンラインなど 388円
006P乾電池 電気店・100均ショップなど 1個100~300円程度

※上記のほかにジャンプワイヤが必要。

■目次

●タミヤから「チェーンプログラムロボット」が新発売
●全体の構想を決める(制御方法・パーツの組み立て等)
●サーボモータの位置合わせ
●チェーンプログラムロボットの組み立てと加工

タミヤから「チェーンプログラムロボット」が新発売

今回使う「チェーンプログラムロボット工作セット」は、その名前の通り、チェーンで動きを決められるロボットです。チェーンには前進/右折/左折の3種類があり、それらをプログラムのようにつないで動きを決めることができます。

チェーンプログラムロボットの製品紹介ページには、「市販のマイコンボードや基板を組み込むことで、機械的なプログラムからコンピュータによるプログラムへ発展させることもできます」と記載がありました。

そう言われると、やはり「電子工作で制御してみたい」という気持ちになってきます…!ただ、「市販のマイコンボードや基板を組み込む」ことについて、具体的な手順は説明書には何も書かれていません。そのためどう工夫するか、頭を悩ませるのもまた醍醐味です。ということで、実際に筆者がチャレンジしてみた内容をお届けします。

以下は今回の完成版となるロボットの動画です。もともとのチェーンプログラムロボットに対して、以下の改造を行いました。

・モータの回転方向や速度の制御をArduino Nanoで行います。
・頭の部分をサーボモータで制御します。
・目の部分にフルカラーLEDを取り付け、自由な色で点灯させます。

今回の電子工作を通して、DCモータとサーボモータの制御もおさらいしてみましょう。また、プラモデルがベースなので、お子様がいる方は一緒に楽しむのも良いと思います。

また、他社の同様なロボットと比較すると、タミヤの「楽しい工作シリーズ」の他のパーツを使ったり、マイコンを他の物に変えたりして、さらに改造しやすいというメリットがあります。ちなみに、筆者は2号機も作っています。マイコンをESP32に変えて、WiFiで制御するようにしました。また、前輪をスポーツタイヤ、後輪をボールキャスターに変えて、よりスムーズに方向転換するようにしました。

全体の構想を決める(制御方法・パーツの組み立て等)

チェーンプログラムロボットはプラモデルなので、買ってきたばかりの状態では、一般的なプラモデルと同様に、パーツに分かれた状態になっています(写真1)。この時点で、いきなりArduinoを組み込む方法を考えるのは、なかなか難しいです。

写真1 チェーンプログラムロボットを組み立てる前の状態

写真1 チェーンプログラムロボットを組み立てる前の状態

そこで、一度本来の手順で作ってみて、どこをどう改造するかを考えました。いろいろと試行錯誤した結果、最終的に以下の形に行き着きました。

●制御はArduino Nanoで行う
チェーンプログラムロボットの胴体の部分には空きスペースがあり、そこにマイコンボードを入れることができます。ただ、一般的によく使われているArduino Unoだと、それだけでスペースを占有してしまい、改造するのが難しくなります。

そこで今回は、より小さなArduinoである「Arduino Nano」を使うことにしました(写真2)。

写真2 Arduino Nano

写真2 Arduino Nano

Arduino Nanoは、仕様的にはArduino Unoとほぼ同じでありながら、4.5cm×1.8cmと非常に小さい製品です。しかも、ブレッドボードに直接に刺すことができ、ブレッドボート上でコンパクトに配線することができます。
なお、Arduino NanoのUSBポートはminiBタイプになっています。そのため、パソコンと接続する際には、A→miniBのUSBケーブルを使います。

●左折/右折はモータの速度調節で対応
チェーンプログラムロボットは、本来はチェーンの組み合わせ方で前進/右折/左折を切り替えるようになっています。右折/左折のチェーンがロボットの中を通ると、内部のレバーを左右に押して後輪の向きを変えるという仕組みです。

今回はこの部分をArduinoで制御できるようにするのは、残念ながらあきらめました。レバーをサーボモータやステッピングモータで動かすことが考えられますが、限られたスペースにそれらのモータを取り付けてレバーを動かせるようにするのは難しいという判断です。

ただ、左右の前輪は別々のモータで動かすようになっています。そこで、曲がるときには左右のモータの回転速度を変えるという方法を取ることにしました(左折するときは右のモータを速く回し、右折するときには左のモータを速く回す)。これなら、モータにかける電圧を制御すれば良いので、Arduinoで比較的簡単に行うことができます。

モータの制御には、スイッチサイエンスで販売されている「BD65496MUV搭載モータドライバ」を使いました。ブレッドボードに刺して使うことができます。

写真3 BD65496MUV搭載モータドライバ

写真3 BD65496MUV搭載モータドライバ

●目をLEDで光らせる
ロボットの顔の部分を見てみると、目の位置に穴があいており、直径5mmのLEDをはめ込むのにちょうど良い大きさになっています。そこで、LEDを取り付けて、目を光らせることにします。

一般的なLEDでも良いですが、それだといわゆる「Lチカ」と同じでいまいち面白みに欠けます。そこで、目の色を自由に変えられるようにしてみました。フルカラーのLEDはいろいろありますが、その中でもよく使われている「WS2812B」を使うことにします(写真4)。

写真4 WS2812BのLED

写真4 WS2812BのLED

WS2812Bは、電源(5VとGND)とデータ線の3本をマイコンに接続して制御することで、フルカラーで光らせることができるLEDです。第50回「フルカラーLEDテープを使ったちょっとお洒落な電子工作」で使用しているLEDと同じです。
LEDテープのように、複数のWS2812Bを数珠繋ぎに接続することもでき、その場合も電源とデータ線だけでArduino Nanoと接続することができるので、少ないピンでも制御しやすいメリットがあります。

●首振りをサーボモータで調節
チェーンプログラムロボットでは、動いている間は頭を左右に振るような仕組みになっています。とはいえ、摩擦を生かしたシンプルな仕組みで、首の振り方を細かく制御するようにはなっていません。

首の後ろのあたりを見てみると、23mm×12mmの四角い穴と、その両端にネジ穴が開いています(写真5)。

写真5 首の後ろにある穴

写真5 首の後ろにある穴

この穴をよくよく見ると、小型のサーボモータを取り付けるのにぴったりです。これは、「サーボモータで首振りを制御せよ」という、タミヤからの「お告げ」なのではないでしょうか…?!(実際のところはわかりませんが、)それに従ってみることにしました。
サーボモータにもいろいろありますが、今回はプラスチックのごく軽い首を振るだけなので、トルクは小さくても大丈夫です。安いサーボモータの中でよく見かける「SG90」を使います(写真6)。

写真6 SG90

写真6 SG90

サーボモータの位置合わせ

サーボモータで首を振るようにするために、あらかじめサーボモータ(SG90)の位置合わせを行っておきます。SG90は、0度〜180度の範囲で回転するようになっています。そこで、中央の90度まで回した状態にし、それを正面とすることにして、後で頭を取り付ける際に位置合わせしやすいようにします。

Arduino NanoとSG90を図1のように接続し、リスト1のプログラムを書き込んで動作させれば、90度まで回ります。そのままArduino NanoからUSBケーブルを抜いて電源を切り、90度まで回ったままにします。なお、Arduino Nanoにプログラムを書き込む際には、以下の手順を取ります。

①パソコンとArduino NanoをUSBケーブルで接続します。
②「ツール」→「ボード」メニューで「Arduino Nano」を選びます。
③「ツール」→「シリアルポート」メニューで、Arduino Nanoを接続したシリアルポートを選びます。
④「ツール」→「プロセッサ」メニューに「ATMega328P(Old Bootloader)」という項目がある場合は、それを選びます。
⑤「スケッチ」→「マイコンボードに書き込む」メニューを選びます。

図1 Arduino Nanoとサーボモータの接続

図1 Arduino Nanoとサーボモータの接続

リスト1 サーボモータを90度まで回す

チェーンプログラムロボットの組み立てと加工

改造の方針が決まったところで、それに適した形になるようにチェーンプログラムロボットを組み立て、改造するための加工も行っていきましょう。

●モータとスイッチのリード線の加工
部品の中に、モータ(2個)とスイッチがあります。モータは前輪を回すのに使われます。また、スイッチは電源のON/OFFに使われます。

モータとスイッチには電線がはんだ付けされていますが、先端部分はリード線がむき出しの状態になっています。改造の際にはこれらの線をArduinoに接続しますが、リード線のままだとブレッドボードに差し込みにくく、しかも抜けやすいです。

そこで、リード線にジャンプワイヤをつないで、ブレッドボードに接続しやすいように加工しておきます。ジャンプワイヤの片方の端を切り落とし、被覆を1.5cmほど剥きます(写真7)。また、モータ/スイッチからの電線も、被覆を若干剥いて、リード線が1.5cmほど出ている状態にします。そして、モータ/スイッチからのリード線と、ジャンプワイヤのリード線とを、より合わせてつなぎます。最後に、より合わせた部分をビニールテープなどで覆って、リード線が外に出ていないようにします。なお、筆者はより合わせた部分を熱収縮チューブで覆って、熱をかけて締めるようにしました。

写真7 片方の被覆を剥いたジャンプワイヤ

写真7 片方の被覆を剥いたジャンプワイヤ

●LEDの加工
ロボットの目をLEDで光らせるために、WS2812BのLEDを使います。
WS2812Bには4本のピンがあります。最も長いピンが右から2番目になるようにすると、右から順にDATA OUT/VDD/GND/DATA INのピン配置になります(図2)。

図2 WS2812Bのピン配置

図2 WS2812Bのピン配置

また、図2の向きにすると、LEDの右側面はほぼ平らになっている一方、左側面はでっぱりがありますので、それでLEDの左右を判別することもできます。

VDD/GNDは、Arduino Nanoの5V/GNDのピンに接続します。そして、DATA INをArduino Nanoのデジタルピン(2〜13番のどれか)に接続して、制御用の信号を送ります。さらに、VDDとGNDの間には0.1μFのセラミックコンデンサも入れます。

また、複数のWS2812Bを制御する場合、隣り合ったWS2812BのDATA OUT/DATA INを数珠繋ぎに接続します(図3)。

図3 複数のWS2812Bを制御する場合の接続方法

図3 複数のWS2812Bを制御する場合の接続方法

今回の例では、左右の目の両方をWS2812Bにしますので、WS2812Bを2つ接続します。2つのWS2812Bのそれぞれで、ピンを幾分切って長さをそろえます。VDDとGNDの足には、セラミックコンデンサの足をまきつけます。そして、それぞれのVDD/GNDのピンと、片方のDATA INに、片側の被膜を剥いたジャンプワイヤをまきつけ、絶縁テープなどで覆います。また、DATA INに線を接続した方のWS2812BのDATA OUTと、もう片方のWS2812BのDATA INの間も、両端の被膜を剥いたジャンプワイヤで接続します。

そして、チェーンプログラムロボットの目の部分のパーツ(「A7」のパーツ)に、WS2812Bを接着します(写真8)。

写真8 2つのWS2812Bを目に接着したところ

写真8 2つのWS2812Bを目に接着したところ

なお、VDD/GNDにつなぐジャンプワイヤは、長さを最小限(10cm弱程度)にする必要があります。そうしないと、LEDが正しく点灯しない現象が起こります。筆者は最初は長い(20cm程度)ジャンプワイヤを使ったため、作業をやり直す羽目にあい苦労しました。
 また、カシメ用の工具を持っている方は、太目の電線(AWG20程度)を使ってジャンプワイヤを自作し、それをLEDのVDD/GNDに接続すると良いです。

●チェーンプログラムロボットの土台部分の組み立て
チェーンプログラムロボットの説明書では、組み立ての手順を1〜19に分けて説明しています。その中で、1〜9と、11〜13の手順を行って、ロボットの土台部分を組み立てておきます。

手順の10と19は頭の部分を取り付ける手順ですが、今回の改造では頭を最後に取り付けますので、今の段階では行いません。また、14〜18は電池やモータの配線に関係する部分ですが、これらの線はArduino Nanoに配線しますので、これも行いません。

組み立てを終えると、写真9のようになります。この時点で、左右の車輪に繋がっているモータに乾電池をつないでみて、左右それぞれの車輪が回ることを確認しておきます。

写真9 土台部分を組み立てたところ

写真9 土台部分を組み立てたところ

●頭の部分の組み立て
A8のパーツを加工したら、頭の部分を組み立てます。手順は以下の通りです。

①首の部分にあたるパーツ(「A9」のパーツ)の裏側に、サーボモータ付属の横長のサーボホーンをネジ止め(または接着)します(写真10、写真11)。ネジ止めする場合、A9のパーツの穴と、サーボホーンの穴とは位置があっていないので、両者の位置を合わせて、サーボホーンにキリなどで穴をあけます。
②目の部分を、頭の部分にあたるパーツ(「A6」のパーツ)にはめ込みます。
③3×8mmタッピングビスで、頭の部分を首の部分にネジ止めします(説明書の手順19を参照)。
④2×6mmタッピングビスで、スイッチをA8のパーツにネジ止めします。白い電線が「ON」の方になるように、スイッチの向きに注意します(説明書の手順15を参照)。
⑤SG90(サーボモータ)上の面を、A8のパーツの穴に裏側から通し、SG90付属のネジで固定します。
⑥SG90に頭の部分を取り付けます(写真12)。

写真10 A9のパーツ(右)と横長のサーボホーン(左)

写真10 A9のパーツ(右)と横長のサーボホーン(左)

写真11 A9とサーボホーンをネジ止めした状態

写真11 A9とサーボホーンをネジ止めした状態

写真12 頭の部分を組み立てたところ

写真12 頭の部分を組み立てたところ

今回は、
・電子工作の構想(Arduino Nanoでどのようにロボットを制御するか)
・土台・頭の組み立て
までをお届けしました。「早く動かしてみたい!」というところかと思いますが、残りの工作については後編でお届けします、次回をお楽しみにお待ちください。

ここWi-Fi飛んでる?目に見えるデバイスをつくってみた(前編)

$
0
0

エンジニアやその分野の学生の皆さんは、年末年始やお盆休みなどに実家に帰ると、ほとんどの方はパソコンやスマホに詳しい神対応サポートスタッフになりますよね。おすすめのパソコン、スマホの契約、年賀状の印刷やプリンターの準備、専門用語の解説…など、面倒だなと思いつつもちょっと楽しみながら家族のお悩みを解決していくのは帰省時の恒例行事と言っても過言ではありません。

そんな帰省中の会話でよくとんでくる質問といえば、「Wi-Fiって何?」は鉄板でしょう。
最近ではWi-Fiはそこら中に当たり前のように飛んでいる空気のような存在になってきましたが、馴染みがない方にとって目に見えないものを信じるというのは難しい話です。ひょっとしたら、お笑い芸人メイプル超合金さんの有名なネタ、「ここWi-Fi飛んでんな」も伝わりづらい方がいらっしゃるかもしれません。

Wi-Fiルーター。WANとLANの端子の間違いなんてありがちですよね。

Wi-Fiルーター。WANとLANの端子の間違いなんてありがちですよね。

そこで、今回はその辺に飛んでいるWi-Fiの電波がどれくらいたくさん飛んでいるのかを肉眼で見て感じることができるデバイスを作っていこうと思います。

完成イメージは大体こんなかんじで最初は考えました。

イメージスケッチ。手書きのスケッチを公開するのってちょっと恥ずかしいですね。

イメージスケッチ。手書きのスケッチを公開するのってちょっと恥ずかしいですね。

とにかく「Wi-Fiのマークをぶんぶん飛ばしたり振ったりすることで、Wi-Fiが飛んでいることを表現したい」という作者の気持ちが読者の皆さんに伝わったらOKです。
制作を進める中でアイデアが多少変わることはありますが、大筋この方針で試作を進めていきます。

この記事では、
・どんなシステムにするかを考えてみる
・M5Stackとは
・Wi-Fiをスキャンする
・モータドライバを動かしてみる

について解説していきます。

どんなシステムにするかを考えてみる

今回作るシステムは「Wi-Fiの電波を検知して、Wi-Fiマークがついたオブジェクトをとばす装置」です。
そのため、必要なシステム構成は以下の図のようになります。

system2

だいぶざっくりとしていますが、簡単にまとめると「Wi-Fi(電波)が入力されたら、Wi-Fiマークをぴょんぴょんさせる」ということですね。
こんなかんじのシステムを組んでいきますので、このあとでM5Stackを使ってWi-Fiを検知したり、モータドライバでアクチュエータを動かしたりしていきます。

M5Stackとは

M5StackはESP32を内蔵しており、USBポート・汎用入出力ポート・カラーディスプレイ・スピーカー・Groveコネクタ・SDカードスロット・Wi-Fi・Bluetoothなどが搭載されている非常に便利な開発モジュールです。
https://www.switch-science.com/catalog/3647/

M5Stack Basic

M5Stack Basic

初めてこれを見た方はちょっと難しそうって思うかもしれませんが、実はArduino IDEを使ってプログラムの開発ができ、M5Stackのライブラリも非常に使いやすく整えられているため簡単に導入することができます。

ライブラリのインストール方法などについては「M5Stack Arduino ライブラリ インストール」と検索するとたくさん情報が出てきますのでそちらをご参照ください。

Wi-Fiをスキャンする

まずはM5Stackで「ここWi-Fi飛んでんな」をするためにWi-Fiのスキャンをやってみます。
ソースコードは以下の通りです。
プログラムの書き込みをしたときにライブラリが見つからないようなエラーコードが出ていたら適宜ライブラリのインストールをしましょう。

これを実行すると、スキャンして見つかったWi-FiのアクセスポイントのSSIDやRSSIがM5Stackのディスプレイに表示されます。
※動画ではSSIDは「********」と伏せ字で表示させています。

モータドライバを動かしてみる

Wi-Fiを物理的に飛ばすためにモータか何かのアクチュエータを動かす必要がありますので、モータドライバをM5Stackにつないで動かしてみます。
今回使用するモータドライバはGroveのI2Cモータドライバです。
https://www.switch-science.com/catalog/827/
M5StackにはGrove対応のコネクタが標準搭載となっておりますので、これを買えばはんだ付けなどをしなくても簡単に接続することができます。

Grove I2Cモータドライバ

Grove I2Cモータドライバ

モータドライバに付属しているケーブルはM5Stackに対応しています。

モータドライバに付属しているケーブルはM5Stackに対応しています。

電源には乾電池を使用します。このモータドライバの電源電圧は6~15Vの範囲で使用することができますので、今回はニッケル水素充電池6本(7.2V)で動かしてみます。
なお、I2CモータドライバのJ4の部分のジャンパーピンは取り外した状態で動かすようにしましょう。
(参考: http://wiki.seeedstudio.com/Grove-I2C_Motor_Driver_V1.3/

全体の配線

全体の配線

モータドライバのところを拡大するとこんなかんじです。

モータドライバのところを拡大するとこんなかんじです。

今回はJ6から電源供給をするため、J4のジャンパーピンは外した状態にします。

今回はJ6から電源供給をするため、J4のジャンパーピンは外した状態にします。

今回使用するモータドライバのライブラリをインストールする必要があるので、Arduino IDEのメニューバーの[スケッチ]→[ライブラリをインクルード]→[ライブラリを管理]をクリックし、ライブラリマネージャで「Grove I2C Motor Driver v1.3」のライブラリをインストールしましょう。
ソースコードは以下のとおりです。

また、同じモータドライバを使ってモータではなく「ソレノイド」も動かしてみます。
ソレノイドは電流を流すことで磁界を発生させて可動鉄心を吸い寄せるアクチュエータです。モータは回転運動をするアクチュエータですが、ソレノイドはモータとは違って直線運動をします。
今回はプッシュソレノイドCB1037(タカハ機工)を使用します。
http://www.takaha.co.jp/SHOP/cb1037.html

プッシュソレノイドCB1037

プッシュソレノイドCB1037

先程のモータを配線した回路から変えるところは、ターミナルJ1に配線されているモータを取り外して、同じ場所にソレノイドを取り付けるだけです。
「モータドライバ」という名前はついていますが、実はモータだけでなくソレノイドも動かすことができます。
プログラムはモータを動かしていたソースコードのままで大丈夫です。

これで下の図のシステムはなんとなくできそうな気がしてきました。
system2

最終的にモータを使うのか、それともソレノイドを使うのか?試行錯誤しながら制作を進めていきたいと思います。次回記事(後編)にて、作品を完成させます!

ラズパイ電子工作の基本① サーボモータを使って指さし温度計を作ってみよう

$
0
0

今回のラズパイ記事は、人気の基本編!

デバプラではこれまで、みなさんに電子工作の楽しさをお伝えするために頑張ってきました。近頃は少しレベルの高い記事もアップしてきましたが、「これから」の人も、もちろんずっと応援しています。そして今回、改めて電子工作を始めたい、ちゃんと知りたい人のために立ち上がってくれたのは……、『これ1冊でできる!ラズベリー・パイ 超入門』などの入門編の書籍でも有名な、福田和宏さん。まずはサーボモータとセンサという王道の組み合わせです!

ラズパイで作品を制作するには、制作したい作品に応じた電子パーツを選択して接続し、プログラムで制御することで実現できます。ロボットやドローンなどといった機器はたくさんの電子パーツを接続し制御していまが、2つ程度の電子パーツでも、十分な電子工作が可能です。
そこで、今回はサーボモータと温度センサの2つを組み合わせて、指で温度が示せる「指さし温度計」を作成してみましょう。

完成イメージ:指さし温度計

【今回の記事の流れ】

制作で利用する機器、電子パーツ
サーボモータとは
Raspberry Piを準備する
サーボモータを動かしてみる
室温を取得する
指さし温度計を作成する
サーボモータの動作範囲を調べる
プログラムを実行して温度を指さすようにする
まとめ

制作で利用する機器、電子パーツ

●Raspberry Pi
02-1

モデルは、Raspberry Pi/2/3、Raspberry Pi Zero/Wのいずれでも問題ありません。わからない場合は最新版の「Raspberry Pi 3 Model B+」を購入しましょう。主な購入可能なサイトは以下の通り。
KSY
秋月電子通商
スイッチサイエンス
Amazon
ヨドバシカメラ

また、Raspberry Piを動作させるためのSDカード、ADアダプター、キーボード、マウス、ディスプレイなどを別途準備する必要があります
(参考記事:https://deviceplus.jp/hobby/raspberrypi_entry_056/)

●サーボモータ
02-2
指を動かすために利用する動力機器です。ここでは、模型などに利用されるサーボモータ「MG90D」を利用します。秋月電子通商で購入可能。

●温度センサ
02-3

室温を計測するセンサです。ここでは、I2CでRaspberry Piに温度情報を送れる温度センサ「ADT7410」を利用します。秋月電子通商で購入可能。

●電池ボックス・単3電池(4本)
02-4

サーボモータを動かすための電力を供給するために利用します。単3電池4本で6Vを出力できる電池ボックスを選択します。秋月電子通商で購入可能。

サーボモータとは

今回、腕を動かして温度を指すために、サーボモータを利用します。サーボモータとは、特定の角度まで回転させられる動力パーツです。角度を指定して動かせるため、ロボットの関節の制御や、ラジコン飛行機の操舵などに使われています。
サーボモータの内部には回転動作をするためのDCモータと、現在の角度を調べるためのポテンショメーター、ギア、動作する角度を制御するための制御用基板が搭載されています。
Raspberry Piなどから制御用の信号が送られてくると、DCモータで回転軸を動かします。この回転軸はポテンショメータにつながっており、現在の角度を逐次調べています。所定の角度に達するとDCモータを停止するようになっています。
12

サーボモータの制御には、パルス波と呼ばれるHigh(電圧の高い状態。3.3Vや5Vなど)とLow(電圧の低い状態。0V)を周期的に切り替える矩形波を送り込むことで制御しています。制御信号のHighとなっている時間の長さによって角度を指定できます。なお、Highの時間のことをパルス幅と呼びます。
パルス幅が小さいと右方向に移動し、大きくなると左方向に移動するようになっています。
パルス幅 制御信号
なお、どの程度のパルス幅の信号を送れば目的の角度に回転できるかは、サーボモータによって異なります。一般的に約1500μ秒のパルス幅にすると駆動範囲の中央付近に動作するようになっています。今回利用するサーボモータのMG90Dの場合は、は120度の範囲をパルス幅800から2300μ秒の間で制御できます。

Raspberry Piを準備する

Raspberry Piを準備しましょう。Raspberry Piは、専用OSのRaspbianを用意する必要があります。Raspberry PiのWebサイトからRaspbianをインストールする「Noobs」をダウンロードし、SDカードに書き込みます。
SDカードを差し込み、Raspberry Piを起動すると、Raspbianのインストールが開始されます。インストールが完了するとRaspberry Piを利用できるようになります。Raspbianのインストール方法については下記の記事を参照してください。
第56回「改めましてラズベリーパイの基本!(1) Raspberry Pi NOOBSインストール 2017年度版」

起動したら、Raspberry Piで各電子パーツを制御できるように設定します。Raspberry Piの制御方法として「pigpio」ライブラリがあります。LEDの点灯制御やスイッチの状態確認やサーボモータの制御など可能となっています。pigpioを利用するには、常駐用プログラムを起動しておきます。デスクトップの上部のパネル上にある「>_」が描かれたアイコンをクリックして端末アプリを起動します。次に以下のように実行します。

sudo systemctl enable pigpiod
sudo systemctl start pigpiod

これで準備完了です。

サーボモータを動かしてみる

実際にサーボモータを動かしてみましょう。サーボモータには3本の配線が取り付けられています。配線は、赤線が電源、黒線がGND、オレンジ線が制御信号用配線となっています。
31

今回利用するサーボモータ「MG90D」は、4.58から6.6Vの電圧を供給する必要があります。また、モータは電流が多く流れるため、Raspberry Piの電源端子に直接接続するのには向いていません。そこで、別途単3電池を4本直列接続して6Vの電源でサーボモータに供給するようにします。
また、制御信号用の配線は、Raspberry PiのGPIO(ここでは、GPIO23:端子番号16番)に接続して制御するようにします。実際には、以下のように接続します。
32

接続したらサーボモータ動作プログラム「servo.py」を利用して動作させてみましょう。以下のリンクからプログラムをRaspberry Piにダウンロードしておきます。
※Raspberry Piでファイルをダウンロードする場合は、WebブラウザのChromiumで閲覧して、ファイルのリンク上で右クリックし「名前を付けてリンク先を保存」を選択します。

【ダウンロード】サーボモータ動作プログラム「servo.py」
servo.py

ダウンロードしたら端末アプリを起動してプログラムを実行してみます。servo.pyは、Pythonを利用したプログラムとなっています。このため、以下のようにpython3コマンドでプログラムファイルを指定することで実行できます。

$ python3 servo.py パルス幅

実行の際にはサーボモータに送り込むパルスの幅を指定します。例えば、パルス幅を1500μ秒とする場合は、以下のように実行します。

$ python3 servo.py 1500

すると、サーボモータが動き、特定の角度で停止します。同様にパルス幅を変えて実行するとほかの角度まで回転します。

室温を取得する

室温を調べるには温度センサを利用します。ここでは、温度センサ「ADT7410」を利用することします。
ADT7410は、計測した温度をI2Cを利用してRaspberry Piなどで受け取ることが可能です。I2Cは、データを送受信する「SDA」、同期信号をやり取りする「SCL」、および電源の4本の線を接続すれば通信ができるようになります。Raspberry Piでは、3番端子がSDA、5番端子がSCLとなっており、以下のように接続することで通信できるようになります。
41

Raspberry PiでI2Cを利用するには、設定が必要となります。Raspberry Piのメニューをクリックして「設定」-「Raspberry Piの設定」を選択します。「インターフェイス」タブにある「I2C」項目を有効に切り替えます。これでI2Cが有効化されます。
42

温度センサの準備ができたら実際に温度を取得してみましょう。温度計測プログラム「temp.py」をダウンロードします。

【ダウンロード】温度取得プログラム「temp.py」
temp.py

ダウンロードしたら端末アプリを起動して以下のように実行します。

$ python3 temp.py

すると、現在の温度が画面上に表示されます。試しに温度センサに触れるなどしてみましょう。すると温度が上昇するのがわかります。

指さし温度計を作成する

サーボモータと温度センサを動作できることを確認したら実際に指さし温度計を製作しましょう。
板や紙などにイラストと温度を示す目盛りを書き込ます。筆者はパソコン上で画像編集ソフトを利用して製作しています。この際、重要なのが、目盛りを均等の角度で描くことです。今回は20度ごとに10℃ずつ温度が変化するように描きました。サーボモータの軸を差し込む部分を中心とした丸を描いてその上に目盛りを振るときれいに描くことができます。また、温度を指すために利用する腕のイラストを別に準備しておきます。
51

描いた絵は板やカラーボードなどに貼り付けます。サーボモータの軸となる部分に穴を開け、裏側からサーボモータを取り付けておきます。この際、サーボモータの向きは気にする必要はありません。
52

サーボモータのホーンに腕のイラストを貼り付けておきます。
53

腕を貼り付けたホーンをサーボモータの軸に差し込めば、指で温度を指すようになります。
次に温度センサとサーボモータをRaspberry Piに次の図のように接続します。接続は前述したサーボモータの動作回路と温度センサの回路同時に接続した形となります。
54

これで指さし温度計の外観と制御回路ができあがりました。

サーボモータの動作範囲を調べる

指さし温度計を実現する際に重要となるのが、正しい温度の目盛りを指せることです。しかし、作成した温度の目盛りやサーボモータの特性の違いがあるため今回用意したプログラムをそのまま動かすだけでは、温度がずれてしまうことがあります。このため、温度とサーボモータの動作を調節する必要があります。
調整には、実際にサーボモータを動かし、所定の温度を指すためのパルス幅を調べることとなります。サーボモータを動かすには前述したプログラム「servo.py」を利用します。

1. サーボモータの動作範囲と中央値を調べる
まず、サーボモータの動かせる範囲を調べます。今回利用するサーボモータ「MG90D」はパルス幅800μ秒〜2300μ秒の範囲で動作します。ただし、多少の個体差があるため、度の範囲で動かせるかは実際に調べて確かめておくことをおすすめします。また、他のサーボモータを利用する場合は、動作するパルス幅の範囲が異なるので、あらかじめ調べておく必要があります。
「servo.py」を利用して、500〜2500の範囲でパルス幅を指定してサーボモータが動く最大値と最小値を調べます。例えば、「800」を指定した場合はサーボモータが動作し、「750」を指定するとサーボモータが動かなくなった場合は、動作範囲の最小値は「800」だとわかります。同様に最大値についても調べておきます。なお、パルス幅は正確に調べる必要はありません。実際はパルス幅が794μ秒まで動作したとしても、800μ秒と見なしてもかまいません。
次に最大値と最小値から中央の角度に動かすためのパルス幅を調べます。筆者のサーボモータは「800〜2300」の範囲で動作したので、中央値は「1550」となります。
61

2. 最大温度と最小温度のパルス幅を調べる
次に温度とサーボモータを制御するパルス幅を合わせます。servo.pyを使ってサーボモータを中央に移動します。ここでは中央値は「1550」なので以下のように実行します。

$ python3 servo.py 1550

サーボモータが中央に移動したら、腕のイラストを貼り付けたホーンをサーボモータに差し込みます。この際、目盛りのおおよそ中央になるように差し込みます。今回の場合は15℃ぐらいを指すように差し込みます。正確な15℃にする必要はありません。
次に目盛りの最大温度と最小温度を指すためのパルス幅を調べます。指定するパルス幅を変えながらservo.pyでサーボモータを動かし、最大または最小温度を指すようにします。正しく温度を指したらパルス幅をメモしておきます。筆者の環境では-10℃のパルス幅は「2150」、40℃は「1100」となりました。
62

目盛りの最大温度、最小温度、それぞれのパルス幅の4つの値を準備することで、温度からサーボモータを制御するパルス幅への変換が可能となります(実際にどのように変換しているかは、次に利用するプログラムを閲覧ください)。

プログラムを実行して温度を指さすようにする

ここまでできあがったら、温度計測とサーボモータの動作を合わせたプログラムを作成します。
以下のリンクから、プログラム「point_temp.py」をRaspberry Piにダウンロードします。

【ダウンロード】指さし温度計のプログラム「point_temp.py」
point_temp.py

ダウンロードしたらRaspberry Piのメニューから「アクセサリ」-「Text Editor」を選択してテキストエディタを起動し、ダウンロードしたプログラム「point_temp.py」を開きます。次に、4から7行目にあるサーボモータの動作範囲に関する設定を変更します。「MIN_TEMP」には温度計に描いた目盛りの最小温度、「MAX_TEMP」には最大温度に変更します。「MIN_PULSE」は、最小温度を指している角度にするためのサーボモータに送るパルスの幅、「MAX_PULSE」には最大温度のパルスの幅を指定します。前述した「servo.py」を使って調べたパルス幅を指定します。
設定ができたらファイルを保存してテキストエディタを終了します。
これで準備ができました。端末アプリを起動して以下のように実行します。

$ python3 point_temp.py

すると、温度センサが計測した温度をプログラムでパルスの幅に変換します。このパルス幅をサーボモータに送り、目的の温度を指さすようになります。

まとめ

今回は温度センサを使ってサーボモータで温度を示すようにしました。この仕組みを利用すれば、温度だけでなく湿度や気圧、重さ、水のかさなど様々なセンサで計測した結果をサーボモータを使って示すことが可能です。

ラズパイでスマートホームを実現しよう! 第3回: 声でリモコンを操作して便利に使う

$
0
0

こんにちは、ヨシケンです!
ラズパイでスマートホーム化の第三回。前回は部屋の温湿度などを簡単に測れるようにしましたが、今回は赤外線リモコン機能を付けます。

第1回: ウェイクワードで操作できるスマートホーム・デバイスを作り始める
第2回: 独自のウェイクワードでお部屋をチェックする
image1

自宅にあるテレビや加湿器、電気などのリモコンを記録して、ラズパイから赤外線送信できるようにします。もちろんこれまで通り、声で操作できるようになりますよ!
image2

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

・Raspberry Pi 3B+ (最新版のラズパイ本体)
- Raspberry Pi 3B+
・小型USBマイク 
(USBで使える小型のこちらを使いました。)
小型USBマイク

・小型スピーカー 
(イヤフォン・ジャックで使えるアンプ付きのこちらを使っています。)
小型スピーカー

・モバイルバッテリー
image9

・温湿度センサー
sensor

・ミニブレッドボード
breadboard

・赤外線LED SIR-34ST3F
image30

・赤外線拡散キャップ
image31

・赤外線受光モジュール
I-04659

・LED、抵抗やケーブル類
・(100円ショップなどで手に入る)木のケースなど装飾部品

 

今回の記事の流れ

1.赤外線リモコン、受光部の設定
2.赤外線送信LEDの作成
3.日本語認識Juliusの導入
4.Juliusと赤外線リモコンの連動
5.まとめ

 

1.赤外線リモコン、受光部の設定

家の中にあるリモコン機器の赤外線を、ラズパイから操れるようにします。
赤外線には、受光部分と送信部があります。以下の図で、黒い方が赤外線受光モジュール、白いLEDが赤外線送信LEDになります。図を見て、ラズパイとつないでみて下さいね。受信側がGPIO 23、送信側をGPIO 24につないでいます。

image3

では最初に、受信側の設定をしていきます。
ラズパイでの赤外線通信では、lircというライブラリがあるので、これをインストールします。このlircの設定をconfig.txtファイルに行います。先ほどつないだGPIO 23、24の設定を書き込みます。

$ sudo apt-get install lirc

$ sudo vi /boot/config.txt

$ sudo vi /etc/lirc_options.conf

[config.txt]
image4

/etc/lirc_options.conf中の以下の部分に、ドライバー、デバイスの登録をしておきます。
[lirc_options.conf]
image5

これらの設定を有効にする為、一旦リブートします。

その後、mode2というコマンドで、lircが使えるようになっているかの確認を行います。
コマンドを流した後、受信モジュールに向けて、テレビなどのリモコンを操作すると、以下画面のような反応があるはずで、赤外線が受けられているかの確認をする事ができます。

$ mode2 -d /dev/lirc0 #又は mode2 –driver default –device /dev/lirc0

image6

それでは、自分のリモコンを登録するために、irrecordという赤外線記録プログラムを起動します。(最初のstopコマンドで、バックグラウンドで立ち上がっているlircdプログラムを止めてから行います。)

$ sudo systemctl stop lircd

$ irrecord -n -d /dev/lirc0

irrecordコマンドを打ったら、以下のように画面中に出てくる指示に従って、リモコンを登録して行きます。(赤字は日本語での説明です。)
image7

image8

image9

好きなボタンを登録したら、最後にボタン名を入れずにエンターだけを押すと、プログラムが終了します。
このirrecordにより、ここではremotetv.lircd.confというファイルが作られました。

ファイル中のon, up, downと付けたコマンドがそれぞれテレビの電源オン、音量アップ、とダウンになっています。

image10

2.赤外線送信LEDの設定

それでは、登録した情報を送信できるようにしていきましょう。
先ほど作った赤外線設定ファイルremotetv.lircd.confを、/etc/lirc/以下にlircd.confという名前でコピーします。
その後、以下コマンドからlircd自動起動プログラムを再起動します。

$ sudo cp remotetv.lircd.conf /etc/lirc/lircd.conf

$ sudo systemctl stop lircd
$ sudo systemctl start lircd
$ sudo systemctl status lircd

配線が多くて見づらくて申し訳ないですが、送信側LEDの接続は以下写真のようになっています。(合わせて当初の接続図も参照して下さい。)
赤い拡散キャップが付いた送信LEDのアノード(長い脚の方)に1Kの抵抗を挟んで3.3V電源と接続、カソード(短い方)は黄色のコードでGPIO24につながっています。
image11

それでは、先ほど設定した赤外線が送信リストに認識されているか、irsend LISTコマンドで確認します。
image12

上画面のようにremotetvや、コマンドon, up, downなどが出てくれば、lircから使える事が分かります。

いよいよリモコン信号を、irsendコマンドで送信してみます。LEDをテレビ受光部に近付けて下さい。

irsend SEND_ONCE remotetv on

irsend SEND_ONCE remotetv up

irsend SEND_ONCE remotetv down

どうでしょうか?テレビが付いたり、音量が変わったりしたでしょうか?
送信側のLEDは指向性があるので、テレビの受光部にある程度近く真っ直ぐに当ててみて下さい。
広範囲で受けやすくする為には、LED拡散キャップを使うと、反応が良くなります。

3.日本語認識Juliusの導入

ここまで手動のリモコン設定を行ってきましたが、ラズパイで日本語を検出できるようにし、声で操作できるようにします。
ラズパイで使える日本語検出には、定番のJuliusというライブラリがあります。こちらからJuliusのソースコードを入手し、ラズパイに導入していきます。(ここではv4.4.2.1を使っています)

$ sudo wget https://github.com/julius-speech/julius/archive/v4.4.2.1.tar.gz
$ tar zxvf v4.4.2.1.tar.gz

プログラム展開後、通常通りJuliusのインストールを行いたいところですが、最新の3B+とRaspbian Stretchでは、Juliusが通常使うサウンドドライバOSSが含まれていません。(以下”FATAL”と出てしまいました。)
image13

それに対応する為、ALSAという別のドライバを使ってJuliusを動かすようにします。(黄色のalsaパラメータをつけています)
以下の順番でライブラリ群をインストールして行って下さい。

$ sudo apt-get install osspd-alsa
$ sudo aptitude install libasound2-dev

$ sudo ./configure –with-mictype=alsa
$ sudo make
$ sudo make install

$ julius –version

$ arecord -l #マイクのデバイス番号を調べて、以下のコマンドで環境設定しておきます
$ export ALSADEV=hw:1,0

image14

これでJulius自身がインストールできました。
image16

続いて、辞書ファイルなどをダウンロードします。

$ sudo wget https://osdn.net/dl/julius/dictation-kit-v4.4.zip
$ sudo unzip dictation-kit-v4.4.zip

$ sudo wget https://github.com/julius-speech/grammar-kit/archive/v4.3.1.zip
$ sudo unzip v4.3.1.zip

ダウンロードしたdictation-kitの中にサンプルファイルがあるので、早速Juliusを試してみます。

$ cd dictation-kit-v4.4/
$ julius -C main.jconf -C am-gmm.jconf -demo

どうでしょうか?下の画面のように、しゃべった日本語を認識してくれたでしょうか?

image17

このデモプログラムを使ってみると分かりますが、デフォルトの辞書がとても大きい為、レスポンスが若干遅くなっています。
今回は家内で使う特定の言葉のみを使うので、パフォーマンスを良くする意味でも、自分自身の辞書を作って最適化しましょう。
このようなremote.wordファイルを作り、単語-Tab-読み、の形で、登録したい単語を追加していきます。
[remote.word]
aimge18

以下コマンドから、remote.wordファイルを辞書ファイルremote.dicに変換します。(書き込みエラーが出たら、remote.dicファイルが作られるフォルダに書き込み権限を追加してみて下さい。)

$ cd ~/smart/julius-4.4.2.1
$ iconv -f utf8 -t eucjp dictation-kit-v4.4/remote.word | gramtools/yomi2voca/yomi2voca.pl | iconv -f eucjp -t utf8 > dictation-kit-v4.4/remote.dic

[remote.dic]
aimge18

最後にremote.jconfという設定ファイルを作って、これまで作った辞書を読み込ませます。(こちらは、Juliusで認識させる辞書remote.dicを指定する、最低限の設定になっています。)
[remote.jconf]
image20

ここでは出来たファイル全て(remote.word, remote.dic, remote.jconf)を、dictation-kitフォルダ下に置いています。
image21

さあこれで、julius -C remote.jconfとコマンドを打ってみましょう!
image22

image23

どうでしょうか?テレビオン、や音量アップ、ダウンなどの単語をレスポンス良く認識してくれたでしょうか?動いている動画はこちらになります。

4.Juliusと赤外線リモコンの連動

それでは最後に、認識した言葉と赤外線リモコンを連動させてみましょう。
そのままでももちろん動きますが、ケーブルがかなりごちゃごちゃしてしまったので、100ショップなどで手に入れた木製のケースなどに収納しました。

image24

外側に赤い拡散キャップが付いた赤外線LEDと受光モジュールを出しています。ここでは家型にしましたが、お好きなデザインで作ってみて下さいね。
image25

では本題のJuliusとコマンドの連携です。
Juliusは-moduleというパラメータを付けると、言葉を認識した時に、xmlファイルを生成するようになります。このxmlファイルを読み込み、特定ワードが聞き取れた時に、irsendコマンドを送る、以下のようなプログラムを用意します。合わせて、LEDを光らせたり、Aquestalkで喋らせたりもしています。

[julius_ir_remote.py]

それでは、操作したい家電の近くに置いて、やってみましょう!

ラズパイのデスクトップ又はパソコンから、別々のターミナルを二つ立ち上げます。
そして、以下二つのプログラムを連携して走らせます。(Juliusプログラムを先に走らせます。)

(一つ目のターミナル) $ julius -C remote.jconf -module

image26

まずこちらのJuliusプログラムが待ち受け状態になります。
image27

その後、先ほど作ったir_remoteプログラムを走らせます。

(二つ目のターミナル) $ python julius_ir_remote.py

そして登録した指示語を発話します。
image28

発話した“テレビオン”などに伴って、画面にその言葉が出力され、LEDが光ったり、赤外線が送信されたりしたでしょうか?こちらの動画のように、声でテレビがついたり、音量が変わっているところが分かると思います。

5.まとめ

今回はラズパイでスマートホームの第三回として、しゃべるだけでリモコン操作ができるものを作りました。
リモコン機器は、赤外線のものなら大抵は登録できるので、ご自宅の機器でやってみて下さい。
辞書の言葉もご自由に追加できるので、操作したい機器に合わせて呼びかけやすい言葉を登録してみて下さい。

次回はカメラも合わせて、家の中をチェックしてくれるような機能も付けます。
お楽しみに!

(ヨシケン)

ラズパイでスマートホームを実現しよう! 第1回: ウェイクワードで操作できるスマートホーム・デバイスを作り始める

$
0
0

こんにちは、ヨシケンです!
これまでラズパイを使って、スマートスピーカーや画像解析するカメラなどを作ってきました。
ここからは、そこで使った音声技術や画像解析を活用して、お家で役立つスマートホーム・デバイスを作って行きたいと思います。
2018年3月に機能向上して発売されたRaspberry Pi 3B+や、小型ラズパイのRaspberry Pi Zeroなどを使って、声で操作する便利なホームデバイスを作っていきますよ!

image11

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

・Raspberry Pi 3B+
image2

・小型USBマイク 
(USBで使えるマイクなら何でも構いませんが、今回は小型で1,000円以下のこちらを使いました。)
小型USBマイク

・小型スピーカー 
(こちらもイヤフォン・ジャックに差さるものなら構いませんが、充電式アンプ付きのこちらを使っています。)
小型スピーカー

・モバイルバッテリーなど
image9

・LEDとケーブル類

 

今回の記事の流れ

1.Raspberry Pi 3B+の基本設定
2.スピーカーとマイクの設定
3.Snowboyウェイクワードの導入
4.ウェイクワードとラズパイのLEDを連動させる
5.まとめ

 

1.Raspberry Pi 3B+の基本設定

Raspberry Pi 3 Model B+ (以下ラズパイ又は3+と記述)は2018年3月14日(これはπ=3.14にちなんでいるそうです)に発売され、以前のラズパイ3と比べてCPUクロックが1.4GHzとなり、ネットワーク性能が向上した最新のラズパイです。そうは言っても、サイズや基本設定などはこれまでと変わらず、今までのやり方を踏襲して進めることができます。OS Raspbianのインストール、RasPi-configでの設定、Wi-Fi環境、SSH接続など基本的なところは、こちらのエントリによくまとまっていますので、参照してやってみて下さい。
ここでは、Raspbian Stretch OSを使っていて、ラズパイの基本的な設定が済んでいる事を前提に進めます。

 

2.スピーカーとマイクの設定

基本設定に続いて、スピーカーとマイクの設定をします。写真のようにジャックにスピーカーを、USBにマイクを挿して、音声の確認をします。

image3

まずaplay -lでスピーカーが認識されているか確かめます。ここでは Card 0にスピーカーが認識されている状態です。また、arecord -lでマイクのカード番号が Card 1になっているのを確認します。

image4

自分で音を録音し、それを先ほどのaplayで聞いたり、arecordとaplayを繋げて、その場の音がスピーカーから流れる事を確認します。

arecord -f S16_LE -r 16000 -D 1 test.wav # 録音を止める時は、CTRL+Caplay -f S16_LE -r 16000 test.wav

alsamixer #音量の調整など。止めるときは、Esc

arecord -f cd -Dhw:1 | aplay -Dhw:0

また、sudo vi ~/.asoundrcという音声設定ファイルを、このマイク、スピーカーに合わせて変更しておきます。

 

3.Snowboyウェイクワードの導入

さて、マイクとスピーカーが動くようになったので、今回のメイン、ウェイクワードの設定を行います。
ウェイクワードとは、「アレクサ!」や「OK Google!」などのように、スマートスピーカーを起動させる最初の決まった呼びかけワードです。
ここでは、Alexaでも使われているウェイクワードのサービスSnowboyを使って、自分独自のウェイクワードを設定できるようにします。
まずこちらのページからSnowboyのダウンロードとラズパイへの導入を行います。

image5

サイト上のDownloadsから、Raspberry Pi with Raspbianのバージョンを選んでダウンロードします。このパッケージをラズパイに送っておきます。
また以下のライブラリをラズパイにインストールし、Snowboyでの音声対応ができるようにします。

(ダウンロードしたパソコンなどから)
scp rpi-arm-xxxx.tar.bz2 pi@raspiname.local#xxxxはダウンロードしたsnowboyファイル名、raspiname.localはラズパイのアドレスを指定して下さい。
(ラズパイ側で)
sudo tar xaf rpi-arm-xxxx.tar.bz2 #先ほど送ったファイルを解凍
sudo apt-get install python-pyaudio python3-pyaudio sox
sudo pip install pyaudio

さあこれだけで、ラズパイがウェイクワードを聞いてくれるようになります。
ラズパイ上でデモプログラムを流してみましょう。

sudo mv rpi-arm-xxx snowboy #先ほどの解凍したファルダをsnowboyとリネームします
cd snowboy
python demo.py resouce/snowboy.umdl

※ここで指定している.umdlや.pmdlがウェイクワード・ファイルで、デモではあらかじめ用意された「スノーボーイ」という単語が入っています。

プログラムを流したら、マイクの近くで「スノーボーイ!」と呼びかけてみて下さい。見事反応すると、ピン!という反応音が聞こえるはずです。
image6

こちらはその時の動いている簡単な動画です。

 

4.ウェイクワードとラズパイのLEDを連動させる

Snowboyが動いたところで、ラズパイ側につながったものと連動させてみます。ここでは最も簡単なLEDをチカチカさせる、ウェイクワードでLチカをやってみます。ラズパイに以下のようにLEDをつなぎます。

image7

それでは、ウェイクワード反応後にLEDを光らせる、wake_led.pyプログラムを記述します。

このプログラムを流して、また「スノーボーイ!」と呼びかけてみましょう。
python wake_led.py resources/snowboy.umdl
image8

見事、LEDがチカチカしたでしょうか?

また百均などで買ってきたLED電球を使って、もう少しお家が楽しくなるような電飾にしてみましょう。季節柄、クリスマスツリーを光らせるのもいいですね。

 

まとめ

今回は、ラズパイでスマートホームの第一回として、Snowboyというウェイクワードの仕組みを導入しました。
そしてこのウェイクワードから、ラズパイ側のLEDを光らせる事を簡単にやってみました。
これはラズパイのローカル上で動いているので、ネットワークが無いところでも、声さえかければラズパイの操作が可能になっています。LED以外もセンサーや音がするものと組み合わせて使う事ができます。色々やってみて下さいね。

次回は、このウェイクワードを使って声でラズパイを操り、家内のスマートホーム化を進めていきます。
お楽しみに!

ラズパイでスマートホームを実現しよう! 第2回: 独自のウェイクワードでお部屋をチェックする

$
0
0

こんにちは、ヨシケンです!
ラズパイでスマートホーム化の第二回です。前回はSnowboyというウェイクワードの仕組みを導入して、「スノーボーイ!」と呼び掛けると、ラズパイからLEDを光らせるようにしました。
今回はそのウェイクワードを自分の声でカスタマイズし、独自の掛け声で部屋の状況(温湿度など)をチェックする仕組みを作ります。

image1

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

Raspberry Pi 3B+ (最新版のラズパイ本体)
Raspberry Pi 3B+

ラズパイケース 
(何でも構いませんが、今回はこちらを使っています)
ラズパイケース

・小型USBマイク 
(USBで使える小型のこちらを使いました。)
小型USBマイク

小型スピーカー  
(イヤフォン・ジャックで使えるアンプ付きのこちらを使っています。)

・モバイルバッテリー
image9

・温湿度センサ(今回はBME280というセンサを使っています)
BME280

・ミニブレッドボード
51OzrndmGqL
・LED、抵抗やケーブル類

 

今回の記事の流れ

1.独自ウェイクワードの設定
2.温湿度センサの設定
3.ラズパイから温湿度をしゃべらせる
4.ウェイクワードとセンサ、LEDを連動させる
5.まとめ

 

1.独自ウェイクワードの設定

前回Snowboyというソフトウェアをラズパイにインストールして、音声から起動させる仕組みを作りました。このSnowboyは自分の声を吹き込んで、好きな言葉でウェイクワードを作る機能もあるので、自分のワードを登録してみましょう。
まずSnowboyのサイトからアカウントを取得します。そのアカウントでログオンして、Profile settingsというメニューを選ぶと、以下のように自分のAPI Tokenを取得する事ができます。
ここに表示されるトークンをコピーしておきます。

image2

以下のモデル作成用サンプル・スクリプトtraining.pyをresourcesフォルダ下に作ります。
このスクリプト中の黄色くハイライトした部分を、今回の設定に合わせて変更します。
まずtokenの部分に上記でコピーしたトークンを貼りつけます。またhotword_name部分は、 “oheya”(お部屋) にしておきます。言語、年齢、性別などは適宜変えて、保存して下さい。
[training.py]

次に以下のコマンドから自分のワードを録音します。一つのウェイクワード・モデルを作るのに、同じ言葉を吹き込んだ3つのファイルが必要になリます。

$ rec -r 16000 -c 1 -b 16 -e signed-integer 1.wav

マイクの近くで「ねぇ、お部屋!」と言って録音してください。(この言葉はもちろん他の言葉でも構いません。お好きな呼びかけ易い言葉を選んで下さい。)
これを1.wav, 2.wav, 3.wavといったファイル名を付けて、三回繰り返します。

image3

さて三つのファイルができたら、training.pyと同じresources下に置き、モデルを作成します。モデル名はoheya.pmdlとしました。(.pmdlはpersonal modelという意味だそうです。)

python training.py 1.wav 2.wav 3.wav oheya.pmdl

程なくするとoheya.pmdlファイルが出来上がります。

image4

それではこのウェイクワード・モデルを使って、デモプログラムや、前回作ったLEDを光らせるプログラムを流してみます。
前回のSnowboyを起動させるプログラムの際、エラーが出た場合は以下のlibatlas-base-devというライブラリが足りないかもしれないので、インストールしておいて下さい。
また元々用意されているdemo2.pyというサンプルプログラムを改変して、2つのウェイクワードを使えるようなwake2_led.pyも作って試してみます。

$ sudo apt-get install libatlas-base-dev

$ cd ~/smart/snowboy/
$ python demo.py resources/oheya.pmdl

$ cp ~/smart/snowboy/demo2.py ~/smart/snowboy/wake2_led.py

前回同様に赤色LEDもつないでおきます。
image5

以下の黄色の部分を追加、変更する事により、snowboyという呼びかけと、今回作ったoheyaを同時に使う事ができます。
[wake2_led.py]

それでは2つのウェイクワードに対応したwake2_led.pyを流してみます。
自分の声で「ねぇ、お部屋!」と言うと、前回作ったLEDが点灯してくれたでしょうか?

$ python wake2_led.py resources/snowboy.umdl resources/oheya.pmdl

image6

実際に動かしている動画はこちらです。

 

2.温湿度センサの設定

次に、ラズパイに温湿度センサをつないで、部屋の温度を測ってもらいましょう。
今回の温湿度センサは、温度、湿度だけでなく気圧も測ることができ、I2Cという通信方式を使っています。
以下コマンドから、ラズパイのI2Cを使用可能にしていきます。

$ sudo raspi-config

“Interfacing Options”を選び。その中から”Enable I2C”を選びます。
image7-1

この後、再起動が必要となる場合がありますので、再起動して続けていきます。
image7-2

実際の接続としては、写真のようにセンサのピンヘッダを半田付けして、小さいブレッドボードに挿してラズパイと使っています。
image8

後続の赤、緑LEDも合わせた接続図は以下のようになっています。接続の際の参考にして下さいね。
image9

センサとラズパイをつないだら、このセンサを操る為の幾つかのI2Cのライブラリをインストールします。その後、コマンドから接続したセンサが使用可能になっているか見てみましょう。

$ sudo apt-get install i2c-tools

$ sudo apt-get install python-smbus

$ sudo i2cdetect -y 1

この I2C Detectコマンドを流すと、以下のようにBME280のデフォルトアドレス0x76での通信が確認できます。何の表示もされない場合は、I2Cの設定がされていないか、接続が正しくない可能性があるので、チェックしてみて下さい。
image10

接続が確認できたら、このセンサを販売しているスイッチサイエンスから便利なサンプルスクリプトが出ているので、ダウンロードして使ってみましょう。
今回使うプログラムを格納するsmartフォルダを作って、そこに置きます。

$ sudo mkdir smart

$ cd smart

$ sudo git clone https://github.com/SWITCHSCIENCE/BME280.git

$ sudo pip install smbus2

$ python BME280/Python27/bme280_sample.py

このサンプル・プログラムを流すと、以下のように簡単に温度、湿度、気圧が取れました!
image11

 

3.お部屋の状況をしゃべって、光ってお知らせ

では、取得した室温をラズパイからしゃべらせる為に、日本語読み上げで定番のAquesTalkをインストールしておきます。公式ページからラズパイ版AquesTalkを、以下のようにダウンロード、ラズパイ内に設置しておいてください。pi@raspi.localの部分はご自分のラズパイ名に合わせて転送して下さい。

(ダウンロードしたPCから) scp aquestalkpi-20130827.tgz pi@raspi.local:smart
(ラズパイにログオンして) $ tar zxvf ~/smart/aquestalkpi-20130827.tgz

温湿度センサにプラスして、赤と緑のLEDをつなぎます。少し配線が多くなってしまいましたが、赤色LEDをGPIO17に、緑色LEDをGPIO18につないでいます。
image12
それでは、元のサンプル・プログラムをコピーして、室温などに応じてしゃべる内容を変えたり、LEDを光らせたりするプログラムを作ります。

$ cd smart/
$ sudo cp BME280/Python27/bme280_sample.py snowboy/bme.py

$ sudo vi snowboy/bme.py

それでは、以下の黄色の部分の追加、修正を行います。室温や湿度の区切り、しゃべらせるメッセージなどはお好きに設定して下さい。
[bme.py]

 

4.ウェイクワードとセンサ、LEDの連動

それでは最後に、bme.pyとSnowboyの仕組みを連動させます。先ほどのwake2_led.pyを改造して、wake_temp.pyを作ります。

$ cp ~/smart/snowboy/wake2_led.py ~/smart/snowboy/wake_temp.py

$ sudo vi ~/smart/snowboy/wake_temp.py

複数の呼びかけに対応しますので、元々の「スノーボーイ!」という掛け声は残して、「ねぇ、お部屋!」と言うと、室温などを測って読み上げてくれるものにします。以下の黄色の部分をwake2_led.pyに追加、修正します。
[wake_temp.py]

それでは部屋の好きなところに置いて、プログラムを流して、「ねぇ、お部屋!」と呼びかけてみましょう。
image13

$ python wake_temp.py resources/snowboy.umdl resources/oheya.pmdl

image14

いかがでしょうか?プログラムは特定のウェイクワードを待ち続け、「ねぇ、お部屋!」と言うと、すかさず室温、湿度、気圧を読み上げてくれたのではないでしょうか。
最初は部屋が乾燥し過ぎていて、「スーパードライ!」と赤いLEDで警告した後、室温、湿度が戻ると「快適ですね!」と緑LEDが点滅したかと思います。
こちらは動いているところの動画です。参考にしてみて下さい。

 

5.まとめ

今回はラズパイでスマートホームの第二回、自分の声でウェイクワードを登録しました。
その声から部屋の温湿度などを測って、しゃべってもらう事ができるようになりました。
それに合わせてLEDを光らせて視覚的にも分かるようにもなりました。今回は簡単のため赤と緑のLEDを使いましたが、Wi-fi対応の電球Hueなどを持っていましたら、IFTTTを使って簡単に部屋の電気の色を変える事もできます。
部屋の状況を声だけでチェックできる、スマートホームに近づいて来たのではないかと思います。

次回は、リモコンなどと連動させて、更に便利なおうちにする機能を追加していきます。お楽しみに!

(ヨシケン)

Arduino Nanoでチェーンプログラムロボットを動かそう(後編:モータドライバの使い方〜完成)

$
0
0

前編では、チェーンプログラムロボットをArduino Nanoで動かすための、準備的な作業を行いました。今回はその続きで、チェーンプログラムロボットを完成させて制御できるようにします。完成まであともうひと踏ん張りですので、頑張っていきましょう!
Arduino Nanoでチェーンプログラムロボットを動かそう(前編:構想〜パーツ組み立て)

完成した作品

完成図・チェーンプログラムロボット

■目次

●モータドライバBD65496MUVの使い方
●Arduino Nanoとモータドライバの接続
●電源の接続
●モータの配線
●頭の取り付けと配線
●プログラムの書き込みと動作の確認
●Scratchで子供と一緒に遊ぼう

モータドライバBD65496MUVの使い方

まずは、モータを動かす方法を考えます。チェーンプログラムロボットには「FA-130」というモータが使われており、このモータを回転させるには数百mAの電流を流すことが必要です。しかし、Arduino Nanoはピン1つあたり最大で40mA・全体で200mAまでしか電流を流すことができず、モータとArduino Nanoとを直接に接続することはできません。そこで、モータドライバを介して接続しましょう。

今回はBD65496MUV搭載モータドライバを使いますので、はじめにこのモジュールの使い方を紹介しておきます。なお、買ってきた時点ではピンは半田付けされていませんので、自分で半田付けします。

モジュール1つにつき、1つのモータを制御することができます。モータ用の電源として2V〜16Vのものを使うことができ、さまざまなモータと組み合わせることができます。
12本のピンのうち、図1のように9本のピンを使ってモータを制御します。INAのピンにPWMの信号を送ると、そのデューティ比×モータ用電圧が、OUTA/OUTBに出力されます。また、OUTA/OUTBのどちらがプラスになるかは、INBに与える信号で決まります(表1)。

図1 BD65496MUVの接続方法

図1 BD65496MUVの接続方法

 

INA OUTA OUTB
HIGH
LOW

表1 INBに与える信号とOUTA/OUTBのプラス/マイナスの関係

例えば、図2のようにArduino NanoとBD65496MUVを接続するとします(INA/INBを、それぞれ3番/4番ピンに接続)。また、モータ用電源として9Vの電池を接続したとします。

この状況で、リスト1のプログラムを実行します。analogWrite関数はPWM出力を行う関数で、引数に255を渡すとデューティー比が100%になります。ここでは引数に153を渡していますので、153÷255=0.6から、デューティ比が60%のPWMが出力されます。したがって、モータに加わる電圧は、疑似的に9V×60%=5.4Vになる、ということです。

図2 Arduino NanoとBD65496MUVの接続の例

図2 Arduino NanoとBD65496MUVの接続の例

 

analogWrite(3, 153);
digitalWrite(4, HIGH);

リスト1 モータドライバを制御する例

 

Arduino Nanoとモータドライバの接続

それでは、チェーンプログラムロボットの組み立ての続きに入りましょう!まず、ブレッドボード上でArduino Nanoとモータドライバを接続します。
チェーンプログラムロボットでは、左右の車輪をそれぞれ別のモータで回転させるようになっています。そこで、モータドライバを2つ使って、左右のモータを別々に制御できるようにします。

BD65496MUVにはPWMを送りますが、Arduino NanoでPWM出力に対応しているピンは、3/5/6/9/10/11の6本あります。これらのうち、3番と5番を使うことにします。また、2番と4番を、モータドライバのINBに接続しました(図3)。Arduino Nanoの隣にあるモータドライバで、右車輪のモータを制御、その右にあるモータドライバで左車輪のモータを制御します。
 

図3 Arduino Nanoとモータドライバの接続

図3 Arduino Nanoとモータドライバの接続

なお、実際の配線の際には一般的なジャンプワイヤではなく、単線の堅いジャンプワイヤを使って、ブレッドボード上を這うように配線することをお勧めします(写真1)。このあとで電源やロボットの頭を接続していきますが、単線を使った方が配線が混乱しにくくなります。

写真1 Arduino Nanoとモータドライバを接続したところ

写真1 Arduino Nanoとモータドライバを接続したところ

また、図3ではモータドライバの「PWM(MODE)」のピンをブレッドボードのプラスのラインに接続していますが、写真1だと接続していないように見えます。実際はモータドライバの裏側を利用して、図4のように配線しました。

図4 PWM(MODE)ピンの接続(赤い線は実際にはモータドライバの裏側に配線)

図4 PWM(MODE)ピンの接続(赤い線は実際にはモータドライバの裏側に配線)

 

電源の接続

今回のロボットのように、USBケーブルから電源を取りにくいものを作ることもあります。その場合は、作りたいものに何らかの電源を組み込み、そこから電力を供給するようにします。

今回は、電源として乾電池を使用します。Arduino Nanoの電源は、006P電池(9Vの長方形の電池)から取ります。Arduino Nanoには「VIN」というピンがあって、7〜12Vの電源を接続することができます。VINに006P電池のプラスを接続し、GNDにマイナスを接続すれば、動作させることができます。
また、ロボット同梱のモータ(FA-130)は定格では1.5〜3Vで駆動するものですが、今回は高めの電圧をかけられるよう、単3乾電池3本(1.5V×3で4.5V)を使います。

電池は電池ボックスに収め、そこからブレッドボードに配線します。秋月電子通商で「ジャンパーワイヤ付きバッテリースナップ」というものが売られていて、これと電池ボックスを組み合わせると、ブレッドボードに電池を接続する際に便利です。
006Pの電池ボックスとしては、ELPAの「PP-006NH」というものを使いました。電池をはめ込んだ後、バッテリースナップを取り付けられるようになっています。また、単3の電池ボックスでバッテリースナップを取り付けられるものは、秋月電子通商で販売されています。

まず、単3用の電池ボックスにバッテリースナップを取り付け、ユニバーサルプレートの片方の端にねじ止めします。その際、ジャンプワイヤがユニバーサルプレートの中央の方に向くようにします。
そして、ユニバーサルプレートの反対側に006Pの電池ボックスを取り付けます。これもバッテリースナップをつけたときに、ジャンプワイヤがユニバーサルプレートの中央を向くようにします(写真2)。電池をつけた側を下にして、チェーンプログラムロボットに乗せます。

写真2 電池ボックスと電池を取り付けたところ

写真2 電池ボックスと電池を取り付けたところ

単3電池からの赤/黒の線は、ブレッドボード上でArduino Nanoの1〜12番ピン側にあるプラス/マイナスのラインに接続します。
また、9V電池からの黒い線は、ブレッドボートのマイナスのラインを経由して、Arduino Nanoの「VIN」のピンがある側のGNDピンに接続。一方の赤い線は、Arduino Nanoとモータドライバの間の空きラインに接続しましょう(図5、写真3)。このあとロボットの頭の部分を取り付けますが、頭にあるスイッチを通して、Arduino NanoのVINに接続するようにします。

図5 電池ボックスとブレッドボードとの接続

図5 電池ボックスとブレッドボードとの接続

 

写真3 電池ボックスからの線をブレッドボードに接続したところ

写真3 電池ボックスからの線をブレッドボードに接続したところ

 

モータの配線

次に、モータをブレッドボード上のモータドライバに配線します。
モータからは黄色と青の線が出ています。図6のように、右車輪のモータからの線は、黄色をOUTA、青をOUTBに接続します。一方、左車輪からの線は、青をOUTA/黄色をOUTBに接続します(写真4)。

図6 モータの配線

図6 モータの配線


 
写真4 モータの配線が終わったところ

写真4 モータの配線が終わったところ

 

頭の取り付けと配線

次に、ロボットの頭の部分を取り付けていきます。頭につけたサーボモータ(SG90)/WS2812B/スイッチは、図7のようにブレッドボードに接続します。
 

図7 サーボモータ(SG90)/WS2812B/スイッチの配線

図7 サーボモータ(SG90)/WS2812B/スイッチの配線

SG90からは赤/茶色/オレンジの3本の線が出ています。赤と茶色は電源用の線で、それぞれをArduino Nanoの5V/GNDのラインに接続します。また、オレンジは制御用の信号を送る線ですが、これはArduino Nanoの12番ピンに接続します。
WS2812BのVDD/GNDからの線は、Arduino Nanoの5V/GNDのラインに接続します。また、片方のWS2812BのDATA INにも線を取り付けましたが、その線はArduino Nanoの13番ピンに接続しています。

線を接続し終わったら、頭の部分を土台にはめ込んで、ねじで固定します(説明書の19番の手順を参照)。
これで、Arduino Nano版のチェーンプログラムロボットが完成です(写真5)!長時間の組み立てお疲れさまでした。

写真5 Arduino Nano版のチェーンプログラムロボットが完成したところ

写真5 Arduino Nano版のチェーンプログラムロボットが完成したところ

 

プログラムの書き込みと動作の確認

最後に、Arduino Nanoにプログラムを書き込んで、ロボットを動かしましょう。

●Adafruit NeoPixelライブラリの組み込み

WS2812Bを制御するために、「Adafruit NeoPixel」というライブラリを使います。
「第50回 フルカラーLEDテープを使ったちょっとお洒落な電子工作 〜Arduinoでパーツやセンサを使ってみよう」の回でインストールしている方は、そのライブラリを使うことができます。
まだインストールしていない方は、以下の手順でインストールしてください。

①Arduino IDEを起動します。
②「スケッチ」→「ライブラリをインクルード」→「ライブラリの管理」メニューを選びます。
③ライブラリマネージャが起動しますので、キーワードの欄に「NeoPixel」と入力します。
④「Adafruit NeoPixel」ライブラリが見つかりますので、「インストール」ボタンをクリックします(図8)。

 

図8 Adafruit NeoPixelライブラリのインストール

図8 Adafruit NeoPixelライブラリのインストール

 

●ベースとなるプログラム

まず、ベースとなるプログラムを用意します。これはリスト2のようになります。
setup関数では、以下のようにロボットを初期化します。

①モータは停止
②SG90は90度にし、頭が正面に向くようにする
③WS2812Bは消灯

loop関数は空になっていますが、この中身によって、ロボットの動きを制御することができます。
なお、プログラムの書き込みが終わった後は、Arduino NanoからUSBケーブルを抜いて、チェーンプログラムロボット本体のスイッチをオンにすると、電池を電源としてロボットを動作させることができます。

リスト2 ベースのプログラム

 

●モータを動かす

モータドライバの制御の流れは、「モータドライバBD65496MUVの使い方」のところで解説した通りです。

モータを回す速さは、3/5番ピンのPWM出力で値で決めます。リスト2の中で、この2つのピンにはそれぞれ「LEFT_A」「RIGHT_A」の定数名を付けていますので、それを使ってピン番号を指定します。
4.5Vの電池を接続していますので、定格上限の3Vでモータを回すには、デューティ比が3分の2のPWM信号を出力します。また、定格下限の1.5Vでモータを回すなら、デューティー比が3分の1のPWM信号を出力します。
analogWrite関数で255を指定するとデューティ比が1になりますので、3分の2なら170(=255÷3×2)、3分の1なら85(=255÷3×1)を指定します。

また、左右のモータの方向は、2/4番ピンに出力する値で決めます。これらのピンにはそれぞれ「LEFT_B」「RIGHT_B」の定数名を付けています。
例えば、loop関数をリスト3のようにすると、右車輪と左車輪のそれぞれのモータに、定格上限の3Vの電圧をかけて、ロボットを前進させることができます。
また、リスト3の3行目を関数を「digitalWrite(RIGHT_B, LOW);」に変えると、左車輪は前進、右車輪は後退になりますので、その場で右旋回するような動きになります。

リスト3 ロボットを前進させる

●頭を動かす

頭を動かすには、「sg90.write(角度)」のような関数を実行して、サーボモータの角度を指定します。
例えば、loop関数をリスト4のようにすると、頭を左右に振る(角度を0度〜180度の間で段階的に増減させる)ことを繰り返します。

リスト4 頭を左右に振る

 

●WS2812Bを点灯する

WS2812BのLEDの色を決めるには、以下のような関数を実行します。

pixels.setPixelColor(番号, pixels.Color(赤, 青, 緑));

「番号」には、左右の目を表す番号を指定します。左/右それぞれの目の番号に対して、リスト2の先頭で「LEFT_EYE」「RIGHT_EYE」の定数を定義していますので、それを使うことができます。
また、「赤」「青」「緑」には、RGBの光の三原色の強さを、それぞれ0〜255の範囲で指定します。
そして、左右の目の色を決めたら、「pixels.show();」の関数を実行して、LEDを点灯させます。
例えば、loop関数をリスト5のようにすると、左右の目が赤→緑→青→白と順番に点灯し、その動作を繰り返します。

リスト5 左右の目を光らせる

 

●サンプルのプログラム

ここまでに解説してきたことを組み合わせることで、ロボットにさまざまな動作をさせることができます。例えば、以下の動画のようなコミカルな動きをさせることもできます。
このプログラムは以下のアドレスからダウンロードすることができますので、ぜひお試しください。
https://www.h-fj.com/deviceplus/chain_program_robot_demo.zip

チェーンプログラムロボットをArduino Nanoで制御した例

Scratchでお手軽に制御してみよう

Arduino Nanoは、Scratchと組み合わせてプログラムを作ることもできます。
初めてプログラミングに触れる場合や、子供と一緒にこのロボットで遊びたい時は、Scratchの方が視覚的にも分かりやすいので、お勧めです。モータとサーボモータの制御をScratchで行うことができます。

詳しい手順は省略しますが、以下のようにすることで、Scratchでこのロボットを制御することができます。

①パソコンにScratch Offline Editorをインストールします。
②「Scrattino2」というArduino用Scratch拡張をインストールします。
(ダウンロード元: https://github.com/yokobond/Scrattino2/releases
③Scrattino2を起動し、Arduino Nanoと接続しておきます。
④Arduino IDEで、「ファイル」→「スケッチ例」→「Firmata」→「StandardFirmata」を開き、Arduino IDEに書き込みます。
⑤Scrattino2のダウンロード元から「scrattino2_resources.zip」をダウンロードし、そのZipファイルの中にある「scrattino.sb2」ファイルをScratchで開きます。
⑥Scratchの「スクリプト」の「その他」に、Arduinoを制御するためのブロックがありますので、それらを組み合わせます。

図9は、実際にScratchでスクリプトを作ってみた例です。ロボットを前後に動かしながら、頭を左右に振るという動きをします。
なお、WS2812Bの制御は、Scrattino2が対応していないので、残念ながら行うことはできません。ただ、単色の一般的なLEDに変えれば、Lチカと同じ仕組みになりますので、Scratchで制御できます。
 

図9 Scratchでロボットを動かす例

図9 Scratchでロボットを動かす例

 

まとめ

Arduino Nanoでチェーンプログラムロボットを動かせるようになりましたが、いかがだったでしょうか?プログラム次第でいろいろな動きをさせることができますので、皆様もぜひ試行錯誤してみてください。
また、今回の例のように、Arduino Nanoはコンパクトで何かに内蔵するのに便利です。Arduino Nanoでいろいろと作ってみると良いでしょう。


ここWi-Fi飛んでる?目に見えるデバイスをつくってみた(後編)

$
0
0

この企画は「その辺に飛んでいるWi-Fiの電波がどれくらいたくさん飛んでいるのかを肉眼で見て感じることができるデバイスを作ろう」という趣深い企画です。
デバイスを作るにあたって必要となる部品や技術内容については前編の記事で解説しておりますので、まだ読んでいない方はぜひ前編からご覧ください。

ここWi-Fi飛んでる?目に見えるデバイスをつくってみた(前編)

さあ、今回は前編で培ってきた技術を組み合わせて実際に作品を作っていきます。
完成イメージはこんなかんじでしたね。

機構部が「モータかソレノイド」となっているとこが優柔不断である

機構部が「モータかソレノイド」となっているとこが優柔不断である

Wi-Fiマークをぴょんぴょんさせるにあたり、モータかソレノイドかを決めないと開発が進められないわけですが、今回はソレノイドを使うことにしました。
理由は「ただただ、ソレノイドを使いたかったから」です。
もうちょいマシな理由で選べよって思うかもしれませんが、趣味のものづくりに厳密な学術的根拠など必要ありません。自分の欲求を大事にしていきましょう。

作品本体をつくる

それでは、作品を作っていきましょう。
ホームセンターに行ったらちょうど良い感じの木の箱があったので、これをベースとして組み立てていこうと思います。

Wi-Fiマークをぴょんぴょんさせるのにちょうど良い感じな箱

Wi-Fiマークをぴょんぴょんさせるのにちょうど良い感じな箱

次にバネを左右にスイングさせるための部品を3Dプリンタでさくっと作っていきましょう。
3Dプリンタで作った部品のSTLファイルは以下からダウンロードできますので、3Dプリンタをお持ちの方はどうぞご活用ください。
STLファイルダウンロードはこちら

3D-CAD(Fusion360)で部品をモデリングします

3D-CAD(Fusion360)で部品をモデリングします

3Dプリンタを使って印刷するとこんなかんじです。

3Dプリンタを使って印刷するとこんなかんじです

アクチュエータにはプッシュソレノイドCBS0830(タカハ機工)を使います。
http://www.takaha.co.jp/SHOP/cbs0830.html

ソレノイドの先端にも3Dプリント部品を取り付けています

ソレノイドの先端にも3Dプリント部品を取り付けています

ソレノイドと3Dプリントした軸受け部品を土台に取り付けます

ソレノイドと3Dプリントした軸受け部品を土台に取り付けます

また別の部品にボールベアリングやバネを固定

また別の部品にボールベアリングやバネを固定

ソレノイドを2個向かい合わせて設置

ソレノイドを2個向かい合わせて設置

バネの先端にWi-Fiマークを取り付けます

バネの先端にWi-Fiマークを取り付けます

前編の記事で使った回路を取り付ければ… (電源はアルカリ乾電池8本になりました)

前編の記事で使った回路を取り付ければ…
(電源はアルカリ乾電池8本になりました)

できた!

作品名『わいふぁいぴょんぴょん』

作品名『わいふぁいぴょんぴょん』

これで本体は完成しました!
続いて動作プログラムもつくっていきましょう。

動作プログラム

前編の記事で作ってきたWi-Fiのスキャンとモータドライバの制御のソースコードを統合して「Wi-Fiの電波を検知したらWi-Fiマークをピョンピョンさせる」動作を実装していきます。
今回作成したソースコードは以下のとおりです。

大まかな動きとしては、
①Wi-FiをスキャンしてRSSI(受信信号の強度)を取得する → scanRssi()
②RSSIの大きさによってソレノイドを動かす回数を決定する → getScore(rssi)
③決定した回数分ソレノイドを動かす → swingSymbol(score)

の3つの処理を繰り返して行うというかんじです。

ソレノイドを動かす回数は、RSSIの大きさによって決定します。-40~0dB→4回、-60~-40dB→1回、-60dB以下→0回という具合にWi-Fiの電波が強いほどWi-Fiマークをより多い回数振ります。

動かしてみよう

それでは、わいふぁいぴょんぴょんのエレガントな動きをご覧ください。

このように、Wi-Fiが飛んでいるのを肉眼で見ることができちゃいます。
これで、実家で「Wi-Fiって何?」と聞かれても

ほら、なんかこの…ぴょんぴょんしてるやつだよ。ほら

ほら、なんかこの…ぴょんぴょんしてるやつだよ。ほら

自信を持ってわかりやすく伝えることができますね。

まとめ

今回の『わいふぁいぴょんぴょん』は「Wi-Fiが飛んでるのを見えるようにしたいなあ」という欲望からアイデアが生まれ、電子工作の技術によりそれを実現しました。
こういうアイデアって冗談や空想だけで終わっちゃうことがほとんどですが、「それ、作ったら面白いんじゃね?」「おっ、Arduinoで作れそうじゃん」というノリと勢いで作ってみると、楽しいものづくりができるのではないかと思います。

ラズパイでスマートホームを実現しよう! 第4回: カメラをつけて、お部屋のチェックなど便利に使おう!

$
0
0

こんにちは、ヨシケンです!
ラズパイでスマートホーム化の第4回。これまでラズパイを使って、声による起動、部屋の温湿度チェック、そしてリモコン機器の操作を行ってきました。
第1回: ウェイクワードで操作できるスマートホーム・デバイスを作り始める
第2回: 独自のウェイクワードでお部屋をチェックする
第3回: 声でリモコンを操作して便利に使う
今回はカメラを付けて、部屋のチェックをしたり、お子さんの帰宅を知らせたりするなど、画像を使った機能を付けましょう。(左側の丸い窓にカメラを設置しています。)

19-1

また、「おはよう!」や「ただいま!」などのシンプルな挨拶で、家の中の事を自動化する仕組みも作って、スマートホームの完成です!
tadaima

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

・Raspberry Pi 3B+ (最新版のラズパイ本体)
- Raspberry Pi 3B+

・小型USBマイク 
小型USBマイク

・小型スピーカー 
小型スピーカー


・パイ・カメラ

(ラズパイ公式カメラです。これと同形状で夜間撮影が可能なPiNoIRカメラもあります。)
パイカメラ

・温湿度センサ
sensor

・赤外線LED SIR-34ST3F
image30

・赤外線拡散キャップ
image31

・赤外線受光モジュール
I-04659

・小型バッテリー(小型ならどんなものでも構いません)
image9

・ミニブレッドボード
breadboard

・LED、抵抗やケーブル類
・(100円ショップなどで手に入る)木のケースなど装飾部品

 

今回の記事の流れ

1.カメラをセットアップして写真撮影
2.写真をLINEに添付、送付
3.スマートホーム・デバイスにカメラを組み込む
4.音声と連携させて、室内で便利に使う
5.まとめ

 

1.カメラをセットアップして写真撮影

まずラズパイにカメラをセットしましょう。ラズパイの中ほどにあるカメラ端子の白いフックを引き上げ、ケーブルを差して、フックを固定します。
右写真のように黒い端子を上の向きにすると、そのままで上下正しく撮る事ができます。(オプションで写真の向きなどを変更する事もできます)

19-3

smartフォルダ下に、imageという写真保存場所を作って、raspistillコマンドで試し撮りしてみます。(-w 480 -h 360は画像サイズの指定です。)

$ cd smart/

$ sudo mkdir image

$ raspistill -w 480 -h 360 -o image.jpg

今後のpythonプログラムで使えるように、camera.pyプログラムを作って、imageフォルダ下に、日付時間毎の画像ファイルを保存するようにします。

[camera.py]

2.写真のLINEへの送付

写真を撮った時に、それをLINEに送って、遠隔からでも簡単にチェックできるようにします。
LINEのNotifyというAPIを使うと、ラズパイから簡単に写真付きメッセージを送る事ができます。

LINE Notifyのページから、LINEアカウントでセットアップをしてみて下さい。
以下画面が出たら、“トークンを発行する”ボタンを押します。

19-4

写真を送りたいグループなどを指定します。ここでは“スマートホーム“グループを作っています。
ここでNotify用のトークンを取得します。一度しか表示されないので、しっかりコピーしておいて下さいね。
またLINE側で、写真を送るグループにLINE Notifyというユーザを招待するのをお忘れなく。

19-5

それでは先ほどのカメラ機能と合わせてcamera_line.pyを作ります。取得したトークンを使ってLINE送付用のコマンドを追加(黄色部分)しています。

[camera_line.py]

camera_line.pyを流してみると、ラズパイで撮った写真が、このようにLINEに送られてきました。

19-6

3.スマートホーム・デバイスにカメラを組み込む

それでは、前回まで作っていたスマートホーム・デバイスに、カメラを組み込んでいきます。

19-7

ちょうど空いた穴から、レンズ部分を出し、固定します。
ケーブルが多くなってしまった部分は、赤い屋根でふたをしておきます。

19-8

これを部屋に置いておいて、定期的に室内写真を撮るようにしてみましょう。例えば、10時と15時に自動的に写真を撮って、LINE送付するようにします。

19-9

これにはcronという定期的にプログラムを実行する仕組みを利用します。
cronに必要なライブラリをインストールして、スタートさせます。

$ sudo apt-get install chkconfig

$ sudo /etc/init.d/cron start

$ sudo chkconfig cron

19-10

cronエディタ(crontab -e)を実行し、その一番最後に以下2つの実行プログラムを記述します。(この場合、毎日10時と15時に実行)
その後リスト(-l)でcronが正常に登録されているか確認してください。

$ crontab -e

# 一番最後にこの二行を追加
00 10 * * * python /home/pi/smart/camera_line.py
00 15 * * * python /home/pi/smart/camera_line.py

$ crontab -l

19-12
またcronから正常にプログラムが動いているか確認する為、cronのログを残すようにします。
rsyslog.confという設定ファイルのうち、#cron.*となっている部分のコメントアウトを外せば、/var/log/cron.logとしてログファイルが書き込まれます。

$ sudo vi /etc/rsyslog.conf

cron.* /var/log/cron.log #コメントアウトを外す

$ sudo /etc/init.d/rsyslog restart

$ sudo cat /var/log/cron.log

[/etc/rsyslog.conf]
19-13

cronが動いているかどうかの確認
19-14

これで部屋に置いて電源を入れておくだけで、定期的に室内の写真をLINEに送ってきてくれるようになります。
19-16

4.音声と連動させて、室内で便利に使う

それでは最後に、発話内容に応じて、室内で便利に使えるように、これまで作った機能を連携させましょう。
以下例のような、普段の“おはよう”や“ただいま”などのあいさつに連動して、自動で動かす仕組みを作ってみてはどうでしょうか?

19-17

そのために、前回作成した日本語認識のJuliusのプログラムを改修して、julius_remote.pyプログラムを作りました。プログラムはリンクからダウンロードできるようになっています。
内容的には、以下の部分で、あいさつに応じて、返答のメッセージや、リモコンのコマンドを指定しています。

[julius_remote.pyの一部]

以下の部分で、コマンドに応じて赤外線送信や、室温のチェック、写真、LINE送付などを定義しています。取り入れたい機能に応じて、プログラムの記述を変えてみて下さい。

[julius_remote.pyの一部]

また室内の温湿度を測って、その結果に応じて赤外線を操るために、bme.pyを以下のように追加、修正します。このプログラムは、bme_remote.pyとして、こちらに保存しています。

[bme_remote.pyの一部]

これらのプログラムができたら、スマートホーム・デバイスを室内の好きなところに置いてください。赤外線機器の近くの方がリモコンの効きは良いと思います。
19-18

それではこのjulius_remote.pyプログラムを実行するか、以前の記事を見て自動実行プログラムにして、走らせます。

さあ、まずは「おはよう!」と挨拶してみましょう。
この動画のように、「おはようございます!」の返答と共に、室温などを測って、リモコン操作してくれると思います。

また、「いってきます!」や「ただいま!」のあいさつで、スナップ写真を撮ってくれています。
特に家に帰ってきた子どもの写真がLINEに送られてくると、親御さんは安心ですし、ほっこり和むこと請け合いですね!
19-19

これ以外にも第2回で扱ったSnowboyで「ねぇ、お部屋チェック!」などのウェイクワードを登録し、こちらのプログラムを使えば、似たような操作が可能です。
[wake_remote.pyの一部]

detector = snowboydecoder.HotwordDetector(models, sensitivity=sensitivity)
callbacks = [lambda: camera_line.main(),
lambda: bme_remote.main()]
print(“「ねぇ、お部屋チェック!」や「ねぇ、お部屋測って!」などウェイクワードを発話して下さい。Ctrl+Cで終了します。”)

ぜひ色々組み合わせて、ご自分の部屋や使い方にあった機能を付け加えてみて下さい!

5.まとめ

ラズパイでスマートホーム化として、カメラをつないで室内をチェックできるようにしました。
合わせてLINEと連携させる事により、離れた所からでも家がチェックできるようになりました。

最後に、これまで作った温湿度センサ、赤外線リモコン、日本語音声認識などを組み合わせて、シンプルなあいさつから、様々な機能を呼び出せるようにしました。

一人暮らしの方は挨拶に応えてくれるだけでも嬉しいですし、お子さんがいる方は、帰宅時などのチェックができて、安心ですね。画像解析機能を活用すれば、不審者検知カメラや、ペット監視にも使えるかもしれません。

それではこれからも、ラズパイと、センサ、カメラ、音声機能などを使って、家の中を便利に、スマートホーム化していってください!

(ヨシケン)

ラズパイ電子工作の基本② サーボモータで制御できる輪ゴム鉄砲砲台を作る

$
0
0

人気のラズパイ電子工作基本編、その2です。

今回のネタは、輪ゴム鉄砲砲台! 複数のサーボを組み合わせて、操作できる輪ゴム鉄砲の砲台を作ります。難しそうに見えるかもしれませんが、かみ砕いて解説してもらいました。今回の内容をマスターすると、きっと応用が利くはずです。

第1回は、サーボモータと温度センサを組み合わせて、室温を指す「指差し温度計」を作りました。サーボモータとほかの電子パーツを組み合わせると様々な作品を作り出せます。

ラズパイ電子工作の基本① サーボモータを使って指さし温度計を作ってみよう

また、サーボモータを複数使って複雑な動きを実現することも可能です。
そこで、今回は3つのサーボモータを組み合わせて輪ゴム鉄砲をラズパイから制御できる「輪ゴム鉄砲砲台」を実現してみましょう。

01

制作で利用する機器、電子パーツ

●Raspberry Pi
02-1
第1回で利用したラズパイを利用できます。
また、複数のモデルが販売されていますが、Raspberry Pi/2/3、Raspberry Pi Zero/Wのいずれでも問題ありません。わからない場合は最新版の「Raspberry Pi 3 Model B+」を購入しましょう。主な購入可能なサイトは以下の通り。
KSY
RS

また、Raspberry Piを動作させるためのSDカード、ACアダプタ、キーボード、マウス、ディスプレイなどが別途準備する必要があります(参考記事)。

●サーボモータ(小型)
02-2
トリガーを引いて輪ゴムを発射するために利用します。ここでは、前回利用した模型などに利用されるサーボモータ「MG90D」を利用します。1個必要となります。

●サーボモータ(大型)
02-3
輪ゴム鉄砲の向きを動かすのに利用します。輪ゴム鉄砲本体や取り付け冶具、サーボモータといった複数の部品を乗せた状態で動かすのである程度のパワーが必要となります。このため、比較的パワーのあるサーボモータ「SG-5010」を利用します。2個必要となります。

●サーボモータドライバ
02-4
サーボモータを制御する電子パーツです。複数のサーボモータを一度に動作できます。また、正確なPWMを出力できるため、動作が安定します。今回はこちらを使います。

●ACアダプタ
02-5
サーボモータ駆動用の電源を供給します。ACアダプタは家庭用コンセントに差し込むと電圧を変換した直流を供給できます。変換する電圧はACアダプタによって異なります。ここでは5Vに変換するACアダプタを選択しています。

●DCジャック、ターミナル変換
02-6
ACアダプタからモータドライバに電源を供給するためにコネクタの変換が必要です。使用したのはこちら

2つのサーボモータで向きを制御する

サーボモータはひとつの軸の対して回転するため、第1回で実現したような1軸の回転する応用ができました。しかし、複数のサーボモータを組み合わせることでより複雑な制御が可能となります。
例えば、ロボットアームであれば、各関節の部分にサーボモータが取り付けられており、腕の動きを実現しています。
同様に2つのサーボモータを使うことで、輪ゴム鉄砲の向きを自由に変化させられます。
本記事では、「ロール」と「チルト」の動作をそれぞれのサーボモータで制御できるようにします。
「ロール」とは、左右の向きを変更する動きです。本記事では、下の台座に装備して、その上を左右に回転させています。

11

「チルト」は上下の傾きを変化する動きです。本記事では、ロールを制御するサーボモータの上に取り付けて上、下を向けられるようにしています。

12

また、向きを変更するだけでなく、輪ゴムを発射するトリガー部分の操作にもサーボモータを利用します。サーボモータをトリガーの近くに設置して、サーボモータを回転させるとトリガーが引いた状態になり、輪ゴムが発射できます。

13

2つのサーボモータで向きを変更できるようにし、1つのサーボモータで輪ゴムを発射できるようにしてみましょう。

サーボモータドライバを使う

第1回で紹介したように、Raspberry Piに直接接続してプログラムでサーボモータを制御できます。しかし、サーボモータに送るパルス波は、数十μ秒の精度が必要となります。もし、パルス幅が変化してしまうと、サーボモータの挙動にも影響し、細かく震えたりと安定性が保てなくなります。
プログラムでパルス波を作成する場合は、他の処理などによって影響を及ぼし、パルス幅が微妙に変化します。また、パルス幅が大きく変化し、挙動がおかしくなることもあります。
第1回で利用したpigpioというライブラリはできる限り正確なパルス波を出力するような工夫をしていますが、まれに挙動がおかしくなることがあります。

21

このため、サーボモータを制御するにはぶれの少ないパルス波を出力できることが大切です。そこで利用できるのが「サーボモータドライバ」です。専用のICによって精度の高いパルス波を出力できるようになっており、プログラムの動作などの影響を受けないようにできます。
また、サーボモータ用の電源端子を搭載しており、電池などの電源を接続しておくことで各サーボモータに電源が供給できます。
今回は、サーボモータドライバとして「AE-PCA9685」を利用します。AE-PCA9685は16個のサーボモータを接続して同時に制御が可能となっています。また、I2Cを利用してRaspberry Piから各サーボモータの制御ができるようになっています。

22

サーボモータを動かしてみる

サーボモータドライバを使ってサーボモータを動かしてみましょう。次の図のようにRaspberry Piと接続します。
31

サーボモータはドライバの上にある「0」と記載された端子に縦向きに差し込みます。この際、茶色の線(GND)を上側にします。

32

なお、サーボモータを接続する端子の上に記載された数字またはアルファベットはチャンネル番号で、サーボモータを動かす際に対象のチャンネル番号を指定することになります。
サーボモータを動かすには別途電源が必要となります。今回はACアダプタを利用してコンセントから電源を取得できるようにします。ACアダプタでは100Vの交流電源を、直流の数Vの電源に変換できます。今回は5Vの直流を出力できるACアダプタを選択します。
また、ACアダプタの端子は円筒状のプラグ状になっており、直接サーボモータドライバに接続できません。そこで、変換用アダプタを利用して配線を使ってサーボモータドライバに接続できるようにしています。なお、ACアダプタには極性があるので接続する場合は注意します。変換アダプタの「+」を記載されている端子からサーボモータドライバの「+5V」と書かれている端子に接続するようにします。

33

サーボモータドライバは、I2Cで通信します。このため、Raspberry PiでI2Cを利用できるように設定が必要です。Raspberry Piのメニューをクリックして「設定」-「Raspberry Piの設定」を選択します。「インターフェイス」タブにある「I2C」項目を有効に切り替えます。

34

次にサーボモータ動作プログラム「servo_pca.py」とサーボモータ制御ライブラリ「pca9685.py」をダウンロードします。

【ダウンロード】
サーボモータ動作プログラム
servo_pca.py
サーボモータ制御ライブラリ
pca9685.py

ダウンロードしたら実際にサーボモータを動かしてみます。サーボモータを接続したチャンネル番号、パルス幅の順に指定します。例えば、チャンネル0に接続したサーボモータを1500μ秒のパルス幅で動作するには以下のように実行します。

$ python3 servo_pca.py 0 1500

他のパルス幅を指定してみてサーボモータが動くことを確認しましょう。
なお、他のチャンネルに接続した場合は、チャンネル番号を変更することで操作できます。ただし、チャンネル番号は16進数で表記されています。AからFはそのままでは指定できないので、「0xa」のように16進数であることを明示する必要があります(10進数に変換した値を指定してもかまいません)。

砲台のパーツを作る

砲台の本体を作成しましょう。
本記事では、手作りした輪ゴム鉄砲を取り付けて操作できるようにします。取り替えも可能なので、子供自身で手作りした輪ゴム鉄砲を取り付けて楽しめるようにできます。
サーボモータの取り付け部分を中心に説明します。
ロールを制御するサーボモータは土台に取り付けます。本記事では四角い箱を作成し、そこにねじで取り付けています。なお、箱の作成にはレーザーカッターを使いました。レーザーカッターを利用せずに、木を切ったり、段ボールを加工する、3Dプリンターで出力するなど任意の方法で作成しても問題ありません。

41

チルトを制御するサーボモータは、ロールのサーボモータに取り付けるホーンと直角になるように配置します。本記事では板を直角に取り付け、一方にサーボモータ、もう一方にホーンを取り付けています。三角形の板は補強するために取り付けたものです。

42

輪ゴム鉄砲を取り付ける部分は、長方形の板を利用します。多数の穴を開けておき、輪ゴム鉄砲の本体を結束バンドなどで固定できるようにしています。また、チルトのサーボモータを取り付けるホーンを中央配置します。トリガーを動かすためのサーボモータを輪ゴム鉄砲のトリガーの前方あたりに配置するように取り付けます。

43

トリガーを動かすために、ホーンに加工をしておきます。そのまま付属のホーンだけでトリガーを動かそうとすると、トリガーがホーンの外側に逃げてしまい、トリガーを正しく動かせません。そこで、ホーンの両方にガイドとなる板で挟み込み、トリガーがガイドの間にはまるようにしておきます。

44

砲台を仕上げる

それぞれのパーツができたら、電子回路を作成し、1つに組み上げます。
電子回路は次のように接続します。サーボモータドライバには、ロールのサーボモータを「0」チャンネル、チルトのサーボモータを「2」チャンネル、トリガーのサーボモータを「4」チャンネルに接続します。

51

組み上げる前にサーボモータをあらかじめ初期の状態に動かしておきます。それぞれのサーボモータをサーボモータドライバに接続します。サーボモータの動作は「servo_pca.py」を使います。
ロールとチルトを制御するサーボモータは動作範囲の中央付近に動かします。多少の違いはありますが、一般的なサーボモータはパルス幅が約1500μ秒で中央まで動くようになっています。そこで、以下のように実行してサーボモータを中央に移動しておきます。

$ python3 servo_pca.py 0 1500
$ python3 servo_pca.py 2 1500

トリガーを動かすには、サーボモータを90度以上動かすこととなります。しかし、今回利用するMG90Dはおおよそ120度の範囲でしか動かせません。トリガーを引いていない状態を動作範囲の中央にしてしまうと、60度程度しか回転できず、トリガーを十分動かせません。そこで、動作範囲の左端にサーボモータを動かしておきます。
第1回で調べたようにMD90Dの動作範囲は800μ秒(右側)から2300μ秒(左側)となっています。動作範囲内で左側の端より少し内側となる2200μ秒をトリガーを引いていない状態とします。以下のように実行してサーボモータを動かします。

$ python3 servo_pca.py 4 2200

サーボモータと砲台の準備ができたら、サーボモータにホーンを取り付けます。ホーンは取れてしまわないよう付属のねじで固定します。
トリガーはホーンが下に向くようにして取り付けておきましょう。

操作範囲を確かめる

砲台が組み上がったらサーボモータの制御範囲を確認しておきます。確認を怠ると、必要以上にサーボモータが回転してしまい、部品同士がぶつかって壊れてしまいかねません。また、トリガーを動かして輪ゴムが発射できるかの調節もしておきます。
まず、パンの制御するサーボモータを動かしてみます。制御範囲を確かめるには「servo_pca.py」を使います。組み立てた際は、おおよそサーボモータの中央となる「1500」となっています。ここからパルス幅を増やしたり減らし、パーツがぶつからない操作する範囲のパルス幅を確認します。この際、ほかのパーツがぶつからないことも確認しておきましょう。例えば、パルス幅を1800とする場合は以下のように実行します。

$ python3 servo_pca.py 0 1800

61

同様にチルトの範囲も調べます。チルトも組み立てる際におおよその中央値の「1500」としています。上下に動かす場合には、トリガーを動かすサーボモータや輪ゴム鉄砲の持ち手部分が干渉しやすいので、注意して確認しておきます。なお、チルトでパルス幅を1300とする場合は以下のように実行します。

$ python3 servo_pca.py 2 1300

62

トリガーを調節します。サーボモータを動かしてトリがが動くことを確認してみましょう。この際、サーボモータの動作範囲を超えないように注意します。例えば、第1回で調べたようにMG90Dは、800から2300の範囲で動かせます。組み立てる際にトリガーを引いていない状態を範囲内の2200としました。同様にトリガーを引く際も範囲内の900にしてみます。

$ python3 servo_pca.py 4 900

これでトリガーが正しく動くかを確かめましょう。トリガがサーボモータから外れてしまう場合は、ホーンに付けるガイドを工夫する必要があります。
次にトリガーを元の状態に戻し、輪ゴムを取り付けて再度サーボモータでトリガーを引いた状態にし、輪ゴムが飛ぶことを確認しましょう。輪ゴムが飛ばない場合は、トリガーの輪ゴムを掛ける部分を削るなどして輪ゴムが飛ぶように調節します。

63

輪ゴムを発射する

砲台に輪ゴム鉄砲を取り付けたら実際にRaspberry Piから操作してみましょう。今回は、キーボードから操作するようにしてみます。
以下のリンクから、プログラム「gum_gun.py」をRaspberry Piにダウンロードします。

【ダウンロード】
輪ゴム鉄砲砲台操作プログラム
gum_gun.py

また、前のサーボモータの制御で利用した「pca9685.py」も必要となるので、ダウンロードしたファイルと同じフォルダー内に配置しておきます。
ダウンロードしたら各サーボモータの操作範囲を設定します。Raspberry Piのメニューから「アクセサリ」-「Text Editor」を選択してテキストエディタを起動し、ダウンロードしたプログラム「gum_gun.py」を開きます。
6から10行目の「pan_」から始まる変数は、パンを制御するサーボモータの設定項目です。「pan_ch」はサーボモータドライバに接続したチャンネル番号です。「pan_neutral」は中央の値の「1500」を指定し、「pan_max」と「pan_min」にサーボも動作範囲のパルス幅を指定しておきます。「pan_delta」は1回のキー操作で変化するパルスの幅を指定します。この値が大きければ速く動き、小さくすれば細かく調節できます。
同様に12から16行目の「tilt_」から始まる変数にチルトを制御するサーボモータの設定をします。
18から20行目の「trig_」から始まる変数にトリガーを制御するサーボモータの設定をします。「trig_ch」に接続したサーボモータドライバのチャンネル、「trig_off」にトリガーを引かない状態のパルス幅、「trig_on」に輪ゴムを発射する場合のパルス幅を指定します。
設定が完了したら以下のように実行します。

$ python3 gum_gun.py

すると各サーボモータが初期の位置に移動し、スタンバイ状態になります。
キー操作は、「A」と「D」でパンの操作、「W」と「S」でチルトの操作します。スペースキーを押すとトリガーを動かして輪ゴムを発射します。
なお、終了する場合は必ず「Q」キーを押すようにします。「Ctrl」+「C」で強制終了してしまうと、端末の表示がおかしくなってしまいます。おかしくなった場合は、端末アプリを起動し直しましょう。

まとめ

今回はサーボモータで輪ゴム鉄砲の向きを自由に変えられるようにしました。この手法は輪ゴム鉄砲以外にも使えます。たとえばカメラを取り付ければ遠隔から制御して撮影が可能になるライブカメラや、レーザーポインタを使えば遠隔から画面を指し示すこともできます。
また、操作についても今回はキーボードを利用しましたが、ジョイスティックを接続したり、独自にスイッチを取り付ける、ネットを介して操作できるようにするなどさまざまな応用もできます。

Viewing all 58 articles
Browse latest View live