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

Arduinoを使用したシンプルでスマートなロボットアーム

コンポーネントと消耗品

>
Arduino UNO
× 1
マイクロサーボ
× 5
ポテンショメータ
× 5
ブレッドボード(汎用)
× 1

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

このチュートリアルでは、マスターアームを使用して制御される単純なロボットアームを作成します。腕は動きを記憶し、順番に演奏します。コンセプトは新しいものではありません。「ミニロボットアーム-Stoerpeakによる」からアイデアを得ました。長い間これを作りたかったのですが、当時はまったく初心者で、プログラミングの知識がありませんでした。ついに私はそれを構築し、シンプルで安価に保ち、皆さんと共有します。

それでは始めましょう....

ステップ1:必要なもの

必要なもののリストは次のとおりです:-

1.サーボモーターx5(Amazon Link)

2.ポテンショメータx5(Amazon Link)

3. ArduinoUNO。 (Amazonリンク)

4.バッテリー。 (私は5Vアダプターを使用しています)

5.ブレッドボード。 (Amazonリンク)

6.段ボール/木材/サンボード/アクリル、入手可能なもの、または見つけやすいもの。

また、ArduinoIDEもインストールする必要があります。

ステップ2:腕を作る

<図> <図>

ここでは、アイスキャンデーの棒を使って腕を作りました。利用可能なあらゆる資材を使用できます。また、さまざまな機械設計を試して、さらに優れたアームを作成できます。私のデザインはあまり安定していません。

両面テープを使ってサーボをアイスキャンデースティックに貼り付け、ネジで固定しました。

マスターアームでは、ポテンショメータをアイスキャンデースティックに接着してアームを作成しました。

写真を参照すると、より良いアイデアが得られます。

ベースとして使用するA4サイズのキャンバスボードにすべてをマウントしました。

ステップ3:接続を確立する

<図> <図> <図>

このステップでは、必要なすべての接続を行います。上の写真を参照してください。

  • 最初に、すべてのサーボを電源に並列に接続します(赤のワイヤーを+ veに、黒または茶色のワイヤーをGndに)
  • 次に、信号線、つまり黄色またはオレンジ色の線をarduinoのPWMピンに接続します。
  • ポテンショメータを+ 5vとGndofarduinoに並列に接続します。
  • 中央の端子をardunioのアナログピンに接続します。

ここでは、デジタルピン3、5、6、9、および10がサーボの制御に使用されています

アナログピンA0〜A4は、ポテンショメータからの入力に使用されます。

ピン3に接続されたサーボは、A0に接続されたポテンショメータによって制御されます

ピン5に接続されたサーボは、A1のポットなどによって制御されます。...

注:-サーボはarduinoを搭載していませんが、サーボのGndをarduinoに接続してください。そうしないと、アームが機能しません。

ステップ4:コーディング

<図>

このコードのロジックは非常に単純で、ポテンショメータの値は配列に格納され、レコードはforループを使用してトラバースされ、サーボは値に従ってステップを実行します。 「Arduinoポテンショメータサーボ制御とメモリ」

を参照するために使用したこのチュートリアルを確認できます。

コード:-(以下に添付されているダウンロード可能なファイル。)

  • 最初に、必要なすべての変数をグローバルに宣言して、プログラム全体で使用できるようにします。これについて特別な説明は必要ありません。
  #include  
// Servo Objects
Servo Servo_0;
Servo Servo_1;
Servo Servo_2;
Servo Servo_3;
Servo Servo_4;
//ポテンショメータオブジェクト
int Pot_0;
int Pot_1;
int Pot_2;
int Pot_3;
int Pot_4;
//サーボ位置を格納する変数
int Servo_0_Pos;
int Servo_1_Pos;
int Servo_2_Pos;
int Servo_3_Pos;
int Servo_4_Pos;
//以前の位置の値を格納する変数
int Prev_0_Pos;
int Prev_1_Pos;
int Prev_2_Pos;
int Prev_3_Pos;
int Prev_4_Pos;
//現在の位置の値を格納する変数
int Current_0_Pos;
int Current_1_Pos;
int Current_2_Pos;
int Current_3_Pos;
int Current_4_Pos;
int Servo_Position; //角度を格納します
int Servo_Number; //サーボを格納しません
int Storage [600]; //データを格納する配列(配列サイズを大きくすると、より多くのメモリが消費されます)
int Index =0; //配列インデックスは0番目の位置から始まります
char data =0; //シリアル入力からのデータを格納する変数。
  • 次に、ピンとその機能を設定するセットアップ関数を作成します。これが最初に実行される主な機能です。
  void setup()
{
Serial.begin(9600); // arduinoとIDE間のシリアル通信用。
//サーボオブジェクトはPWMピンに接続されています。
Servo_0.attach(3);
Servo_1.attach(5);
Servo_2.attach(6);
Servo_3.attach(9);
Servo_4.attach(10);
//サーボは初期化時に100の位置に設定されます。
Servo_0.write(100);
Servo_1.write(100);
Servo_2.write(100);
Servo_3.write(100);
Servo_4。 write(100);
Serial.println( "「R」を押して録音し、「P」を押して再生します");
}

次に、アナログ入力ピンを使用してポテンショメータの値を読み取り、それらを制御サーボにマッピングする必要があります。このために、関数を定義し、 Map_Pot();, という名前を付けます。 ユーザー定義関数である任意の名前を付けることができます。

  void Map_Pot()
{
/ *サーボは180度回転しますが、
制限するために使用することは、
お勧めできません。サーボが継続的にブーンという音を立てる
これは煩わしいので、サーボの移動を制限します
:1-179 * /
Pot_0 =analogRead(A0); //ポットから入力を読み取り、変数Pot_0に保存します。
Servo_0_Pos =map(Pot_0、0、1023、1、179); // 0〜1023の間の値に従ってサーボをマップします
Servo_0.write(Servo_0_Pos); //サーボをその位置に移動します。

Pot_1 =analogRead(A1);
Servo_1_Pos =map(Pot_1、0、1023、1、179);
Servo_1.write (Servo_1_Pos);

Pot_2 =analogRead(A2);
Servo_2_Pos =map(Pot_2、0、1023、1、179);
Servo_2.write(Servo_2_Pos);

Pot_3 =analogRead(A3);
Servo_3_Pos =map(Pot_3、0、1023、1、179);
Servo_3.write(Servo_3_Pos);

Pot_4 =analogRead(A4);
Servo_4_Pos =map(Pot_4、0、1023、1、179);
Servo_4.write(Servo_4_Pos);
}
  • 次に、ループ関数を記述します:
  void loop()
{
Map_Pot(); //ポット値を読み取るための関数呼び出し

while(Serial.available()> 0)
{
data =Serial.read();
if(data =='R')
Serial.println( "Recording Moves ...");
if(data =='P')
Serial.println( "Playing Recorded Moves .. 。 ");
}
if(data =='R')// 'R'が入力された場合、記録を開始します。
{
//値を変数
Prev_0_Pos =Servo_0_Pos;
Prev_1_Pos =Servo_1_Pos;
Prev_2_Pos =Servo_2_Pos;
Prev_3_Pos =Servo_3_Pos;
Prev_4_Pos =Servo_4_Pos;
(); //比較のために呼び出されたマップ関数

if(abs(Prev_0_Pos ==Servo_0_Pos))//絶対値は比較によって取得されます
{
Servo_0.write(Servo_0_Pos); //値が一致する場合サーボは再配置されます
if(Current_0_Pos!=Servo_0_Pos)//値が一致しない場合
{
Storage [Index] =Servo_0_Pos + 0; //値が配列に追加されます
Index ++; //インデックス値を1インクリメントします
}
Current_0_Pos =Servo_0_Pos;
}
/ *同様に、すべてのサーボに対して値の比較が行われ、エントリごとに+100が差分値として追加されます。 * /
if(abs(Prev_1_Pos ==Servo_1_Pos))
{
Servo_1.write(Servo_1_Pos);
if(Current_1_Pos!=Servo_1_Pos)
{
Storage [Index] =Servo_1_Pos + 100;
Index ++;
}
Current_1_Pos =Servo_1_Pos;
}

if(abs(Prev_2_Pos ==Servo_2_Pos))
{
Servo_2.write(Servo_2_Pos);
if(Current_2_Pos!=Servo_2_Pos)
{
Storage [Index] =Servo_2_Pos + 200;
Index ++;
}
Current_2_Pos =Servo_2_Pos;
}

if(abs(Prev_3_Pos ==Servo_3_Pos))
{
Servo_3.write(Servo_3_Pos);
if(Current_3_Pos!=Servo_3_Pos)
{
Storage [Index] =Servo_3_Pos + 300;
インデックス++;
}
Current_3_Pos =Servo_3_Pos;
}
if(abs(Prev_4_Pos ==Servo_4_Pos))
{
Servo_4.write(Servo_4_Pos);
if(Current_4_Pos!=Servo_4_Pos)
{
Storage [Index] =Servo_4_Pos + 400;
Index ++;
}
Current_4_Pos =Servo_4_Pos;
}
/ *値はシリアルモニターに出力され、「\ t」は値を表形式で表示するためのものです* /
Serial.print(Servo_0_Pos);
Serial.print( "\ t");
Serial.print(Servo_1_Pos);
Serial.print( "\ t");
Serial.print(Servo_2_Pos);
Serial.print( "\ t");
Serial.print(Servo_3_Pos);
Serial.print( "\ t");
Serial.println(Servo_4_Pos);
Serial.print( "Index =");
Serial.println(Index);
delay(50);
}
if(data =='P')// IF'P 'が入力された場合、記録された動きの再生を開始します。
{
for(int i =0; i {
Servo_Number =Storage [i] / 100; //サーボの数を検索します
Servo_Position =Storage [i]%100; //サーボの位置を検索します
switch(Servo_Number)
{
ケース0:
Servo_0.write(Servo_Position);
break;
ケース1:
Servo_1.write(Servo_Position);
break;
ケース2:
Servo_2.write(Servo_Position);
break;
ケース3:
Servo_3.write(Servo_Position);
break;
ケース4:
Servo_4.write(Servo_Position);
break;
}
delay(50);
}
}
}
  • コードの準備ができたら、arduinoボードにアップロードします。

スマートアームは動作する準備ができています。この機能は、Stoerpeakが作成したものほどスムーズではありません。

コードを改善したり、提案があれば、コメントセクションでお知らせください。

それでは、テストに移りましょう。...

Record-Play.ino

ステップ5:テスト

ボードにコードを正常にアップロードした後、[ツール]オプションで見つけることができる[シリアルモニター]を開きます。シリアルモニターが起動すると、arduinoはリセットされます。これで、マスターアームを使用してロボットアームを制御できます。しかし、何も記録されていません。

記録を開始するには、モニターに「R」と入力して、記録したい動きを実行できるようにします。

移動が完了したら、記録された移動を再生するために「P」を入力する必要があります。ボードがリセットされない限り、サーボは移動を実行し続けます。

プロジェクトが気に入っていただければ幸いです。

ありがとう...

コード

  • Record-Play.ino
  • コードスニペット#1
  • コードスニペット#2
  • コードスニペット#3
  • コードスニペット#4
Record-Play.ino Arduino
ファイルを開くときにエラーが発生しました。
コードスニペット#1 プレーンテキスト
 #include  // Servo ObjectsServo Servo_0; Servo Servo_1; Servo Servo_2; Servo Servo_3; Servo Servo_4; //ポテンショメータObjectsintPot_0; int Pot_1; int Pot_2; int Pot_3; int Pot_4; //サーボ位置を格納する変数intServo_0_Pos; int Servo_1_Pos; int Servo_2_Pos; int Servo_3_Pos; int Servo_4_Pos; //以前の位置値を格納する変数intPrev_0_Pos; int Prev_1_Pos; int Prev_2_Pos; int Prev_3_Pos; int Prev_4_Pos; //現在の位置の値を格納する変数intCurrent_0_Pos; int Current_1_Pos; int Current_2_Pos; int Current_3_Pos; int Current_4_Pos; int Servo_Position; //角度を格納しますintServo_Number; // servointストレージを保存しません[600]; //データを格納する配列(配列サイズを大きくすると、より多くのメモリが消費されます)int Index =0; //配列インデックスは0番目のpositionchardata =0から始まります; //シリアル入力からのデータを格納する変数。
コードスニペット#2 プレーンテキスト
 void setup(){Serial.begin(9600); // arduinoとIDE間のシリアル通信用。 //サーボオブジェクトはPWMピンに接続されています。 Servo_0.attach(3); Servo_1.attach(5); Servo_2.attach(6); Servo_3.attach(9); Servo_4.attach(10); //サーボは初期化時に100の位置に設定されます。 Servo_0.write(100); Servo_1.write(100); Servo_2.write(100); Servo_3.write(100); Servo_4.write(100); Serial.println( "「R」を押して録音し、「P」を押して再生します"); } 
コードスニペット#3 プレーンテキスト
 void Map_Pot(){/ *サーボは180度回転しますが、サーボを制限するために使用することは、サーボが継続的にブーンという音を立てて煩わしいため、サーボを次の間で移動するように制限するため、お勧めできません。1-179* / Pot_0 =analogRead(A0); //ポットから入力を読み取り、変数Pot_0に保存します。 Servo_0_Pos =map(Pot_0、0、1023、1、179); // 0〜1023の間の値に従ってサーボをマップしますServo_0.write(Servo_0_Pos); //サーボをその位置に移動します。 Pot_1 =analogRead(A1); Servo_1_Pos =map(Pot_1、0、1023、1、179); Servo_1.write(Servo_1_Pos); Pot_2 =analogRead(A2); Servo_2_Pos =map(Pot_2、0、1023、1、179); Servo_2.write(Servo_2_Pos); Pot_3 =analogRead(A3); Servo_3_Pos =map(Pot_3、0、1023、1、179); Servo_3.write(Servo_3_Pos); Pot_4 =analogRead(A4); Servo_4_Pos =map(Pot_4、0、1023、1、179); Servo_4.write(Servo_4_Pos);} 
コードスニペット#4 プレーンテキスト
 void loop(){Map_Pot(); //ポット値を読み取るための関数呼び出しwhile(Serial.available()> 0){data =Serial.read(); if(data =='R')Serial.println( "Recording Moves ..."); if(data =='P')Serial.println( "記録された動きを再生しています..."); } if(data =='R')// 'R'が入力された場合、記録を開始します。 {//値を変数に格納しますPrev_0_Pos =Servo_0_Pos; Prev_1_Pos =Servo_1_Pos; Prev_2_Pos =Servo_2_Pos; Prev_3_Pos =Servo_3_Pos; Prev_4_Pos =Servo_4_Pos; Map_Pot(); //比較のために呼び出されたマップ関数if(abs(Prev_0_Pos ==Servo_0_Pos))//絶対値は{Servo_0.write(Servo_0_Pos);を比較することによって取得されます。 //値が一致する場合サーボは再配置されますif(Current_0_Pos!=Servo_0_Pos)//値が一致しない場合{Storage [Index] =Servo_0_Pos + 0; //値が配列Index ++に追加されます; //インデックス値を1インクリメントします} Current_0_Pos =Servo_0_Pos; } / *同様に、値の比較はすべてのサーボに対して行われ、+ 100が差分値としてエントリごとに追加されます。 * / if(abs(Prev_1_Pos ==Servo_1_Pos)){Servo_1.write(Servo_1_Pos); if(Current_1_Pos!=Servo_1_Pos){Storage [Index] =Servo_1_Pos + 100;インデックス++; } Current_1_Pos =Servo_1_Pos; } if(abs(Prev_2_Pos ==Servo_2_Pos)){Servo_2.write(Servo_2_Pos); if(Current_2_Pos!=Servo_2_Pos){Storage [Index] =Servo_2_Pos + 200;インデックス++; } Current_2_Pos =Servo_2_Pos; } if(abs(Prev_3_Pos ==Servo_3_Pos)){Servo_3.write(Servo_3_Pos); if(Current_3_Pos!=Servo_3_Pos){Storage [Index] =Servo_3_Pos + 300;インデックス++; } Current_3_Pos =Servo_3_Pos; } if(abs(Prev_4_Pos ==Servo_4_Pos)){Servo_4.write(Servo_4_Pos); if(Current_4_Pos!=Servo_4_Pos){Storage [Index] =Servo_4_Pos + 400;インデックス++; } Current_4_Pos =Servo_4_Pos; } / *値はシリアルモニターに出力されます。 '\ t'は値を表形式で表示するためのものです* / Serial.print(Servo_0_Pos); Serial.print( "\ t"); Serial.print(Servo_1_Pos); Serial.print( "\ t"); Serial.print(Servo_2_Pos); Serial.print( "\ t"); Serial.print(Servo_3_Pos); Serial.print( "\ t"); Serial.println(Servo_4_Pos); Serial.print( "インデックス="); Serial.println(インデックス); delay(50); } if(data =='P')// IF'P 'が入力された場合、記録された動きの再生を開始します。 {for(int i =0; i  

回路図


製造プロセス

  1. PythonでArduinoとRFIDを使用した出席システム
  2. Arduino、1Sheeld、Androidを使用したユニバーサルリモコン
  3. Arduinoとスマートフォンを使用したDIY電圧計
  4. IoTを使用してロボットアームをリモート制御する
  5. IOT-ESP8266、Arduino、超音波センサーを使用したスマートジャー
  6. Arduinoを使用した周波数とデューティサイクルの測定
  7. Arduino3Dプリントロボットアーム
  8. スマートシューズ(自動レーシングおよび発電)
  9. Nunchuk制御ロボットアーム(Arduino付き)
  10. arduinoを使用したソナーと処理IDEでの表示
  11. Arduino&ESP8266によるWiFiログインページを使用したSmart Door Lock