.. include:: /index.rst
:start-after: start_hello_message
:end-before: end_hello_message
.. _py_motor:
1.6 モーター
================
**はじめに**
このプロジェクトでは、Fusion HAT+ を使用して DC モーターを制御し、時計回りおよび反時計回りに回転させる方法を学びます。
----------------------------------------------
**必要なもの**
このプロジェクトを完了するには、以下のコンポーネントが必要です。
.. list-table::
:widths: 30 20
:header-rows: 1
* - COMPONENT
- PURCHASE LINK
* - :ref:`cpn_motor`
- |link_motor_buy|
* - :ref:`cpn_fusion_hat`
- \-
* - Raspberry Pi
- \-
----------------------------------------------
**回路図**
以下の回路図は、モーターを制御するために必要な接続を示しています。
.. image:: img/fzz/1.3.1_sch.png
:width: 80%
:align: center
----------------------------------------------
**配線図**
.. image:: img/fzz/1.3.1_bb.png
:width: 80%
:align: center
----------------------------------------------
**サンプルの実行**
このチュートリアルで使用するすべてのサンプルコードは ``ai-lab-kit`` ディレクトリに用意されています。
以下の手順に従ってサンプルを実行してください。
.. raw:: html
.. code-block:: shell
cd ~/ai-lab-kit/python/
sudo python3 1.6_Motor.py
スクリプトを実行すると、ポート M0 に接続されたモーターがループ動作で開始と停止を繰り返します。
まず 0.5 秒間停止し、その後 −50% の出力で 1 秒間回転します。続いて再び 0.5 秒停止し、最後に 75% の出力で 1 秒間回転します。
このシーケンスは継続的に繰り返されます。プログラム終了時には、モーターは安全に停止します。
----------------------------------------------
**コード**
以下の Python コードは、モーターの回転方向と動作タイミングを制御します。
.. raw:: html
.. code-block:: python
#!/usr/bin/env python3
from time import sleep
from fusion_hat.motor import Motor
# Motor on port M0, reverse direction if needed
motor = Motor("M0", is_reversed=True)
try:
while True:
motor.power(0)
sleep(0.5)
motor.power(-50)
sleep(1)
motor.power(0)
sleep(0.5)
motor.power(75)
sleep(1)
except KeyboardInterrupt:
# Ctrl + C to stop
print("\nStopped by user.")
finally:
# Always stop the motor safely
motor.stop()
sleep(0.1)
----------------------------------------------
**コードの解説**
1. **ライブラリのインポート**
``fusion_hat`` ライブラリは GPIO の操作を簡素化し、``time`` ライブラリは待機時間(ディレイ)を提供します。
.. code-block:: python
from time import sleep
from fusion_hat.motor import Motor
2. **モーターの初期化**
``Motor`` オブジェクトは M0 ピンを使用して作成されます。
.. code-block:: python
motor = Motor('M0', is_reversed=True)
3. **モーターの動作**
モーターの速度はそれぞれ 0、-50、75 に設定されています。``sleep`` 関数は指定した時間だけプログラムを一時停止させます。
.. code-block:: python
try:
# Loop forever
while True:
motor.power(0) # Stop the motor
sleep(0.5) # Wait 0.5 seconds
motor.power(-50) # Run the motor at -50% power
sleep(1) # Run for 1 second
motor.power(0) # Stop again
sleep(0.5) # Wait 0.5 seconds
motor.power(75) # Run the motor at 75% power
sleep(1) # Run for 1 second
----------------------------------------------
**トラブルシューティング**
1. **モーターが動作しない**
- **原因**: 配線の誤り、または GPIO ピン設定の不備。
- **解決方法**: モーターに電源が供給されているか、また有効化(Enable)ピンが正しく接続されているかを確認してください。
2. **一方向にしか回転しない**
- **原因**: 正転または逆転用ピンの接続不良。
- **解決方法**: 各ピンが Fusion HAT+ にしっかり接続されていることを確認してください。
3. **モーターが停止せず回転し続ける**
- **原因**: ``stop()`` 関数が正しく実行されていない可能性があります。
- **解決方法**: ``motor.stop()`` メソッドが呼び出されていることを確認してください。
----------------------------------------------
**拡張アイデア**
1. **ユーザー操作による制御**
キーボード入力を使用して、ユーザーがリアルタイムでモーターを制御できるようにします。
.. code-block:: python
while True:
num = int(input("The speed percentage (-100~100): "))
if num >= -100 and num <= 100:
motor.speed(num)
else:
print("Invalid action!")
3. **時間指定によるモーター制御**
ユーザーが指定した時間だけモーターを動作させる機能を追加します。
.. code-block:: python
duration = int(input("Enter duration (seconds): "))
motor.speed(50)
sleep(duration)
motor.stop()
----------------------------------------------
**まとめ**
このプロジェクトでは、Fusion HAT+ を使用して DC モーターを制御する方法を紹介しました。
モーター制御の理解は、ロボットや動作を伴う電子プロジェクトを構築するうえで非常に重要な基礎となります。