ジェスチャ制御ロボット
コンポーネントと消耗品
> |
| × | 1 | |||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
必要なツールとマシン
> |
|
このプロジェクトについて
ジェスチャ制御ロボットは、物理的および実用的なプロジェクトでマイクロコントローラーの知識を理解して実装するために愛好家や学生によって行われる最も一般的なタイプのプロジェクトの1つです。その背後にある概念は単純です。手のひらの向きがロボットカーの動きを制御します。それはどのようにそれをするのですか、あなたは尋ねますか?分解しましょう。
十分に理解するために、各コンポーネントの役割と機能を理解し、それらを組み合わせて目的のパフォーマンスを実現することから始めます。
1. ADXL335(加速度計)
加速度計の機能は単純です。手首の向きを感知することです。加速度計は、重力による加速度「g」も含めて加速度を測定します。したがって、下の図に示すように、加速度計を使用してADXL335の特定の軸の「g」の成分を測定することで手首の向きを感知できます。
<図>手の傾きにより、垂直方向の変化に伴うX軸および/またはY軸の角度、したがって「g」加速度の成分もそれらに作用し、測定可能であり、したがって手の向きを示します。
ADXL335は最大3gの加速度を測定でき、その軸ピンをArduinoのアナログピンに接続することでArduinoと接続します。加速度計は、加速度に比例した電圧値を出力します。
このプロジェクトでは、加速度計はArduino Nanoに接続され、手のひらに取り付けられています。 ADXL335は、0〜Vcc(通常3.3Vの印加電圧)の範囲の電圧を出力し、Arduinoのアナログピンによって読み取られます。したがって、ユーザーの場合、0〜1024(10ビットADC)の範囲の値を取得します。向きが異なると、軸ごとに異なるアナログ値が生成され、ロボットの動きにマッピングされます。
加速度計の回路図は次のとおりです。
<図>ADXL335の動作を理解するためのテストコードは次のとおりです。
void setup(){pinMode(A0、INPUT); // x軸はA0に接続されていますpinMode(A1、INPUT); // y軸はA1に接続されていますpinMode(A2、INPUT); // z軸はA2Serial.begin(9600);に接続されています//データをシリアルモニターに出力するには} void loop(){Serial.print( "X ="); Serial.println(analogRead(A0)); Serial.print( "Y ="); Serial.println(analogRead(A1)); Serial.print( "Z ="); Serial.println(analogRead(A2)); delay(1000);}
このプログラムを実行して、手のひらと手首を前、後ろ、左、右に傾けたときに得られる値を確認できます。これらの値は、最終的にロボットの制御に使用されます。
2.RF-433送信機と受信機
RFモジュールの機能はシンプルです。手首のArduinoNanoからArduinoUnoを制御するモーターにコマンドデータを送信します。 RFモジュールは433Hzの周波数の電波を使用しているため、RF-433という名前が付けられています。それらは振幅変調を使用してデータを送信しますが、多くの技術を習得せず、物事を単純に保つために、コマンドをロボットに送信するために使用されます。つまり、前進、後退、右または左に移動します。また、データがない場合は、静止します。それらは10メートルの範囲までうまく機能します。
プロジェクトでRFモジュールを実装する方法を理解するために、送信機と受信機の回路を順番に操作してみましょう。
送信機回路
送信機回路は、送信機RFとエンコーダーHT12Eの2つの部分で構成されています。送信機は、1つのデータピン、1つのアンテナ、1つのアース、および電源で構成されています。送信機にデータを提供するのはHT12Eエンコーダーの仕事です。エンコーダは、データを送信できる4つのデータピンで構成されています。これらの4つのデータピンを使用して4つのモーションを表し、これらのピンのHIGHは4つのモーションのいずれかを個別に表し、すべてのLOWは静止を表します。
回路図は次のとおりです。
<図>左側のピン(A0〜A7)はアドレスピンであり、データを交換するペアを定義します(同じアドレスを持つ送信機と受信機はデータのみを共有します)。 A0-A7をLOW(接地)に設定します。
データ入力ピンはArduinoデジタルピン(このプロジェクトでは6〜9)に接続されており、コマンドデータを次のように出力します。
デジタルピンコマンド(HIGHの場合)
9転送
10リバース
11左
12右
ADXL335からの入力に基づいて、デジタルピンをHIGHとしてデジタル書き込みし、必要なモーションを実行します。
受信機回路
レシーバー回路は、示されているトランスミッター回路と完全に似ていますが、データピンがArduinoから出力される代わりに、この場合、Arduino Unoのコマンドを受け取り、必要に応じてモーターを実行するための入力として読み取られます。
<図>簡単にするために、送信機との適切な接続を示すために示されている複雑な回路の代わりに、ピン17でLEDを1K抵抗で直列に接続できます。
3.モーターシールド
モーターシールドは、AdafruitライブラリAFMotorが利用できるため、最も扱いやすい部品です。リンク:-https://github.com/adafruit/Adafruit-Motor-Shield-library
Arduinoライブラリフォルダにあるライブラリをダウンロードしてコピーし、プログラムスケッチに含めることができるようにします。
AFMotorライブラリの例は次のとおりです。
#include AF_DCMotor motor(4); //シールドのポイントモーター4にモーターワイヤーを接続しますvoidsetup(){Serial.begin(9600); //シリアルライブラリを9600bpsに設定Serial.println( "Motor test!"); //モーターをオンにしますmotor.setSpeed(200); motor.run(RELEASE);} void loop(){uint8_t i; Serial.print( "tick"); motor.run(FORWARD); for(i =0; i <255; i ++){motor.setSpeed(i); delay(10);} for(i =255; i!=0; i-){motor.setSpeed(i); delay(10);} Serial.print( "tock"); motor.run(BACKWARD); for(i =0; i <255; i ++){motor.setSpeed(i); delay(10);} for(i =255; i!=0; i-){motor.setSpeed(i); delay(10);} Serial.print( "tech"); motor.run(RELEASE); delay(1000);
4.すべてを組み合わせる
最後の最後の部分には、上記のすべての部分を組み合わせて、手のコマンドに従う完全なロボットを形成することが含まれます!
モーターシールドはほとんどすべてのデジタルピンを使用しているため、ArduinoUnoのアナログピンを使用してレシーバーデータを読み取ります。最終的な回路図は次のとおりです。
<図>モーターシールドは、モーターへの接続を処理します。 9V電池をシールドへの電源入力に接続します。
注:私は個人的に、4つのモーターすべてを実行するのに十分な電力を供給するために、シールド電源入力と並列に2つまたは3,9Vのバッテリーを接続することを好みます。 2つのグループで4つのモーターを接続しました(同じ側面のモーターが並列に接続されているため、モーターポイント3と4のみを実行する必要があります)。
<図>
最終コード
Arduino Nanoの場合:
int x_axis =0; int y_axis =0; int forward =9; int back =10; int right =11; int left =12; void setup(){pinMode(A0、INPUT); // X軸pinMode(A3、OUTPUT); // Y軸pinMode(forward、OUTPUT); //前方に移動するにはHIGHpinMode(backward、OUTPUT); //後ろに移動するにはHIGHpinMode(right、OUTPUT); //右に移動するにはHIGHpinMode(left、OUTPUT); //左に移動するにはHIGHSerial.begin(9600);} void loop(){x_axis =analogRead(A0); y_axis =analogRead(A3); Serial.print( "X ="); Serial.println(x_axis); Serial.print( "Y ="); Serial.println(y_axis); if(y_axis> =390){Serial.println( "Forward"); digitalWrite(forward、HIGH); } else {if(y_axis <=310){Serial.println( "BACK"); digitalWrite(backward、HIGH); } else {if(x_axis> =380){Serial.println( "RIGHT"); digitalWrite(right、HIGH); } else {if(x_axis <=320){Serial.println( "LEFT"); digitalWrite(左、HIGH); } Serial.println( ""); }}} delay(200); if(x_axis> 320 &&x_axis <380 &&y_axis> 310 &&y_axis <390){digitalWrite(forward、LOW); digitalWrite(backward、LOW); digitalWrite(right、LOW); digitalWrite(左、LOW); }}
Arduino Unoの場合:
#include AF_DCMotor motor_right(3); AF_DCMotor motor_left(4); int forward =0; int back =0; int right =0; int left =0; void setup(){ pinMode(A2、INPUT); pinMode(A3、INPUT); pinMode(A4、INPUT); pinMode(A5、INPUT); Serial.begin(9600); motor_right.setSpeed(255); motor_left.setSpeed(255); motor_right.run(RELEASE); motor_left.run(RELEASE);} void loop(){forward =digitalRead(A0); backward =digitalRead(A1); right =digitalRead(A2); left =digitalRead(A3); if(forward ==HIGH){motor_right.run(FORWARD); motor_left.run(FORWARD); Serial.println( "転送"); } if(backward ==HIGH){motor_right.run(BACKWARD); motor_left.run(BACKWARD); Serial.println( "リバース"); } if(right ==HIGH){motor_right.run(FORWARD); motor_left.run(RELEASE); Serial.println( "RIGHT"); } if(left ==HIGH){motor_right.run(RELEASE); motor_left.run(FORWARD); Serial.println( "LEFT"); } if(left ==LOW &&right ==LOW &&forward ==LOW &&backward ==LOW){motor_right.run(RELEASE); motor_left.run(RELEASE); } delay(100);}
写真とビデオはこちらです:
<図><図>
<図>
<図>
<図>
製造プロセス