●サーボを動かす

サーボを動かしてみましょう。サーボの出力軸(白いギザギザのところ)は通常0°~180°の範囲で回転しますが、その位置はサーボの容器に対して絶対的に決まっています。そのため出力軸の回転位置を気にせずに適当にロボットを組み立ててしまうと、出力に取り付けられた部品が思い通りに動いてくれません。まずはサーボの出力軸を90°の位置に停止させるプログラムをつくります。

下の写真を参考に配線してください。サーボは電池から電源を供給する回路になっていますので、今回は電池をつなぎます。サーボは2個使いで、それぞれ前脚用、後脚用となります。サーボのコネクタは逆向きに挿しても動きませんが壊れることはありません。中央のピンがプラス電源となっているためです。一方、電池のワイヤーは逆につけるとマイコンが壊れますので絶対に間違えないでください。
電源スイッチはOFF側にしておきます。
*サーボを取り扱う際の注意
サーボは非常に精密なギアで構成されています。出力軸を回そうとして(「バックドライブ」と言います。)引っ掛かりがある場合に無理に回そうとするとギアを破損します。

servo_setting

ハードウェアの準備ができましたらプログラムを作っていきます。
Arduino IDEを起動して「ボード」と「シリアルポート」の設定をしてください。
「ファイル」->「スケッチ例」->"Servo"->"Knob"を選択します。内容を下記のように変更してください。

#include <Servo.h>

Servo myservo1;  // create servo object to control a servo
Servo myservo2;  // create servo object to control a servo

//int potpin = 0;  // analog pin used to connect the potentiometer
//int val;    // variable to read the value from the analog pin

void setup() {
  myservo1.attach(9);  // attaches the servo on pin 9 to the servo object
  myservo2.attach(10);  // attaches the servo on pin 9 to the servo object
  myservo1.write(90);
  myservo2.write(90);
}

void loop() {
  /*
  val = analogRead(potpin);            // reads the value of the potentiometer (value between 0 and 1023)
  val = map(val, 0, 1023, 0, 180);     // scale it to use it with the servo (value between 0 and 180)
  myservo.write(val);                  // sets the servo position according to the scaled value
  delay(15);                           // waits for the servo to get there
  */
}

チェックボタンでコンパイルが成功したら、矢印ボタンでメイン基板に書き込みます。「ボードへの書き込みが完了しました。」と出たら基板の電源スイッチをONにします。サーボが動いて90°の位置(センター位置)で停止します。(新品のサーボを用いた場合はもともと90°の位置になっていて動かない場合があります。)この状態でサーボホーン(長いタイプ)をサーボの長手方向と平行になるように取り付けます。ぴったり合わなくても構いません。後でソフトで調整します。

●プログラムの説明
#include
Arduinoでサーボを使う時にはプログラムの最初にこの行を書きます。Arduino IDEにあらかじめ用意されている"Servo.h"というファイルに実際にサーボをコントロールするプログラムが書かれていて、我々は簡単にサーボを使えるようになっています。
Servo myservo1;
Servo myservo2;
2つのサーボにmyservo1,myservo2と名前をつけます。Servoは"Servo.h"のServoです。Servoクラスのオブジェクトmyservo1とmyservo2を生成したと言います。
myservo1.attach(9);
myservo2.attach(10);
myservo1とmyservo2にArduinoの出力ピン9,10を割り当てます。基板上のサーボのコネクタは回路図ではK2,K3で、それぞれ3ピンのうちひとつ(S1,S2)がサーボをコントロールする信号がくる線で、他の2つが電源(バッテリー)とグラウンド(0V)です。S1,S2はマイコンのPB1とPB2につながっているのでPin MappingからArduinoの"digital out 9"と"digital out 10"であるとわかります。
myservo1.write(90);
myservo2.write(90);
myservo1とmyservo2を90°の位置に動かせ、という命令文です。write()やattach()mの内容は"Servo.h"からたどって"Servo.cpp"というところに書かれています。今回はサーボを一度動かして終わりなのでloop()は何もしません。

●往復運動させる
loop()の中身を書き換えてサーボを往復運動させてみます。プログラムの意味はわかると思います。

#include <Servo.h>

Servo myservo1;  // create servo object to control a servo
Servo myservo2;  // create servo object to control a servo

//int potpin = 0;  // analog pin used to connect the potentiometer
//int val;    // variable to read the value from the analog pin

void setup() {
  myservo1.attach(9);  // attaches the servo on pin 9 to the servo object
  myservo2.attach(10);  // attaches the servo on pin 9 to the servo object
  myservo1.write(90);
  myservo2.write(90);
}

void loop() {
  myservo1.write(70);
  myservo2.write(70);
  delay(500);
  myservo1.write(110);
  myservo2.write(110);
  delay(500);
}

サーボがセンター位置を中心に往復運動することを確認してください。

●デバッグの方法
サーボとは直接関係ありませんが、プログラムが思い通りに動かない時などに原因を調べるひとつの方法です。
上のプログラムに少し追加します。

#include <Servo.h>

Servo myservo1;  // create servo object to control a servo
Servo myservo2;  // create servo object to control a servo

//int potpin = 0;  // analog pin used to connect the potentiometer
//int val;    // variable to read the value from the analog pin

void setup() {
  myservo1.attach(9);  // attaches the servo on pin 9 to the servo object
  myservo2.attach(10);  // attaches the servo on pin 9 to the servo object
  myservo1.write(90);
  myservo2.write(90);
 Serial.begin(9600);  //追加
}

void loop() {
  myservo1.write(70);
  myservo2.write(70);
  Serial.print("angle=70\n");  //追加
  delay(500);
  myservo1.write(110);
  myservo2.write(110);
  delay(500);
  Serial.print("angle=110\n");  //追加
}

このプログラムをメイン基板に転送して実行し、Arduino IDEの「ツール」->「シリアルモニタ」からシリアルモニタを起動します。Serial.print()に書いた内容が500msごとに出てくると思います。このように実行中のプログラムの状況を調べることができます。

最後にloop()の中をすべてコメントアウト(/* ... */)してサーボを90°の位置に戻してサーボホーンを外しておいてください。

今回の成果は"ms03"などとして保存しておきましょう。

<= マイクロサウルス チュートリアル(2)
チュートリアルベース
マイクロサウルス チュートリアル(4) =>