2018年12月18日火曜日

[Elegoo: 9] サーボモータ
ポテンショメータでモータのシャフト(角度)を制御する




概要 (Overview)
  • サーボモータについて学ぶ
  • ポテンショメータでサーボモータのシャフト(角度)を制御する




使用する電子部品 (Component Required)
電子種別電子部品個数
マイコン Elegoo UNO R3 マイコンボード1
USBケーブル1
能動 サーボモータ1
機構 ポテンショメータ1
ブレッドボード1
ジャンプワイヤ(赤)[オス-オス]3
ジャンプワイヤ(黒)[オス-オス]3
ジャンプワイヤ(黄)[オス-オス]2



電子部品について (Component Introduction)

サーボモータ SG90


"サーボ"とは、指示した位置や速度にすばやく追従させる制御をおこなう装置。
サーボモータは精密に制御できるギア(歯車)とシャフト(軸)を統合したモータで、 電気を入れたら回る、回りっぱなしのモーターではなく、
検出器がモーターの状態(速度や回転角度)をフィードバックしながら
回転の速度や位置を制御するドライバーと組み合わせて使用する

《データシート》
コネクタJR/FP
動作速度0.12秒/60度(4.8V)、0.10秒/60度(6.0V)
停動トルク(4.8V)1.6kg/cm
温度-30〜60℃
デッドバンド幅5us
使用電圧3.5 - 6V
寸法3.2cm×3cm×1.2cm
重量134グラム

《端子》
ServoMotorPin
BrownGND
Red5V
OrangeDigital (PWM) 9 or 10



電子回路 (Electronic Circuit)

回路図 (Schematic)


実体配線図 (Wiring Diagram)





実践 (To Practice)

配線写真 (Example Picture)


プログラム (Code)

サーボライブラリ
  • Arduinoボードからシャフトの角度である電気パルスを送信してモータを制御する
  • サーボは精密に制御できるギア(歯車)とシャフト(軸)を統合したモータで、 一般的なサーボはシャフトを様々な角度(0~180度)にすることができる
  • 殆どのボードで12個のサーボオブジェクトを作成可能だが、
    多くのサーボを制御する場合はArduinoの5Vピンではなく、
    外部から電源を供給する
    ※ この場合必ずArduinoと外部電源のアースを接続する
書式引数説明
uint8_t Servo::attach(int pin)
uint8_t Servo::attach(int pin, int min, int max)
pin:デジタルピン番号
min:最小値
max:最大値
サーボにピンに割り当て
0~180度のパルス幅を
マイクロ秒で指定
※9,10ピンのPWM機能⇒不可
※省略時:min[544],max[2400]
(一部:min[700],max[2300])
void Servo::write(int value) value:角度(0-180) サーボに角度を書き込み
シャフトを制御する
void Servo::writeMicroseconds(int value) value:角度(0-180) サーボに角度のパルス幅を
マイクロ秒単位で書き込み、
シャフトを制御する
int Servo::read() サーボの現在位置(0-180)の
角度を戻す
bool Servo::attached() サーボ変数がピンに
割り当てられているかを
戻す
void Servo::detach() サーボ変数をピンから
切り離す
※9,10ピンのPWM機能⇒可

スケッチ
/**********************************************/
/* 【 Elegoo:9 】サーボモータ                  */
/*    ポテンショメータで                        */
/*    サーボモータのシャフト(角度)を制御する     */
/**********************************************/

/*----------------------------*/
/* サーボ ライブラリ
/*----------------------------*/
#include <Servo.h>


// サーボオブジェクトの作成
Servo objServo;

// シャフトの角度
int intAngle = 0;

/*----------------------------*/
// ポテンショメータ(10K)使用
/*----------------------------*/
#define METER 

/*----------------------------*/
// ピンの定義
/*----------------------------*/
#define PIN_SERVO 9   // D9:サーボモータ
#define PIN_METER 0   // A0:ポテンショメータ(角度)


/*********/
/* setup */
/*********/
void setup(){

  // --------------------------------------------------
  // サーボモータにピンに割り当て,
  // 0~180度のパルス幅をマイクロ秒で指定
  // --------------------------------------------------
  objServo.attach(PIN_SERVO, 700, 2300);

  // --------------------------------------------------
  // シャフト位置の初期化
  // --------------------------------------------------
  objServo.write(0);  // サーボに角度を書き込む
  delay(500);         // シャフトがその位置に達するのを待つ

}

/********/
/* loop */
/********/
void loop(){

// --------------------------------------------------
// ポテンショメータでシャフトを制御する
// --------------------------------------------------
#ifdef METER
  // ポテンショメータから角度(0-180)を読み込む
  intAngle = map(analogRead(PIN_METER), 0,1023,0,180);
  objServo.write(intAngle); // サーボに角度を書き込む
  delay(10);                // シャフトがその位置に達するのを待つ

// --------------------------------------------------
// 角度:0⇔180度でシャフトを制御する
// --------------------------------------------------
#else

  // 角度:0 → 180度
  for (intAngle = 0; intAngle <= 180; intAngle += 1){ 
    objServo.write(intAngle);   // サーボに角度を書き込む
    delay(10);                  // シャフトがその位置に達するのを待つ
  }

  // 角度:180 → 0度
  for (intAngle = 180; 0 <= intAngle; intAngle -= 1){ 
    objServo.write(intAngle);   // サーボに角度を書き込む
    delay(10);                  // シャフトがその位置に達するのを待つ
  }

#endif
}

結果(動画)・モニタリング


サーボモータのシャフト(角度)を制御する


ポテンショメータでサーボモータのシャフト(角度)を制御する