.. note::
こんにちは、SunFounderのRaspberry Pi & Arduino & ESP32愛好家コミュニティへようこそ!Facebook上でRaspberry Pi、Arduino、ESP32についてもっと深く掘り下げ、他の愛好家と交流しましょう。
**参加する理由は?**
- **エキスパートサポート**:コミュニティやチームの助けを借りて、販売後の問題や技術的な課題を解決します。
- **学び&共有**:ヒントやチュートリアルを交換してスキルを向上させましょう。
- **独占的なプレビュー**:新製品の発表や先行プレビューに早期アクセスしましょう。
- **特別割引**:最新製品の独占割引をお楽しみください。
- **祭りのプロモーションとギフト**:ギフトや祝日のプロモーションに参加しましょう。
👉 私たちと一緒に探索し、創造する準備はできていますか?[|link_sf_facebook|]をクリックして今すぐ参加しましょう!
1.3.3 ステッパーモーター
=====================================
はじめに
------------
ステッパーモーターは、その独自の設計により、フィードバックメカニズムなしで高い精度で制御できます。ステッパーモーターのシャフトは、一連の磁石で取り付けられ、正および負に充電される一連の電磁コイルによって制御され、特定の順序で正確に前方または後方に小さな「ステップ」で移動します。
必要な部品
------------------------------
このプロジェクトでは、次の部品が必要です。
.. image:: ../python_pi5/img/1.3.3_stepper_motor_list.png
.. raw:: html
回路図
-----------------
.. image:: /python_pi5/img/1.3.3_stepper_motor_schematic.png
実験手順
-----------------------
**ステップ1:** 回路を組み立てます。
.. image:: ../python_pi5/img/1.3.3_stepper_motor_circuit.png
**ステップ2:** コードファイルを開きます。
.. raw:: html
.. code-block::
cd ~/davinci-kit-for-raspberry-pi/python-pi5
**ステップ3:** 実行します。
.. raw:: html
.. code-block::
sudo python3 1.3.3_StepperMotor.py
コードが実行されると、ステッパーモーターは、 'a' または 'c' の入力に応じて時計回りまたは反時計回りに回転します。
.. warning::
エラー メッセージ ``RuntimeError: Cannot determine SOC peripheral base address`` が表示された場合は、 :ref:`faq_soc` を参照してください。
**コード**
.. note::
以下のコードを変更、リセット、コピー、実行、停止することができます。ただし、それを行う前に、ソースコードのパスである ``davinci-kit-for-raspberry-pi/python-pi5`` に移動する必要があります。コードを変更した後、その効果を確認するために直接実行できます。
.. raw:: html
.. code-block:: python
#!/usr/bin/env python3
from gpiozero import OutputDevice
from time import sleep
# ステッパーモーターを制御するためにGPIOピン18、23、24、25を初期化します
motorPin = [OutputDevice(pin) for pin in (18, 23, 24, 25)]
# モーターの回転速度パラメーターを設定し、スムーズなモーター動作のための各ステップ間の待ち時間を計算します
rotationPerMinute = 15
stepsPerRevolution = 2048
stepSpeed = (60 / rotationPerMinute) / stepsPerRevolution
def rotary(direction):
"""
指定された方向に基づいてモーターの回転を制御します。
:param direction: 時計回りの場合は 'c'、反時計回りの場合は 'a'
"""
if direction == 'c':
# 時計回りの回転のステップシーケンスを実行します
for j in range(4):
for i in range(4):
if 0x99 << j & (0x08 >> i):
motorPin[i].on()
else:
motorPin[i].off()
sleep(stepSpeed)
elif direction == 'a':
# 反時計回りの回転のステップシーケンスを実行します
for j in range(4):
for i in range(4):
if 0x99 >> j & (0x08 >> i):
motorPin[i].on()
else:
motorPin[i].off()
sleep(stepSpeed)
def loop():
"""
ユーザーにモーターの回転方向を選択させ続け、この入力に基づいてモーターを制御します。
"""
while True:
direction = input('モーターの回転方向を選択してください a=反時計回り、c=時計回り: ')
if direction == 'c':
print('モーターは時計回りに動作します\n')
break
elif direction == 'a':
print('モーターは反時計回りに動作します\n')
break
else:
print('入力エラー、もう一度やり直してください!')
# 選択した方向でモーターを連続的に回転させます
while True:
rotary(direction)
def destroy():
"""
安全にすべてのモーターピンをオフにし、クリーンなシャットダウンに使用します。
"""
for pin in motorPin:
pin.off()
# メインプログラムの実行
try:
loop()
except KeyboardInterrupt:
destroy() # キーボード割り込みを処理してモーターを安全にシャットダウン
コードの説明
---------------------------
1. このセクションでは、必要なライブラリをインポートしています。GPIOピンの制御には「gpiozero」、タイミング制御には「time」を使用しています。
.. code-block:: python
#!/usr/bin/env python3
from gpiozero import OutputDevice
from time import sleep
2. ステッパーモータを制御するためにGPIOピン18、23、24、25を初期化します。
.. code-block:: python
# ステッパーモータのモーターピンを初期化します
motorPin = [OutputDevice(pin) for pin in (18, 23, 24, 25)]
3. モーターの回転速度を設定し、スムーズな動作のために各ステップ間の時間間隔を計算します。
.. code-block:: python
# モーターの回転速度パラメータを設定します
rotationPerMinute = 15
stepsPerRevolution = 2048
# スムーズなモーター動作のための各ステップの間隔を計算します
stepSpeed = (60 / rotationPerMinute) / stepsPerRevolution
4. 「rotary」関数は、モーターの回転を制御します。ビット操作とステッピングシーケンスを使用して、時計回りまたは反時計回りの回転に適した順序でモーターピンをアクティブにします。
.. code-block:: python
def rotary(direction):
"""
指定された方向に基づいてモーターの回転を制御します。
:param direction: 'c' は時計回り、'a' は反時計回り
"""
if direction == 'c':
# 時計回りの回転用のステッピングシーケンスを実行します
for j in range(4):
for i in range(4):
if 0x99 << j & (0x08 >> i):
motorPin[i].on()
else:
motorPin[i].off()
sleep(stepSpeed)
elif direction == 'a':
# 反時計回りの回転用のステッピングシーケンスを実行します
for j in range(4):
for i in range(4):
if 0x99 >> j & (0x08 >> i):
motorPin[i].on()
else:
motorPin[i].off()
sleep(stepSpeed)
5. 「loop」関数はユーザーにモーターの回転方向を選択するように継続的にプロンプトを表示し、入力に基づいてモーターを制御します。
.. code-block:: python
def loop():
"""
ユーザーにモーターの回転方向を選択するように継続的にプロンプトを表示し、この入力に基づいてモーターを制御します。
"""
while True:
direction = input('モーターの方向を選択してください。a=反時計回り、c=時計回り:')
if direction == 'c':
print('モーターが時計回りに動作中\n')
break
elif direction == 'a':
print('モーターが反時計回りに動作中\n')
break
else:
print('入力エラー、もう一度やり直してください!')
# 選択した方向にモーターを継続的に回転させます
while True:
rotary(direction)
6. 「destroy」関数はすべてのモーターピンをオフにします。これはクリーンなシャットダウンのために使用され、プログラムが終了したときにモーターが安全に停止することを保証します。
.. code-block:: python
def destroy():
"""
クリーンなシャットダウンに使用される、すべてのモーターピンを安全にオフにします。
"""
for pin in motorPin:
pin.off()
7. メインプログラムは「loop」を呼び出し、キーボード割り込み(Ctrl+Cなど)を処理して「destroy」を使用してモーターを安全にシャットダウンします。
.. code-block:: python
# メインプログラムの実行
try:
loop()
except KeyboardInterrupt:
destroy() # キーボード割り込みを処理してモーターを安全にシャットダウンします