趣味で使うサーボモーターの定番といったら、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