ピックワールド(PIC World)

インフォメーション

この記事は 2017年02月16日 に以下のカテゴリに投稿されました Robot.

この記事のタグ

, , , , , , , , , , , ,


Arduino で 4 足歩行ロボットを作ってみるかな – (3) Arduino のサーボライブラリ Servo.h について

Arduino で 4 足歩行ロボットを作ってみるかな の3回目です。

Arduino の Servo.h を使ってサーボモータの動作スピードを制御する

Arduino の Servo.h を使ってサーボモータの動作スピードを制御する

前回は、実際に Arduino にサーボモーターを使い、サーボモーターとはどんなものなの理解を深めました。

まぁ無理矢理というわけではないのだけれど、Arduino サーボモーターを動かすためにパルスを発生させて、動作することを確認しました。

実際に、ロボットを動かす場合には、もちろんこんなことを一から行う必要はなくて、Arduino には、最大の強みである、沢山のライブラリが用意されていて、その中にもちろんサーボモーターに関するものも公開されているので、そちらを使うことになります。というかそれが普通なのですね。

Arduino でサーボモータを動かすライブラリはいくつか存在しますが、やっぱり Arduino IDE をインストールすると、入っている Servo.h が一番最初に覚えるのなら一番でしょう。

Servo.h はざっくり、以下のような機能が備わっています。(Arduino 日本語リファレンスから)

  1. attach(pin)
  2. write(angle)
  3. writeMicroseconds(uS)
  4. read()
  5. attached()
  6. detach()

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 に入っています。

簡単に説明すると、

  1. まずは15行目の #include <Servo.h> でサーボライブラリをインクルード(使える状態にする)
  2. 18行目の myservo.attach(9); で Arduino の 9番ピンにサーボモーターが接続されていると指定する
  3. 22~26行の間で、0~180迄 pos が変化するループを巻く
  4. 24行目の myservo.write(pos); でサーボを動かす(1°ずつ)
  5. 25行目の delay(15); で 15ms 待つ(サーボが動いている時間待つ)

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 を使ってロボットのスケッチを書くのならば、このようにしたらどうかな?

それは関数を定義して、使う方法。

関数には、

  1. サーボモータを動かす角度
  2. サーボモーターを動かすスピード

を引数にしてあげれば・・で、書いたのが以下のスケッチ。

#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); 

}
 

まぁ、こんな感じでサーボの速度をコントロールしながら、動かすことができました。

ただ・・・これ、複数サーボの時には・・んんん?どうする。

ってところで、少し長くなってしまったので、これらを解決する方法を次回に説明しましょう。

 

投稿者のプロフィール

minorus
minorus
電子機器が大好きです。
プログラムを書くのをお仕事としていたこともあるので、両方できる PIC や Arduino を使って、いろいろな(役にあんまり立たない)ものを作っています。
実は UNIX 関連のお仕事も長かったので、Raspberry Pi もお手の物なのですけれど、これから触る機会が多くなるのかなぁ。
ボチボチ行きますが、お付き合いください。
若いころの写真なので、現時点では、まだ髪の毛は黒くてありますが、お髭は真っ白になりました。
愛車の国鉄特急カラーのカスタムしたリトルカブで、時々、秋月電子通商の八潮店に出没します。

コメントを残す

最近の投稿

最近のコメント

アーカイブ