detamamoruのブログ

興味を持ったことや勉強したことに関して記事を書きます。主に低レイヤー寄りの記事を公開。

初めてのロボットアーム作りに挑戦!0: サーボモータ操作


出田守です。
アイアンマンを観て、ロボットアームが欲しくなりました。
勉強しながら、初めてのロボットアーム作りに挑戦します。

今回の目標

まずは、1自由度で指示した角度に動かせるようになることを目指します。

材料

  1. サーボモータ FS90 1個
  2. ESP32DevKitCv4 1個
  3. マイクロUSBケーブル 1本

配線画像

f:id:detamamoru:20200901094810j:plain
ESP32DevKitCv4とサーボモータFS90の配線

サーボモータFS90はJRタイプというコネクタの種類です。今回はESP32DevKitCv4から直接モータ用電源を取っていますが、おそらくこれは良くなくて本来はモータ用の別電源を設ける必要があります。

線色 役割
GND
電源
制御

PWM制御

サーボモータFS90は、PWM制御で角度調整を行います。
ESP32DevKitCからPWM制御するにはledcSetup関数でPWMの値を設定し、ledcAttachPin関数でPWM出力ピンを設定します。ledcWrite関数にduty比を入力して、PWM信号を出力します。
以下のような感じです。

...
// pin
const int pwmPin = 25;

// PWM properties
const double frequency = 226.24434389140271493212669683258;
const int pwmChannel = 0;
const int resolution = 10;

...

void setup(){
  ...  
  ledcSetup(pwmChannel, frequency, resolution); // PWM値を設定
  
  ledcAttachPin(pwmPin, pwmChannel); // PWMピンを設定

  ledcWrite(pwmChannel, dutyCycle); // PWM信号出力
}
...

サーボモータ操作

FS90データシートには、1500usで中立位置として120°レンジでは900~2100us、180°レンジでは500~2500usとなっています。
しかし、私のやり方が悪いのか、中立位置を中心に120°や180°になってくれず、10°位の誤差が出てしまいました。
なので、オシロスコープで地道に調査しました。
調査した結果、以下ぐらいがだいたい良さげな気がしたのでこれで進めていきます。ちなみに角度レンジは余裕をみて今回は5°~175°としています。

角度 duty比
460us
90° 1220us
175° 2130us

若干のズレはあるものの今回は良しとしましょう。

どうせならスマホ(Android)から操作したかったので、アプリからBluetooth経由で操作します。

出来上がったプログラムを以下に置いています。
github.com

youtu.be