.. include:: /index.rst :start-after: start_hello_message :end-before: end_hello_message .. _py_servo: 1.7 サーボ ============================== **はじめに** このプロジェクトでは、Raspberry Pi を使用してサーボモーターを制御する方法を学びます。サーボモーターは、角度の動きを高精度に制御できるため、ロボティクスや自動化分野で広く使用されています。 ---------------------------------------------- **必要なもの** このプロジェクトを完了するには、以下のコンポーネントが必要です。 .. list-table:: :widths: 30 20 :header-rows: 1 * - COMPONENT - PURCHASE LINK * - :ref:`cpn_servo` - |link_servo_buy| * - :ref:`cpn_fusion_hat` - \- * - Raspberry Pi - \- ---------------------------------------------- **回路図** 以下の回路図は、サーボモーターを制御するために必要な接続を示しています。 .. image:: img/fzz/1.3.2_sch.png :width: 80% :align: center ---------------------------------------------- **配線図** .. image:: img/fzz/1.3.2_bb.png :width: 80% :align: center ---------------------------------------------- **サンプルの実行** このチュートリアルで使用するすべてのサンプルコードは、``ai-lab-kit`` ディレクトリに用意されています。 以下の手順に従ってサンプルを実行してください。 .. raw:: html .. code-block:: shell cd ~/ai-lab-kit/python/ sudo python3 1.7_Servo.py スクリプトを実行すると、PWM 0 に接続されたサーボが −90° から 90° まで 10 度刻みで滑らかに動き、各位置で短時間停止します。 その後、同じ方法で 90° から −90° へ戻ります。この往復動作が継続的に繰り返されます。 ---------------------------------------------- **コード** 以下の Python コードは、サーボモーターをさまざまな角度に動かして制御する方法を示しています。 .. raw:: html .. code-block:: python #!/usr/bin/env python3 from fusion_hat.servo import Servo # Import Servo class from time import sleep # Import sleep for delays # Initialize servo on channel 0 servo = Servo(0) try: while True: # Sweep from -90° to +90° in steps of 10° for angle in range(-90, 91, 10): servo.angle(angle) sleep(0.1) # Smooth movement delay # Sweep back from +90° to -90° in steps of 10° for angle in range(90, -91, -10): servo.angle(angle) sleep(0.1) except KeyboardInterrupt: # Stop the program safely when Ctrl+C is pressed servo.angle(0) # Return servo to center position sleep(0.1) この Python スクリプトは、PWM 0 に接続されたサーボモーターを制御します。実行すると次のように動作します。 1. サーボは -90 度から 90 度まで、10 度刻みで移動します。 2. 各動作の間に 0.1 秒の待機時間が入ります。 3. その後、方向を反転し、90 度から -90 度まで 10 度刻みで移動します。 4. この動作が無限ループで繰り返されます。 ---------------------------------------------- **コードの解説** 1. **ライブラリのインポート** ``fusion_hat`` ライブラリは GPIO 操作を簡単に扱えるようにし、 ``time`` ライブラリは待機時間を実現するための関数を提供します。 .. code-block:: python from fusion_hat.servo import Servo # Import the Servo class for controlling servos from time import sleep # Import sleep for timing delays 2. **サーボの初期化** ``Servo`` オブジェクトは PWM 0 を指定して初期化されます。 .. code-block:: python servo = Servo(0) 3. **サーボの動作** サーボはループ内でさまざまな角度へ移動します。 ``angle`` メソッドはサーボの位置を設定し、 ``sleep`` は指定した時間だけ処理を一時停止します。 .. code-block:: python while True: # Sweep from -90° to +90° in steps of 10° for angle in range(-90, 91, 10): servo.angle(angle) sleep(0.1) # Smooth movement delay # Sweep back from +90° to -90° in steps of 10° for angle in range(90, -91, -10): servo.angle(angle) sleep(0.1) ---------------------------------------------- **トラブルシューティング** 1. **サーボが動作しない** - **原因**: GPIO ピンの接続ミス、または電源供給の問題。 - **解決方法**: サーボが PWM 0 に正しく接続されていること、および電源供給が正常であることを確認してください。 2. **サーボの動作が不安定、または反応しない** - **原因**: サーボへの電源供給が不足している可能性があります。 - **解決方法**: Fusion HAT+ の電源が不足している場合は、サーボ用に外部電源を使用してください。 ---------------------------------------------- **発展アイデア** 1. **ユーザー操作によるサーボ制御** キーボード入力を使用して、ユーザーがサーボの位置を対話的に制御できるようにします。 .. code-block:: python while True: position = float(input("Enter position (-90 to 90): ")) servo.angle(position) 2. **サーボ位置の記録** 時間経過に伴うサーボの位置を記録し、その軌跡をグラフとして表示します。 .. code-block:: python positions = [] for i in range(-90, 91, 10): servo.angle(i) sleep(0.1) positions.append(servo.angle()) plt.plot(positions) plt.show() ---------------------------------------------- **まとめ** このプロジェクトでは、サーボモーターを制御する基本的な方法を紹介しました。サーボ制御を理解することで、ロボットやロボットアームなど、さまざまなモーション制御プロジェクトへ応用することが可能になります。