まえおき
ずいぶん昔にサーボモーターを制御できるPI HATを購入して、ハンダ付けまでしていたのですが、それっきりすっかり忘れていました。電子部品の在庫確認をしていたら、見つけてしまったので動作確認してみました。
パーツ
- パーツというか、RasPi3
- サーボモーター SG-90
- モーター用の電源
- モーターコントローラ Adafruit 16チャンネル PWM/サーボ HAT for Raspberry Pi
確認したら、まだ現行の製品でした。
環境
- python 3.7.3
- adafruit-circuitpython-servokit 1.2.1
調べたこと、やったこと
サーボモーターは、180度回転するタイプ(左右90度ともいえる)と、360度ぐるぐる回転するタイプがあるようです。180度回転するタイプも360度回転するタイプも、製品の情報をたどると、サンプルコードに到達できたのですが、ここのコードをコピペしても、思ったように動きませんでした。まず、はんだ付け失敗かとも思ったんですが、サーボモーターを接続する場所(16か所あります)を変更しても、動きは同じ。うーむ、、、、
これは、ハンダ付けでダマができているのが問題ではないと思い(責任転嫁か!)、ちょっとパラメータを変えてみて試行してみました。
で、以下のコードでだいたいいけそうでした。
# Adafruit 16-Channel PWM/Servo HAT & Bonnet for Raspberry Pi & SG90 sample
#
# see:
# https://learn.adafruit.com/adafruit-16-channel-pwm-servo-hat-for-raspberry-pi
#
# test system:
# python 3.7.3
# adafruit-circuitpython-servokit 1.2.1
import time
from adafruit_servokit import ServoKit
# Set channels to the number of servo channels on your kit.
# 8 for FeatherWing, 16 for Shield/HAT/Bonnet.
kit = ServoKit(channels=16)
ch = 1
kit.servo[ch].set_pulse_width_range(500, 2400)
# 0..180 step 30 angle
for v in range(0,181,30):
print( "value=", v )
kit.servo[ch].angle = v
time.sleep(1)
# 0, 180 step 90 angle x 3set
for i in range(1,3):
for v in range(0,181,90):
kit.servo[ch].angle = v
time.sleep(1)
# stop(90 angle)
kit.servo[ch].angle = 90
ポイントは
kit.servo[ch].set_pulse_width_range(500, 2400)
で、サーボモーターSG-90のデータシートを確認して、下が0.5ms pulse、上が2.4ms pulseらしいので設定しました。このパラメータでも、ちょっと180度に足りていない気もしますが、ひとまずよしとしときます。