気分はセレブ!手を叩くとディナーを出してくれるデバイスを作ろう
こんにちは、たいしょーです。
いきなりですが、高級なレストランで指パッチンや手を叩いて合図するとウェイターがディナーを出してくれるシーンを見たことありませんか?
憧れのシーンを実現したい
どこで見たかわからないけどなんとなく想像できる人も多いと思います。
で、私はそのシーンをめっちゃ再現したいわけです。
何も言わずとも合図を送るだけで自分の好みを把握したウェイターがスッとディナーを出してくれる…そんなセレブ気分を味わいたい…………! しかし、高級レストランに行くお金もなければ、行けたとしても恥ずかしくてそんなことやる勇気も出ないので自宅で再現してみましょう。
設計
先ほどのイメージ画像通り「合図するとディナーを出してくれる」のが完成イメージですが、より具体的な実現方法を考えてみます。
考えた結果、手を叩いたことをセンサーで認識して、「Amazon Dash Button」を押すことでディナーをネット注文することにしました。
準備するもの
準備するものリスト
名前 | 個数 |
---|---|
Amazon Dash Button | 1 |
Arduino Uno | 1 |
拍手制御スイッチ [AKIT-107] | 1 |
トランジスタ(S8050) | 1 |
デジタル・マイクロサーボ SG90 | 1 |
ジャンパー線(オス) | 最低6本 |
太い輪ゴム | 1 |
半田付けセット |
手を叩くことを認識するセンサー部分は、aitendo様に「拍手制御スイッチ」というまんま目的に合った素敵キットがあったので注文しました。
拍手制御スイッチを組み立てる
半田付けする
はやく半田付けをしたい人も、このセクションの【注意点!!】を読んでから半田付けをはじめてください。
拍手制御スイッチは自分で部品を半田付けするキットで届くので組み立てていきましょう。
半田付けの基本については村田製作所様のこちらのページが参考になります。
電子工作のコツ/はんだ付け | 村田製作所 - Murata
さて、今回用意した半田付けセットはこちら。
はんだは線径0.6mmのもの、半田ごては温度を350度に設定したものを用意しました。 洗濯バサミみたいな道具はヒートシンクといい、半田ごての熱から熱に弱い部品を守るものですが今回は使いませんでした。
どの部品を基板のどこにつけるかなのですが、aitendo様のWebページに部品リストと回路図が載っているのでこれを見ながら組み立てて行くしかありません……。
これが滅茶苦茶大変です。
オススメのやり方は最初に部品リストの順番通りに部品を並べてから半田付けを始めることです。
抵抗などは下記のページで抵抗値を入力して5本色帯カラーコードに変換しながら照らし合わせると間違いづらいです。
抵抗 - カラーコード(4本・5本色帯)変換 - 計算ツール
注意点!!
さて、いよいよ半田付け・・・と、ちょっと待ってください!!
部品を整理したらQ4の場所につけるトランジスタ(S9014)をトランジスタ(S8050)に差し替えてください。 組み立ててから気づいたのですが、ここの部品をすり替えないと組み上がった後正常に動作しません。(予備に2つ基板を買って試しましたがどちらも同じ結果でした)
部品を差し替えたら今度こそ半田付けをします。
電解コンデンサ、LED、ダイオードは取り付け向きが決まっているので注意しましょう。 電解コンデンサ、LEDは2本ある足の長い方が+側。ダイオードは黒く模様がついている方向を基板の模様と合わせてください。
無事、組み終わったものがこちらです。
試してみる
図のような簡単な回路を組んで、ちゃんと動くか試して見ましょう。 拍手スイッチのPower(入力電圧)は5Vではなく3.3Vであることに注意してください。
今回Fritzing用に拍手制御スイッチ(AKIT-107)のカスタムパーツを作りましたのでこちらからDLできます。 よかったらどうぞ。
回路を組んだらセンサの上で手を叩いて見ます。手を叩くたびにLEDが点灯・消灯すれば成功です!
(これが楽しくて、30分ぐらいセンサーの上で手を叩いてました。)
サーボの原点合わせ
今回用意した「デジタル・マイクロサーボ SG90」は「Amazon Dash Button」を押すのに使います。まずはサーボの原点合わせを行いましょう。
今回使用するSG90は0~180°まで回るのですが、買った初期状態ではどこを向いているのかわからないので原点として初めに90°に位置合わせを行います。
まず以下のようにサーボとArduinoを繋ぎましょう。
そして以下のプログラムを書き込んで実行します。
#include <Servo.h>
Servo myservo;
void setup() {
myservo.attach( 10 );
}
void loop() {
myservo.write( 90 );
}
これでサーボの原点が決まったので、付属のホーンを以下のように真上を向くようにつけます。
全体の配線
いよいよ全体の配線! 以下のように配線します。
「サーボ」と「Amazon Dash Button」は輪ゴムで合体させました。
プログラム
以下のプログラムを書き込みます。
#include <Servo.h>
Servo myservo;
volatile int flag = 0;
void interruptsw()
{
flag = 1;
}
void setup() {
myservo.attach( 10 );
attachInterrupt(0, interruptsw, CHANGE);
}
void loop() {
if(flag == 1){
myservo.write( 45 );
delay(500);
flag = 0;
}else{
myservo.write( 90 );
}
}
今回のプログラムのポイントは割り込み処理とvolatileです。
割り込み処理
割り込み処理とは簡単に言えば、「イベントが起こった時に、コンピュータがどんな処理をしていようと無理やり別の処理を割り込ませる」というもの。
今回のプログラムの場合attachInterrupt(0, interruptsw, CHANGE);で、どのピンのどんなイベントを監視するか指定しています。指定の仕方は、attachInterrupt([監視するピン], [割り込ませる処理], [反応するイベントの種類]);です。
Arduino Unoでは監視するピンは0か1しか指定できなく、それぞれpin2, pin3に対応しています。
今回のプログラムのattachInterrupt(0, interruptsw, CHANGE);とは「2pinの信号がCHANGE(変化するたび)interruptswを実行してね」という指定をしていることになります。
volatile
volatileとは「この変数に関係する部分は消さないで!」という指定。
どういうことかというと、プログラムをよく見てもらうとvolatileをつけているflagという変数はloop()の中で、何の計算にも使われていません(足すとか引くとか)。loop()の中では、if(flag == 1)の部分でフラグが1になることを待っていますが、コンピュータはかしこい?ので、
flagはloop()の中で計算に使ってない
↓
計算に使ってないならflagの値が増えたり減ったりすることは一生ないんじゃね?
↓
じゃあ「flag == 1」になることはありえんね、無駄なんでif文消しまーす
↓
俺優秀☆
という具合に最悪の場合勝手にif文を消します。 私たちからすれば「そこは割り込みが起こった時に1が代入されるんだけど・・・」と思いますがコンピュータは知ったこっちゃありません。ということで、計算には使ってないけど割り込みなどで確実に値が変化する変数についてはvolatileをつけて消されないようにしてあげます。
実際に使ってみる
さて、難しい話はこれぐらいにして早速完成したデバイスを使ってみましょう!
より雰囲気を出すためにフリー素材のおじさまウェイターの画像をA3用紙4枚刷りで印刷し、そこにデバイスを貼り付けました。
いざ起動・・・・!!!
無事、手を叩いただけでディナーが届きました!!!!!
「シーチキン」の「Amazon Dash Button」を使ったのでシーチキンが届きました。今回使った拍手センサは使い方も簡単なので、他にも音で動くデバイスを作ってみると面白いと思います!
それでは、みなさん良きセレブライフをー!