工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

自宅でジェスチャ制御ロボットを作る方法

コンポーネントと消耗品

>
Arduino UNO
× 1
Arduino Nano R3
× 1
HC-05Bluetoothモジュール
× 2
SparkFun三軸加速度計とジャイロブレイクアウト-MPU-6050
× 1
DCモーター、12 V
× 2
ラバーホイール
× 1
TexasInstrumentsデュアルHブリッジモータードライバーL293D
× 1
9Vバッテリー(汎用)
× 2

必要なツールとマシン

>
はんだごて(汎用)
はんだワイヤー、鉛フリー
テープ、フォーム
マルチツール、スクリュードライバー

アプリとオンラインサービス

>
Arduino IDE

このプロジェクトについて


これは、ジェスチャー制御の車を自分で作成する方法についてです。基本的に、これはMPU-6050 3軸ジャイロスコープ、加速度計の単純なアプリケーションです。あなたはもっと多くのことをすることができます。使用方法、Arduinoとのインターフェース方法、Bluetoothモジュールを介してデータを転送する方法を理解することによって。この記事では、2つのHC-05Bluetoothモジュール間のBluetoothからBluetoothへの通信に焦点を当てます。

ビデオに従って、このプロジェクトのロボット本体と接続を構築してください。

<図> <図> <図> <図> <図> <図> <図> <図> <図>

ロボットと送信機ユニットの接続図を以下に示します。参照してください。

<図> <図> <図> <図> <図> <図>

PCBwayからこのプロジェクトで使用される直接注文PCB:https://www.pcbway.com/project/shareproject/How_to_Make_Arduino_Based_Edge_Avoiding_Robot.html

<図> <図> <図> <図> <図> <図> <図> <図> <図> <図> <図> <図>

それでは、Bluetoothモジュールの構成について説明しましょう。基本的に、HC-05Bluetoothモジュールにはスレーブモジュールの工場出荷時設定が付属しています。つまり、プラグを差し込むことでモジュールjuにデータを送信できます。モバイルデバイスからHC-05モジュールにデータを送信するために他の設定を行う必要はありません。接続するには、デフォルトのパスワード(1234/0000)を入力するだけです。ただし、このモジュールを使用して他の同じモジュールまたはモバイルデバイスにデータを送信する場合はどうなりますか。

<図> <図>

このプロジェクトでは、Bluetoothモジュールを介してデータを送信するのと同じことを行います。 mpu-6050ジャイロセンサーによって別のBluetoothモジュールに収集されます。

<図>

そのため、これを行うには、最初にこれら2つのBluetoothモジュールを構成する必要があります。電源を入れた後、自動的にバインドできるようにします。ここで、最初のモジュールはスレーブデバイスとして機能します。このデバイスは、リモートユニットから信号を受信し、車に取り付けられます。そして、送信機ユニットとして機能し、スレーブデバイスにデータを送信するマスターデバイスとして2番目のデバイスを構成します。

<図>

したがって、最初に最初のBluetoothモジュールをスレーブデバイスとして構成します。これを行うには、この配線図に従ってArduinoに接続します。

<図>

そして、configureという名前でコードをアップロードします。

  #include  
SoftwareSerial BTSerial(10、11); // RX | TX
void setup()
{
Serial.begin(9600);
Serial.println( "Enter ATコマンド:");
BTSerial.begin(38400 ); // ATコマンドのHC-05のデフォルト速度more
}
void loop()
{
// HC-05から読み取りを続け、Arduinoシリアルモニターに送信します
if(BTSerial.available())
Serial.write(BTSerial.read());
// Arduinoシリアルモニターから読み取りを続け、HC-05に送信します
if(Serial。 available())
BTSerial.write(Serial.read());
}

モジュールを切断します。モジュールのkyを押したままにして、接続し直します。 LEDオンモジュールの点滅が遅くなっていることがわかります。 2秒に1回。これは、HC-05がATコマンドモードであることを意味します。次に、シリアルモニターを開いて、ボーレートを9600に変更し、出力タイプをNLとCRの両方にします。次に、送信ボックスにATと入力して、送信します。 okと応答した場合、それはすべてが順調であることを意味します。ただし、そうでない場合で、エラーが発生した場合は、ATを再度送信してください。 okまたはchek接続で応答し、ATを再度送信するまで…

<図> <図>

モジュールからOK応答を取得したら、次のコマンドを1つずつ入力します。

AT + ORGLして送信します。このコマンドは、モジュールを工場出荷時の設定に設定します。

AT + RMAADこのコマンドは、以前のペアリングからモジュールを解放します

AT + UART?モジュールの現在のボーレートを確認してください

AT + UART =38400、0、0はボーレートを38400に設定します

AT + ROLE?役割がスレーブかマスターかを確認してください。 0または1で応答します。モジュールがスレーブの場合は0で応答し、マスターデバイスの場合は1で応答します

スレーブデバイスとしての役割を設定します。 AT + ROLE =0

と入力します

AT + ADDR?モジュールアドレスを確認してください。

このアドレスを書き留めます。モジュールによって返信されました。このアドレスを取得すると、スレーブモジュールの設定が完了します。

<図> <図>

次に、2番目のBluetoothモジュールをマスターデバイスとして構成します。このモジュールをArduinoボードに接続し、ATモードにします。前のものと同じように。

<図> <図>

これらのATコマンドを指定された順序で入力します。

AT + ORGL

AT + RMAAD

AT + UART?

AT + UART =38400、0、0

AT + ROLE?

このモジュールの役割をマスターデバイスとして設定します。 AT + ROLE =1

AT + CMODE =0であるため、モジュールは単一のデバイスのみを接続します。デフォルト設定は0です

次に、このモジュールをスレーブデバイスにバインドして、これを実行します。

AT + BIND ="スレーブモジュールのアドレス"およびすべて完了

次に、MPU-6050センサーとI2C通信用のライブラリをインストールします。 MPU-6050ジャイロセンサーはI2Cインターフェースを備えているため。ここからライブラリとソースコードをダウンロードします:http://www.mediafire.com/file/l8mru5emulb8x93/gesture_control_robot.rar/file

これらのライブラリをプレインストールしている場合は、これをスキップしてください。

次に、USBケーブルを使用してカーユニットをPCに接続します。正しいCOMポートとボードタイプを選択してください。そして、「Gesture_controled_Robot__car_unit_」という名前でプログラムをアップロードします。プログラムをアップロードするときは、バッテリーとBluetoothモジュールが車に接続されていないことを確認してください。

<図>
  // 2019年3月10日にShubhamShinganapureがプログラム
//
//ジェスチャー制御ロボットカー用
int lm1 =8; //左モーター出力1
int lm2 =9; //左モーター出力2
int rm1 =10; //右モーター出力1
int rm2 =11; //右モーター出力2
char d =0;
void setup()
{
pinMode(lm1、OUTPUT);
pinMode(lm2、OUTPUT);
pinMode(rm1、OUTPUT);
pinMode(rm2、OUTPUT);
Serial.begin(38400);
sTOP();
}
void loop()
{
if(Serial.available()> 0)
{
d =Serial.read();
if(d ==' F ')
{
ForWard();
}
if(d ==' B ')
{
BackWard();
}
if(d =='L')
{
Left();
}
if(d =='R')
{
Right();
}
if(d =='S')
{
sTOP();
}
}
}
void ForWard()
{
digitalWrite(lm1、HIGH);
digitalWrite(lm2、LOW);
digitalWrite(rm1、HIGH);
digitalWrite(rm2、LOW);
}
void BackWard()
{
digitalWrite(lm1、LOW);
digitalWrite(lm2、HIGH );
digitalWrite(rm1、LOW);
digitalWrite(rm2、HIGH);
}
void Left()
{
digitalWrite(lm1、 LOW);
digitalWrite(lm2、HIGH);
digitalWrite(rm1、HIGH);
digitalWrite(rm2、LOW);
}
void Right()
{
digitalWrite(lm1、HIGH);
digitalWrite(lm2、LOW);
digitalWrite(rm1、LOW);
digitalWrite(rm2、HIGH);
}
void sTOP()
{
digitalWrite(lm1、LOW);
digitalWrite(lm2、LOW);
digitalWrite(rm1、LOW);
digitalWrite( rm2、LOW);
}

リモートユニットでも同じようにします。リモートという名前でプログラムを開きます。リモートユニットにアップロードします。

<図>
  //プログラムは3/10/19に// ShubhamShinganapureによって変更されました。
//
//ジェスチャ制御のロボットカー(リモート)
#include " I2Cdev.h "
#include" MPU6050_6Axis_MotionApps20.h "
//#include" MPU6050.h "// MotionAppsインクルードファイルを使用する場合は不要
// I2Cdevの場合はArduinoワイヤーライブラリが必要I2CDEV_ARDUINO_WIRE実装
//I2Cdev.hで使用
#if I2CDEV_IMPLEMENTATION ==I2CDEV_ARDUINO_WIRE
#include "Wire.h"
#endif
//クラスデフォルトI2Cアドレスは0x68です
//特定のI2Cアドレスをパラメータとしてここに渡すことができます
// AD0低=0x68(SparkFunブレークアウトおよびInvenSense評価ボードのデフォルト)
// AD0高=0x69
MPU6050 mpu;
#define OUTPUT_READABLE_YAWPITCHROLL
// MPU control / status vars
bool dmpReady =false; // DMPの初期化が成功した場合はtrueに設定します
uint8_t mpuIntStatus; // MPUからの実際の割り込みステータスバイトを保持します
uint8_t devStatus; //各デバイス操作後にステータスを返します(0 =成功、!0 =エラー)
uint16_t packetSize; //予想されるDMPパケットサイズ(デフォルトは42バイト)
uint16_t fifoCount; //現在FIFOにあるすべてのバイトのカウント
uint8_t fifoBuffer [64]; // FIFOストレージバッファ
VectorFloat重力;
クォータニオンq;
float ypr [3]; // [ヨー、ピッチ、ロール]ヨー/ピッチ/ロールコンテナと重力ベクトル
uint8_t teapotPacket [14] ={'$'、0x02、0,0、0,0、0,0、0,0 、0x00、0x00、 '\ r'、 '\ n'};
volatile bool mpuInterrupt =false; // MPU割り込みピンがハイになったかどうかを示します
void dmpDataReady(){
mpuInterrupt =true;
}
#include
SoftwareSerial BTSerial( 10、11); // RX | TX
int bt =8;
int x =1;
void setup(){
#if I2CDEV_IMPLEMENTATION ==I2CDEV_ARDUINO_WIRE
Wire.begin();
TWBR =24; // 400kHz I2Cクロック(CPUが8MHzの場合は200kHz)
#elif I2CDEV_IMPLEMENTATION ==I2CDEV_BUILTIN_FASTWIRE
Fastwire ::setup(400、true);
#endif
//シリアルを初期化コミュニケーション
//(ティーポットのデモ出力に必要なため、115200を選択しましたが、プロジェクトによっては
//実際にあなた次第です)
Serial.begin(115200);
BTSerial.begin(38400);
// while(!Serial); // Leonardoの列挙を待ち、他の人はすぐに続行します
Serial.println(F( "Initializing I2C devices ..."));
mpu.initialize();
//接続を確認します
Serial.println(F( "デバイス接続のテスト..."));
Serial.println(mpu.testConnection()?F( "MPU6050接続に成功しました"):F( "MPU6050接続に失敗しました" ));
//準備ができるまで待つ
// DMPをロードして構成する
Serial.println(F( "Initializing DMP ..."));
devStatus =mpu .dmpInitialize();
//ここに独自のジャイロオフセットを指定し、最小感度に合わせてスケーリングします
mpu.setXGyroOffset(220);
mpu.setYGyroOffset(76);
mpu。 setZGyroOffset(-85);
mpu.setZAccelOffset(1788);
//動作することを確認します(動作している場合は0を返します)
if(devStatus ==0){
/ /準備ができたのでDMPをオンにします
Serial.println(F( "Enabling DMP ..."));
mpu.setDMPEnabled(true);
// Arduino割り込みを有効にします検出
Serial.println(F( "割り込み検出を有効にする(Arduino外部割り込み0)..."));
a ttachInterrupt(0、dmpDataReady、RISING);
mpuIntStatus =mpu.getIntStatus();
// DMP Readyフラグを設定して、メインのloop()関数がそれを使用しても問題がないことを認識できるようにします
シリアル.println(F( "DMP準備完了!最初の割り込みを待機しています... "));
dmpReady =true;
//後で比較するために予想されるDMPパケットサイズを取得します
packetSize =mpu.dmpGetFIFOPacketSize();
} else {
//エラー!
// 1 =初期メモリの読み込みに失敗しました
// 2 =DMP構成の更新に失敗しました
//(破損する場合は、通常、コード1)
Serial.print(F( "DMP初期化に失敗しました(コード"));
Serial.print(devStatus);
Serial.println(F( ")"));
}
//出力用にLEDを構成する
pinMode(bt、INPUT);
}
// ================================================================
// ===メインプログラムループ===
// ================================================================
void loop(){
if(digitalRead(bt)==HIGH)
{
x ++;
delay(150);
}
if((x%2)==0) {
//プログラミングが失敗した場合は、何もしないでください
(!dmpReady)が返された場合;
// MPU割り込みまたは追加のパケットが利用可能になるのを待ちます
while(!mpuInterrupt &&fifoCount //他のプログラムの動作はここにあります
//。
//。
//。
// ifあなたは本当にパラノイアです。他の
//のものの間で頻繁にテストして、mpuInterruptが真であるかどうかを確認し、真である場合は、
// while()ループから「break;」してMPUをすぐに処理できます。 data
//。
//。
//。
}
//割り込みフラグをリセットし、INT_STATUSバイトを取得します
mpuInterrupt =false;
mpuIntStatus =mpu.getIntStatus();
//現在のFIFOカウントを取得
fifoCount =mpu.getFIFOCount();
//オーバーフローをチェックします(コードが非効率的すぎる)
if((mpuIntStatus&0x10)|| fifoCount ==1024){
//クリーンに続行できるようにリセット
mpu.resetFIFO();
Serial.println(F( "FIFOオーバーフロー!"));
//それ以外の場合は、DMPデータレディ割り込みをチェックします(これは頻繁に発生するはずです)
} else if(mpuIntStatus&0x02){
//正しい利用可能なデータ長を待つ、非常に短い待機である必要があります
while(fifoCount // FIFOからパケットを読み取る
mpu.getFIFOBytes(fifoBuffer、packetSize);
//ここでFIFOカウントを追跡する使用可能なパケットが1つを超える場合
//(これにより、割り込みを待たずにすぐに詳細を読み取ることができます)
fifoCount- =packetSize;
#ifdef OUTPUT_READABLE_YAWPITCHROLL
// displayオイラー角(度)
mpu.dmpGetQuaternion(&q、fifoBuffer);
mpu.dmpGetGravity(&gravity、&q);
mpu.dmpGetYawPitchRoll(ypr、&q、&gravity);
Serial .print( "ypr \ t");
Serial.print(ypr [0] * 180 / M_PI);
Serial.print( "\ t");
Serial.print( ypr [1] * 180 / M_PI);
シリアル.print( "\ t");
Serial.println(ypr [2] * 180 / M_PI);
if((ypr [1] * 180 / M_PI)<=-25)
{BTSerial.write( 'F');
}
else if((ypr [1] * 180 / M_PI)> =25)
{BTSerial.write( 'B' );
}
else if((ypr [2] * 180 / M_PI)<=-25)
{BTSerial.write( 'L');
}
else if((ypr [2] * 180 / M_PI)> =20)
{BTSerial.write( 'R');
}
else {
BTSerial。 write( 'S');
}
#endif
}
}
else {
BTSerial.write( 'S');
}
}

スレーブBluetoothモジュールを車のユニットに挿入し、リモートユニットのBluetoothモジュールをマスターします。そして、すべて完了しました。

<図> <図> <図> <図>

電源を入れて、プレイする準備ができました……。

<図> <図> <図> <図> <図>



これがお役に立てば幸いです。はいの場合、それが好きで、それを共有し、あなたの疑問をコメントしてください。その他のそのようなプロジェクトについては、私に従ってください!私の仕事をサポートし、YouTubeで私のチャンネルを購読してください。

ありがとうございます!

コード

  • ジェスチャー制御ロボット(リモートユニット)
ジェスチャー制御ロボット(リモートユニット) Arduino
 //プログラムは3/10/19に// ShubhamShinganapureによって変更されました。 ////ジェスチャー制御ロボットカー(リモート)#include "I2Cdev.h" #include "MPU6050_6Axis_MotionApps20.h" //#include "MPU6050.h" // MotionAppsインクルードファイルを使用する場合は不要// ArduinoWireライブラリはI2CdevでI2CDEV_ARDUINO_WIRE実装//が使用されている場合は必須です。 AD0低=0x68(SparkFunブレークアウトおよびInvenSense評価ボードのデフォルト)// AD0高=0x69MPU6050 mpu; #define OUTPUT_READABLE_YAWPITCHROLL // MPU制御/ステータスvarsbooldmpReady =false; // DMPの初期化が成功した場合はtrueに設定しますuint8_tmpuIntStatus; // MPUuint8_tからの実際の割り込みステータスバイトを保持しますdevStatus; //各デバイス操作後にステータスを返します(0 =成功、!0 =エラー)uint16_t packetSize; //予想されるDMPパケットサイズ(デフォルトは42バイト)uint16_t fifoCount; //現在FIFOuint8_tにあるすべてのバイトのカウントfifoBuffer [64]; // FIFOストレージbufferVectorFloat重力;クォータニオンq; float ypr [3]; // [ヨー、ピッチ、ロール]ヨー/ピッチ/ロールコンテナと重力vectoruint8_t teapotPacket [14] ={'$'、0x02、0,0、0,0、0,0、0,0、0x00、0x00、 '\ r'、 '\ n'}; volatile bool mpuInterrupt =false; // MPU割り込みピンがハイになったのかどうかを示しますvoiddmpDataReady(){mpuInterrupt =true;}#include  SoftwareSerial BTSerial(10、11); // RX | TXint bt =8; int x =1; void setup(){#if I2CDEV_IMPLEMENTATION ==I2CDEV_ARDUINO_WIRE Wire.begin(); TWBR =24; // 400kHz I2Cクロック(CPUが8MHzの場合は200kHz)#elif I2CDEV_IMPLEMENTATION ==I2CDEV_BUILTIN_FASTWIRE Fastwire ::setup(400、true); #endif //シリアル通信を初期化します//(ティーポットデモ出力に必要なため115200を選択しましたが、プロジェクトによっては//実際にはあなた次第です)Serial.begin(115200); BTSerial.begin(38400); // while(!Serial); // Leonardoの列挙を待ち、他の人はすぐに続行しますSerial.println(F( "Initializing I2C devices ...")); mpu.initialize(); //接続を確認しますSerial.println(F( "デバイス接続をテストしています...")); Serial.println(mpu.testConnection()?F( "MPU6050接続に成功しました"):F( "MPU6050接続に失敗しました")); //準備が整うのを待ちます// DMPをロードして構成しますSerial.println(F( "Initializing DMP ...")); devStatus =mpu.dmpInitialize(); //ここに独自のジャイロオフセットを指定し、最小感度に合わせてスケーリングしますmpu.setXGyroOffset(220); mpu.setYGyroOffset(76); mpu.setZGyroOffset(-85); mpu.setZAccelOffset(1788); //動作することを確認します(動作している場合は0を返します)if(devStatus ==0){// DMPをオンにして、準備ができたSerial.println(F( "Enabling DMP ...")); mpu.setDMPEnabled(true); // Arduino割り込み検出を有効にしますSerial.println(F( "割り込み検出を有効にします(Arduino外部割り込み0)...")); attachInterrupt(0、dmpDataReady、RISING); mpuIntStatus =mpu.getIntStatus(); // DMP Readyフラグを設定して、メインのloop()関数がそれを使用しても問題がないことを認識できるようにしますSerial.println(F( "DMP ready!最初の割り込みを待機しています...")); dmpReady =true; //後で比較するために予想されるDMPパケットサイズを取得しますpacketSize =mpu.dmpGetFIFOPacketSize(); } else {//エラー! // 1 =初期メモリのロードに失敗しました// 2 =DMP構成の更新に失敗しました//(壊れそうな場合、通常、コードは1になります)Serial.print(F( "DMP初期化に失敗しました(コード"));シリアル。 print(devStatus); Serial.println(F( ")")); } //出力用にLEDを設定pinMode(bt、INPUT); } // ================================================================// ===メインプログラムループ===// ================================================================void loop(){if (digitalRead(bt)==HIGH){x ++; delay(150); } if((x%2)==0){//プログラミングが失敗した場合は、何もしないでくださいif(!dmpReady)return; // MPU割り込みまたは追加のパケットが利用可能になるのを待ちます(!mpuInterrupt &&fifoCount  =25){BTSerial.write( 'B'); } else if((ypr [2] * 180 / M_PI)<=-25){BTSerial.write( 'L'); } else if((ypr [2] * 180 / M_PI)> =20){BTSerial.write( 'R'); } else {BTSerial.write( 'S'); } #endif}} else {BTSerial.write( 'S'); }} 

回路図


製造プロセス

  1. Arduino + RaspberryPiロボットプラットフォームの作り方
  2. 自宅でDIY宿題ライティングマシンを作る
  3. サーボモーター付きロボット回避障害物
  4. ラインフォロワーロボット
  5. カスタマイズ可能なパンチ可能なキーボードボタンの作り方
  6. 自律型ホームアシスタントロボット
  7. Arduinoで音楽を作る方法
  8. Arduinoベースの自動ドア開口部の作り方
  9. AndroidアプリでArduinoロボットアームを制御する
  10. ArduinoBluetooth制御車の作り方
  11. 超クールな屋内ナビゲーション用ロボット