注釈
こんにちは、FacebookのSunFounder Raspberry Pi & Arduino & ESP32 Enthusiasts Communityへようこそ!Raspberry Pi、Arduino、ESP32について、仲間と一緒に深掘りして学びましょう。
なぜ参加するべきか?
専門家のサポート: 購入後の問題や技術的な課題を、コミュニティやチームのサポートで解決できます。
学びと共有: ヒントやチュートリアルを交換して、スキルを向上させましょう。
限定プレビュー: 新製品の発表や先行公開にいち早くアクセスできます。
特別割引: 最新製品に対する独占的な割引を楽しめます。
祝祭プロモーションやプレゼント: プレゼント企画やホリデープロモーションに参加できます。
👉 一緒に探求し、創造を楽しみたいですか?[こちら] をクリックして、今すぐ参加しましょう!
3.7 サーボモーターの動作
このレッスンでは、Raspberry Pi Pico 2を使って サーボモーター を制御する方法を学びます。サーボモーターは、0°から180°の間で特定の角度に回転することができるデバイスです。リモートコントロール玩具やロボット、精密な位置制御が必要なその他の用途に広く使用されています。
それでは、サーボを前後に揺らしてみましょう!
必要なもの
このプロジェクトでは、以下の部品が必要です。
セットで購入するのが便利です。こちらがリンクです:
名前 |
セット内容 |
リンク |
|---|---|---|
Newton Lab Kit |
450+ |
また、下記のリンクから個別に購入することもできます。
番号 |
部品 |
数量 |
リンク |
|---|---|---|---|
1 |
1 |
||
2 |
Micro USBケーブル |
1 |
|
3 |
1 |
||
4 |
数本 |
||
5 |
1 |
回路図

配線図

オレンジの線は信号線で、GP15に接続します。
赤の線はVCCで、VBUS(5V)に接続します。
茶色の線はGNDで、GNDに接続します。
サーボは負荷がかかるとかなりの電流を消費することがあります。今回使用するのは小型のサーボで負荷も軽いため、PicoのVBUSピンから給電することで、この簡単な実験は問題なく動作します。大きなサーボや複数のサーボを使う場合は、外部電源の使用を検討してください。
サーボアームの取り付け
サーボアーム(またはホーン)をサーボの出力シャフトに取り付けます。
必要に応じて、サーボに付属している小さなネジで固定します。
コードの作成
サーボが0°から180°まで前後に動くように、MicroPythonのプログラムを書きます。
注釈
3.7_swinging_servo.pyをnewton-lab-kit/micropythonフォルダから開くか、コードをThonnyにコピーして「実行」をクリックするか、F5を押して実行します。正しいインタープリタ(MicroPython(Raspberry Pi Pico).COMxx)が選択されていることを確認してください。
import machine
import utime
# GP15ピンでPWMを初期化
servo = machine.PWM(machine.Pin(15))
servo.freq(50) # 周波数を50Hzに設定
# 角度をデューティサイクルに変換する関数
def angle_to_duty(angle):
min_duty = 1638 # 0.5msのパルス(0°)
max_duty = 8192 # 2.5msのパルス(180°)
duty = int(min_duty + (angle / 180) * (max_duty - min_duty))
return duty
while True:
# サーボを0°から180°に動かす
for angle in range(0, 181, 1):
servo.duty_u16(angle_to_duty(angle))
utime.sleep_ms(20)
# サーボを180°から0°に戻す
for angle in range(180, -1, -1):
servo.duty_u16(angle_to_duty(angle))
utime.sleep_ms(20)
コードが実行されると、サーボはスムーズに0°から180°の間を前後に動きます。
コードの理解
モジュールのインポート:
machine: ハードウェア関連の機能にアクセスします。utime: 遅延など、時間関連の機能を提供します。
PWMの初期化:
GP15ピンでPWMを設定します。サーボの標準周波数である50Hzに設定します。
servo = machine.PWM(machine.Pin(15)) servo.freq(50)
angle_to_duty関数の定義:この関数は、角度(0°〜180°)をサーボのデューティサイクルに対応する値に変換します。
min_dutyとmax_dutyは、サーボ制御信号の最小と最大のパルス幅に対応します。計算によって、角度を適切なデューティサイクルにスケーリングします。
def angle_to_duty(angle): min_duty = 1638 # 0.5msパルス幅 max_duty = 8192 # 2.5msパルス幅 duty = int(min_duty + (angle / 180) * (max_duty - min_duty)) return duty
メインループでサーボを動かす:
サーボは0°から180°まで、1°ずつ角度を増加させます。
その後、180°から0°に戻ります。
utime.sleep_ms(20)は、動作をスムーズにするための小さな遅延を追加します。
while True: for angle in range(0, 181, 1): servo.duty_u16(angle_to_duty(angle)) utime.sleep_ms(20) for angle in range(180, -1, -1): servo.duty_u16(angle_to_duty(angle)) utime.sleep_ms(20)
コードのさらなる理解
サーボは、特定のパルス幅を持つPWM信号を送ることによって制御されます。 サーボの標準は50HzのPWM信号(周期20ms)です。 各周期内のパルス幅がサーボの角度を決定します:
0.5msのパルス幅は0°に対応。
1.5msのパルス幅は90°に対応。
2.5msのパルス幅は180°に対応。
PWM信号のデューティサイクルを調整することによって、パルス幅を変更します。
duty_u16() 関数は0から65535までの値を受け付けます。
パルス幅に対応するデューティサイクルを計算するためには:
Duty cycle = (Pulse Width / Period) * 65535
例えば、0.5msのパルス幅の場合:
Duty cycle = (0.5ms / 20ms) * 65535 ≈ 1638
さらなる実験
速度の変更:
utime.sleep_ms(20)の遅延を調整して、サーボの動作速度を速くしたり遅くしたりできます。特定の角度に設定: コードを変更して、サーボを特定の角度に動かすことができます。
servo.duty_u16(angle_to_duty(90)) # 90°に移動
入力による制御: ポテンショメーターやボタンを接続して、サーボの角度をインタラクティブに制御できます。
重要な注意点
電源供給: サーボに十分な電力が供給されていることを確認してください。ジッターや不安定な動作が見られる場合は、外部の5V電源を使用してください。
過負荷を避ける: サーボを物理的な限界(通常0°〜180°)を超えて強制的に動かさないようにしてください。サーボが損傷する原因となります。
結論
このレッスンでは、Raspberry Pi Pico 2を使ってサーボモーターを制御する方法を学びました。PWM信号を使ってサーボの角度を設定し、スムーズに動かす方法を理解しました。このスキルは、精密な動きが必要なロボティクスやオートメーションプロジェクトにおいて非常に重要です。