ラズベリーパイでサーボモーターを制御する方法
コメントⓘ Cet article peut avoir été partiellement ou totalement traduit à l'aide d'outils automatiques. Nous nous excusons des erreurs que cela pourrait engendrer.
このチュートリアルは、Raspberry Piで電子機器を発見するためのファイルの3番目の部分です。読んでいない場合は、Raspberry PiでLEDを制御するための最初のチュートリアルと、Raspberry PiでRFIDリーダーを使用するための2番目のチュートリアルを参照することをお勧めします。
ホームオートメーションを開始するときの古典的なニーズは、プログラムから実際の物理的な動きを制御することです。
このチュートリアルでは、Raspberry Piを使用してサーボモーターを制御する方法を説明します。
サーボモーター制御用アクセサリー
このチュートリアルを実行してサーボモーターを制御できるようにするには、次の資料が必要です。
モーター、サーボモーター、ステッピングモーターの違いは何ですか?
サーボモーターをRaspberry Piに接続する前に、電子機器で従来から使用されているさまざまな種類のモーターを見てみましょう。
詳細には触れずに、電子機器で使用されるモーターを3つのカテゴリーに大まかに分類できます。
- モーター:電源が供給されている限り動作します。精度をあまり必要としない連続動作を行いたい場合に適しています。
- ステッピングモーター:小さな連続した跳躍で回ります。つまり、特定の動き(たとえば、4分の1回転)に対応する50ジャンプ、または112ジャンプなどを実行するように依頼することができます。高精度の連続移動が必要な場合に適しています(たとえば、3Dプリンターで使用されます)。
- サーボモーター:PWM(パルス幅変調)タイプの信号に従って定義された特定の角度で回転します。多くの場合、小型モーターは制限されており、1回転を超えることはできません。したがって、かなり正確な短いムーブメントに使用されます。
これらの異なるエンジンについては、他にも多くのことを言う必要がありますが、それでは、チュートリアルの範囲をはるかに超える機械的な質問に入ります。
ここでは、Raspberry Piから制御する最も簡単な精密モーターであるため、サーボモーターを使用します。
サーボモーターをRaspberry Piに接続する
私たちのサーボモーターを使用できるようにするために最初にすることは、それをRaspberry Piに接続することです。
アクチュエータには3つの電気コネクタがあります。色はメーカーによって異なる場合がありますが、通常は次のようなものが見つかります。
- 電源として機能する赤い線。
- GDNとして機能する黒または茶色のワイヤー。
- モーターの位置を制御するPWM信号を送信するために使用される別のワイヤー。
したがって、これらの異なるケーブルをRaspberry Piに接続し、赤いワイヤーを5ボルトのGPIOポートに、黒いワイヤーをGNDポートに接続します。
一方、PWMポートの場合は、必ずRaspberry Piの12番目のGPIOピンに接続する必要があります。実際、これはデフォルトでPWM信号をサポートする唯一のGPIOピンです。
したがって、このようなモンタージュが必要です。
注:ここでは、Raspberry Piから直接サーボモーターに電力を供給しています。これは非常に小さなサーボモーターを使用しているため機能しますが、より大きなモデルでは専用の電源が必要になります。
コマンドラインでサーボモーターを制御する
サーボモーターを接続したので、Raspberry Piコマンドラインから直接駆動できます。
これを行うには、プロセッサの番号付けに従って、ポート12、つまりGPIO 18でPWMモードをアクティブにすることから始めます。
gpio -o mode 18 pwm
そして、PWMのマーク/スペースモードをアクティブにします。これにより、私たちの用途により適した信号を得ることができます。
gpio pwm-ms
最後に、サイクルの期間、使用する周波数などを構成します。
サーボモーターは50 Hz、つまり20 msの周波数で動作するように設定されています。Raspberry Pi信号は、19.2 MHzの別の周波数で動作します。これらの2つの数値を使用して、期間と範囲を計算できます(式のramboise314.frに感謝します)。
50 = 19.2 * 10^6 / 192 / 2000
したがって、これらの値を使用するようにRaspberry Piを設定します。
gpio pwmc 192 gpio pwmr 2000
最後に、エンジンを動かすことができます!サーボモーターに角度を渡すのではなく、角度に変換される数値を渡すことに注意してください。私たちのサーボモーターは0°から180°に行きます。いくつかのテストの後、0°は230、90°から150および180°から70に対応するように見えます。
したがって、モーターを90°で送信するには、次のコマンドを使用します。
gpio -g pwm 18 150
そして、150を230に置き換えて0°に移動し、70を180°に移動するか、必要に応じてその間の任意の値にします。
これらの小型モーターは正確に180°の角度をサポートしますが、190°または200°を生成し、十分に低い値を設定した場合は完全に回転することもできる小さなマージンがあります。各エンジンモデルに固有です。
Pythonでサーボモーターを駆動する
このシリーズの以前のチュートリアルと同様に、目標は、コマンドラインから直接ではなく、Pythonでエンジンを制御することです。これでPythonの基本が理解できたと思います。前のチュートリアルを読まない場合は、この記事の冒頭にリンクがあります。
Pythonスクリプトからエンジンを制御するには、もう一度libを使用します Rpi.GPIO
。
PythonとPiでは、モーター角度はサイクルのパーセンテージとして計算されます。この割合は「デューティサイクル」と呼ばれます。
0.5msの信号は0°に対応し、2.5msの信号は180°に対応します。サイクルが50 Hz、つまり20ミリ秒であることを知っているため、次のように0°と180°のデューティサイクルを計算できます。
x = 0.5 / 20 y = 2.5 / 20
次に、0°に対応するデューティサイクルは0.025、つまり2.5%であり、180°に対応するデューティサイクルは0.125、つまり12.5%であることがわかります。
小さな問題ですが、この値が理論的に良い場合、実際には0°の間モーターの完全な回転をトリガーする傾向があります… したがって、0°には4%を使用することをお勧めします。180の値12.5%が適切です。
モーターを制御するには、ピン12をPWM信号として設定し、関数を使用するだけです。start
そして ChangeDutyCycle
。
したがって、ファイルを作成できます servo.py
そして次のコードをそこに置きます:
#!/usr/bin/env python3
#-- coding: utf-8 --
import RPi.GPIO as GPIO
import time
#Set function to calculate percent from angle
def angle_to_percent (angle) :
if angle > 180 or angle < 0 :
return False
start = 4
end = 12.5
ratio = (end - start)/180 #Calcul ratio from angle to percent
angle_as_percent = angle * ratio
return start + angle_as_percent
GPIO.setmode(GPIO.BOARD) #Use Board numerotation mode
GPIO.setwarnings(False) #Disable warnings
#Use pin 12 for PWM signal
pwm_gpio = 12
frequence = 50
GPIO.setup(pwm_gpio, GPIO.OUT)
pwm = GPIO.PWM(pwm_gpio, frequence)
#Init at 0°
pwm.start(angle_to_percent(0))
time.sleep(1)
#Go at 90°
pwm.ChangeDutyCycle(angle_to_percent(90))
time.sleep(1)
#Finish at 180°
pwm.ChangeDutyCycle(angle_to_percent(180))
time.sleep(1)
#Close GPIO & cleanup
pwm.stop()
GPIO.cleanup()
あなたがしなければならないのは、次のようにしてスクリプトを実行することだけです。
python3 ./servo.py
エンジンが0°で始動し、次に90°にシフトし、最後に180°で停止するのを確認します。
あなたがしなければならないのは、このスクリプトをあなた自身のニーズに適応させることだけです!