はじめてのサーボ・モータ (2) Arduino UNOで動かす-複数動作
前回、Arduino UNOの各ポートのどこへつないでもサーボ・モータは動きました。ここでは、複数のサーボ・モータを同時につなぎます。サーボ・モータのライブラリでは、一度角度を指定すると、ずっとその角度を維持します。たとえホーンに負荷がかかって角度がずれてもすぐに元に戻そうとします。複数のサーボ・モータがつながっても大丈夫なのでしょうか。
●三つのサーボ・モータをつなぐ
ポート0、1、2、にサーボ・モータをつなぎました。次のスケッチをコンパイル、実行します。
#include <Servo.h>
Servo myservo;
#define n 3
void setup() {
for (byte Ports=0; Ports<n; Ports++) {
myservo.attach(Ports);
myservo.write(0);
delay(500);
myservo.write(180);
delay(1000);
}
}
三つのサーボ・モータが、次々と動きます。今度は、繰り返し動かして波形を見ます。
#include <Servo.h>
Servo myservo;
#define n 3
void setup() {
}
void loop() {
for (byte Ports=0; Ports<n; Ports++) {
myservo.attach(Ports);
myservo.write(0);
delay(500);
myservo.write(180);
delay(1000);
}
}
オシロスコープで0、1番のポートを見ています。赤色が0番、青色が1番です。
1個目が動いています。
2個目が動いています。
3個目が動いています。
どうも、myservo.attach(Ports);で指定されたポートだけに信号が出ています。サーボ・モータを手で触ると、そのポートだけは振動していますが、ほかの指定されていないポートは動いている様子はありません。
PWMの印のあるポート9、10、11につなぎましたが、0、1、2と同様に、指定されたポートだけに信号が出ています。
●ほかの仕事しているとき
setup()で10番につないだサーボ・モータを90度に設定します。loop()内ではLEDを点滅します。
#include <Servo.h>
Servo myservo;
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
myservo.attach(10);
myservo.write(90);
}
void loop() {
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(1000);
}
このときの波形です。ずっと90度の信号が出ています。
delay()のときも、サーボ・モータは制御されています。delay()は、Arduino UNOでは三つあるタイマのうちtimer0を使っています。これは、内蔵されているタイマを利用したプログラムなので、CPUとは無関係に動作しています。逆に言えば、同じタイマを利用するライブラリがあれば、動作が保証されないかもしれません。timer0は5、6番のPWM出力に使われているようです。
サーボ・ライブラリはtimer1を使っています。このタイマは9、10番のPWMにも使われます。
timer2はtone()と3、11番のPWMに使われます。
複数のサーボ・モータを同時に動かしたい場合は、割り込みを使って実現します。「A clean sweep」