サーボモータを活用してオリジナル「自動給餌器」を作ろう!アイデア・ハック!! Arduinoで遊ぼう(11)(2/3 ページ)

» 2014年06月02日 10時00分 公開
[三月兎MONOist]

まずは、サーボモータだけを動かそう!

 部品の配置図(画像5)で説明したように、サーボモータを動かすだけなら、乾電池4本とサーボモータだけでOKです。

 まずは、Arduinoの統合開発環境「Arduino IDE」で、サーボモータを動かすスケッチ(プログラム)を作成し、動作テストをしてみましょう(画像7スケッチ1)。


サーボモータ 画像7 サーボモータだけを動かしてみよう
#include <Servo.h>
 
//-----------------------
// 定数の定義
//-----------------------
Servo myservo;     // サーボオブジェクトを宣言
int pos;           // サーボモータのシャフト回転位置
int servopin = 9;  // サーボモータの信号線 接続ピン
 
void setup()
{
  pinMode(servopin, OUTPUT);
  myservo.attach(servopin);      // 9番ピンをサーボオブジェクトに接続
  myservo.write(0);              // サーボモータのシャフトを0角度に指定
}
 
void loop()
{
  for(pos = 0; pos <= 180; pos += 1) // 0〜180度まで 1度ずつ
  {                                  
    myservo.write(pos);              // シャフトの角度を指示
    delay(50);                       // 50ms待機
  }
  for(pos = 180; pos>=0; pos-=1)     // 180〜0度まで −1度ずつ
  {                                
    myservo.write(pos);              // シャフトの角度を指示
    delay(50);                       // 50ms待機
  }
  delay(3000);                       // 0度で3秒待機
}
 
スケッチ1 サーボモータ動作確認用のスケッチ

 Arduinoには、サーボモータを扱うためのライブラリが用意されています。1行目で、ライブラリ(Servo.h)を読み込んでいます。このライブラリのおかげで、難しいことを考えずに、サーボの角度を指定するだけで、モータを動かすことができます。

 6行目で、Servo型オブジェクトのインスタンスを作成しています。Arduino公式サイトのライブラリのコメントによると最大で8個のサーボまで扱えるようです。7行目で、サーボモータのシャフトの角度を指定するための変数を宣言し、サーボモーターの信号線に接続するピンとして9番を宣言しています(8行目)。

 「servopin」のピンモードを出力(OUTPUT)に設定し、宣言したサーボオブジェクトに接続します(12〜13行目)。これでサーボモータを使う準備は完了です。

 「write()」で引数に0〜180の値を入れて、モータを動かします。ここでは、デフォルトの位置として、サーボモータを0度に設定しました(14行目)。

 17行目の「loop()」内でサーボモータを動かしています。まずは、0〜180度まで1度刻みでモータを動かします(19〜23行目)。そして、180〜0度まで逆に戻します(24〜28行目)。29行目で、0度の状態をキープし、3秒間停止させています。

 このスケッチ1を実行した様子が動画2です。

動画2 Arduinoでサーボモータを動かしてみる

 loop()が一通り終わって、サーボモータが「myservo.write(0)」で3秒停止しているときに、電源をカットし、サーボモータのスタート地点としています。その状態でサーボホーンを取り付けたのが動画2です。サーボホーンの初期位置がずれていると、意図した角度にモータが動きません。

 スケッチ1を実行して、「やったぁ〜!! ばっちり動きました!」と言いたいところですが……。どう見ても、サーボモータの最終地点が180度ではありません。動画2では分かりにくいのですが、180度よりも広い角度まで動いています(画像8)。

write 画像8 サーボモータの「write(0)」地点と「write(180)」地点

 調べたところ、使用しているサーボモータ(GWS Micro2BB)は、動作角が235度程度あるようです。どうやらwrite()は、動作角の235度を180分割して動かしているみたいです。このままでは、自分が意図した角度にサーボモータを動かすことができません。この状態のまま、仮にヒューマノイドロボットに適用してしまうと、まともに歩くことができないロボットが完成してしまいます。それはよろしくありません。

 とはいうものの、今回は厳密な位置を指定したいわけではないので「まぁ、いっかー」としました。筆者がちゃんとした電子工作ができるようになるまでには、まだまだ勉強が必要です。

Copyright © ITmedia, Inc. All Rights Reserved.