LoginSignup
3
2

More than 3 years have passed since last update.

Arduinoでラジコンサーボの応答性を確認する

Posted at

概要

Arduinoと位置フィードバック付きのラジコンサーボを使い、サーボの応答性を確認してみます。

用意するもの

No. 項目 型式 備考
1 マイコン Arduino Uno R3 -
2 ラジコンサーボ FS5115M-FP 位置フィードバック付き
3 電池ボックス 問わず 単三4本用
3 電池 単三×4本 サーボ電源用

位置フィードバック付きサーボの外観を以下に示します。通常のラジコンサーボから出ているコネクタはグランド、電源、信号入力の3つですが、それに加えて回転角度をアナログで取得できる出力(緑の線)がついています。

配線図

配線図を以下に示します。
servoTestSketch_ブレッドボード.png

プログラム

loop部分の大きな流れは下記の通りです。ラジコンサーボの制御はArduino IDEのサンプルプログラムを参考にしました。

①ラジコンサーボに対し目標角度を出力
②現在角度を取得
③目標角度、現在角度などのデータをPCに送信
④制御周期が50msになるようにディレイを調整

servoTest.ino
#include <Servo.h>

//サンプリング周期関連
const int SMP_TIME = 50;
unsigned long startTime = 0;
unsigned long endTime = 0;
int dlyTime = 0;
int indx = 0;

//サーボ関連
Servo myservo;  // create servo object to control a servo
// twelve servo objects can be created on most boards

//目標角度
const int PIN_X = 15;//アナログ入力ピンのA1をデジタル出力として使う
int r = 0;//目標角度(deg)

//現在角度
const int PIN_Y = 0;//アナログ入力A0で現在角度を取得
const int AIN_DEG_000 = 609;//角度0のときのアナログ入力値
const int AIN_DEG_180 = 76;//角度180のときのアナログ入力値
const float ANLG2DEG = 180 / (float)(AIN_DEG_180 - AIN_DEG_000);//アナログ入力値から角度を求める定数

int ya = 0;//現在角度(アナログ入力)
float y = 0;//現在角度

void setup() {

  //シリアルポートの通信設定
  Serial.begin(9600);

  //サーボで使用するピンの設定
  myservo.attach(15);

  //サーボ位置の初期化
  myservo.write(0);//0deg
  delay(2000);//2s待つ

  Serial.println("");
  Serial.println("--------START--------");
}

void loop() {

  startTime = millis();//現在時刻を取得

  if(indx < 10){
    //はじめの10サンプルは目標位置0deg
    r = 0;
  }else{
    r = 180;
  }

  //①ラジコンサーボに対し目標角度を出力
  myservo.write(r);//目標値は常に180deg

  //②現在角度を取得
  ya = analogRead(PIN_Y);//現在角度を取得する
  y = (float)(ya - AIN_DEG_000) * ANLG2DEG;//角度に変換

  //③目標角度、現在角度などのデータをPCに送信
  Serial.print(indx);
  Serial.print(",");  
  Serial.print(startTime);//現在時刻
  Serial.print(",");  
  Serial.print(r);//目標角度
  Serial.print(",");
  Serial.print(y);//現在角度
  Serial.print(",");
  Serial.println(ya);//現在角度(アナログ入力そのまま)

  //インデックス
  indx++;
  //ここまでの処理で約17ms

  //④制御周期が50msになるようにディレイを調整
  endTime = millis();//現在時刻を取得
  dlyTime = SMP_TIME - (endTime - startTime);  
  delay(dlyTime);

}

Arduinoから出力されるデータはArduino IDEのシリアルモニタなどを利用して受信します。受信したデータは適当な範囲までコピーし、テキストエディタなどに貼り付けてデータファイルとして保存しておきます。そのデータファイルをグラフ描画ソフトなどで読み込み、次の「結果」で示すようなグラフを描画します。

結果

無負荷状態で目標角度を0-180degにステップ状に変化させた場合の応答を以下に示します。約800ms(16サンプル)で目標角度に到達していることがわかります。
servoTest.png

今後

  • ラジコンサーボの周波数応答特性を測定してみたい
  • ラジコンサーボで位置制御ベースの力制御をしてみたい

免責注意事項

この記事に従って発生した如何なる損害も筆者は負うことができません。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2