手の動きとArduinoを使用した素晴らしいコントロールコンピュータ
コンポーネントと消耗品
> ![]() |
| × | 1 | |||
![]() |
| × | 2 | |||
![]() |
| × | 1 |
アプリとオンラインサービス
> ![]() |
| |||
| ||||
| ||||
|
このプロジェクトについて
このプロジェクトでは、ジェスチャー制御のラップトップまたはコンピューターを構築する方法を学習します。これは、ArduinoとPythonの組み合わせを使用することに基づいています。
キーボード、マウス、ジョイスティックを使用する代わりに、手のジェスチャーを使用して、ビデオの再生/一時停止、写真のスライドショーでの左右の移動、Webページでの上下のスクロールなどのコンピューターの特定の機能を制御できます。もっと。これが、VLC MediaPlayerをハンドジェスチャープロジェクトとして制御することにした理由です。
プロジェクトの背後にあるアイデアは、Arduinoで2つの超音波センサー(HC-SR04)を使用することで非常に簡単です。ノートパソコンの画面の上部に2つのセンサーを配置し、手とセンサーの間の距離を計算します。シリアルポートを介してPythonに送信されるArduinoからの情報を頼りに、この情報は、特定のアクションを実行するために、コンピューター上で実行されているPythonによって読み取られます。
ハードウェアコンポーネント:
- Arduino
- 2つの超音波センサー(HC-SR04)
- いくつかのワイヤー
ソフトウェアアプリ:
- Arduino IDE
- Python IDLE
- PySerialライブラリ(シリアルポートとの通信に使用します)。
- PyAutoguiライブラリ(アクションの実行に使用します)。
したがって、PythonとPySerialライブラリがすでにインストールされており、いくつかの基本的なプロジェクトが正常に実行されていると思います。そうでない場合でも、心配する必要はありません。以前のチュートリアル(Pythonを使用したArduinoのプログラミング)に従うことをお勧めします。また、超音波センサーについて知りたい場合は、こちらをご覧ください。
ステップ1:詳細についてはビデオを見る
ステップ2:ハンドジェスチャの目的
以下は、デモンストレーション用にプログラムした5つのコマンドハンドジェスチャです。
- 直接のジェスチャー:右/左の超音波センサーの前に特定の距離を置いて両手を置くことで、VLCを「再生/一時停止」できます。
- 2番目のジェスチャー:左のセンサーの前に特定の距離を置いて手を置くことで、動画を「巻き戻す」ことができます。
- 3番目のジェスチャー:特定の遠距離にある右側のセンサーの前に手を置くことで、動画を「転送」できます。
- 4番目のジェスチャー:左のセンサーの前に特定の距離を置き、センサーから離れることで、動画の「音量を上げる」ことができます。
- 5番目のジェスチャー:特定の遠距離で左側のセンサーの前に手を置き、センサーに近づくことで、動画の「音量を下げる」ことができます。
ステップ3:回路図 <図>



回路図は非常に単純です。以下の手順に従う必要があります。したがって、各センサーには4つのピンがあります:
- Vcc-このピンは5V +に接続されています。
- Trig-プログラムでこのピンを定義する必要があります。
- エコー-このピンはTrigと同じであり、定義する必要もあります。
- GND-このピンはグランドに接続されています。
ステップ4:Pythonのプログラミング <図>



1. PythonIDLEをインストールします
すでにコンピューターにPythonIDLEをインストールしている場合は、この手順をスキップできます。はいの場合は、手順2に進むか、次の手順を参照してください。
- PythonのWebサイトにアクセスして、ダウンロードします(ここ)。
- 完了したら、Pythonがデフォルトでインストールされるディレクトリを保持してインストールに進みます。
注:コンピューターが64ビットで動作している場合でも、Arduinoライブラリとの互換性がないため、32ビットのPython自体を使用できます。
2.PySerialライブラリをインストールします
PySerialはPythonAPIモジュールであり、シリアルデータの読み取りとArduinoまたはその他のマイクロコントローラーへの書き込みに使用されます。 Windowsにインストールするには、PySerialのダウンロードページにアクセスし、以下の手順に従ってください。
- 上記のリンクからPySerialをダウンロードします。
- デフォルトとして設定を維持してインストールします。Pyserialが正しく機能したことを確認する必要があります。これをする;次のように入力します:
インポートシリアル
エラーに直面していなければ、問題ありません。それ以外の場合は、インストールとPythonIDLE拡張機能を確認することをお勧めします。
3.PyAutoguiライブラリをインストールします
PyAutoGUIの目的は、人間のGUI自動化のためのクロスプラットフォームのPythonモジュールを提供することです。 APIは、適切なデフォルトを使用して可能な限りシンプルになるように設計されています。以下の手順に従って、Windows用のpyautoguiをインストールします。 (これらの手順を実行するには、Python IDLEがすでにインストールされている必要があります。)
他のプラットフォームを使用している場合は、こちらをご覧になることをお勧めします。
- Windowsコマンドを開く
- 次のコマンドを入力します
cd C:\ Python27
- 次に次のように入力します:
python –m pip install –upgrade pip
- 最後のコマンドは次のとおりです:
python –m pip install pyautogui
注:pyautoguiが正しく機能することを確認するには、次のように入力します。
import pyautogui
エラーに直面していなければ、問題ありません。
ステップ5:Arduinoコード <図>

PythonからArduinoとの接続を開始するには、最初にArduinoがオンになっているCOMポートを特定する必要があります。このタスクは、上の写真で述べたように、Ardunioプログラミング環境によって簡単に実行されます。
const int trigger1 =2; // 1番目のSesnorconstのトリガーピンintecho1 =3; // 1番目のSesnorconstのエコーピンinttrigger2 =4; // 2番目のSesnorconstのトリガーピンintecho2 =5; // 2番目のSesnorlongのエコーピンtime_taken; int dist、distL、distR; void setup(){Serial.begin(9600); pinMode(trigger1、OUTPUT); pinMode(echo1、INPUT); pinMode(trigger2、OUTPUT); pinMode(echo2、INPUT); } / * ###距離を計算する関数### * / voidcalculate_distance(int trigger、int echo){digitalWrite(trigger、LOW); delayMicroseconds(2); digitalWrite(trigger、HIGH); delayMicroseconds(10); digitalWrite (trigger、LOW); time_taken =pulseIn(echo、HIGH); dist =time_taken * 0.034 / 2; if(dist> 60)dist =60;} void loop(){//無限ループycalculate_distance(trigger1、echo1); distL =距離; //左センサーの距離を取得calculate_distance(trigger2、echo2); distR =dist; //右センサーの距離を取得//一時停止モード-Holdif((distL> 40 &&distR> 40)&&(distL <60 &&distR <60))//両手を検出{Serial.println( "Play / Pause"); delay(500);} calculate_distance(trigger1、echo1); distL =dist; calculate_distance(trigger2、echo2); distR =dist; //制御モード//左ロック-制御モードif(distL> =13 &&distL <=17) {delay(100); //ハンドホールド時間calculate_distance(trigger1、echo1); distL =dist; if(distL> =13 &&distL <=17){Serial.println( "Left Locked"); while(distL <=40){calculate_distance(trigger1、echo1); distL =dist; if(distL <10)//手で押し込んだ{Serial.println( "ボリュームが増加しました"); delay(300);} if(distL> 20)//手で引き出した{Serial.println( "Volume Decreased"); delay(300);}}}} // Lock Right-Control Modeif(distR> =13 &&distR <=17){delay(100); //ハンドホールド時間calculate_distance(trigger2、echo2); distR =dist; if(distR> =13 &&distR <=17){Serial.println( "Right Locked"); while(distR <=40){calculate_distance(trigger2、echo2); distR =dist; if(distR <10)//右手を押し込んだ{Serial.println( "Rewind"); delay(300);} if(distR> 20)//右手が引き出された{Serial.println( "Forward"); delay(300);}}}} delay(200);}
Arduinoコードを読むと、必要なタスクを実行するために特定のキーボード機能を制御する5つのコマンドを確認できます。
arduino_pythogui.inoダウンロード
arduino_pythogui.ino
ステップ6:Pythonコード <図>

まず、Pythonがシリアルポートを介してデータを送信するための簡単なプログラムが必要です。
import serial#シリアル通信用にインポートされたシリアルimport time#遅延関数を使用する必要がありますimport pyautogui#アクションを実行するために必要ですArduinoSerial =serial.Serial( 'com15'、9600)#arduinoSerialDatatime.sleep(2というシリアルポートオブジェクトを作成します)#通信が確立されるまで2秒間待ちます1:着信=str(ArduinoSerial.readline())#シリアルデータを読み取り、着信の「再生/一時停止」の場合、シリアルデータをラインプリント着信として出力します:pyautogui.typewrite([ 'スペース']、0.2)if '巻き戻し' in着信:pyautogui.hotkey( 'ctrl'、 '左')if '転送'着信:pyautogui.hotkey( 'ctrl'、 '右')if 'ボリューム増加'着信時:pyautogui.hotkey( 'ctrl'、 'down')if 'ボリュームが減少しました'着信時:pyautogui.hotkey( 'ctrl'、 'up')着信="";
コード
- コードスニペット#5
- コードスニペット#6
コードスニペット#5 プレーンテキスト
const int trigger1 =2; // 1番目のSesnorconstのトリガーピンintecho1 =3; // 1番目のSesnorconstのエコーピンinttrigger2 =4; // 2番目のSesnorconstのトリガーピンintecho2 =5; // 2番目のSesnorlongのエコーピンtime_taken; int dist、distL、distR; void setup(){Serial.begin(9600); pinMode(trigger1、OUTPUT); pinMode(echo1、INPUT); pinMode(trigger2、OUTPUT); pinMode(echo2、INPUT); } / * ###距離を計算する関数### * / voidcalculate_distance(int trigger、int echo){digitalWrite(trigger、LOW); delayMicroseconds(2); digitalWrite(trigger、HIGH); delayMicroseconds(10); digitalWrite (trigger、LOW); time_taken =pulseIn(echo、HIGH); dist =time_taken * 0.034 / 2; if(dist> 60)dist =60;} void loop(){//無限ループycalculate_distance(trigger1、echo1); distL =距離; //左センサーの距離を取得calculate_distance(trigger2、echo2); distR =dist; //右センサーの距離を取得//一時停止モード-Holdif((distL> 40 &&distR> 40)&&(distL <60 &&distR <60))//両手を検出{Serial.println( "Play / Pause"); delay(500);} calculate_distance(trigger1、echo1); distL =dist; calculate_distance(trigger2、echo2); distR =dist; //制御モード//左ロック-制御モードif(distL> =13 &&distL <=17) {delay(100); //ハンドホールド時間calculate_distance(trigger1、echo1); distL =dist; if(distL> =13 &&distL <=17){Serial.println( "Left Locked"); while(distL <=40){calculate_distance(trigger1、echo1); distL =dist; if(distL <10)//手で押し込んだ{Serial.println( "ボリュームが増加しました"); delay(300);} if(distL> 20)//手で引き出した{Serial.println( "Volume Decreased"); delay(300);}}}} // Lock Right-Control Modeif(distR> =13 &&distR <=17){delay(100); //ハンドホールド時間calculate_distance(trigger2、echo2); distR =dist; if(distR> =13 &&distR <=17){Serial.println( "Right Locked"); while(distR <=40){calculate_distance(trigger2、echo2); distR =dist; if(distR <10)//右手を押し込んだ{Serial.println( "Rewind"); delay(300);} if(distR> 20)//右手が引き出された{Serial.println( "Forward"); delay(300);}}}} delay(200);}
コードスニペット#6 プレーンテキスト
import serial#シリアル通信用にインポートされたシリアルimport time#遅延関数を使用する必要がありますimport pyautogui#アクションを実行するために必要ですArduinoSerial =serial.Serial( 'com15'、9600)#arduinoSerialDatatime.sleep(2)というシリアルポートオブジェクトを作成します#wait通信が確立されるまで2秒間1:incoming =str(ArduinoSerial.readline())#シリアルデータを読み取り、incoming:pyautogui.typewrite(['space' ]、0.2)着信時の「巻き戻し」の場合:pyautogui.hotkey( 'ctrl'、 '左')着信時の '転送':pyautogui.hotkey( 'ctrl'、 '右')着信時の 'ボリュームの増加': pyautogui.hotkey( 'ctrl'、 'down')if'Volume Decreased 'incoming:pyautogui.hotkey(' ctrl '、' up ')incoming ="";
製造プロセス
- Arduinoを使用してモニターをAmbilightにする
- Arduino、1Sheeld、Androidを使用したユニバーサルリモコン
- Arduinoとスマートフォンを使用したDIY電圧計
- IoTを使用してロボットアームをリモート制御する
- Arduinoを使用した周波数とデューティサイクルの測定
- FirmataとXboxOneControllerを使用してArduinoRoverを制御する
- モーションセンサー水鉄砲
- BoltとArduinoを使用したLEDの明るさの制御
- Arduinoを使用したシンプルでスマートなロボットアーム
- AlexaとArduinoIoTCloudを使用したテレビのフルコントロール
- ArduinoとRDA8057Mを使用したFMラジオ