Arduinoを使って電子工作をいくつか試したことがある方、そろそろ自分の頭の中のイメージを形にしてみませんか?
「まだ早いのでは?」と思った方、最も早く電子工作の腕を上達させるコツは、今までに作った電子工作のポイントとなる部分を組み合わせることです。
そこで今回は以前の記事、「Arduino LeonardoはUSBの周辺機器にも早変わり!? まずは音量の調整から始めよう!」で作ったパソコンの音量を操作するUSB機器を改良してみます。
Webサイトを閲覧している時に急に動画が再生されたり、いきなり誰かが部屋に入って来た時などに大急ぎでパソコンをミュートに変えたりするのは煩わしい作業です。そこで、今回の電子工作では、そのような時に手の動きなどのジェスチャーでパソコンをミュートできるデバイスを作ります。
前回はArduino Leonardoと可変抵抗器を使いましたが、今回は可変抵抗器の代わりに距離センサ(超音波センサ)を使用してパソコンのミュート(音消)を操作します。
目次
1. ジェスチャーでパソコンを操作するには
本記事で紹介するのは人間の手の動きなどのジェスチャーを読み取りパソコンへミュート(音消)コマンドを送る電子工作です。
これは、以前に紹介した2つの記事のポイントの組み合わせで実現できます。
手の動きなどのジェスチャーを読み取るには「Arduino LeonardoはUSBの周辺機器にも早変わり!? まずは音量の調整から始めよう!」で紹介した超音波センサを使用します。
超音波センサの特徴である対象物との距離を計測する機能がポイントです。
ジェスチャーを分析してパソコンへミュートコマンドを送るのは「Arduino LeonardoはUSBの周辺機器にも早変わり!? まずは音量の調整から始めよう!」のArduino Leonardoです。
Arduino Leonardoは、マウスやキーボードなどのHID機器と呼ばれる種類のUSBデバイスを簡単に作成できるのでその特徴を利用します。「メディアの再生/停止」「音量の操作」などのマルチメディアキーも実装できます。今回はマルチメディアキーの「ミュート(音消)」機能を実装します。
2. Arduino Leonardoは標準でHID機器になる
今回の電子工作は、いつも使用するArduino Unoでは上手くいきません。
Arduino Leonardoに搭載されているマイコンATmega32u4にはHID機器を作成するための機能が含まれているためです。Unoには含まれていません。
技術的にはUnoとHoodloader2ライブラリを組み合わせればHID機器を作成できます。ただし、この方法は難易度が高いので最初から機能を内蔵しているマイコンを搭載したLeonardoを使用した方が手軽です。
Arduino LeonardoをHID機器として使用するためにはHID-Projectと呼ばれるサードパーティー製のライブラリをArduino IDEに追加する必要があります。
[スケッチ]メニューから[ライブラリをインクルード] ≫ [ライブラリを管理…]を選択します。
[検索をフィルタ]に「hoodloader」と入力してください。
「HID-Project by NicoHood」が見つかるはずです。最新のバージョンを選択して[インストール]をクリックします。
これでスケッチからHID-projectライブラリが使用できるようになります。
3. 準備
以下のものを準備してください。
Arduino Leonardo
Arduino IDE
超音波センサ
本記事では超音波センサにHC-SR05を使用します。
超音波センサはさまざまな製品が販売されていますが、どれも構造は似ています。ピンの並びに注意すれば使用できるものも多くあります。
上記以外にUSBケーブルが必要です。
また、本記事はWindowsを使用します。ほかのOSでは動作が異なる場合もあるので注意が必要です。
4. スケッチ全体
以下がスケッチの全体です。スケッチのあとに解説が続きます。
#include <HID-Project.h> void setup() { pinMode (6,OUTPUT); //Insert HC-SR-05 with VCC in pin 6 pinMode (5, INPUT); // Assign pin 5 to Echo pinMode (4, OUTPUT);// Assign pin 4 to Trig pinMode (2,OUTPUT); // Assign pin 2 to GND. Serial.begin(9600); // This will allow you to read the current value of the dial } void loop() { long duration, cm; // Initialize variables for duration and cm digitalWrite(6, HIGH); // Power the sensor digitalWrite(4, LOW); // Clear pulse before sending a 10 microsecond ping, delayMicroseconds(2); digitalWrite(4, HIGH); delayMicroseconds(10); digitalWrite(4, LOW); duration = pulseIn(5, HIGH); // Detect pulse length from the Echo pin, measured in microseconds cm = (duration/2)/29.155; // Divide duration in half (due to round trip), then convert distance to centimeters (1cm per 29.155 microseconds), assign to cm variable Serial.print(cm); // Print distance in cm to serial monitor Serial.print("cm"); Serial.println(); if (cm < 10 && cm > 0) { Consumer.write(MEDIA_VOLUME_MUTE); delay(500); } }
スケッチのポイントとなる部分を説明します。
最初はスケッチ内でHID-Projectライブラリが提供する関数を使用できるようにするinclude文です。
#include <HID-Project.h>
Arduino IDEでHID-Projectライブラリを読み込むだけでは利用できません。必ずこのinclude文をスケッチの先頭に追加します。
以下はsetup()関数の中のソースコードです。
pinMode (6,OUTPUT); //Insert HC-SR-05 with VCC in pin 6 pinMode (5, INPUT); // Assign pin 5 to Echo pinMode (4, OUTPUT);// Assign pin 4 to Trig pinMode (2,OUTPUT); // Assign pin 2 to GND. Serial.begin(9600); // This will allow you to read the current value of the dial
超音波センサを接続したピンの動作を以下のように設定します。
- 6番ピン: [出力] 超音波センサに電源(Vcc)を供給します。
- 5番ピン: [入力] 対象物に反射した超音波を受信(Echo)します。
- 4番ピン: [出力] 超音波センサに超音波を送出するように指示(Trig)します。
- 2番ピン: [出力] 超音波センサのグランド(GND)です。
最後の行でArduino IDEのシリアルモニタにデータを表示できるようにします。今回は超音波センサから受信した情報をシリアルモニタに出力します。
以下はloop()関数の抜粋です。
digitalWrite(6, HIGH); // Power the sensor digitalWrite(4, LOW); // Clear pulse before sending a 10 microsecond ping, delayMicroseconds(2); digitalWrite(4, HIGH); delayMicroseconds(10); digitalWrite(4, LOW);
1行目は超音波センサに電源を供給します。
2〜6行目は、超音波センサから超音波を10ミリ秒送出しています。
最初に超音波が確実に停止している状態を2ミリ秒間維持します。
その後TrigがつながるピンをHIGHにして超音波の送出を開始、10ミリ秒間その状態を維持した後LOWにします。
以下のソースコードが続きます。
duration = pulseIn(5, HIGH); // Detect pulse length from the Echo pin, measured in microseconds cm = (duration/2)/29.155; // Divide duration in half (due to round trip), then convert distance to centimeters (1cm per 29.155 microseconds), assign to cm variable
1行目で対象物に反射した超音波が超音波センサに戻るまでスケッチの実行をストップします。超音波を受信していない状態ではEchoはLOWです。対象物に反射した超音波を受信するとEchoはHIGHになり、ストップが解除され2行目に処理が続きます。
この際に変数durationにLOWの状態が継続した時間(マイクロ秒)が格納されます。
超音波が1センチメートル進むのに必要な時間は29.155マイクロ秒です。変数durationに格納される時間は超音波が対象物まで往復した時間なので、これを2分の1して29.155で割って対象物までの距離(センチメートル)を算出できます。
以下のソースコードで超音波センサの入力から算出した対象物までの距離に応じて処理を切り分けます。
if (cm < 10 && cm > 0) { Consumer.write(MEDIA_VOLUME_MUTE); delay(500); }
条件が一致した時はパソコンにミュートコマンドを送出します。条件は対象物がセンサから10センチメートルまでの場合です。
MEDIA_VOLUME_MUTEをデバイスから受信したパソコンは、受信するごとに音消し機能をON/OFFします。パソコンの音がミュートされている時はミュートを解除、またミュートが解除されている状態ではミュートします。
最後にdelay()関数を呼び出してパソコンに短時間に連続してコマンドを送らないようにします。
if文の条件の一つに「cm > 0」が含まれています。「変数cmの中の値が0だったら反応しない」という意味です。これは超音波センサの誤作動などで超音波を送出した瞬間にセンサが「反射した超音波を受信した」と反応するのを無視します。
このif文の条件は使用している環境や超音波センサの種類によっても異なるでしょう。実際に動作させながら、ちょうど良い距離を探してください。
5. 配線
ArduinoボードからパソコンにつながるUSBケーブルを一旦取り外し、超音波センサを配線します。
配線は以下の手順で行います。
- Arduinoの6番ピンを超音波センサの電源(Vcc)ピンに接続します。
- Arduinoの5番ピンを超音波センサのEchoピンに接続します。
- Arduinoの4番ピンを超音波センサのTrigピンに接続します。
- Arduinoの2番ピンを超音波センサのグランド(GND)ピンに接続します。
配線が終わったらArduinoボードを再びパソコンに接続します。
超音波センサに手を近づけるごとにパソコンがミュート/ミュート解除と切り替われば成功です。上手く動作しない場合は超音波センサがジェスチャーに反応していないことが考えられます。
6. まとめ
今回の電子工作は過去に紹介した電子工作の中からポイントとなる部分を抜き出して組み合わせたものです。
実際の電子機器の設計も似たようなものです。回路図は見たことのないような記号の羅列で最初は圧倒されるかも知れません。しかしよく見ると1つ1つの部品は特定の機能を実現するための集合体で、それがいくつもつながっているだけです。
今までに紹介してきた電子工作は初歩的な内容が多かったと思います。次のステップはそれをつなぎ合わせてみることです。最初は戸惑うかも知れませんが、少しずつ大規模な設計ができるようになるはずです。諦めないで続けていきましょう。