連載
» 2016年05月12日 07時00分 公開

Arduinoで学ぶ基礎からのモーター制御:基礎からのマイコンモーター制御(6):PWMを使ったサーボモーターの制御 (3/3)

[今岡通博,MONOist]
前のページへ 1|2|3       

Arduinoへのプログラミング

 次のリストはスケッチの例から「Servo」を選択し、そのなかの「Knob」からロードできます。掲載したリストは一部コメントを削除しています。

#include <Servo.h>
 
Servo myservo;  // 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()
{
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
}
 
void loop() 
{ 
  val = analogRead(potpin);             
  val = map(val, 0, 1023, 0, 180);     
  myservo.write(val);                 
  delay(15);                           
}

 まず1行目ですが今回はServoクラスを用いますのでServo.hのインクルードが必要です。3行目でServoクラスのオブジェクトmyservoを生成します。この後サーボーモーターの制御はこのオブジェクト名を用いて行います。5行目はアナログ入力ピンのピン番号を変数podpinに代入しています。今回はアナログ入力の0番を用いますから0を代入しています。

  • setup関数内の処理

 10行目でサーボモーターの制御信号を出力するピン番号を指定します。今回はD9ですので引数には9を指定します。

  • loop関数内での処理

 15行目でアナログポートの値を読みます。ボリュームのノブを回すことで0Vから5Vまで変化しますが、それが10Bitの分解能で読みだされますので、0から1023の値として取得されます。16行目でこの0から1023までの値を、0から180までの変化に対応させます。サーボモーターに対する制御は0度から180度までの角度で指定しますので、このスケールに変換します。

 17行目では、アナログ値を角度に変換された値でサーボモーターに対して制御信号を出力します。次に18行目で15ミリ秒の間隔を空けます。これはサーボモーターに対して制御信号を出して軸が指定した角度に到達するまでの時間です。サーボモーターに対して物理的な負荷をかける場合はこの値をもう少し長くする必要があるかもしれません。このDelayの値は仕様で説明したバンドウィデゥス(Dead band width)に関わる値ですのでそれらの値を検討して決定してください。SG-90の場合、0度から180度まで移動する場合は0.3秒、300ミリ秒必要ですので動きがぎこちない場合はこの値を調整してください。

おわりに

 今回はArduinoによるサーボモーターの基本的な制御の方法についてお話しました。次回は3DプリンタやCNCなど精密制御に欠かせないステッピングモーターの制御に付いてお話したいと思います。お楽しみに。

前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.