Arduino で 4 足歩行ロボットを作ってみるかな の3回目です。
前回は、実際に Arduino にサーボモーターを使い、サーボモーターとはどんなものなの理解を深めました。
まぁ無理矢理というわけではないのだけれど、Arduino サーボモーターを動かすためにパルスを発生させて、動作することを確認しました。
実際に、ロボットを動かす場合には、もちろんこんなことを一から行う必要はなくて、Arduino には、最大の強みである、沢山のライブラリが用意されていて、その中にもちろんサーボモーターに関するものも公開されているので、そちらを使うことになります。というかそれが普通なのですね。
Arduino でサーボモータを動かすライブラリはいくつか存在しますが、やっぱり Arduino IDE をインストールすると、入っている Servo.h が一番最初に覚えるのなら一番でしょう。
Servo.h はざっくり、以下のような機能が備わっています。(Arduino 日本語リファレンスから)
Arduino 日本語リファレンスには、
このライブラリはRCサーボモータのコントロールに用います。標準的なサーボでは0から180度の範囲でシャフトの位置(角度)を指定します。連続回転(continuous rotation)タイプの場合は、回転スピードを設定します。
ServoライブラリはほとんどのArduinoボードで最大12個のサーボをサポートします。Arduino Megaにおいては最大48個です。Mega以外のボードでは、ピン9と10のPWM機能が無効になります。Megaでは、12個までならPWM機能に影響せず、それ以上のサーボを使う場合はピン11と12のPWMが無効になります。
このように書かれていて、使用するボードによってサポートされるサーボの数など、これからロボットを作るうえで重要なことも記載されています。
上記に列記した、コマンドのリンク先も、Arduino 日本語リファレンスなのですが、よく書かれていると思います。
Arduino IDE にサンプルスケッチも入っているので、こちらを使いますが、
/* Sweep by BARRAGAN <http://barraganstudio.com> This example code is in the public domain. modified 8 Nov 2013 by Scott Fitzgerald http://www.arduino.cc/en/Tutorial/Sweep */ #include <Servo.h> Servo myservo; // create servo object to control a servo // twelve servo objects can be created on most boards int pos = 0; // variable to store the servo position void setup() { myservo.attach(9); // attaches the servo on pin 9 to the servo object } void loop() { for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees // in steps of 1 degree myservo.write(pos); // tell servo to go to position in variable 'pos' delay(15); // waits 15ms for the servo to reach the position } for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees myservo.write(pos); // tell servo to go to position in variable 'pos' delay(15); // waits 15ms for the servo to reach the position } }
このサンプルスケッチは、Sweep という名前で、Arduino IDE に入っています。
簡単に説明すると、
27~30行目は、for ループがが逆になっているだけで、やっていることは同じ。
従って、一度ビューンと180°うごいて、2回目のループで元の位置に戻しているという動作を行うスケッチですね。
なぜこのようにしなければならないかというと、サーボモーターの特性として、角度を指定してパルスを送ると、一目散にサーボモーターのできる限りの最高スピードでその角度に動こうとするので、1°動かしては Wait(delayをかけて)するような動作で、サーボモーターの動作スピードを加減しているわけですな。
普通に Servo.h を使ってサーボモーターを動かすと、以下のようなスケッチになります。
#include <Servo.h> Servo servo; // Servoオブジェクトを作る void setup() { servo.attach(9); // 9番ピンをサーボの信号線として設定 } void loop() { servo.write(90); // サーボを 90°に動かす delay(1000); // サーボが動いている間、お休み servo.write(0); // サーボを 0°に動かす delay(1000); // サーボが動いている間お休み servo.write(180); // サーボを 180°に動かす delay(1000); // サーボが動いている間お休み }
動画としてはあまり面白くないのですけれど、こんな感じでこのサーボモーターの最大の速度で、90°->0°->180°の角度に(一生懸命)動いていますね。
ついでに先に紹介した Wait させてサーボモーターの動作速度を制限したサンプルスケッチ Sweep を実行してみます。
このように、ゆっくりとサーボモーターを動かすことができますね。
実際にロボットに乗せるスケッチを普通に Servo.h を使って書くと、キレキレのダンスのような動きで問題がなければよいのですが、そもいかない場合もあると思うので、Sweep サンプルスケッチのように、Wait を入れてゆっくりと動かす必要もあるかと思います。
Servo.h を使ってロボットのスケッチを書くのならば、このようにしたらどうかな?
それは関数を定義して、使う方法。
関数には、
を引数にしてあげれば・・で、書いたのが以下のスケッチ。
#include <Servo.h> Servo servo; // Servoオブジェクトを作る int posn; void setup() { //Serial.begin(9600) ; servo.attach(9); // 9番ピンをサーボの信号線として設定 //servo2.attach(10); // 10番ピンにもサーボを付けてみる servo.write(90); // とりあえずホームポジションへ delay(1000); posn = 90; } int myservo(int pos, int wtime){ int i; if(posn <= pos){ for ( i = posn ; i <= pos; i++) { servo.write(i); //Serial.println(i) ; delay(wtime); } posn = pos; } else { for (i = posn ; i >= pos; i--) { servo.write(i); //Serial.println(i) ; delay(wtime); } posn = pos; } } void loop(){ myservo(180, 30); delay(1000); myservo(0,10); delay(1000); myservo(90,50); delay(1000); myservo(120,1); delay(1000); myservo(30,30); }
まぁ、こんな感じでサーボの速度をコントロールしながら、動かすことができました。
ただ・・・これ、複数サーボの時には・・んんん?どうする。
ってところで、少し長くなってしまったので、これらを解決する方法を次回に説明しましょう。
電子機器が大好きです。
プログラムを書くのをお仕事としていたこともあるので、両方できる PIC や Arduino を使って、いろいろな(役にあんまり立たない)ものを作っています。
実は UNIX 関連のお仕事も長かったので、Raspberry Pi もお手の物なのですけれど、これから触る機会が多くなるのかなぁ。
ボチボチ行きますが、お付き合いください。
若いころの写真なので、現時点では、まだ髪の毛は黒くてありますが、お髭は真っ白になりました。
愛車の国鉄特急カラーのカスタムしたリトルカブで、時々、秋月電子通商の八潮店に出没します。