3軸のめちゃ簡単ロボットアームの組立と動作確認を行います。 これを3Dプリンタで印刷して3軸ロボットの実験をして見ます。
ソースコード修正
超簡単ロボットアームのソースコードを、CheapStepperライブラリに対応に変更して行きます。
#include <CheapStepper.h> //definitions for each command to be recieved via serial port #define COMMAND_1 '1' #define COMMAND_3 '3' #define COMMAND_4 '4' #define COMMAND_6 '6' #define COMMAND_7 '7' #define COMMAND_9 '9' #define COMMAND_8 '8' #define COMMAND_2 '2' #define COMMAND_STOP ' ' //enter the steps per rev for your motors here int stepsInRev = 384; //this sets the value for the for loops and therefore sets the amount of steps in each call int num_of_steps = 1; // setup pins for each driver motor1 ~ IN1, IN2, IN3, IN4; motor2 ~ IN1, IN2, IN3, IN4 CheapStepper motorbottom(13, 11, 12, 10); CheapStepper motormid(9, 7, 8, 6); CheapStepper motortop( 5, 3, 4, 2); // variable to store the last call to the serial port char lastCall = ' '; void bottomleft(int steps){ motorbottom.step(1); } void bottomright(int steps){ motorbottom.step(-1); } void midleft(int steps){ motormid.step(1); } void midright(int steps){ motormid.step(-1); } void topleft(int steps){ motortop.step(1); } void topright(int steps){ motortop.step(-1); } void bothleft(int steps){ motortop.step(1); motormid.step(1); } void bothright(int steps){ motortop.step(-1); motormid.step(-1); } void allStop(){ Serial.println("stop"); // steppers stop PORTD = B00000000; //sets all of the pins 0 to 7 as LOW to power off stepper1 PORTB = B00000000; //sets all of the pins 8 to 13 as LOW to power off stepper2 } void setup() { Serial.begin(9600);//start the bluetooth serial port - send and recieve at 9600 baud // set the speed at 20 rpm: motortop.setRpm(20); motormid.setRpm(20); motorbottom.setRpm(20); } void loop() { //check to see if there is serial communication and if so read the data if(Serial.available()) { char data = (char)Serial.read(); // switch to set the char via serial to a command switch(data) { case COMMAND_1: bottomleft(num_of_steps); break; case COMMAND_3: bottomright(num_of_steps); break; case COMMAND_4: midleft(num_of_steps); break; case COMMAND_6: midright(num_of_steps); break; case COMMAND_7: topleft(num_of_steps); break; case COMMAND_9: topright(num_of_steps); break; case COMMAND_8: bothleft(num_of_steps); break; case COMMAND_2: bothright(num_of_steps); break; case COMMAND_STOP: allStop(); break; } // set the 'lastCall' variable to the last call from the serial lastCall = data; } else{ char data = lastCall; switch(data) { case COMMAND_1: bottomleft(num_of_steps); break; case COMMAND_3: bottomright(num_of_steps); break; case COMMAND_4: midleft(num_of_steps); break; case COMMAND_6: midright(num_of_steps); break; case COMMAND_7: topleft(num_of_steps); break; case COMMAND_9: topright(num_of_steps); break; case COMMAND_8: bothleft(num_of_steps); break; case COMMAND_2: bothright(num_of_steps); break; case COMMAND_STOP: allStop(); break; } lastCall = data; } }
ソースコード解説
スケッチに以下の変更を加えます。
1.Sepper.h の代わりに CheapStepper.h をインクルードします。
2.setup() の中で CheapStepper で初期化します。
関数名が違います。 set()→setRpm()
回転速度決めます。CheapStepper のサンプルを見ると28BYJ-48は 20rpmが標準のようです。
動作確認
変更したスケッチをArduino Nanoに書き込み、電源を繋ぎます。
同じようにProcessingから動かすと、LEDの動きは四つが全部点滅する感じで、二つづつ点いていたStepperライブラリとは明らかに駆動方法が違うようです。動作確認をするのに、ULN2003Aドライバ基盤のLEDが役に立ちます。
単体で動かすと見違えるようにキビキビと駆動するようになりました。しかし、ロボットアームに組付けると、たしかに動きは良くなりましが、やはり5Vだと中軸は腕を振り上げる時はステップ通りに動いている感じではありません。動かないとか逆に動くことはなくなりましたが、トルクがかかる場面ではまだステップが飛びます。
結論
CheapStepper ライブラリを使うと、28BYJ-48 5Vでももう少しトルクが稼げます。
この3軸ロボットアームを動かすためには、やはり28BYJ-48 の12Vモデルが必要なようです。5Vモデルも電源に9Vを入れるとなんとか駆動するようになりますが、駆動力は足りないです。
ソースコードを見ていて思ったのですが、もしかしたらこの3Dモデルの作者もちょっと動かして見て、ちゃんと動かすのを諦めてしまったのかも知れません。なのでソースコードが最適化されていなかったりしています。
(num_of_stepsが効いていないし、同じようなコードが二か所にあったりしています。)
おわりに
CheapStepperライブラリのおかげで、ソフトウェアで28BYJ-48の駆動を少し改善できることがわかったので、こんどはソフトウェアの変更やパラメータの変更で、もう少しなんとかできないか、探って見る事にします。
購入品情報
(今日の時点で、28BYJ-48の12Vバージョンはまだ届いていません。)