ラズパイ4でサーボモータを動かすpigpio


ラズパイ4 カーネル5.1.0(2021.5.7版 32bitおすすめ全部入り)を使用しています
ラズパイの紹介記事でよく見かけるGPIOライブラリ RPi.GPIO でサーボモーターをPWMで制御するとパルス幅などに揺らぎがあるためにサーボモーターが止まるはずなのに、ジッ、ジッ、と動いてしまいます。

GPIOにアクセスするライブラリはいくつかあるようですが、 pigpioを使ってみることにしました。
interface2021.6月号でも紹介しています。https://interface.cqpub.co.jp/wp-content/uploads/if2106_148.pdf

pigpioのインストール

公式ページのダウンロードリンクhttp://abyz.me.uk/rpi/pigpio/download.html
ここに、以下の2つのコマンドを打つとあるので端末から実行します。
sudo apt-get update
sudo apt-get install pigpio python-pigpio python3-pigpio
今回は、実行時に既に最新板があるよ!と表示されたので、32bitおすすめ全部入り版はインストール不要でした。
使用前にデーモンを起動します。
sudo pigpiod   pigpioではなくdが付いています。
pigpiod -v でバージョン確認できます。
インストールしたときは1.79と出ましたが、バージョン確認では79と表示されました。

動作テスト

コードは参考HP
https://www.fabshop.jp/%E3%80%90-%E7%AC%AC38%E5%9B%9E-%E3%80%91gpio%E5%88%B6%E5%BE%A1%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%AE%E3%81%BE%E3%81%A8%E3%82%81/
からコピペしました。windows上だとコード部分をテキストエディタに貼り付けて、PWM.pyなど適当に名前を付けます。
USBメモリにコードを移して、ラズパイに刺しました。その後、ファイルマネージャを使ってホームディレクトリにコピーしています。
pyファイルをダブルクリックするとラズパイのpython開発環境であるThonnyが立ち上がります。
実行ボタンを押すとサーボモーターが動きました。
いくつかの制御関数があるようですが、.hardware_PWMがノイズが少なくて良さそうです。

import pigpio
from time import sleep
# 実行前にsudo pigpiodを忘れずに
pig = pigpio.pi()
pig.set_mode(12, pigpio.ALT0) #OUTPUTの他にALT0-5のモードがある

counter = 0
while (counter < 3):
    pig.hardware_PWM(12, 50, 120000) #サーボは50Hzで制御する
    sleep(1)
    pig.hardware_PWM(12, 50, 72500) #7.25%のdutycycle
    sleep(1)
    pig.hardware_PWM(12, 50, 25000)
    sleep(1)
    pig.hardware_PWM(12, 50, 72500)
    sleep(1)
    counter = counter + 1

pig.hardware_PWM(12, 50, 0)
pig.set_mode(12, pigpio.INPUT)
pig.stop()

ラズパイ4でのALTモードの紹介
https://elinux.org/RPi_BCM2711_GPIOs#PCM_CLK
set_modeでOUTPUTやALT1-5を試してみたけど、ALT0と同様にサーボが動きました。18番GPIOでも同様でした。
interfaceの記事では18番でOUTPUTを使っていました。

サーボモーターの接続

秋月で購入したSG-92Rを使いました。動作電圧:4.8V、配線:茶=GND、赤=電源[+]、橙=制御信号 [JRタイプ]とあるので、
電源ラインは5Vとして(3.3Vでも動きます)、オレンジは参考HPのコードから12番のGPIOピンと接続しました。
PWMサイクルが20msなので、50Hzで制御します。制御パルス0.5msの時dutyは2.5%、2.4msの時は12%なので、2.5-12%の間でdutyをかけてやります。