現在製作している電子工作でのお遊び、ロボットアームの製作記事の続きとなります。
ロボットアームって電子工作という趣味をやられている方なら1度は作ってみたいと思われるものではないでしょうか?
ステッピングモーターを使い精度の高い動きをさせてモノをアームで挟んで指定位置まで自動で持っていく・・・
うぅ〜ん、このような精度の高いものを今後作ってみたいとは思いますが・・・まずはサーボモーターで簡単に動かすことができ、アームの構造など理解しやすいモデルを1つ作ってみるのがいいかなという事でベーシックな形状のモデルを現在製作しています。
前回のこちらの記事の続きとなりますが、簡単なモデルと言っても実際に作ってみて動かしてみるとスムーズに動かすにはプログラムなど難しく、そしてその構造を理解する上で非常に役立ちます!
そんな事で前回、3D CADを使いこのような関節の構造となるアームをイメージしてベースモデルを作ってみました。
工事現場などで動いている重機、ショベルカーみたいなアームの構造ですね。
この投稿をInstagramで見る
ある程度ベース形状が出来上がるとそこから肉付けしていき3Dプリントパーツの製作となるわけですが、初めてのロボットアーム製作という事でCAD上で動かし干渉部分などのチェックをしても実際の動きがなかなかイメージしにくいという事で、同様な構造の良いモデルがThingiverseの方にアップされていたので、まずはこのモデルを作ってみようという事で製作を始めていきました。(上記記事の前回の内容です)
動かしてみるとこれがなかなか面白く、アーム部分の関節構造を理解する上で非常にいいモデルとなりました。
構成的にはArduinoを使いSG90というマイクロサーボを使って制御する形としています。(サーボ構成は今回変えました)
Arduinoの学習用としても非常に良い教材だと思います。
そして実際に初めて動かしてみた動画がこちらとなります。
困ったことに3Dプリントパーツで作られたアームなので、どうしてもパーツ同士が接する部分の摩擦が大きくなるためSG90では動き出しのトルク不足で動きが鈍く、大きな負荷がかかっているためサーボに1A以上の電流が流れる時があります。
これが長い時間続いてしまうとモーターが焼き切れそうです!
そんな事からサーボの構成を変えてみようという事で、今回はSG90の高トルクタイプとなるSG92Rサーボモーターを使って再トライしてみました。
結果は非常に良好で、パワフルにアームを動かすことが出来るようになりました。
今回使ったロボットアームのモデルはThingiverseでも人気なようで、多くの方が作られているようですね。
初めてのロボットアーム製作としておすすめできるモデルなので、3Dプリンタをお持ちの方で電子工作好きの方は挑戦してみてはいかがでしょうか!
それでは見ていきましょう!
目次
3Dプリントパーツで作るロボットアームに挑戦!その②
今回製作しているロボットアームは、Thingiverseのこちらのモデルを使っています。
3Dプリンタで作れるロボットアームとしてThingiverseに上がっているものでも人気があるようで作られた方も多いようです。
今回サーボモーターの構成など少し変更してパワフルに動かせるようにしてみました。
上記Thingiverseページには、製作者の方が作られた詳細な組み立て手順書(WEBページ)も用意されている事から組み立てに関しては特に問題ないかと思います。
しかしながら、電子パーツの構成やサンプルコードなどが付属していないため実際に動かすためには少し補足が必要かもしれません。
今回は電子工作という視点でそのあたりの構成を補足しながらご紹介していきたいと思います。
まずは簡単にロボットアーム本体の組み立てから順を追って見ていきましょう。
ロボットアームの組み立て
先述のように上記Thingiverseページには詳細な組立手順が書かれたWebページが紹介されています。
参考 EEZYbotARMAutodesk, Inc.上記ページを見ながら組み立てていけば基本的に問題ないかと思いますが、使用するビスの寸法が多いので少し確認&補足しながら組み立てていきます。
3Dプリントパーツは14種(オプションパーツを省く)、全17パーツとなります。
パーツ点数は多いですが、小型アームなので個々のパーツは小さく3Dプリンタでの出力にはそれほど時間はかからないと思います。
使用ビス&ナット
3Dプリントパーツは上記手順ページの個数だけ出力させればいいので問題ないかと思いますが、使用するビスやナットが結構多いのでまとめておきます。
- M4セルフロックナット×7
- M4ワッシャー×15
- M4×20丸頭ビス×7
- M3ナット×7
- M3×30ビス×1
- M3ワッシャー×2
- M3×12ビス×6
- M3×20ビス×2
- パイプ 外形4mm×内径3mm×長さ22mm(1)
- パイプ 外形4mm×内径3mm×長さ26mm(1)
上記がパーツを固定するためのビスやナットの指定寸法となります。
基本的にこれより極端に長いものでなければ問題なく固定は出来るかと思います。
M3ナット7個のうち2つは先端のハンド部分の固定に使うナットですが、これはM4ナット同様にセルフロックナットに変更しておいた方がいいかもしれません!
関節やハンドを固定しているナットで可動する部分なので通常の六角ナットではすぐに緩んでしまいます。
個別でビスを用意するのは手間なのでこのようなセット物に足りないものを追加という形がいいかと思います。
またパイプ2本は製作者様は真鍮製パイプを使われていますが、アルミパイプでも問題ありませんでした。
こちらのアルミパイプは非常に安く加工(切断等)もしやすいのでいいかと思います。(カッターでも切れます)
組立に必要なビスやナット等のパーツが揃えば組み立てていきます。
上記手順サイト通りに組み立てていけば問題ないかと思いますが、ビス固定の各関節部分は少しヤスリ等でネジ穴を削った方が摩擦が少なくなり動きも良くなります。(何度もバラして調整しました!)
また、パイプを差し込む部分もある程度挿入穴を全てヤスリで削っておかないとパイプが上手く貫通せず抜くことも押し込むこともできなくなり・・・3Dプリントパーツではよくあることですが、こちらも適度に削っておかないと作業は大変でした。
3Dプリントパーツのヤスリがけはこのような棒ヤスリがあると大変便利ですので参考にしてください。
電子パーツ
アームの組み立てが完了したら次に動力となるサーボモーターの取り付けです。
アームの関節部分に2つのサーボ、台座内に回転用に1つ、ハンド部分に1つの計4つのサーボモーターを使います。
4つ全てのサーボをSG90マイクロサーボでまず組んでみましたが、アームの可動部分の2つのサーボは冒頭でご紹介したようにSG90では少しトルク不足でスムーズに動かすことが出来ませんでした。
製作者様はこのアーム可動部分のサーボにはSG90のメタルギア版となるMG90を使われています。
SG90のストールトルクは1.5kg/cm、そしてMG90は1.8kg/cmとなっています。
今回はさらにトルクが増したSG92Rというサーボモーターを使いました。
SG90の高トルクタイプとなるサーボモーターで、そのストールトルクは2.5kg/cmのものとなります。
動作的には非常にパワフルに動かすことが出来るので、SG90やMG90という選択よりもいいかと思います。
SG90やSG92Rサーボモーターに関してはこちらの記事を参考にして下さい。
という事でサーボの選定は、アーム駆動部分にSG92Rサーボを2つと台座の回転およびハンド部分にSG90を使いました。
そしてアームへの取り付けですが、全てこの位置がニュートラル(センター)となるようにサーボホーンを付けてからアームに取り付けて下さい。
サーボモーターの制御方法についてはこちらの記事を参考にしてください。
サーボモーターのセンター出しやこの後のテスト動作(可動域の確認等)にはサーボテスターがあると非常に便利となります。
可動域の確認
ロボットアーム本体に4つのサーボモーターを取り付けボディーは完成しました!
あとはArduinoでプログラムを組んでいきますが、その前にアームの可動域を確認しておきます。
アームの構造上、各サーボモーターの可動域には違いがあります。
動くことが出来ない角度を指定してサーボを動かすと過負荷状態になりサーボの破損等につながります。
簡単に各サーボモーターの可動域を確認しておきます。
アームの可動域の確認にはArduinoなどでプログラムを組み確認することももちろん出来ますが、サーボテスターがあると便利となります。
電子工作でサーボモーターを使う場合、1台持っていると非常に役立ちます。
こちらはサーボテスターを使って動かした動画となります。
これだけでも普通にアームを動かすことは出来ますが、アームを動かす2つのサーボモーターはそれぞれ可動域が大きく異なるためプログラムで制限をかけて動かした方が綺麗に動かせそうです。
もちろん、アームを手で動かしてある程度の可動域(サーボの角度)を確認しておくのもいいかとおもいます。
それではある程度のアーム関節部分の可動域を確認しておきます。
今回サーボ番号はこのように割り振りました。
まずサーボ①ですが、こちらのサーボはアームを前後に動かす部分となります。
可動域は広く約30°〜160°くらいの範囲で動きます。
後述するArduinoでプログラムを組む際はこの範囲を可動域としそれ前後ではリミットを付けて動かなくしておきます。
次にサーボ②ですが、こちらはリフトの動作(アームを上下)をさせる動きとなります。
角度にして約100°〜160°くらいで制限をかけておくのがいいと思います。
次にアーム本体を回転させるサーボ③ですが、0~180°でもいいのですが一応10°余裕を見て10〜170°としておきます。
次にハンド部分を動かすサーボ④も同様に10〜170°としておきました。
ある程度、各サーボモーターの可動域の確認が出来たらプログラムを組んでいきます。
あとはプログラムで動きやすいように微調整していきます。
アームを操作する上で一番簡単なのはポテンショメーターを使う方法だと思います。
先程使ったサーボテスターはポテンショメーターでサーボを動かしているものなので、同様にArduinoに4つのポテンショメーターを繋ぎ上記可動域の制限をプログラムし動かすのが一番簡単そうですが・・・実際にやってみましたが動作テストレベルで動かす分にはいいのですが、操作は非常にしにくい感じでした。
そこで今回はアームの操作性も考慮してジョイスティックを2つ使って動かすプログラムを考えてみたいと思います。
ジョイスティックでアームを動かす
アームを動かす方法はいろいろとあります。
先述のようにポテンショメーターを4つ使いアームを動かすのが最も簡単ですが、操作性のことも考えこのような電子工作用途でよく使われるジョイスティックを2つ使い操作出来るようにしてみたいと思います。
接続はこのようになりました。
配線を簡単にするためにArduino Unoにセンサーシールドを取り付けてジョイスティックとサーボモーターの配線を全てまとめています。
Arduinoはシールドを使うと大変便利となります。
センサーシールドに関してはこちらの記事も参考にして下さい。
接続はこのようになります。
サーボやジョイスティック接続のための配線が多くなるためブレッドボードを使用して接続する形となります。(サーボ駆動用の電源は別系統で用意して下さい!)
接続は同じですがセンサーシールドを使うと上記写真のように配線は非常に簡単になります。
そのため、VRXとVRYの接続は上記回路図のように反転(入れ替え)しています。
VRXを縦方向の検知で使っています。
そして操作をイメージしやすいようにこのようなジョイスティックケースも作ってみました。
ジョイスティックをバラで接続するよりアームの動きをイメージしやすく、またプログラムの修正もしやすくなるかと思います。
電子工作用途でのテスト環境で便利に使えるかと思いますので、興味ある方は作ってみて下さい。
Arduinoのプログラムを考える
上記接続で動かせるように、簡単なテストプログラムを作ってみました。
先ほど確認したおおよそのサーボの可動域をmap関数を使ってジョイスティックの動きに連動するようにした単純なものとなります。
ジョイスティックからのアナログ値の入力やAD変換(アナログ/デジタル変換)、またスティックの押し込みのON/OFF判定に関してはこちらの記事を参考にして下さい。
操作はこのように割り振っています。
左ジョイスティック前後 | アームの前後(サーボ①) |
右ジョイスティック前後 | アームの上下(サーボ②) |
左ジョイスティック左右 | 台座の回転(サーボ③) |
右ジョイスティック押し込み | ハンドが握る動作(サーボ④) |
左ジョイスティック押し込み | ハンドを開く動作(サーボ④) |
テストプログラムはこちらとなります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 | #include <Servo.h> Servo arm1; Servo arm2; Servo arm3; Servo arm4; const int INPUT_PIN1 = A1; const int INPUT_PIN2 = A2; const int INPUT_PIN3 = A3; const int INPUT_PIN4 = A4; const int SW1_PIN = 6; const int SW2_PIN = 7; const int SV_PIN1 = 8; const int SV_PIN2 = 9; const int SV_PIN3 = 10; const int SV_PIN4 = 11; int arm1_min = 30; int arm1_max = 160; int arm2_min = 100; int arm2_max = 160; int arm3_min = 10; int arm3_max = 170; int arm4_min = 60; int arm4_max = 150; int arm1_center = (arm1_min + arm1_max)/2; int arm2_center = (arm2_min + arm2_max)/2; int arm3_center = (arm3_min + arm3_max)/2; int Joystick1_center = 505; int Joystick2_center = 510; int Joystick3_center = 532; int angle1 = arm1_center; int angle2 = arm2_center; int angle3 = arm3_center; int angle4 = arm4_max; int analog1; int analog2; int analog3; int analog4; int SW1_POS; int SW2_POS; void setup(){ Serial.begin(9600); arm1.attach(SV_PIN1); arm2.attach(SV_PIN2); arm3.attach(SV_PIN3); arm4.attach(SV_PIN4); arm1.write(angle1); arm2.write(angle2); arm3.write(angle3); arm4.write(angle4); pinMode(SW1_PIN, INPUT_PULLUP); pinMode(SW2_PIN, INPUT_PULLUP); delay(2000); } void loop(){ analog1 = analogRead(INPUT_PIN1); analog2 = analogRead(INPUT_PIN2); analog3 = analogRead(INPUT_PIN3); SW1_POS = digitalRead(SW1_PIN); SW2_POS = digitalRead(SW2_PIN); if(analog1 >= Joystick1_center){ angle1 = map(analog1, Joystick1_center, 1023, arm1_center, arm1_min); } else if(analog1 < Joystick1_center){ angle1 = map(analog1, Joystick1_center, 0, arm1_center, arm1_max); } if(analog2 >= Joystick2_center){ angle2 = map(analog2, Joystick2_center, 0, arm2_center, arm2_max); } else if(analog2 < Joystick2_center){ angle2 = map(analog2, Joystick2_center, 1023, arm2_center, arm2_min); } if(analog3 < Joystick3_center - 300){ angle3 = angle3 + 5; if(angle3 > arm3_max){ angle3 = arm3_max; } } if(analog3 > Joystick3_center + 300){ angle3 = angle3 - 5; if(angle3 < arm3_min){ angle3 = arm3_min; } } if(SW1_POS == 0){ angle4 = arm4_max; } if(SW2_POS == 0){ angle4 = angle4 - 10; } if(angle4 <= arm4_min){ angle4 = arm4_min; } arm1.write(angle1); arm2.write(angle2); arm3.write(angle3); arm4.write(angle4); Serial.print("Servo1: "); Serial.print("Analog: "); Serial.print(analog1); Serial.print(" Angle: "); Serial.print(angle1); Serial.print(" Servo2: "); Serial.print("Analog: "); Serial.print(analog2); Serial.print(" Angle: "); Serial.print(angle2); Serial.print(" Servo3: "); Serial.print("Analog: "); Serial.print(analog3); Serial.print(" Angle: "); Serial.print(angle3); Serial.print(" Servo4: "); Serial.print("Analog: "); Serial.print(analog4); Serial.print(" Angle: "); Serial.print(angle4); Serial.print(" SW1: "); Serial.print(SW1_POS); Serial.print(" SW2;"); Serial.println(SW2_POS); delay(10); } |
手順① ジョイスティックの調整
上記プログラムを動かし各所微調整していきます。
まずサーボモーターを繋がずにジョイスティックの調整をしておきます。
ジョイスティックは可変抵抗を使った単純なものなので製品により微妙にセンターの位置が異なっているかと思います。
アナログ入力なのでArduinoには0~1023の範囲でAD変換され数値化されます。(10ビットの分解能)
本来センターは512あたりになりますが、実際には少しズレていることから微調整しておきます。
サーボを繋がずに上記スケッチを動かしシリアルモニタを立ち上げると各ジョイスティックが取得しているアナログ値及びサーボ角度が表示されます。
この数値が実際にセンター位置にある時に取得されているアナログ値なので、プログラム内の変数の値をこちらの数値に書き換えておきます。
私の環境ではこのような数値になりましたが、製品により微妙に異なっているかと思います。
34 35 36 | int Joystick1_center = 505; int Joystick2_center = 510; int Joystick3_center = 532; |
サーボ可動域の微調整
次にサーボモーターを繋ぎ実際に動かしてみます。
先ほど確認した各サーボの可動域はこちらで指定しています。
実際に動かしながら微調整していく形となります。
20 21 22 23 24 25 26 27 | int arm1_min = 30; int arm1_max = 160; int arm2_min = 100; int arm2_max = 160; int arm3_min = 10; int arm3_max = 170; int arm4_min = 70; int arm4_max = 150; |
ジョイスティック及びサーボモーターの可動域の指定ができれば最低限動かせる状態になります。
アーム可動部分のサーボモーターにSG92Rを今回使ったので非常にパワフルに動いてくれるかと思います。
しかし細かい動作はなかなか難しいようです。
上記プログラムはジョイスティックの動きと連動してサーボを動かしています。
手を離すとジョイスティックはセンターに戻り同様にアームもホームポジションに戻るようになっています。
細かな動作をさせたい場合は、スティックに連動させるのではなく動いた位置を保持するようにプログラムさせた方がよさそうですね。
このあたりは、いろいろと試してみて下さい!
今回は動作確認が出来るテストプログラムとなるので、あとはお好みでプログラムを修正しいろいろと楽しんで頂ければと思います。
プログラム次第でさらに面白くなりそうですね!
思い通りパワフルにアームを動かすことが出来るようになりました。
実際に操作しながら動きを見ていると、そのアーム構造も理解しやすく非常に良いモデルだと思います。
プログラム次第でもっと細かな動きも出来るようになりそうで、電子工作ではいろいろと遊べそうですね!
以前、サーボモーターでアームを制御して時間を描くPlotclockという時計を製作したことがあります。
2つのサーボでペンを持つアームを動かしていますが、各サーボの角度からペン位置の座標を計算して動かすというなんともおもしろい超アナログな時計です。
このように、2つのアーム可動サーボの回転角度からアーム先端(ハンド部分)の座標を計算して自動的にモノをつかんで指定位置まで持っていく・・・なんてこともプログラム次第でできそうですね!(今後の課題です)
また、このようなガイドの動きをさせるリーダーアームも作ってみました。
この子アーム(ガイドアーム)の動きに連動して今回制作した親アームをヌルヌルと動かせたら楽しそうですよね。
ベースとなるアームを1つ作っておけば、いろいろと楽しめ電子工作の学習用としても役立ちそうです!
【追記】リーダーアームを使って操作する!
メインのロボットアームを自在に動かせるようにリーダーアームを作ってみました。
関節部分にポテンショメーターを取り付け、そのアナログ値を取得しアームのポジションをArduinoを使い計測しロボットアームを操作するというものとなります。
パーツデータをアップしたので興味がある方は使ってみて下さい!
最後に!
電子工作に3Dプリンタはほんと最強の組み合わせですね!
はじめてのロボットアーム作りには非常に良いモデルとなるので興味ある方は作ってみてはいかがでしょうか!
今回はArduinoにコントローラーを有線接続して動かしてみましたが、非常に楽しかったのでこのような無線モジュールを使い無線化なども考えています。
無線化出来れば、今回製作したロボットアームや以前作った4足歩行ロボット、ミニラジコンなどさらに面白くなりそうなんですが・・・
また別の機会にご紹介できればと思います。
コメントを残す