目的
シリアルサーボを使いこなせるようになりたい。 これができると、mycobot-piに内蔵されているシリアルサーボが自由に制御できるようになると思う。他にも自由に遊び倒せるようになるはず。。。
使用するシリアルサーボについて
SG90の仕様など 上記リンクは秋月電商のリンクだがこのページにデータシートがあるので、こちらをDLして確認することをお勧めする。
仕様は上図に示す通り、オレンジ色がPWM信号(回転角指定)、赤がVcc、茶色がGNDである。 色々と参考リンクがあるようだが、今回はこちらのリンクに従って進めていく。
接続対応
今回は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数となるわけである。
配線対応は以下の通りにすればよい。
ただし、後述するがプログラムの書き込みの最中はピンをすべて外すことに注意。
実際に動かしてみる
とりあえずプログラムを丸々コピーして試してみる。 プログラムを新規作成して、コンパイルから書き込みをしてみると以下のようなエラーが出た。
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でシリアルサーボを動かしてみた。 後程シリアルサーボ制御用のパルス数の計算について厳密にまとめておきたいと思う。 とりあえず動いてよかった。