.. 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()
----------------------------------------------
**まとめ**
このプロジェクトでは、サーボモーターを制御する基本的な方法を紹介しました。サーボ制御を理解することで、ロボットやロボットアームなど、さまざまなモーション制御プロジェクトへ応用することが可能になります。