この記事をシェアしよう!

【 第26回 】から【 第37回 】に亘って、Pytho3にインポートする様々なGPIO制御ライブラリを使ってきましたが、今回、それぞれの仕様について一覧表にまとめてみました。

こうして一覧表にまとめてみると、制御ライブラリでは”pigpio”で、特にサーボモーターの制御で出力チャンネルが2チャンネルで足りるなら、ハードウェアPWMを出力する関数”.hardware_PWM”がよいのではないでしょうか。出力チャンネルがそれ以上必要な場合は、Hardware Timed PWMで出力する関数”.set_servo_pulsewidth”がサーボモーターの制御に特化していて使いやすいと思います。

残念だったのは”Gpiozero”の関数”.AngularServo_angle”がサーボモーターの回転を直接、角度で指定できるのがとても分かり易かったのに、ジャダーが激しくて使い物にならないことでした。

こちらの一覧表では、各ライブラリのバージョンアップが進んでいたので、現時点での最新情報に改訂しました。新たにnode-rpioというライブラリも見つかったので、今後も確認をしていきたいと思います。

各GPIO制御ライブラリを用いたサーボモーターの回転

各GPIO制御ライブラリのサーボモーター制御関数を用いた回転の様子を動画で確認していただきます。

同一条件で撮影する為、【 第37回 】と同じ部品と接続でサーボモーターも同一のものを使い、プログラムも見直して動作を共通にしました。尚、GPIO出力への影響を最小限に抑える為、音声出力は【 第25回 】の方法で無効化しています。

RPi.GPIOの関数".PWM_ChangeDutyCycle"

import RPi.GPIO
from time import sleep

RPi.GPIO.setmode(RPi.GPIO.BCM)
RPi.GPIO.setup(12, RPi.GPIO.OUT)

pig = RPi.GPIO.PWM(12, 50)
pig.start(7.25)

counter = 0
while (counter < 3):
    pig.ChangeDutyCycle(2.5)
    sleep(1)
    pig.ChangeDutyCycle(7.25)
    sleep(1)
    pig.ChangeDutyCycle(12)
    sleep(1)
    pig.ChangeDutyCycle(7.25)
    sleep(1)
    counter = counter + 1

pig.stop()
RPi.GPIO.cleanup()

WiringPiの関数".pwmWrite"

import wiringpi
from time import sleep

wiringpi.wiringPiSetupGpio()
wiringpi.pinMode(12, wiringpi.GPIO.PWM_OUTPUT)
wiringpi.pwmSetMode(wiringpi.GPIO.PWM_MODE_MS)
wiringpi.pwmSetRange(1024)
wiringpi.pwmSetClock(375)

counter = 0
while (counter < 3):
    wiringpi.pwmWrite(12, 25)
    sleep(1)
    wiringpi.pwmWrite(12,75)
    sleep(1)
    wiringpi.pwmWrite(12. 123)
    sleep(1)
    wiringpi.pwmWrite(12, 75)
    sleep(1)
    counter = counter + 1

wiringpi.pwmWrite(12, 0)
wiringpi.pinMode(12, wiringpi.GPIO.INPUT)
wiringpi.wiringPiSetGpio()

pigpioの関数".set_PWM_dutycycle"

import pigpio
from time import sleep

pig = pigpio.pi()

pig.set_PWM_frequency(12, 50)
pig.set_PWM_range(12, 1024)

counter = 0
while (counter < 3):
    pig.set_PWM_dutycycle(12, 25)
    sleep(1)
    pig.set_PWM_dutycycle(12, 75)
    sleep(1)
    pig.set_PWM_dutycycle(12, 123)
    sleep(1)
    pig.set_PWM_dutycycle(12, 75)
    sleep(1)
    counter = counter + 1

pig.set_PWM_dutycycle(12, 0)
pig.set_mode(12, pigpio.INPUT)
pig.stop()

pigpioの関数".set_servo_pulsewidth"

import pigpio
from time import sleep

pig = pigpio.pi()

counter = 0
while (counter < 3):
    pig.set_servo_pulsewidth(12, 2400)
    sleep(1)
    pig.set_servo_pulsewidth(12, 1450)
    sleep(1)
    pig.set_servo_pulsewidth(12, 500)
    sleep(1)
    pig.set_servo_pulsewidth(12, 1450)
    sleep(1)
    counter = counter + 1

pig.set_servo_pulsewidth(12, 0)
pig.set_mode(12, pigpio.INPUT)
pig.stop()

pigpioの関数”.hardware_PWM”

import pigpio
from time import sleep

pig = pigpio.pi()
pig.set_mode(12, pigpio.ALT0)

counter = 0
while (counter < 3):
    pig.hardware_PWM(12, 50, 120000)
    sleep(1)
    pig.hardware_PWM(12, 50, 72500)
    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()

Gpiozeroの関数".Servo"

from gpiozero import Servo
from time import sleep

pig = Servo(12, min_pulse_width=0.5/1000, max_pulse_width=2.4/1000)

counter = 0
while (counter < 3):
    pig.min()
    sleep(1)
    pig.mid()
    sleep(1)
    pig.max()
    sleep(1)
    pig.mid()
    sleep(1)
    counter = counter + 1

Gpiozeroの関数”.AngularServo.angle”

from gpiozero import AngularServo
from time import sleep

pig = AngularServo(12, min_pulse_width=0.5/1000, max_pulse_width=2.4/1000)

counter = 0
while (counter < 3):
    pig.angle = 90
    sleep(1)
    pig.angle =0.0
    sleep(1)
    pig.angle = -90
    sleep(1)
    pig.angle = 0.0
    sleep(1)
    counter = counter + 1
この記事をシェアしよう!