制御工学博士の日常+備忘録

ようやく制御工学で博士を手に入れたので真っ当な人間になるべく研究以外の事とか色々と備忘録的にやっていく。そんな感じ

M5Stack GrayでSG90のサーボモータを回す

目的

シリアルサーボを使いこなせるようになりたい。 これができると、mycobot-piに内蔵されているシリアルサーボが自由に制御できるようになると思う。他にも自由に遊び倒せるようになるはず。。。

使用するシリアルサーボについて

SG90の仕様など 上記リンクは秋月電商のリンクだがこのページにデータシートがあるので、こちらをDLして確認することをお勧めする。

サーボ仕様.PNG (419.7 kB)

仕様は上図に示す通り、オレンジ色がPWM信号(回転角指定)、赤がVcc、茶色がGNDである。 色々と参考リンクがあるようだが、今回はこちらのリンクに従って進めていく。

m5stack+SG90のリンク

接続対応

今回はM5stackの16PINのGPIOと5V, GNDPINの3本を使用する。 PWMの分解能を16bit=216-1=65535とする。 ※ビット計算は2n - 1で最大bit数が計算できる。 SG90のデータシートより

  • 0.5ms: -90度

  • 1.45ms: 0度

  • 2.4ms: +90度

となることとPWM周期50Hzと考えると、必要なビットデータは

X = 0.5ms/20ms*65535 = 1638.375 = 1638

となる。つまり、1638が90deg回転に必要なPulse数となるわけである。

配線対応は以下の通りにすればよい。 DSC_0838.JPG (4.3 MB)

ただし、後述するがプログラムの書き込みの最中はピンをすべて外すことに注意。

実際に動かしてみる

とりあえずプログラムを丸々コピーして試してみる。 プログラムを新規作成して、コンパイルから書き込みをしてみると以下のようなエラーが出た。

A fatal error occurred: Failed to connect to ESP32: Invalid head of packet (0x4F)

この原因は色々とあるようだが、下記リンクが参考になった。

ESP32 ( ESP-WROOM-32 , M5Stack )自分的 トラブルシューティング まとめ

このリンクによると、書き込み時にGPIO端子に何かしらピンが接続していると失敗するらしい。

ということで、全部のPINを外してもう一度書き込みをしたら無事できた。 参考リンクによる色々と指定するパルス数に問題はあるようではあるが、とりあえず動いたので一旦放置。

プログラムコード

下記プログラムコードは色々と遊んでわかったことをそのままコメント付きで残している。

#include <M5Stack.h>

int led1 = 16;

//PWMの設定
const double PWM_Hz = 50;   //PWM周波数
const uint8_t PWM_level = 16; // PWM 16bit(0~65535)

void setup() {
  Serial.begin(115200);
  m5.begin();
  pinMode(led1, OUTPUT);
  //モータのPWMのチャンネル、周波数の設定
  ledcSetup((uint8_t)1, PWM_Hz, PWM_level);

  //モータのピンとチャンネルの設定
  ledcAttachPin(led1, 1);
}
void loop() {
  // 1600から9000の間で回転するように指令。
  // i=i+10は更新ごとに10パルス増やすので(9000-1600)/10=740回
  // 740*10ms=7.4sに-90degから90degまで回転、逆回転も7.4sでいく
  for (int i = 1600; i <= 9000; i=i+10) {
    ledcWrite(1, i);
    delay(10);  //20msの遅延
    Serial.printf("%d\n", i);
  }
  for (int i = 9000; i > 1600; i=i-10) {
    ledcWrite(1, i);
    delay(10);
    Serial.printf("%d\n", i);
  }
  // ひたすら-90deg⇔0deg⇔90degまでを1秒ごとに繰り返す動作
  /*
  int deg=1638;
  ledcWrite(1, deg);
  Serial.printf("%d\n", deg);
  delay(1000);
  deg = 4751;
  ledcWrite(1, deg);
  Serial.printf("%d\n", deg);
  delay(1000);
  deg = 7864;
  ledcWrite(1, deg);
  Serial.printf("%d\n", deg);
  delay(1000);
  deg=4751;
  ledcWrite(1, deg);
  Serial.printf("%d\n", deg);
  delay(1000);
  deg = 1638;
  ledcWrite(1, deg);
  Serial.printf("%d\n", deg);
  delay(1000);
  deg = 4751;
  ledcWrite(1, deg);
  Serial.printf("%d\n", deg);
  delay(1000);
  deg = 7864;
  ledcWrite(1, deg);
  Serial.printf("%d\n", deg);
  delay(1000);
  deg = 4751;
  ledcWrite(1, deg);
  Serial.printf("%d\n", deg);
  delay(1000);
  */
}

まとめ

今回はm5stack grayでシリアルサーボを動かしてみた。 後程シリアルサーボ制御用のパルス数の計算について厳密にまとめておきたいと思う。 とりあえず動いてよかった。