サーボモーターを制御する

ラズパイピコ

 ラズパイピコを使って、サーボモーター(SG92R)を制御する方法について説明します。制御には、PWM(Pulse Width Modulation:パルス幅変調)という制御方法を使います。

広告

SG92Rについて

 SG92Rは500円程度の安価なマイクロサーボモーターです。
 サーボというのは「言いつけどおりに忠実に働く」という意味で、仕組みに関わらず回転位置や回転速度などを制御できればサーボモーターと呼ばれます。サーボモーターには通常、回転検出器とコントローラーが内蔵されていて、回転位置を検出しズレがある場合は正しい位置に補正します。
 SG92Rの主な仕様は下記の通りです。動作電圧が約5Vなので、ラズパイピコのVBUS(40番のピン)から電源を取ります。VBUSからはマイクロUSBから供給される5V電源が取れます。

  • PWMサイクル:20mS
  • 制御パルス:0.5ms~2.4ms
  • 制御角:±約90°(180°)
  • トルク:2.5kgf・cm
  • 動作速度:0.1秒/60度
  • 動作電圧:4.8V

PWM制御について

 PWMというのは周期的なパルス信号を出力して、その周波数やパルスの長さを情報として伝える制御方法です。パルスの長さはデューティー比として指定します。

 SG92RではPWMサイクル(周期)が20msなので周波数は50Hzとなります。制御パルスは0.5msから2.4msで指定しますので、デューティー比としては0.5/20×100から2.4/20×100の範囲で指定することになります。
 ラズパイピコでは指定したGPIOピンからPWM信号を出力することができます。

配線とソースコード

 配線は下記の通りです。オレンジ色の配線は電源で、VBUSから取っています。黄色の配線は制御線で、どのGPIOピンでも良いです。抵抗には1kΩのものを使っています。茶色の配線はGNDです。

 ソースコードは下記の通りです。

from machine import Pin, PWM
import time

freq = 50 #20ms = 50Hz
duty_offset = 0.5 / 20 #制御パルスが0.5~2.4msのため、オフセットを設定 
duty_coef = (2.4 - 0.5) / 20 / 180 #角度をデューティ比に変換する係数
servo = PWM(Pin(28))

#角度を受け取ってサーボモータを回転させる関数
def set_angle(angle):
    degree = angle + 90
    duty = int((duty_offset + duty_coef * degree) * 65535)
    servo.freq(freq)
    servo.duty_u16(duty)

#45度に回転し1秒停止
set_angle(45)
time.sleep(1)

#-45度に回転し1秒停止
set_angle(-45)
time.sleep(1)

#PWM出力を無効化
servo.deinit()

 配線してプログラムを走らせてみると、サーボモーターが45度、-45度と動くかと思います。他のセンサーやプログラムと組み合わせれば、ちょっとした玩具などが作れそうですね。

コメント

タイトルとURLをコピーしました