11月25日発売 書籍『Arduinoと3Dプリンタでロボットを作ろう』を出させて頂きました!

M5StickCでサーボを動かしてみる!4台までなら簡単に制御出来ます。

今回はM5StickCを使ってサーボを動かしてみたいと思います。
M5StickCを使えばアイデア次第でいろんな事ができそうですが、まずは動く何かを作ってみたいなんて思いませんか?

そんな時、やはりサーボを動かすことができればいろいろと幅が広がりそうです。
サーボを使って動かす四脚ロボットとして『PuppyC』というM5StickCを乗っけて制御するキットが販売されています。

単純にM5StickCを使い4つのサーボを動かしているだけのロボットなんですが、サーボの制御方法さえ分かれば難しいプログラミングなしでUIFlowを使いブロックを並べていけば同様なものは比較的簡単に作れそうです!

見ているだけでも面白いですよね!
まだ全然上手く動かせていませんが、ここまで動かすのは結構時間がかかりました。
単純に脚(サーボ)を前後に同じタイミングで動かすだけではなかなか前や後ろへと進んでくれず・・・
このあたりの調整なんかも非常に面白く勉強にもなります。

この程度のものなら今回ご紹介するサーボを制御する方法を見て頂ければ簡単に作れるかと思います。(サーボの電源を別系統で取ったりと少し難しい所もありますが)

今回、M5StickCを使ってサーボを動かす方法を簡単にご紹介したいと思います。

M5StickCを使ってサーボを動かす!

サーボと一言で言っても大きく分けると2種類あります。(ACやDC、デジタルやアナログなどいろいろとあるのですが)

モーターのように360°クルクル回転させることが出来る連続回転サーボ(ローテーションサーボというのかな?)を使えば車輪を付け動くものが作れそうですが・・・

今回はラジコンなどホビー用途でよく使われている任意の角度にピタッと止めることが出来るタイプのサーボを動かしてみたいと思います。

SG-90 マイクロサーボ

今回、SG-90マイクロサーボという非常にメジャーな(ホビーユースなどでよく使われている)サーボを使ってみたいと思います。
約9gほどの小型なサーボとなります。

サーボは一般的に3本のケーブルからなり、赤色ケーブル(Vcc:〜5V)・茶色ケーブル(GND)・橙色ケーブル(信号線)からなっています。
赤色と茶色ケーブルに電源を繋ぎ、橙色ケーブルに入力する信号によりサーボを動かす角度を調整しています。

サーボHAT用のブロックを使って動かしてみる!

それでは少しサーボを動かしてみましょう。
一般的にサーボを動かすにはPWM(Pulse Width Modulation)という方法を用いてサーボの信号線に特定の波形を入力する事により制御を行います。

何か難しそうですね?
前回、LEDをゆっくり点灯(または消灯)させる時にもPWMで制御してやってみました。
M5StickCで使える汎用ポートGPIOやPWM制御について書いているので、参考程度にこちらも読んで頂けると分かりやすいかと思います。
デジタル出力(制御)でこのようなアナログ的な事をやろうと思えば少し工夫が必要となります。

M5StickCでLEDを点滅させてみる!汎用ポートGPIOやPWM制御って何?

PWM制御によりデューティー比というものを計算してサーボにその信号を送ってやることにより任意の角度に動かす事が出来ます。

なんですが、ちょっとその話は置いておいて・・・
M5StickCにはサーボHAT(SERVO HAT)というものが販売されています。
頭にこのモジュールを取り付けるとUIFlow(ブロックプログラミング)でも簡単にサーボを動かすことが出来ます。

参考 SERVO HATM5Stack

このサーボHATの回路図を見てみると、G26に信号線、あと5V出力とGNDをM5StickC本体に繋げているだけの簡単な回路となっています。

って事はサーボ1台だけなら、このサーボHATを使わなくてもお手持ちのサーボを使いM5StickC本体に直接繋げればサーボHAT用のブロックを使って簡単に動かす事が出来ます。(もちろんArduinoでも)

UIFlowアプリを起動して画面左下から【Hat】を選択して【+】をクリック。

使えるHat一覧が表示されるので、【SERVO】を選択してOKへ進みます。

すると【HAT】の項目に【SERVO】ブロックが出現します。

このブロックを使えばG26に繋いだサーボ限定となりますが簡単に動かす事が出来ます。

配線はこんな感じ。
G26から信号を取り、あとは5V出力とGND端子に直接繋いだだけの回路となります。

このブロックを使えばサーボの可動角度を指定してやれば動かす事が出来ます。
先程出てきたデューティー比の計算とか面倒なものは必要ありません。(もちろんUIFlowでの話です)
こんな感じでサーボの動く角度を指定してあげれば動きます。(90°動きます)

もしUIFlowでサーボを動かす場合、G26ポートに繋いだ1台だけとなりますがこれが1番簡単な方法かと思います。

PWN制御でサーボを動かす!

サーボHAT用のブロックを使う事によりサーボを動かす事が出来ました。
そしてここからが今回の本題です!

M5StickCにはG26以外にもGPIOと呼ばれる汎用ポートがまだ残っています。(G0やG32、G33)
これを使えば他のポートで動かすことや複数台のサーボを同時に動かす事も可能となります。

ここで一般的にサーボの制御で使われているPWMという制御方法の話が出てきます。

サーボの信号線(橙色ケーブル)にはLow(0)とHigh(1)の波形(方形波)が連続して流れています。
その時の周期内のHighの割合(これをデューティー比といいます)を変える事によりサーボを任意の角度まで動かす事が出来ます。

例えば下図のように1周期内にHighが50%、Lowが50%の信号ならデューティー比(Highの割合)は50%になるという事です。
この方形波(HighとLowの波形)のHighになっている部分の長さ(パルス幅)を変える事によりサーボの動く角度を変えることが出来ます。

うぅ〜ん、ちょっと難しいなんて思われるかもしれませんが・・・
UIFlowにはPWMが使えるブロックが用意されているのでそれほど難しいものではないですよ!

それでは実際にデューティー比というものを計算してサーボを動かしてみます。
今回使用しているサーボはSG-90というホビーユースでよく使われるメジャーなサーボで、数百円程度で購入出来るものとなります。

まずはこのサーボの仕様を見てみましょう。
制御角は180°(±90°)の半回転まで動く一般的なサーボとなります。
今回使う必要(重要)な部分は赤色で書いています。

SG-90 マイクロサーボ 製品仕様
PWMサイクル20mS
制御パルス0.5mS〜2.4mS
制御角±約90°(180°)
配線茶(GND)・赤(+電源)・橙(制御信号)
トルク1.8kgf・CM
動作速度0.1秒/60°
動作電圧4.8V(~5V)
温度範囲0~55°C
外形寸法22.2×11.8×31mm
重量約9g

秋月電子通商さんのサイトにデータシートがあったので引用させてもらいます。

参考 SG-90 参考資料秋月電子通商

周期が20ms(50Hz)で、Highの時間を0.5〜2.4msの間で変え回転角を制御するサーボとなります。

それではデューティー比を計算してみましょう。

デューティー比とは、1周期にあるHighの時間の割合の事なのでこのサーボの場合Highの時間を0.5〜2.4ms範囲で変化させる事により0〜180°までの任意の位置まで動かします。

【例】回転角0°の場合のデューティー比
例えばHighの時間が最小の0.5msの場合(サーボの回転角0°)、この時のHighの割合(デューティー比)は

Highの時間(0.5ms) ÷ 周期(20mS) = 0.025(2.5%)

となります。

【例】回転角180°の場合のデューティー比

Highの時間が最大の2.4msの場合(サーボの回転角180°)では

Highの時間(2.4ms) ÷ 周期(20mS) = 0.12(12%)

となります。

そして真ん中(サーボ角90°)では、7.25%という事ですね。
こんな感じでデューティー比を計算してサーボの回転角を指定する形となります。

あとはUIFlowのPWMブロックを使えばサーボを動かす事が出来ます。
PWM用のブロックは、【高度なブロック】⇒【PWM出力】から選択できます。

先にご紹介したサーボHAT用のブロックで組んだのがこちら。(90°回転)

PWMブロックではこんな記述になります。
ピン番号26を指定(今回G26に出力)、周波数(1/周期)、デューティ比7.25%(90°回転)としています。
出力ピンが指定できるので他のGPIOポートからも出力させることが出来ます。

サーボHAT用ブロックのように角度で指定出来る方が最初は分かりやすいのですが、PWMブロックを使えば他の空いているGPIOポート(G26・G0・G32・G33)に接続し複数のサーボを同時に動かす事も出来ます。(G33は入力専用なので使えません)

試しにG0・G26・G32・G33に信号線を繋げ4台のサーボを同時に動かしてみました。

MEMO
今回テスト的にやっているのでサーボ電源はM5StickCの5V出力端子から直接取っています。
また、複数のジャンパーワイヤーが挿せないので5VおよびGNDはブレッドボードを使用しています。

GROVE端子にはジャンパー線は挿せないので、GROVE端子変換ケーブルを使う事によりG32とG33ポートが使えます。

GROVE – 4ピン-ジャンパメスケーブル (5本セット)

組んだブロックはこんな感じです。
サーボの回転角を0°→90°→180°を繰り返すだけの単純なものとなります。

サーボは動き出し時に多くの電気を必要とするようで、M5StickC本体電圧が3.5V付近になるとサーボ4台動作では急な電圧低下でシャットダウンする事がありました。(M5StickCは3.0Vで強制的にシャットダウンされる)

今回のようにテスト的に動かすには問題ありませんが、実際に何かを作り複数台のサーボを動かす場合、電源は別系統で取る形となるかと思います。

また急な電圧低下を防止させるため、サーボのVcc-GND間に電解コンデンサを入れておくのもいいかもしれませんね。

サーボを使ったテスト動作!

こんな感じでPWM制御を使えばUIFlowでも簡単にサーボを複数台動かす事が出来ます。
またM5StickCには加速度センサーが搭載されているので傾きによりサーボを動かしたり

ジョイスティックを使ってアナログ的に動かす事も出来るので楽しいですよ!

最後に!

今回、PWM制御を使ってサーボを動かしてみました。
Arduinoでも基本的な考え方は同じなので、サーボ制御の雰囲気を掴むのにUIFlowでいろいろ組んで遊んでみると理解が深まります。

M5StickCには使えるGPIOポートの数に制限があります。(少ない)
今回、G0・G26・G32・G33を使って(G36は入力専用なので今回は使えません)4台同時にサーボを動かしてみました。
M5StickC本体に物理的に直接挿して使う場合、これが最大となるようですね。

またI2Cを用いさらに多くの(最大8台)サーボを動かす事ができるSERVOS HATも販売されています。
16340リチウムイオン電池をサーボの電源として使っており、あとは何か台座を用意すれば・・・もうそれだけで動くものが作れそうですね!

そしてこちらはM5StickCではないのですがSTM32を使った倒立振子ロボットとなります。
Banggoodさんで販売されているものとなりますが、こういうキット的なものがあると楽しみながらいろいろ学ぶ事が出来ます。(今の私にはレベルが高すぎますが!)
2本のタイヤで上手くバランスをとり、なかなか倒れません。

このようなモーター制御にもPWMが使われているようです。
この倒立ロボットくんの回路構成や内部のプログラム的な事を含めまだほぼ理解できていませんが、こんなのが自分で作れるようになるといいですね!

姿勢制御にはPID制御が使われているようで、このあたり理解できればドローンの方もさらに理解が深まるのに・・・なんて考えながら夜な夜な遊んでおります・・・

コメントを残す