はじめてのサーボ・モータ (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

前へ

Linduinoで計測 (2) 24ビットA-DコンバータLTC2498

次へ

重さを測る その3 NAU7802を使う