趣味で使うサーボモーターの定番といったら、Tower pro の SG90 なのだろう。
Amazon ですぐに変えるし、
5個で2200円と安いし、トルクも結構強い。
茶色と赤と黄色の線が出ている。茶色は電源の+、赤は-側、データシート(秋月さんのリンクより)によると、電圧は4.8V (~5V) とある。
黄色は、角度を支持する信号を入れる線。振幅4.8V、周期50Hzの矩形波を入れる。
+側の時間間隔で角度がコントロールでき、0.5 ~ 2.4ms が、サーボの角度0~180度に対応する。
テストしてみよう。
以下のように、GPIOの23に配線するとする。
以下のプログラムを実行。
# -*- coding: utf-8 -*-
import RPi.GPIO as GPIO
import time
import numpy as np
A1_GPIO = 23
RNG_DIG = np.array([-90, 90])
RNG_RATE = np.array([2.5, 12])
def mapping(x, rx, ry):
a = (ry[0] - ry[1]) / (rx[0] - rx[1])
b = ry[0] - a * rx[0]
y = a * x + b
return y
# --- main
GPIO.setmode(GPIO.BCM)
GPIO.setup(A1_GPIO, GPIO.OUT)
p1 = GPIO.PWM(A1_GPIO, 50)
p1.start(0)
A1 = -90
d1 = mapping(A1, RNG_DIG, RNG_RATE)
p1.ChangeDutyCycle(d1)
time.sleep(0.5)
A1 = 90
d1 = mapping(A1, RNG_DIG, RNG_RATE)
p1.ChangeDutyCycle(d1)
time.sleep(0.5)
A1 = 0
d1 = mapping(A1, RNG_DIG, RNG_RATE)
p1.ChangeDutyCycle(d1)
time.sleep(0.5)
p1.stop()
GPIO.cleanup()
実行結果。想定通りに動いた(0度で若干下向きになるように接続しているので、これでOK)。
上記の方法はソフトウェア的にPWM信号を作っていて、ハードウェアでPWM信号を作る方法に比べて精度が落ちるとのこと。ラズパイ3 Model B+ だと、ハードウェアPWM信号も2つ出すことができる。
以下は、ハードウェアPWMを制御する方法。
実例で学ぶRaspberryPi 電子工作 p192-193 のやり方でwiringPi2-Python をインストール。
[code lang=”shell”]
sudo apt-get update
sudo apt-get install python-dev python-setuptools swig
git clone –recursive https://github.com/WiringPi/WiringPi-Python.git
cd WiringPi-Python/WiringPi
sudo ./build
cd ..
swig -python wiringpi.i
sudo python setup.py install
[/code]
しかし本で紹介されていたサンプルプログラムbb2-06-01-zero.pyが動かない。どうやら、firmware のダウングレードが必要そうだ。
参考:豆腐とコンソメさん
ファームウェアをダウングレードしたら動くようになった。
(※別な機会にこれをやったら、OSが壊れたことも。うーん、バックアップをとって自己責任で試してください。。)
追記
ハードウェアPWMをするのに、pigpiod という方法もあるようだ。
https://qiita.com/s417-lama/items/0ef64a7af3fcf6a56cc5


