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信号はそのまま直結です。
当然ですが、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電源のジャンパピンの変更のみ。)
接続はクリソツ。こんな感じ。
ソフトの方はもっと簡単、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); }