Arduinoでロボットアーム型のプロッタを作る方法
Arduinoでラジコン用のサーボを制御して、ロボットアーム型のプロッタで絵を描いてみたいと思います。
◆手抜き逆運動学
一般的にロボットアームを制御するためには、逆運動学で計算して関節の角度をコントロールしますが、もう少し簡単な手抜きの方法を考えてみました。
3個のサーボで動く簡単なロボットアームをイメージしています。これにペンを持たせて2Dプロッタを作ろうと思っています。
まず、アームのベースのZ軸を原点として右にX軸、上にY軸だとすると、目標座標(X,Y)までの距離(L)は、SQRT(X^2+Y^2)で求まります。よってZ軸の回転(θ1)は、ACOS(X/L)で求まります。これでアームは目標座標にピッタリ向くはずです。
あとは目的の位置(距離)までアームを曲げればよいわけです。ここで2つのアームが同じ長さだとすると、中点距離はL/2となります。アームの長さ(AL)は元々分かっているので付け根の角度(θ2)は、ACOS((L/2)/AL)で求まります。残りの角度(θ3)は、π-(θ2*2)で求まるはずです。
ベースの高さ(h)の問題はペン先の高さを調整することでクリアできます。
これなら簡単で分かりやすいです。
元々、ラジコン用の安価なサーボでは大した精度はありません。動作確認程度に線が引ければOKということにします。
◆サーボ制御の検証
プロッタとしてロボットアームを動かす場合、目的の座標までサーボをコントロールするだけでなく、A点からB点まで線を引く線形補完が必要になります。
もう一つ厄介な問題は、ホストPCとの通信です。今回のロボットアームは、パソコンから制御コマンドを送信して、その命令を受信して動作することを想定しています。
Arduinoはパソコンとシリアル通信が出来ますが、基本バイト単位の通信機能しかありません。もちろん小さなバッファー機能はありますが、JavaのStreamTokenizerのような便利な機能はありません。出来るだけ単純な機械に合わせたコマンド体系にする必要があります。色々と課題があるのですが、とりあえずこんな状態で動き出しました。
Arduinoの出力ポートに直接サーボを接続してドライブさせていますが、ラジコン用の小型サーボなのでなんとか動作しています。実験に使っているサーボはラジコンで使用していた中古サーボなのでかなりガタが出ています。
例えば、腕の長さが300㎜のアームを動かすとすると、サーボの角度が1度違えば腕先では5.2㎜もズレます。誤差対策が必要なようです。
Arduinoではservo.write(1度単位)を使った制御方法以外に、アナログ制御することで最大1024段階に制御する方法もあります。しかしサーボがそのコントローを追随できるかは別問題です。サーボはポテンションメーターのフィードバックでアナログ的に動作しますが、製品によってガチャ付きやそもそもの精度が違います。
そういうことでサーボのチェック用スケッチを作って検証してみました。
今回検査するのはWaipoint W-060が2個とTowerpro SG-50が1個です。
SG-50は以前に出火騒動があったサーボなので全く期待していません。元々ギアのバックラッシュが大きくてガタつきがあります。W-060は静止状態ではガタつきは少ないですがどうでしょうか。
テストは90度のセンター出しを行ってから、0~180度までをピックアップしてテストしてみました。
まずSG-50ですが、0度まで稼動しますがジージー音がします。最小の角度は10度程度までにしたほうが無難なようです。180度までは回転しません。170度ぐらいが限界のようです。稼動範囲は余裕を見て20~160度の範囲で使うのが無難かと思います。
W-060ですが、全くダメで45度以下はどこまで回るか適当なようです。上限も130度付近から怪しいです。おそらくこのサーボには角度といった概念は存在しないと思います。50~120度の範囲で適当に動いてくれる程度と思ったほうが無難です。
予想はしていましたが、これでは逆運動学なんて意味がないようようです。
ラジコン飛行機を飛ばすだけなら最終はアナログ的に指先でコントロールするのでこの程度の精度でも十分利用できるんでしょうが、数値で角度コントロールするのは難しいようです。デジタルサーボも結局はボリュームを回しているだけなので結果は同じです。
ということで精度はゼロというこが確定しましたが、とりあえず形を目指して進めます。
◆ロボットアームを動かす
サーボの検証で、ほぼコントロール精度は出ないことが確定しましたが、とりあえずロボットアームの形にしてみました。
これ以上チープに作るのはムリでしょう。w
アームはアイスクリームの棒で、グレープフルーツ味でした。
まだ若干香りが残っています。w
両面テープで貼ってセロテープを巻いただけですが、この組み合わせを整理するだけでも苦労しました。一応サーボの稼動範囲を最大限に生かして、トリム調整した上で張り合わせています。構造的には接合方向は合っていると思います。
厄介な問題はPCとの通信です。
今回はPCのターミナルから文字列のコマンドを送信して、それをJapaninoで解釈してサーボを動かす仕組みです。用意したコマンドは以下のものです。
==================================================
// 移動 M(x1座標,y1座標) M(100,200)
// 点 P(x1座標,y1座標) P(100,200)
// 直線 L(x1座標,y1座標,x2座標,y2座標) L(100,200,300,400)
// 四角 B(x1座標,y1座標,x2座標,y2座標) B(100,100,300,400)
// 円 C(x1中心座標,y1中心座標,r半径) C(100,200,300)
==================================================
単純化のためにコマンドを識別する記号は一文字で、各コマンドにあわせて括弧内の数値を受け渡しします。文字列処理を行うには自前でバッファー処理して1バイト単位に識別変換する必要があります。また、コマンドを解釈して実行が正常に終了すれば「OK」のリターン通信を返してくる仕組みです。
サーボのコントロールは単に座標→角度変換するだけではなく、線を引く動作をさせるために線形補完もしています。色々と面倒な処理をして論理的にはまともな解が求められていると思います。
実験の結果、かなり寂しいものでした。
動画をご覧下さい。
Japanino (Arduino) Robotic arm
コメントが難しいほど弱々しくチープです。w
時々、コントロールコードを無視してあらぬ方向にも動きます。
試しにサインペンも持たせてみましたが、2歳児にペンを持たせたようなものでした。バカサーボですが、動こうと努力してるサーボが健気にも見えてきました。哀愁漂うロボットアームです。
ジャパニーノ画伯の処女作品です。
芸術的ですなー・・・
◆筋肉強化をしてみる
ジャパニーノ画伯の筋肉を強化してみました。
かなり怪しかった「Waipoint W-060」第2サーボを「Futaba FP-S143」に変更してみました。さすがに少し値段が高いだけはあるようで、少し線がシャキッとしました。
しかしまだ全体的に歪んでいます。もう一つのWaipointも排除すべきでしょう。
つまり使用するサーボによって結果はかなり変わることが確認できました。
◆サイドアーム型
3軸のロボットアームを作ってきましたが精度が全く出ませんでした。使っていたサーボもダメだったのですが、可動軸が多ければそれだけ誤差も大きくなります。ということで今回はシンプルに2軸のアームに作り変えてみました。
サーボはまだ信頼性が高そうなFutaba FP-S143を2個使っています。現状は動作確認の段階なので、骨格は以前のままのアイスクリーム棒です。
動作用プログラムは以前とほとんど同じです。各サーボの角度計算も3軸の計算式の内、1軸と2軸を足したものが1軸になるだけです。それは何故か?図をご覧ください。
Japaninoとの接続部分もスッキリとさせました。
高校生時代に使っていた汎用基盤の残りでシールドを作ってみました。
シールドといっても配線だけですが・・・
サーバ側のソフトも作ってみました。現状出来ることはCOMポートを利用したテキストの送信と受信だけですが、これで今後GUIも作り込めるようになりました。
マウスの動きをシミュレートしてアームでお絵描きなんて出来そうです。
出来ても意味はなさそうですが・・・
コンパクトに筋肉強化されたアームの性能はどうでしょうか?
まずは検証です。
Japanino (Arduino) Robotic arm 2
https://youtu.be/pi1LwORtFms
んーーー・・・ダメですね。
わずかに、ジャガイモがスイカになった程度です。
根本的にラジコン用サーボを使ったアームロボットに製図をさせようというアプローチが間違っているんでしょう。角度の誤差や動作の遅延、反動によるプルプルまで作図に表れてしまいます。
折り畳みのコンパクトなアームプロッタは便利かもと思ったんですが、大筆持ってお絵描き程度がアームプロッタの限界かもしれません。
◆巨大な分度器で検証
アームプロッタは何がどうダメなのか?
より分かりやすく数値で見ていきたいと思います。
巨大な分度器を作りました。
CADで製図してプリントアウトした分度器ですが、単なる目視よりは分かりやすいかと思います。
実験の方法は、まずサーボで90度を出してから両サイド0~180度でどれだけ実測と誤差があるか調べました。なんだか昔やった理科の実験みたいです。
検体は先日から使っている3種類のサーボです。
その中でも特に有望と思えるFP-S143を主眼に調査しました。
ではまずはW-060です。
30度以下は全く不規則です。測定外です。
無理に0度の指定をするとサーボを壊す可能性が高いです。
ただ30度程度までは一定の傾斜でズレが見てとれます。
限られた稼働範囲なら矯正は可能かもしれません。
SG-50はこんな感じです。
これも0度の指定はできるものの途中からカーブを描いたズレが発生しています。元々計測に使っているボリューム(ポテンショメータ)の品質が一定でないのでしょう。タイプAかな? カーブ部分の矯正は困難なようです。
最後に本命のFP-S143です。
サーボは2つありますので個体調査も兼ねて0~180度で別々に調査してみました。
Aサーボ
Bサーボ
両方ともある程度綺麗な直線的なズレがあることが見てとれます。
ただ個体差は大きいようです。
ラジコンではここまでの計測はしませんが、やってみる価値はあると思います。同じサーボでもこれだけ個体差があれば、ミキシング設定で十分考慮すべきでしょう。
ラジコン使用では0~180度まで目一杯使うことは少ないと思いますが、ズレは確実にあります。カタログスペックを鵜呑みにするのは危険です。1個1個性格が違うと思って間違いありません。エルロンサーボだと左右の舵に微妙なニュアンスのズレとなって表れると思います。
ちなみに、デジタルサーボとアナログサーボの違いは制御信号だけの問題だけなので精度には変化はありません。デジタルだから正確ということではありません。駆動系は結局ポテンションメーターを回してるだけなので、A/D変換しようが結局はアナログです。
ただ、若干デジタルサーボの方がモーターが強いので、立ち上がりが早いのと保持力も強くなります。しかしその分消費電力は大きくなりますのでバッテリーが十分でないとガチャ付きやノーコンになります。またコアレスとかは精度には全く関係はありません。
これはラジコン用の1個数百円~数万円程度の安価なサーボを対象としたことで、ロボット制御専用に作られた1個数十万円もする高級サーボは別ものです。
アームプロッタの精度向上のためには、まずこのズレをソフト的にキャリブレーションする必要がありそうです。可動範囲も20~160度に制限すべきだと思います。(描画範囲が狭くなる)細かなブレを抑えることは出来ないと思いますが、大きく図形が歪むことは少なくなると思います。
しかし1度違えば数ミリの誤差です。
1cm方眼ぐらいの大きな目で評価してあげる必要があるかもしれません。
◆四角は□、丸は○
一番素直そうなFP-S143をダーゲットに調整を行いました。
前回からの改善ポイントは
・サーボの角度誤差を補正するため、線形補間の調整計算式を追加。
・1度単位の角度指定からwriteMicrosecondsによる1024分解に精度を向上。
・線描画補間のステップを1mmステップから0.1mmステップに向上。
・サーボの動作遅延を考慮してインターバルの調整。
等々を行いました。
結果はご覧の通りです。(右側が補正後です)
んーーーー
四角は□っぽい?
丸は○っぽい?
ひいき目に見てそんな気もしますが、プルプル線画は相変わらずです。論理的な空想の世界を現実の世界に描き出す面白さはありますが、これ以上の精度を望むのはどうも無理なようです。
一応、完!