この記事は IoTLT Advent Calendar 2023 の 15 日目の記事です。M5Stack の Servo Kit 360 を UIFlow で使うメモです。
以前 obniz+Geek Servo モーター+LEGO テクニック歯車で正・逆回転とパワー制御した あたりで M5Stack で制御する Servo Kit 360 も買っていたものの、なかなか動かす仕様が理解でき動かせなかったのですが、ようやくイイ感じに UIFlow 動かすことができたので、まとめていきます。
UIFlow で動かすモチベーション
Arduino では、Servo ライブラリや PWM まわりの指示ライブラリも揃っていますすが、今後、息子のためや自分のために継続的に動作プログラムを調整することを考えると、Arduino の C 言語コードで保管しておくのはちょっと厳しいなと思っていました。
そこで、ディスプレイまわりも仕組みが作りやすく、ノーコードでブロックでできる UIFlow を使いたいと考えていまして、今回の選定となります。
ドキュメントはある
さすが公式の Kit ということもあり UIFlow も Arduino も仕様とともに説明があります。
Connecting the 360° will control the speed and direction, and connecting the 180° servo will control the angle(360° servo duty cycle 0~7.075 clockwise rotation ,greater than 7.625 counterclockwise rotation,the relationship between rotation speed and duty cycle is nearly linear)
Arduino の説明なんですが、だいたいこのあたりが仕様のようです。この 0 ~ 7.075 という値が時計回りで 7.675 以上は反時計回りになるようです。
サーボを素の PWM で扱ったことがなく、この 7.075 の値が何を指しているか、イマイチ分からないまま進めることになりましたが UIFlow には、このキットも UIFlow の Unit 扱いでインストールできるのですぐに使うことができます。
うまく理解できないままは、まずいなーと思っていたのですが早速ハマります。ブロック的に180 度回る方は degree turn と分かっても、今回本命の 360 度回るほうであろうブロックは us pulse という単位で書かれていて 500 とか 2500 で入力するので、早速 7.075 の値と違うので頭をかかえました。
7.075 はデューティ比らしい
さっきの説明をよく見てみると、前の単語で duty cycle とありました。
こちらの資料などを読んで、サーボにアナログ電流のように PWM で流し込むために、どうにかする値のようです。
PWM の周波数は 50 Hz で 20 ms で動かすことがわかったので、これを基準に考えていきます。
デューティ比が 7.075 %ということは 20 ms の中での 7.075 %なので 1.415 ms ぶん電流が流れていれば良いようです。
us pulse に置き換える
さてここにある us は何かというと単位名でしらべるとマイクロ秒。さきほどデューティ比で ms ミリ秒が出てきた流れで、一段細かいマイクロ秒のことを指すようです。
デューティ比では今回は 20 ms のような期間の中でどう値を入れるかで考えましたが、マイクロ秒を使ってより細かい単位からいつ電流を入れるかを厳密に決めちゃった方が表現しやすいという値のようです。
たぶん、うまく検索ワードや知識があれば、一発でヒットしそうな方面な気がしますが、絶妙に私からクリアに分かりづらい領域なので、なんとなくのイメージで行きます。うごけばよいのです。
つまり先ほどの値であれば 1.415 ms = 1415 us ということになり、1415 us から 0 us までが時計回りで回転するようです。
ということで理解したプログラムはこちら
正直、頭から湯気が出るかんじで、めっちゃ半端な知識を総動員して考えまして、なんとか作れました。
- デューティ比 7.075 から 0 へは 7.075 が小さく動く値で 0 は大きく動く値へ時計回りする模様
- デューティ比 7.675 から以降の値はどんどん大きく反時計回りする模様
- それ気づいたのは 7.075 から 7.675 については、この中でどういう値を入れても停止にあたる値ぽい
- 7.075 という値は前述のとおり 1.415 ms = 1415 us ということになり、これ値以下で時計回りをする
- 7.625 という値は前述のとおり 1.525 ms = 1525 us ということになり、この値以上で反時計回りをする
という形で解釈。
そして出来上がったフローがこちらです。A ボタンを押すと時計回りがはじまり何度も押すと回転速度が上がっていきます。 B ボタンを押すと反時計回りがはじまり何度も押すと回転速度が上がっていきます。 C ボタンは停止させます。
実際にこのような形で動作しました。ディスプレイもうまく実装できていいですね。
ちなみに PORT A に差し込んだ時の動きになっています。
このように動きます!