1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

M5 Servo-360 Unit

Last updated at Posted at 2024-09-29

はじめに

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の値をどのように影響しているかを説明する形にしました。

ご不明な点や質問がございましたら、どうぞお気軽にご連絡ください。

1
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?