DIY Arduinoロボットアーム–ハンドジェスチャで制御
コンポーネントと消耗品
> ![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
| × | 6 | ||||
| × | 1 | ||||
![]() |
| × | 1 | |||
![]() |
| × | 2 | |||
![]() |
| × | 1 | |||
| × | 1 | ||||
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
| × | 1 |
必要なツールとマシン
> ![]() |
|
このプロジェクトについて
ヒューマンジェスチャによって制御されるDIYロボットアームの紹介。
パシフィックリム、アバター、その他のSF映画などの大ヒット映画は、ロボットとの相乗効果を示唆しています。ロボットの支援により、動きを強化できます。
同じ産業用ロボットをより小規模に構築できるとしたらどうでしょうか?
このプロジェクトはこれを達成するための試みです。
これはArduinoロボットアームであり、ハンドジェスチャによってプログラムまたは制御することもできます。
<図>
アイアンマンのスーツの慣習に忠実であり続けると、各反復はマークとして知られます。このプロトタイプはMARK1として知られています。元のロボットアームでは、より多くの反復が改善されることが期待できます。
<図>
完全なDIYロボットアーム(ハンドジェスチャによって制御される)チュートリアルをここで表示
概要
このチュートリアルでは、ロボットグローブを使用して手のジェスチャーで制御される6軸ロボットを作成します。また、ピンチや手首の左回転などの自然な人間のジェスチャーを模倣することで、ロボットアームをそれぞれ左右に開閉または回転させることができます。事実上、ロボットアームを手動で制御します。
元の記事の詳細を探す
<図>
マーク1の機能:
- 6軸回転
- ポータブル
- 人間のジェスチャーでロボットを制御する
- 基本的な機能を実行するように事前にプログラムすることができます
- 範囲からワイヤレスで制御できます
- 積載重量600g(最大積載重量1kg)を保持できます
パーツリスト <図>

ロボットアームは完全にカスタマイズ可能です。自分で購入することも、自分で3Dプリントすることもできます。 3D印刷を選択した場合でも、心配はいりません。サーボモーターを使用するさまざまなロボットのリストがあるため、私たちが構築しているものの理論は引き続き適用されます。
このプロジェクトでは、このプロトタイプ(Mark 1)は、カスタムパーツを作成するためのスペースが増えるため、3Dプリントされます。
ロボットアーム: Thingiverse 3Dプリントロボットアーム(クレジット:Wonder Tiger):
- パート1:グリッパーパーツ
- パート2:ベースとターンテーブル
- パート3:ロボットコアアーム
上記のパーツのネジの種類とともに、このビルドの詳細を確認できます。印刷にかかる時間は最大40時間です。ただし、これによりロボットアームの購入コストが削減されます。
ロボティックグローブ : Robotic Glove.STLファイル(クレジット:Roman 13)
<図>
Robotic Gloveはプロジェクトに美的に追加されましたが、ビルダーグローブを使用してRoboticArmを実装することもできます。
注: 大きな手には、105%の縮尺で印刷します
仕組み <図>

全体として、ロボットグローブからサーボモーターに信号を(Bluetooth経由で)送信しています。値を受信すると、サーボドライバーはロボットアームを動かす特定のサーボモーターに信号を送信します。
これで、複数のサーボとセンサーを追加すると、各モーターを制御できるようになります。 `
<図>
ロボットアームを、互いに協調して機能を実行する一連のサーボモーターと考えると、ロボットグローブによって制御されるロボットアームを作成できます。
Robotic GloveのArduinoは、センサーを使用してRobotic Arm Arduinoと通信し、データを送信してサーボを目的の角度に移動します。
ロボットグローブはどのセンサーを使用しているのでしょうか?
MARK 1には、フレックスセンサーと加速度計(MPU6050)を使用します
- フレックスセンサー –このプラスチック片の曲がり具合に基づいて、抵抗が変化し、電流に影響を与えます。この測定値は、手の動きの変化を検出するために使用されます。
- 加速度計 –より自然なジェスチャーの場合、加速度計は腕と手首の回転の変化を検出できます。
これらのセンサーを使用して、ジェスチャーの変化を検出しています。次に、ジェスチャの特定の値をロボットアームに送信して、Bluetooth経由でサーボモーターを制御できます。そして、十分なジェスチャーで、ロボットアームが生き返ります!
<図>
ロボットアームマッピング
以下は、グローブによってロボットアームに送信される値のマッピングテーブルを表しています。これは元の記事にあります。それぞれがその機能を特徴づけるための鍵を持っています。 (P –ピンキー、L –右など)
注: 大文字の「F」(指) サーボモータースピンの反対方向を表します
部品の組み立て <図>

ロボットアーム–アセンブリ
ロボットアームの購入は非常に高額になる可能性があります。このロボットアームを予算内に収めるには、ロボットアームを3Dプリントするのが最善の選択肢でした。
これは、LEDの追加、カメラスタンドクランプの作成など、カスタマイズ可能な3D印刷されたロボットアームの例が多数あるため、長期的には役立ちます。
前述のように、ロボットアームはThingyverseのロボットアームを中心にモデル化されました。この例を選択したのは、6軸を提供し、十分に文書化されており、強度/堅牢性を備えた優れた設計であったためです。パーツのリストからワンダータイガーのロボットアームにアクセスできます。
ロボットアームカメラスタンドのリミックスもあります。これについては、今後のリリースで詳しく説明します。ただし、すべてのパーツを印刷するには、パーツの収集に少なくとも40時間かかる場合があります。
他にも多くのロボットアーム3Dプリントの代替品を見つけることができます。
サーボモーターとドライバーの紹介 <図>

ロボットアームが理想的には一緒に調整する一連のモーターであることを考えると、理論的には、すべてArduinoから電力を供給できるいくつかのモーターを取り付けることができます。このプロジェクトでは、PCA9685サーボドライバーを使用してMG966Rサーボに電力を供給します。
注: 各モーターに電力を供給するときは、外部電源を使用してください。 Arduinoはすべてのモーターを制御するのに十分な電力を供給できません。このプロジェクトでは、5V、2200mAhのRCバッテリーが使用されました。
Arduinoダイアグラムの配線は次のようになります:
<図>
ベースローテーション用のNEMA-17
Roboticが少し重量を増し始めていたので、MG966RサーボモーターはベースでRoboticArmを回転させるほど強力ではありませんでした。ロボットアームを回転させるには、サーボモーターよりも堅牢なモーターを使用する必要があります
<図>
ステッピングモーター(NEMA-17)は、その精度と高トルクにより使用でき、ロボットアームがジェスチャーコントロールにシームレスに回転するのに役立ちます。
モーターの方向を制御するために使用されるNEMA-17およびA4988ドライバーは、下の図からわかります。
<図>
そして最後に、次の図は、完全なロボットアームの最終的な配線図アセンブリを示しています。
回路の組み立て
次の配線図は、Bluetoothモジュールを含むロボットアームを作成するためのすべての電子部品の最終的な組み立てを示しています。以下でペアリングプロセスについて説明します。
<図>
ヒューマンフレックスセンサー <図>

ロボットアームの美学を忠実に守りながら、3Dプリントされた外骨格ガントレットを印刷してロボットグローブとして使用できます。
ただし、標準の Builder’s Glove を使用できます。 ロボットグローブのプロトタイピング用。この「ロボットグローブ外骨格」のデザインは、ロボットアームのデザインとうまく調和しています。
ロボットグローブは次のコンポーネントで構成されています:
- フレックスセンサー –指の曲がりに基づいて、モーターに信号を送信するために使用できる電流が変化します
- 加速度計(MPU6050 )– X、Y、Z平面から人間のジェスチャーをマッピングすることでモーターを制御できます
- LED –人間のジェスチャーコントロールがArduinoに送信されると、LEDが点灯します
- Bluetooth(HC-05)モジュール –ロボットアームHC-05レシーバーへのデータの送信
- Arduino Nano –マイクロコントローラーはロボットグローブの頭脳として機能します
次の図は、フレックスセンサーと加速度計をテストするのに最適です。
重要: ロボットアームは、ロボットグローブが制御するのと同じくらい正確であるため、これを正しく行う価値があります。
<図>
Bluetoothの構成(マスターとレシーバー)
Arduinoロボットアームは、HC-05モジュールを使用してBluetooth経由で通信します。以下に重要な情報を示します。
モジュール
構成
ロボットグローブHC-05マスターロボットアームHC-05スレーブ
注:
ボーレートは4800に設定されています
Arduinoプログラミング
以下のコードをダウンロードできます:
注: 他のすべてのテストコードと最新バージョンは、Arduino Robotic Arm GitRepoにあります
ロボットアームのプログラミング <図>

ロボットアームコードは、HCPCA9685ライブラリ(サーボドライバ用)を利用します。このようにして、すべてArduinoによって制御される複数のサーボモーターに電力を供給することができます。コードでは、このライブラリを追加し、サーボ変数を宣言することから始めることができます。
次の変数は、前/インクリメントを見つけてサーボの現在の位置を取得するために使用されます。
* HCPCA9685ライブラリをインクルードします* /
#include "HCPCA9685.h"
/ *デバイス/モジュールのI2Cスレーブアドレス。 HCMODU0097の場合、デフォルトのI2Cアドレスは
0x40 * /
#define I2CAdd 0x40
/ *ライブラリのインスタンスを作成します* /
HCPCA9685 HCPCA9685(I2CAdd);
//モーターの初期駐車位置
const intservo_joint_L_parking_pos =60;
//ロボットサーボ感度の程度-間隔
intservo_joint_L_pos_increment =20;
//追跡するモーター位置の現在の値
intservo_joint_L_parking_pos_i =servo_joint_L_parking_pos;
//サーボモーターの最小および最大角度
intservo_joint_L_min_pos =10;
intservo_joint_L_max_pos =180;
>
Bluetooth通信を開始するには、ボーレート4800でシリアルポートを初期化します
Serial.begin(4800); // Bluetoothモジュールのデフォルトの通信速度を初期化します
loop()セクションでは、ロボットグローブからのデータがあるかどうかを常にチェックしています。 trueの場合、受信データを「state」変数に格納します。与えられたキャラクターに応じて、これを使用してモーターを動かします。
次のセクションでコードの概要を説明します:
ロボットアームコードは、人間の動きをシミュレートするために連携して動作する一連のサーボモーターと見なすことができます。コードは同じですが、サーボはBluetoothの値に基づいてサーボドライバーによって駆動されます。
//サーボドライバの定義。 0x40アドレスはデフォルトのI2Cアドレスです。
#define I2CAdd 0x40
int response_time =5; // RoboticGlove間隔から値を受信する
//データがシリアルポートから送信されているかどうかを確認します
if(Serial.available()> 0){
state =Serial 。読む(); //シリアルポートからデータを読み取ります
Serial.print(state); //送信された値を出力します
//モーター機能コードブロック
}
現在の「状態」の値に基づいて、サーボドライバはそれぞれのモーターに信号を送信します。
たとえば、指を曲げるとします。値「f」は、ロボットグローブによって(Bluetooth経由で)送信されます。これにより、ロボットアームがこのデータを読み取り、それぞれのサーボモーターを回転させる機能をトリガーします。このプロセスは無限ループで繰り返されます。
if(Serial.available()> 0){//データがシリアルポートから送信されているかどうかを確認します
state =Serial.read(); //シリアルポートからデータを読み取ります
Serial.print(state); //送信された値を出力します
//モーターの名前については、記事/チュートリアルを参照してください
//移動(ベース回転)ステッピングモーターを左に移動
if(state ==' S '){
baseRotateLeft();
delay(response_time);
}
}
注: このコードは、モーターが最大角度を超えないようにするためのハードストップを実装しています。これにより、モーターのギアが剥がれる可能性があります。
HCPCA9685.Servo(0、servo_joint_L_parking_pos_i); //チャネル0のサーボモーターを目的の角度に駆動します。
//クローモーターを下に移動します
if(state =='f'){
if(servo_joint_3_parking_pos_i HCPCA9685.Servo(4、servo_joint_3_parking_pos_i);
delay(response_time);
Serial.println(servo_joint_3_parking_pos_i);
servo_joint_3_parking_pos_i =サーボ_joint_3_parking_pos_i =サーボ_joint_3_parking_pos_i +サーボ_>}
void baseRotateLeft(){
digitalWrite(stepPin、LOW); // HIGH、LOWに基づく方向にスピンします
delayMicroseconds(stepDelay); //ステッピングモーターの速度を変更します
}
サーボモータの値が最大回転数未満の場合は、回転を続けてください。最大回転180度に達したら停止します。
servo_joint_3_parking_pos_i
ここで、servo_joint_3_max_posはモーターの最大位置です。
注: このコードは、モーターが最大角度を超えないようにするためのハードストップを実装しています。これにより、モーターのギアが剥がれる可能性があります。
フレックスセンサーのプログラミング
ロボットアームのコードはGitHubにあります。プロジェクトに取り組んでいる場合は、独自のバージョンをGitRepoに提供してください。これは、ロボットアームのさまざまなバージョンと機能のインデックスを作成するのに役立ちます。
コードはすでに文書化されています(Gitでも入手可能)。ただし、重要なポイントについては説明します:
5つのセンサーを定義します:
// LED ON PIN 3
int pinkie_Data =A1;
int finger_Data =A2;
int thumb_Data =A3;
// const int MPU_addr =0x68;
const int MPU2 =0x69、MPU1 =0x68;
注: 0x68と0x69は、2つのMPU6050加速度計のI2Cアドレスを表します
//ロボットアームに値を送信する頻度
int response_time =1000;
次のコードは、センサーの値を読み取るArduinoの概要を示しています。
// FlexセンサーからArduinoに値を読み取ります
pinkie =analogRead(pinkie_Data);
finger =analogRead(finger_Data);
thumb =analogRead(thumb_Data);
加速度計の現在の位置を読み取ります:
GetMpuValue1(MPU1);
GetMpuValue2(MPU2);
値の調整:
次のコードは、フレックスセンサーの上限と下限を見つけるために調整されます。フレックスグローブを再調整するには、Arduinoのリセットボタンを押します。
if(bool_caliberate ==false){
delay(1000);
thumb_high =(thumb * 1.15);
thumb_low =(thumb * 0.9);
finger_high =(finger * 1.03);
finger_low =(finger * 0.8);
pinkie_high =(pinkie * 1.06);
pinkie_low =(pinkie * 0.8);
bool_caliberate =true;
}
現在の値が、キャリブレーションに基づいて定義されたフレックスの上限または下限を超えているかどうかを常に確認します。フレックスセンサーがこの値を上回ったり下回ったりすると、データがロボットアームに送信され、特定のサーボモーターが特定の方向に移動します。
// finger 1-Claw Bend / Open
if(finger> =finger_high){
Serial.print( "F");
delay(response_time);
}
if(finger <=finger_low){
Serial.print( "f");
delay(response_time);
}
ロボットアームのプログラミング
結果–見返り <図>

ロボットアームは、オブジェクトを動かすのに十分正確です。ただし、複雑なオブジェクトを移動したり、人間が器用さで持っている「百万年以上」と競争したりするには、ある程度の作業が必要になります。コードの作業に多くの時間を費やしますが、ロボットの精度はMARK1iで意図されたとおりに機能します。 。腕は改善できますが、大幅に改善できます。
コードを改善したい場合は、に貢献してください ArduinoロボットアームGitレポ そして腕を作ります。これを他の人が構築できるように公開しましょう!
最後に、手のジェスチャーでロボットを制御し、基本的なタスクを自動化するようにロボットをプログラムすることもできます。
次のステップ
MARK 1の皆さんはこれですべてです!このプロジェクトをご希望の場合は、私のPatreonページをサポートすることを検討してください。
コード
- コードスニペット#1
- コードスニペット#3
- コードスニペット#4
- コードスニペット#5
- コードスニペット#7
- コードスニペット#11
- コードスニペット#12
コードスニペット#1 プレーンテキスト
* HCPCA9685ライブラリをインクルードします* /#include "HCPCA9685.h" / *デバイス/モジュールのI2Cスレーブアドレス。 HCMODU0097の場合、デフォルトのI2Cアドレスは0x40です* /#define I2CAdd 0x40 / *ライブラリのインスタンスを作成します* / HCPCA9685 HCPCA9685(I2CAdd); //モーターコンストの初期パーキング位置intservo_joint_L_parking_pos =60; //ロボットサーボの程度感度-間隔intservo_joint_L_pos_increment =20; //モーター位置の現在の値を追跡しますintservo_joint_L_parking_pos_i =servo_joint_L_parking_pos; //サーボモーターの最小および最大角度intservo_joint_L_min_pos =10; intservo_joint_L_max_コードスニペット#3 プレーンテキスト
//サーボドライバの定義。 0x40アドレスはデフォルトのI2Cアドレスです。#defineI2CAdd 0x40 int response_time =5; // Robotic Glove間隔から値を受信します//データがシリアルポートから送信されているかどうかを確認しますif(Serial.available()> 0){state =Serial.read(); //シリアルポートからデータを読み取りますSerial.print(state); //送信された値を出力します//モーター機能コードブロック}コードスニペット#4 プレーンテキスト
if(Serial.available()> 0){//データがシリアルポートから来ているかどうかを確認しますstate =Serial.read(); //シリアルポートからデータを読み取りますSerial.print(state); //送信された値を出力します//モーターの名前については、記事/チュートリアルを参照してください//(ベース回転)ステッピングモーターを左に移動if(state =='S'){baseRotateLeft(); delay(response_time); }}コードスニペット#5 プレーンテキスト
HCPCA9685.Servo(0、servo_joint_L_parking_pos_i); //チャネル0のサーボモーターを目的の角度に駆動します。//クローモーターを下に移動しますif(state =='f'){if(servo_joint_3_parking_pos_iコードスニペット#7 プレーンテキスト
// LED ON PIN 3int pinkie_Data =A1; int finger_Data =A2; int thumb_Data =A3; // const int MPU_addr =0x68; const int MPU2 =0x69、MPU1 =0x68;コードスニペット#11 プレーンテキスト
if(bool_caliberate ==false){delay(1000); thumb_high =(thumb * 1.15); thumb_low =(thumb * 0.9); finger_high =(finger * 1.03); finger_low =(finger * 0.8); pinkie_high =(pinkie * 1.06); pinkie_low =(pinkie * 0.8); bool_caliberate =true; }コードスニペット#12 プレーンテキスト
// finger 1-Claw Bend / Open if(finger> =finger_high){Serial.print( "F"); delay(response_time); } if(finger <=finger_low){Serial.print( "f"); delay(response_time); }Github
http://github.com/EbenKouao/arduino-robot-armhttp://github.com/EbenKouao/arduino-robot-armGithub
https://github.com/EbenKouao/arduino-robotic-armhttps://github.com/EbenKouao/arduino-robotic-arm
カスタムパーツとエンクロージャー
シンギバース
https://www.thingiverse.com/thing:1748596CADファイルthingiverse.comシンギバース
https://www.thingiverse.com/thing:1750025CADファイルthingiverse.comシンギバース
https://www.thingiverse.com/thing:1838120CADファイルthingiverse.comシンギバース
https://www.thingiverse.com/thing:1982745CADファイルthingiverse.com 回路図
ロボットアームGitレポ
https://github.com/EbenKouao/arduino-robot-arm製造プロセス