部品屋根性(34) マイクロサーボSG-90、UnoとNucleoでソース共通

Joseph Halfmoon

SG-90は、「Arduino業界」定番のマイクロサーボモータでしょう。Arduinoからの制御は簡単。しかし「データシート」と称するものはあるのですが、電気特性はイマイチ不明なところあり。電源電圧異なる環境で、標準機Arduino UnoとSTM32マイコンのNucleoボードの両方で「回して」みました。

※「部品屋根性」投稿順Indexはこちら

アイキャッチ画像に掲げましたSG-90は、本当に小さなサーボモーターです。

発売元はTower Pro社、中国とシンガポールに会社があるみたいですが詳細は良く分かりません。Tower Proで検索してもヒットするのは販売ルートばかり。URLにブランド名の入ったtowerpro.com.tw(台湾)のサイトもヒットしてきますが、通販サイトのようです。詳細な情報などはありません。台湾のサイトはリモコン向けのモーター(内燃機関の「エンジン」含む)の販売に特化しているみたいで、電動のサーボモータは勿論、2サイクル、4サイクルのガソリン・エンジンなどもラインナップ(内燃機関はTorqProなる別ブランド)をそろえていてこれはこれで興味を引きます。最小の33cc2ストローク単気筒エンジンでも4馬力近く。最大の120ccは水平対向2気筒に見えます。模型飛行機用?だがかなり強力そう。

閑話休題、SG-90に戻ります。SG-90は電源、グランドとPWMの制御信号の合計3端子しかありません。SG-90の「ある」データシートには電源は5V(正確には4.8V以上)6Vまでと書かれておったのです(ネット上には似ているけれど変種のデータシートと称するものが複数あり。)今回購入は例によって秋月電子通商殿ですので、そちらのサイトから引いてきたデータシートを基準としたいと思います。ダウンロードしたデータシートでは、

Operating voltage: 3.3V (~6V)

という記載です。3.3Vでも動くということなので、5Vだけでなく3.3Vでも動かしてみることにいたします。しかし、前述のとおり、肝心のPWM信号のDC特性については記載がありません。分かっているのは、AC的な部分のみ

周期は20ms(50Hz)
PWMのデューティにより角度が定まる

角度は-90度から+90度というべきか、0度から180度というべきか。いずれにせよ180度の範囲です。Arduinoのライブラリでは0から180度でコードしているのでそちらで説明します。0度のときハイ期間は0.5ms、つまりデューティ2.5%、180度のとき2.4ms、デューティ12%です。このデューティの間でハイ期間を制御することで位置が決定されます。

Arduino Uno(互換機だけれども)の場合

アトメル(マイクロチップ)製8bitAVRマイコンATMega328Pを搭載したArduino Unoの場合、以下のヘッダをインクルードすることでサーボモータを制御するためのライブラリが使用できます(Servoライブラリが不在の場合はライブラリマネージャから簡単にインストール可能)。

Servo.h

実際にテストに使用したソースコードは末尾に掲げました。モータのPWM端子はUnoの3番端子に接続しています。以下の写真ではスイッチが配線で良く見えませんが、スイッチを2番端子につけてあり、ローならモータ停止、ハイならモータを0度から180度へ、あるいは180度から0度へと方向変えながら回転させます。なおボード上のLED(13番端子)を2秒毎に点滅させており、モータが動作するのはLEDがオンの間だけとしてあります。

マイコンボードから小さいとは言えモータ電源を引き出すのは不安なので、Unoの場合もBBに搭載した別電源から5V与えています。Arduino UnoのAVRマイコンのIO電圧は5Vなので、PWM信号はそのまま直結です。

UnoCompatible_SG90当然ですが、Arduino Uno(互換機だけれども)の場合は、ギッタンバッコンという感じで、何の問題もなく回ります(行ったり来たりする。)

Nucleo F072RBボードの場合

つづいてSTマイクロエレクトロニクス社製、32bitのArm Cortex-M0搭載STM32マイコンをいただく Nucleo F072RBボードで試してみます。NucleoボードにはArduino Unoと互換性の高い端子が出ています。Arduino環境では、Unoと同じ番号で呼び出すことができますので端子番号そのままにUnoをNucleoにとりかえます。しかし、STM32マイコンのIO電圧は3.3Vです。SG-90のPWM入力のVIHが不明。コンサバ解としてはSTMの3.3V信号を適当なデバイス(実は裏で74HC04を用意してありました。)で5V信号に変更して入力するか。いやいや、3.3VでもSG-90は回るとデータシートに書いてあったので、このさい、モーター電源を5Vから3.3Vに切り替えてみました。その方が簡単(BB電源のジャンパピンの変更のみ。)

接続はクリソツ。こんな感じ。

Nucleo_SG90ソフトの方はもっと簡単、Uno用のソースを無変更のままです。ターゲットボードをUnoからNucleo64のF072RBボードに変更して再ビルド。もっともビルドしている最中にServoライブラリがどうなっているのか観察すると、AVR用のServoではなく、STM32用のServoの方が自動的に選択されていました。裏でよきに計らってくれちゃうわけです。

あれ動かない、と思ったらいつものオトボケでありました。電源のスイッチ押してなかったです。3.3V電源ON。動きました。ギッタンバッコン。

この辺、NucleoのArduino対応の互換性高いです。楽ちん。

部品屋根性(33) 傾斜スイッチ、Uno/Wio/M5StickCで割り込み受け へ戻る

部品屋根性(35) DCモータ(ブラシ付)、DRV8835でPWM駆動 へ進む

#include <Servo.h>

#define LED   (13)
#define SW    (2)
#define MOTOR (3)

Servo sg90;

int counter;

void setup() {
  pinMode(LED, OUTPUT);
  pinMode(SW, INPUT_PULLUP);
  digitalWrite(LED, LOW);
  sg90.attach(3);
  sg90.write(0);
  counter = 0;
}

void loop() {
  if ((counter % 2) == 0) {
    digitalWrite(LED, LOW);
  } else {
    digitalWrite(LED, HIGH);
    if (digitalRead(SW) == 1) {
      if ((counter % 4) == 1) {
        sg90.write(0);
      } else {
        sg90.write(180);        
      }
    }
  }
  counter++;
  delay(2000);
}