はじめに
PCN渋谷にて、ワークショップとしてイライラ棒ゲームを作成しました。ゲームの妨害機構にモーターを使った回転動作を加え、難易度を調整しています。
開発環境
- VSCode (エディター)
- PlatformIO (組み込み開発に特化したVSCode拡張機能)
使用デバイス
使用言語
- C++
実行Flow
1. 上記の記事より、開発環境を構築する(VSCode PlatformIO環境が存在する場合省略可)
2. GitHubからコードをクローンする
3. クローンしたディレクトリに移動cd Servo-360-Unit
4. Terminalからpio run --target upload && pio device monitor
を実行する
Servo-360-Unit仕様
パラメータ | 値 |
---|---|
PWM | 50Hz/0.5~2.5MS |
電圧 | 4.8~6.0V |
デューティ比 | 0 ~ 0.705 |
電圧が一定でないため、同秒数、同速度でも常に同じ角度にはならないことがあります。
角度の制御をしたい場合は、Servo kit 180を使用してください。
PWM制御
サーボモーターの動作はPWM (パルス幅変調) を使用して制御します。PWM信号を送ることで、モーターの回転速度と方向を制御します。
デューティ比
PWM制御における「オン」と「オフ」の比率をデューティ比と呼びます。サーボモーターに送るパルスの幅がデューティ比を決め、これがモーターの回転速度と方向に影響します。今回使用するServo kitでは、0~0.705の範囲で制御します。
解説
以下のコードに書いてある通り1500から7500までの値がそれぞれ回転速度や方向を示します。
#define ROTATE_RIGHT_HIGH_SPEED 1500 // 右回転早め
#define ROTATE_RIGHT_LOW_SPEED 4500 // 右回転ゆっくり
#define COUNT_STOP 5000 // 回転停止
#define ROTATE_LEFT_HIGH_SPEED 5500 // 左回転早め
#define ROTATE_LEFT_LOW_SPEED 7500 // 左回転ゆっくり
これらの定義された値は、PWM信号のパルス幅を示しており、ledcWrite 関数を使ってサーボモーターに適用されます。
以下のようにしてモーターに値を送信します。
ledcWrite(1, ROTATE_RIGHT_HIGH_SPEED);
- ledcWrite(1, value) の第1引数 1 はPWMチャンネルを指定し、第2引数 value は回転速度や方向を決める値です
- 値が1500の場合、右方向に高速で回転します。4500にすると右方向にゆっくり回転し、5000で停止。さらに、5500以上の値では左方向に回転します
まとめ
本プロジェクトでは、M5StickCPlus2を使ってServo Kit 360をPWM制御し、イライラ棒ゲームに回転動作を加えました。今回の例では、簡単な速度と方向の制御を示しましたが、用途に応じた応用も可能です。
このようにして、関数 ledcWrite の動作や、各定義された定数がPWMの値をどのように影響しているかを説明する形にしました。
ご不明な点や質問がございましたら、どうぞお気軽にご連絡ください。