発行済み 2026-04-05
このガイドでは、標準を制御するためのステップバイステップの方法を提供します。サーボPython を使用した ESP32 ボードを備えたモーター。ロボット アーム、パンチルト カメラ マウント、または単純な移動プロップのいずれを構築している場合でも、正確な配線、Python コード、およびキャリブレーション手順を学び、サーボ正確に動く。すべての例は一般的な現実世界の状況に基づいているため、独自のプロジェクトにすぐに適用できます。
ESP32 開発ボード 1 枚 (一般的なバリアント)
標準 5V 1 つサーボモーター(例:SG90またはMG995タイプ)
外部5V電源(高トルクサーボを使用する場合)
ジャンパー線 (メス対メス)
ESP32 に MicroPython ファームウェアがインストールされたコンピューター
> 重要: ESP32 の 3.3V ピンから直接サーボに電力を供給しないでください。ほとんどのサーボは 5V を必要とし、ボードが安全に供給できる以上の電流を消費する可能性があります。サーボ用の5V電源は別途用意し、ESP32には信号線のみを接続してください。
開閉する単純なロボットの爪を構築していると想像してください。一般的なMG995サーボを使用しています。次のように接続します。
クリティカルポイント:外部電源のグランドしなければならないESP32 GND に接続してください。この共通アースがないと信号が不安定になり、サーボがジッターしたり動かなくなったりします。
ESP32は50HzのPWM信号(周期=20ms)を生成してサーボを制御します。サーボの位置はパルス幅によって決まります。0°の場合は0.5ms、90°の場合は1.5ms、180°の場合は2.5msです。
以下は、テスト済みの完全な MicroPython スクリプトです。名前を付けて保存main.pyESP32で。
マシンからのインポート ピン、PWM インポート時間 # GPIO15 を使用 – PWM をサポートする任意のピンに変更できます SERVO_PIN = 15 # 標準サーボ周波数: 50 Hz PWM_FREQ = 50 # 0°、90°、180° のデューティ サイクル値 (50 Hz で計算) # 16 ビット PWM 解像度 (0 ~ 65535) の場合: # デューティ= (パルス幅_ms / 20ms)65535 # 0.5 ms -> 1638 (0°) # 1.5 ms -> 4915 (90°) # 2.5 ms -> 8192 (180°) DUTY_0 = 1638 DUTY_90 = 4915 DUTY_180 = 8192 # サーボピンの PWM を初期化 servo = PWM(Pin(SERVO_PIN), freq=PWM_FREQ,duty_u16=DUTY_90) # 90°で開始 def set_angle(angle): """ サーボ角度を設定します (0° ~ 180°)。角度をデューティ サイクルに線形にマップします。 """ # クランプ角度を有効範囲に設定 angle = max(0, min(180, angle)) # 線形マッピング:duty = DUTY_0 + (角度/180)(DUTY_180 - DUTY_0)duty = int(DUTY_0 + (angle / 180) * (DUTY_180 - DUTY_0)) servo.duty_u16(duty) # 例:Trueの間前後にスイープ:範囲(0, 181, 10)の角度の場合: set_angle(angle) time.sleep_ms(50) 範囲(180, -1, -10): set_angle(角度) time.sleep_ms(50)
1. MicroPython ファームウェアを ESP32 にフラッシュします (まだ行っていない場合)。
2. 説明に従ってサーボを接続します。
3. 次のようなツールを使用してスクリプトをボードにコピーします。リモートまたはトニー。
4. スクリプトを実行します。サーボは 0° から 180° までスイープし、繰り返し戻ります。
サーボモデルが異なれば、パルス幅範囲もわずかに異なります。たとえば、安価な SG90 は 0.5 ミリ秒から 2.4 ミリ秒で動作しますが、高トルクの MG996R は 0.6 ミリ秒から 2.4 ミリ秒を使用します。ほとんどの場合、一般的な 0.5 ~ 2.5 ミリ秒の範囲で機能しますが、常に調整する必要があります。
校正方法(ロボット アーム プロジェクトの実世界のケース):
デューティ サイクルを 1638 に設定し、実際の角度を記録します。
サーボが0°にならない場合は、サーボが動かなくなるまでDutyを少し(例:1700)上げてください。
180°についても、8192 から減少させて同じことを行います。
測定した DUTY_MIN と DUTY_MAX を使用します。set_angle()関数。
サーボは、デューティ サイクルのパーセンテージではなく、パルス幅によって制御されます。周波数は正確に 50Hz (周期 20ms) である必要があります。パルス幅を0.5msから2.5msの間で変更すると、サーボは0°から180°まで回転します。 MicroPython では義務_u16()この方法では、パルス幅からデューティ値へのマッピングは PWM 分解能 (ESP32 では常に 16 ビット) によって異なります。提供されている数式または線形マッピング関数を使用します。
1. 常に簡単なスイープテストから始めてください– 配線と基本的な PWM 動作を確認します。
2. ロジックアナライザーまたはオシロスコープを使用するサーボの動作がおかしい場合はパルス幅を確認します。
3. バッテリー駆動のプロジェクトの場合、電圧降下を吸収するために、サーボ電源端子間に大きなコンデンサ (470µF 以上) を追加します。
4. プロジェクトで複数のサーボが必要な場合、それぞれを個別の GPIO ピンで制御しますが、合計電流が電源の定格を超えないようにしてください。
ESP32 と Python を使用したサーボの制御は簡単です。信号線を PWM 対応 GPIO に接続し、共通グランドを使用して別の 5V 電源を供給し、50Hz PWM 信号を生成し、デューティ サイクルを調整してパルス幅を 0.5ms ~ 2.5ms に設定します。提供されたコードは、ほとんどの標準サーボでそのまま使用できます。動作範囲が正しくない場合は、特定のサーボの最小および最大デューティ値を校正します。これで、正確なモーションを独自の ESP32 ベースのプロジェクトに統合する準備が整いました。
更新時間:2026-04-05