アイススティックを使用してロボットアーム作成し、Arduinoとボリュームでコントロールするようにしました。
このロボットアームは、4個のサーボモーターを使用します。
ボリュームを個々に動かすだけではなく、ボリュームを2個同時に動かしてもサーボをコントロールできるようにマルチタスクを使用しました。
アイススティックとMDFでロボットアームを作ってみました。
アームの部分は全てアイススティックで作ってあります。Arduinoのプロミニで4つのサーボモータを動かしています。
スケッチプログラムは、並列処理ができるようにマルチタスクを使用しています。つまり2つのボリュームを同時に動かしても
アームが2つのボリュームに応じて動くようにしてあります。
下図は、ロボットアームの回路図と完成品です。
下記のスケッチでMotiveクラスは、スイープアクションをカプセル化しますが、タイミングを合わせるためにmillis()関数を使用します。
また、サーボを特定のピンに関連付けるために、Attach()関数を追加する必要があり、簡略化のためにmap()関数を使用しました。
(Detach() 関数は使用していません)
Motiveの各インスタンスに必要なコードは、次の通りです。
・インスタンスを宣言する
・セットアップのピンに接続する
・ループ内での更新の呼び出し
#include <Servo.h>
class Motive { //クラスMotive
Servo myservo; //サーボ名の定義
int updateInterval; //更新間隔
unsigned long lastUpdate; //位置の最終更新
public:
Motive(int interval) { // Motive(int型の間隔)
updateInterval = interval;
}
void Attach(int pin) {
myservo.attach(pin); //サーボの取り付けピン
}
void Update(int inputpin,int sdeg, int ldeg) {
if((millis() - lastUpdate) > updateInterval) { //更新する時刻
lastUpdate = millis();
int val = analogRead(inputpin); //インプットピンの読み込み
int deg = map(val,0,1023,sdeg,ldeg);
myservo.write(deg); //サーボ書込み
}
}
};
Motive motive1(20); //インスタンスを宣言 サーボ1
Motive motive2(30); //サーボ2
Motive motive3(40); //サーボ3
Motive motive4(50); //サーボ4
void setup() { //セットアップのピンに接続
motive1.Attach(3); //サーボ1は3ピンに接続
motive2.Attach(5); //サーボ2は5ピンに接続
motive3.Attach(6); //サーボ3は6ピンに接続
motive4.Attach(9); //サーボ4は9ピンに接続
}
void loop() { //ループ内での更新の呼び出し
motive1.Update(0,30,160);
motive2.Update(1,30,180);
motive3.Update(2,0,180);
motive4.Update(3,0,120);
}
これで、4つのボリュームによる独立したタスクを互いに干渉しないでノンストップで実行できます。
つまり、2つ以上のボリュームを同時に動かしても実行できます。
ただし、手は2つしかありませんので、ボリューム2個を同時に動かすしかありません。
ジョイスティックを使えばマルチタスクの動きがよくわかると思います。
次のビデオは、ロボットアームを動かしているビデオです。