●サーボモーターを使ってみる

ラジコンなどに使われているサーボをArduinoで使ってみたいと思います。


まずは、サーボ自体の信号線を調べます。
電源のプラスを、Arduinoの3.3Vや5Vに、マイナスはGNDに、信号線は好きなポートに接続します。
電圧はサーボの仕様によって違うことがありますので注意が必要です。
他の電源でサーボを動作させる場合には、信号線とGNDはArduinoに接続させる必要があります。

手持ちのサーボのFUTABA S3003の端子をしらべました。


動作電圧が4.8V〜6.0Vでしたのでプラスを5Vに接続して、マイナスをGNDに接続、
信号線を適当なポート、デジタルピン2番に接続しました。


Arduinoに次のプログラムを書き込みます。

#include <Servo.h>

Servo servo1;

void setup() {
  servo1.attach(2); //デジタルピン2番を使用
 }

void loop() {
    servo1.write(90); //90度に設定
    while(1);//無限ループ
}

書き込み完了するとデジタルピン2番に接続されたサーボが90度まで動いて、その角度が維持されます。


■サーボモーターで遊んでみる

まず、10個で2400円程度で買える低価格なサーボモーターをアマゾンで購入しました。
Miuzei サーボモーター マイクロサーボ 9g 180° 10個セットデジタル・サーボ メタルギア ,RCヘリコプター/飛行機/ボート/ロボット/Arduinoに適用


このサーボモーターでは、黄色い線をArduinoのデジタルピンに、茶色の線をGNDに、赤い線を3.3Vまたは5Vに接続すれば動作することがわかります。

無駄に10個も買ってしまいました、そこでサーボモーターを使って移動するロボットを作ってみたくなりました。 そこで、サーボモーターを2個組み合わせて足のような物を作りました。

サーボモーターを制御できる中間位置である90度でこの形になるように作成しました。


この足を複数個作って制御したら昆虫のように歩けるのじゃないかと考えて、サーボモーター全てを使って、 5本の足を作成しました。



次に本体を作成したいと思います。
竹の割り箸を手元から 7センチで印をつけて切断します。

これを星型に並べて接着剤で固定して本体を作ります。
しかし、正5角形に近い形で割り箸を並べて固定するのは三角関数が必要です。

360°を5で割ると72°

真ん中に90度で線を引き、辺の長さを求めます。
計算の結果、約4.11cmとなり、各辺の端の長さを約8.2cmで接着すれば、正五角形に近い形を作れるはずです。
それに合わせて、割り箸を接着剤で接着しました。

ほぼ、5角形に近い形になりました。
そこに、今まで作成したサーボモーターの足を結束バンドで取り付けます。

なんだか気持ち悪い生き物みたいに見えてきました。


■コントロール基盤を作る

サーボの信号線に対してArduinoのデジタルピン2番〜11番を割り当てていこうと思います。
そこで、まず、Arduinoの互換NANOとピンヘッダーと基盤を用意しました。

ピンヘッダーに対して、デジタルピンをひとつづつ接続して、GNDを負極側に、5Vを正極側に接続します。


作成した基盤の表面


作成した基盤の裏側


作成した基盤を本体に取り付けました。
配線は取り回しが良い順に付けましたので、どこのポートに何が接続されているのかわかりませんが、細かい事はソフトウエアで調整できるので問題ないはずです。


■ソフトウエアを作成する

まずは、足に番号を振ります。

上から時計回りに0〜4までの足として、そこにkneeとankleというサーボが付くことにします。


▼すべてのサーボを一度に90度まで動かすプログラムを作成

#include <Servo.h>

Servo servo_0_knee, servo_0_ankle;
Servo servo_1_knee, servo_1_ankle;
Servo servo_2_knee, servo_2_ankle;
Servo servo_3_knee, servo_3_ankle;
Servo servo_4_knee, servo_4_ankle;

void setup() {
  servo_0_knee.attach(2);
  servo_0_ankle.attach(3);
  servo_1_knee.attach(4);
  servo_1_ankle.attach(5);
  servo_2_knee.attach(6);
  servo_2_ankle.attach(7);
  servo_3_knee.attach(8);
  servo_3_ankle.attach(9);
  servo_4_knee.attach(10);
  servo_4_ankle.attach(11);

  servo_0_knee.write(90);
  servo_0_ankle.write(90);
  servo_1_knee.write(90);
  servo_1_ankle.write(90);
  servo_2_knee.write(90);
  servo_2_ankle.write(90);
  servo_3_knee.write(90);
  servo_3_ankle.write(90);
  servo_4_knee.write(90);
  servo_4_ankle.write(90);
}

void loop() {}
書き込んでみると、うまく動作しません。
ちょっと動いて止まり、ちょっと動いて止まりを繰り返します。
いわゆる、電気が足りてない状態だと思います。
サーボだけ、外部電源で動作するように配線を変更すればいいのでしょうが、分解するのが面倒なのでこのままなんとかしようと思います。


▼サーボ2個だけ動作させるプログラムを作成

電源の容量が足りないようなので、サーボ2個づつ動作させるプログラムを作成しました。
#include <Servo.h>

#define KNEE_0  2
#define ANKL_0  3
#define KNEE_1  4
#define ANKL_1  5
#define KNEE_2  6
#define ANKL_2  7
#define KNEE_3  8
#define ANKL_3  9
#define KNEE_4  10
#define ANKL_4  11

Servo servo1, servo2;

void setup() {}

void loop() {
  move(KNEE_0, 120, ANKL_0, 120);
  move(KNEE_1, 120, ANKL_1, 120);
  move(KNEE_2, 120, ANKL_2, 120);
  move(KNEE_3, 120, ANKL_3, 120);
  move(KNEE_4, 120, ANKL_4, 120);

  move(KNEE_0, 30, ANKL_0, 30);
  move(KNEE_1, 30, ANKL_1, 30);
  move(KNEE_2, 30, ANKL_2, 30);
  move(KNEE_3, 30, ANKL_3, 30);
  move(KNEE_4, 30, ANKL_4, 30);
}

void move(int no, int angle) {
  servo1.attach(no);
  servo1.write(angle);
  delay(1000);
  servo1.detach();
}

void move(int no1, int angle1, int no2, int angle2) {
  servo1.attach(no1);
  servo2.attach(no2);
  servo1.write(angle1);
  servo2.write(angle2);
  delay(1000);
  servo1.detach();
  servo2.detach();
}
サーボモーターを2個づつなら問題なく動作するみたいです。
やはり、電源の容量不足でした。


作成中


▲トップページ > マイコンなど