2019年7月25日木曜日

四脚歩行ロボットを作る その2 サーボモータ着弾

意外とはやくサーボが届いたので喜び勇んで動作テスト。

1.SG90スペック

購入したサーボモータは小型低価格の定番らしいSG90です。

スペック及び外形寸法はこちら
重量:9g
ストールトルク:1.8kgf・cm(4.8V)
駆動方式:アナログ
ギア材質:POM
回転速度:0.12sec/60°(4.8V)
動作電圧:4.8V
動作角度:180°
PWMサイクル:20msec
制御パルス:0.5~2.4ms
A寸法:34.5mm
B寸法:22.8mm
C寸法:26.7mm
D寸法:12.6mm
E寸法:32.5mm
F寸法:16.0mm

最初はメーカーも知らず購入したのですが、ラベルにはTZTと書いてあります。メーカーサイトを探しても見つからず、ほぼ同じ外観のラベル違いの製品としてTower Pro SG90というものもあります。スペックも同じなのでおそらくどちらかのOEM生産品なのでしょう。
ちなみに私はAli Expressで購入して、一個108円(送料込!!)でした。もちろん国内販売もあり、みんな大好き秋月電子やAmazonにもあります。Amazonは中華業者の出店が多そうなので、Aliで買っても変わらない気はします。
似た製品で、デジタル制御タイプのSG90 Digitalや、360°回転タイプのSG90 360 Degree、金属ギアタイプのMG90S、そのデジタル制御のMG90D、360°回転タイプのMG90D Robot servo 360° Rotation高トルクタイプのSG92Rなどもあります。

今回はあくまでも制御の練習が目的ですので、Digitalと360は不要、この軽量低トルクで金属ギアは不要ですのでSG90アナログタイプで十分でしょう。
ただし、高トルクタイプのSG92Rは良い選択となる可能性があります。
バランスを崩してから転倒するまでの時間はロボットが小さい程短くなるため、アクチュエーターには素早さが必要とされます。SG90とSG92では、SG92の方が(カタログスペック上は)回転速度が高く設定されています。さらに、負荷時の動作速度はトルクが大きいほど無負荷時に近い速さを実現できるはずですので、高トルクモータの方が有利となるでしょう。

ちなみに重量当たりの出力を計算すると次の通りでした。

SG90:10W/g
SG92:17W/g

2.動作確認① 1モーターでの動作

初サーボモーターですのでとにかく動かしてみましょう。
試験環境は次の通りです。

マイコンボード:Arduino Pro Micro互換機
サーボ:SG90アナログ
サーボ電源:エネループ単四×4本直列(4.8V)



図中では電池2本ですが、実際にはエネループ×4本直列です。
PWM出力はPro Microの5番PINを使用しています。


動画の通り約180°の間を往復運動すれば成功です。
注意点としては、Pro Microの給電はPCからUSBケーブルで行っているのに対し、サーボモータはエネループの電池ボックスから給電している点、電池ボックスのマイナス側とPro MicroのGNDを繋ぐ点ぐらいでしょうか。

テスト動作時のスケッチは以下の通りです。
------------------------------------------------------------------------------
#include <Servo.h>

Servo myservo;

int pos = 0;
void setup() {
  myservo.attach(5);
}

void loop() {
  myservo.write(0);
  delay(500);
  Serial.println("1");
  myservo.write(180);
  delay(500);
}
----------------------------------------------------------------------------

3.動作確認② 複数モーターの同時制御

ロボット製作時には、12個のサーボを異なる速度で、異なる位相へ、同時に動かします。ここでは、脚一本分に相当する3個のサーボを別々に動作させるテストを行いました。
テスト用のスケッチはこちらのサイトを参考にしています。
サーボの一つはロータリーポテンショメータを使って回転速度を変更できる様にしてあります。
サーボ1は5番、サーボ2は6番、サーボ3は9番ピンから出力しています。
ポテンショメータはA0から入力しています。
こちらも電源はエネループ×4個、4.8Vです。


サーボ1(上段)は低速、サーボ2(中段)は低速、サーボ3(下段)はポテンショメータの入力に従い任意の速度で動きます。


テスト用スケッチは以下の通りです
--------------------------------------------------------------------------------------
#include <Servo.h>

Servo myservo1;
float angle1 = 0;
float vel1 = 0;

Servo myservo2;
float angle2 = 0;
float vel2 = 0;

Servo myservo3;
float angle3 = 0;
float vel3 = 0;

int sensorPin3 = A0; 
int sensorValue1 = 0;
int sensorValue2 = 1023;
int sensorValue3 = 0;

void setup() {
  Serial.begin(9600);
  myservo1.attach(5);
  myservo2.attach(6);
  myservo3.attach(9);
}

void loop() {
  vel1 = mapfloat(sensorValue1, 0, 1023, 0.005, 0.01);
  float n1 = (float) sin(angle1);
  float val1 = n1 * 90.0 + 90.0;
  myservo1.write(val1);
  angle1 += vel1 * 5;

  vel2 = mapfloat(sensorValue2, 0, 1023, 0.005, 0.01);
  float n2 = (float) sin(angle2);
  float val2 = n2 * 90.0 + 90.0;
  myservo2.write(val2);
  angle2 += vel2 * 5;

  sensorValue3 = analogRead(sensorPin3);
  vel3 = mapfloat(sensorValue3, 0, 1023, 0.005, 0.01);
  float n3 = (float) sin(angle3);
  float val3 = n3 * 90.0 + 90.0;
  myservo3.write(val3);
  angle3 += vel3 * 5;

  delay(5);
}

float mapfloat(float x, float in_min, float in_max, float out_min, float out_max) {
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
--------------------------------------------------------------------------------

4.サーボ動作範囲の確認

SG90は安価なだけあり、動作バラツキがそれなりにある様です。テスト動作を行っていて気になったのは動作範囲のバラツキです。もっとも気になったのは角度指定で0~180°指定しても実際には180°の動作範囲が得られなかった事です。
気になったので、PWM制御のon時間を直接指定して動作させたところ、3つのサーボだけでも動作範囲が以下の様に異なっていました。

カタログ値 0°:500µsec 180°:2400sec
サーボ1  0°:406µsec 180°:2303sec 動作上限:2374sec
サーボ2  0°:544µsec 180°:2430sec 動作上限:2500sec
サーボ3  0°:479µsec 180°:2368sec 動作上限:2404sec

動作開始位置を0°としていますが、パルス幅はばらばら、可動範囲は180°+αとなっています。パルスの側の精度の可能性もありますが、オシロを持っていないので、確認はできていません。

ロボットに実装する際には、それぞれの可動範囲を測定し、0~180°に相当するパルス範囲を固体ごとに定義する必要がありそうです。





0 件のコメント:

コメントを投稿

ESP32でスマホとシリアル通信 その2 BluetoothでLチカ

1.BluetoothでLチカ制御 前回、Bluetoothでの双方向通信に成功しましたので、ついでに少しスケッチを修正してスマホからESP32のLチカを制御した様子が以下の動画です。 撮影が悪くて画面が良く見えませんが、"1"を送信...