M5Stack社のPb.Hub UnitにFader Unit(フェーダーユニット)を6つ接続し,Elephant Robotics社のmyCobot 280の6つのジョイントを動かすプログラムです。
- myCobot 280 x 1
- AtomMain 3.2以降
- Pb.Hub Unit x 1
- Fader Unit x 6
PlatformIO環境に対応しています。動作確認は Windows 11 上でPlatformIO IDE for VSCodeを使用して実施しています。
$ git clone https://github.com/3110/mycobot-fader-controller
$ cd mycobot-fader-controller
$ platformio run --target=upload
myCobotのM5Stack Basicに書き込む際のシリアルポートは自動判別されますが,うまくいかないときはplatformio.ini
のupload_port
を設定してください。
Pb.Hub UnitにはCH0からCH5まで6つの接続チャネルがあるので,それぞれにフェーダーユニットを接続します。CH0に接続したFader UnitがmyCobotのJ1の操作に,CH1がJ2,CH2がJ3,CH3がJ4,CH4がJ5,CH5がJ6にそれぞれ対応します。
はじめてフィーダーコントローラを起動すると,フィーダーの位置合わせをするモードになります。
各ジョイントの値は,物理的な位置と一致するように下からJ1,J2,J3,J4,J5,J6と並んでいます。
ボタンは向かって左からボタンA,ボタンB,ボタンCと呼びます。 各ボタンの上には必要に応じてラベルが表示されます。以下の図ではボタンAの上にMinというラベルが表示されています。
フィーダーの値はケーブルを差す側が最大値,逆側が最小値,真ん中で止まる位置が**値になります。
※Fedar Unitから取得できる値は本来は0から4095ですが,Pb.Hub Unitを経由する場合,分解能が10bitのため1024までとなり,出力が5VにもかかわらずFader Unitは3.3Vまでしか出力できないため,1024×(3.3/5.0) = 675.84までになります。
フェーダーの位置は最小値(Min)・**値(Mid)・最大値(Max)の順に設定していきます。 まずは最小値(Min)を設定します。フェーダのつまみをすべて最小値側に移動させます。
ボタンAを押すと,それぞれ各ジョイントの最小角度に設定されます。ボタンAのラベルの表示が最小値を表すMinから**値を表すMidに変わるので,今度は**値を設定します。
すべてのフェーダーのつまみを**付近のいったん止まる位置まで動かします。
ボタンAを押すと,それぞれ各ジョイントの**値が0に設定されます。ボタンAのラベルの表示が**値を表すMidから最大値を表すMaxに変わるので,今度は最大値を設定します。
すべてのフェーダーのつまみを最大値側に動かします。
ボタンAを押すと,それぞれ各ジョイントの最大値が設定されます。
ここで設定した値は,M5Stack Basicの不揮発記憶(NVS: Non-Volatile Storage)に記録されるので,電源を切っても設定が残ります。同じFader Unitを同じ場所につないでいる限りは再度設定する必要はありません。
これでフェーダーでmyCobotを動かす準備が整いました。
フィーダーの位置合わせが完了している場合,電源を入れると以下の画面から始まります。
フェーダーを動かしてみると,それぞれ対応するジョイントの値が変わるはずです。この状態では実際にはmyCobotのジョイントは動きません。
ボタンA(Set)を押すと,位置合わせをすることができます。位置がうまく合ってないなど,再度位置合わせをしたい場合に押してください。
ボタンB(Start)を押すと,フェーダーで設定されている値に応じてmyCobotが実際に動き出します。指定された値通りに動くので,設定値には注意してください。もう一度ボタンB(Stop)を押すと停止します。詳細は次の「myCobotを動かす」を参照してください。
ボタンC(Free)を押すと,myCobotのジョイントをすべて脱力させて手で自由に動かせるようになります。ボタンBで停止させたときにmyCobotに無理な力がかかるような動きになってしまって止めたい場合などに使用します。
初めてボタンBを押してmyCobotを動かすときは,フェーダーのつまみをすべて**にします。 フェーダーのつまみをすべて**にするとmyCobotが直立するので,安全に動かすことができます。
ボタンB(Start)を押すと,myCobotがフェーダーで設定した値の通りに動きます。試しにJ6のフェーダーを動かしてみてください。myCobotの手先が動くのがわかると思います。
物にぶつかるかどうかなどには関係なく,myCobotはフェーダーで指定された位置に動きます。設定した値によってはmyCobotに無理な力がかかって壊れる可能性もありますので,動かす場合は細心の注意をはらってください。
フェーダーに合わせて動かないようにするには,再度ボタンB(Stop)を押します。
- このプログラムにはElephant Robotics社がApache License, Version 2.0のライセンスで配布している成果物を含んでいます。
- https://github.com/elephantrobotics/myCobot/tree/main/Arduino/MycobotBasic
- 以下を改変しています
- フォーマッタの適用
- AtomMain 3.2以降への対応のため係数の変更
MycobotBasic::readData()
MycobotBasic::WriteAngles(Angles angles, int speed)
- コンパイラの警告抑制のため使われていない変数の削除
- typoの修正
MycobotBasic/MycobotBasic.h
:WRITE_SIGLE_SERVO_GAP
->WRITE_SINGLE_SERVO_GAP