ピックワールド(PIC World)

インフォメーション

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

この記事のタグ

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


Arduino で 4 足歩行ロボットを作ってみるかな – (4) Arduino のサーボライブラリ VarSpeedServo.h はスピードを調整でき、sequence 動作も可能!

間が空いてしまったのですが、バタバタしていて、すみませんです。

いろいろと試してみながら進めたいと思っていて、マイペースってことでご勘弁ください。

Kuman SG90 - 9g サーボモーター

Kuman SG90 – 9g サーボモーター

前回は、Arduino の標準ライブラリを使っときの問題点である、サーボモーターの回転スピードの制御ができない(サーボモータは指令を受け取ると、一目散にフルスピードで指定の角度まで動こうとする)問題を改善する方法を書きましたね。

でも、世の中にはやっぱりこれは問題だろうと、改善するライブラリを書いちゃう人もいるものなのですよ~

それがタイトルにある  VarSpeedServo.h というライブラリを使う方法で、これを使うと簡単にサーボの回転スピードを制御しながら動かすことが可能となります。

ただし、制限があるのですが、それは、「Supports up to 8 servos」となっている点。(最大 8個のサーボモータをサポートします)

  • Supports up to 8 servos
  • Allows simultaneous, asynchronous movement of all servos
  • The speed of a move can be set
  • The write() function initiates a move and can optionally wait for completion of the move before returning
  • A servo can be sent a sequence of moves (where each move has a position and speed)

上記のように紹介されています。

目標としている4足歩行ロボットだと、8個のサーボまでとなると、1つの足あたり、2個のサーボモータを装着するといことになります。

う~ん。これでもよいのだろうけれど、1足あたり3個のサーボモータの方が、自然な動きが実現できると考えるのが普通でしょうね。

サーボの制御方法をいろいろと紹介していて、あともう1つ紹介しようと思っていますが、実は使用するライブラリや環境によって、こんな制限があることも事実なのですね。

容認できる問題とそうでない問題があるとは思うのですが、目的のものを実現するためには、それができるという様々な環境(等)を探し出さないといけませんから・・・

まぁこんな制限はあるけれども、 VarSpeedServo.h について、以下に紹介しようと思います。

なお GitHub にアップされていて、こちらからファイルをダウンロードし、Arduino IDE の所定の場所に置くか(例えば C:\Program Files (x86)\Arduino\libraries)zip ファイルをダウンロードし、Arduino IDE で取り込めば、ライブラリが使えるようになります。

いきなりサンプルスケッチですが・・


#include <VarSpeedServo.h>

VarSpeedServo myservo; // create servo object to control a servo

void setup() {
myservo.attach(9); // attaches the servo on pin 9 to the servo object
}

void loop() {
myservo.write(180, 30, true); // move to 180 degrees, use a speed of 30, wait until move is complete
myservo.write(0, 30, true); // move to 0 degrees, use a speed of 30, wait until move is complete
}

1行目は、VarSpeedServo.h をインクルードする

3行目は、servo オブジェクトを作る

6行目は、サーボ 9番ピンに接続していることを指定する

10行目と11行目でサーボを動かしていますが、

myservo.write(180, 30, true); // move to 180 degrees, use a speed of 30, wait until move is complete

サーボモーターを現在の位置から、180°の位置まで、30のスピードで動かし、wait する
myservo.write(0, 30, true); // move to 0 degrees, use a speed of 30, wait until move is complete

同じく0°の位置に30のスピードで動かし、wait する。

といった感じです。

クラスメソッドは、

attach(pin )サーボモータが接続されているピンを指定する
attach(pin, min, max)サーボモータが接続されているピンを指定するとともに、使用するサーボの最大角度となるパルス幅をマイクロ秒で指定する(デフォルトの最小値は544、最大値は2400)
write(value)サーボを動かしたい角度を指定する
write(value, speed)サーボを動かしたい角度を指定するとともに回転速度を指定する(0 =最高速度、1-255の順で速く動作)
write(value, speed, wait)上記に加え wait をブール代数で指定(true と指定)することにより、動作が完了するまで関数の呼び出しをブロックする
writeMicroseconds()サーボパルス幅をマイクロ秒単位で設定する
read()最後に書き込まれたサーボパルス幅を0〜180の角度で取得(取得と書いてあるが、前回の指定を覚えているだけ?)
readMicroseconds()最後に書き込まれたサーボパルス幅をマイクロ秒単位で取得(取得と書いてあるが、前回の指定を覚えているだけ?)
attached()サーボが接続されているか確認する
接続されている場合は true を返す
detach()接続されているサーボを解除する
slowmove(value, speed)write(value、speed)と同じ
Kormanのバージョンとの互換性のために用意されている
stop()在の位置でサーボを停止
sequencePlay(sequence, sequencePositions)位置0から始まるシーケンスを開始する
sequencePlay(sequence, sequencePositions, loop, startPosition)ポジションの数だけシーケンス再生
sequenceStop()現在の位置でシーケンスを停止する

 

こんな感じですね。

まぁ Servo.h とほぼ同じ使い方もでき、サーボモーターの動作スピードも指定できるわけですが、もう1点 VerSpeedServo.h には機能が追加されていて、それはシーケンス動作ができる事。

上記の表の下3行にある、sequence から始まる、

  • sequencePaly
  • sequenceStop

の2つですね。

シーケンスとは、あらかじめ決められた順序で複数の動作を行うことを指し、例えば今回の目標である4足歩行ロボットでは、その足を所定の複数の角度に順番に動かすことができることができるということになり、これは便利に使えそうです。

以下は、codebender.cc から拾ってきたサンプルスケッチですが、


/*
ServoSequence
Reads an analog input, and plays different servo sequences depending on the analog value

This example code is in the public domain.
*/

#include <VarSpeedServo.h>

VarSpeedServo myservo1;

const int servoPin1 = 9; // the digital pin used for the servo

// sequences are defined as an array of points in the sequence
// each point has a position from 0 - 180, and a speed to get to that position
servoSequencePoint slow[] = {{100,20},{20,20},{60,50}}; // go to position 100 at speed of 20, position 20 speed 20, position 60, speed 50
servoSequencePoint twitchy[] = {{0,255},{180,40},{90,127},{120,60}};

const int analogPin = A0;

// the setup routine runs once when you press reset:
void setup() {
myservo1.attach(servoPin1);
}

// the loop routine runs over and over again forever:
void loop() {
// read the input on analog pin 0:
int sensorValue = analogRead(analogPin);
if (sensorValue > 200) {
myservo1.sequencePlay(slow, 3); // play sequence "slowHalf" that has 3 positions, loop and start at first position
} else {
myservo1.sequencePlay(twitchy, 4, true, 2); // play sequence "twitchy", loop, start at third position
}
delay(2); // delay in between reads for analogin stability
}

16行目と17行目で2つのシーケンスを配列で指定していますね。

その後、31行目と33行目で sequencePlay を使って、指定の順番でサーボモーターを指定の角度 / 指定のスピードで動かすというサンプルスケッチです。

ロボットを歩行させるときには、足を動かして進むわけですが、このシーケンスを上手に使えば、いつも同じように足を動かすことができるので、おそらくは非常に重宝する機能ではないかと思います。

ずいぶんと長くなってしまいましたが、今回で4回目のサーボモーターの話となるわkですが、くどいようで申し訳ありませんが、あと1回(5回目)サーボモータの話をしなければなりません。

先に紹介したとおり、Arduino Mega を除き、Arduino に接続できるサーボモータの最大数は、12個です。

12個のサーボモーターを動かすことができれば、1レッグ / 3 サーボの4足歩行ロボットができますが、他のセンサー(超音波センサーや赤外線センサー)を付けることができませんね。

これでは少し楽しくないかも。

ご承知の通り、Arduino には I2C というシリアルバスが搭載されています。

これを使ってサーボモータを動かすこともでき、この場合の最大数は理論上992個までのサーボモータを接続することができる(こと)になっています。

この1枚のインタフェースボードには、16個のサーボが接続できるのですが、これを使えば 12個のサーボモータでも楽々!加えて Arduino の I / O ポートも空きがたくさんできてセンサー類の搭載も可能となるりますね。

次回はこんなボードを使ったサーボモーターの動かし方について、紹介したいと思います。

 


コメントを残す

最近の投稿

最近のコメント

アーカイブ