RPi.GPIO と pigpio のパルス幅の精度を測定
本日は、OSCにて予想外に質問が多かったGPIOのPWM出力を比較してみましょう。
RPi.GPIOは初期のころからサポートされているGPIO操作のライブラリです。
2つあるハードウェアのPWMポートを使うのだと思っていましたが、実はGPIOすべてで使えます。
一方の
pigpioは、pigpiodというデーモンがroot権限で走っていてユーザープログラムからSocketで通信してコントロールします。このデーモンが標準5us(最小1us)のサンプルレートで動作し、非常に正確にGPIOを操作するため、PWMの時間的なブレが少ないのが特徴です。こちらもすべてのGPIOからPWMやサーボ用パルスを出せます。
詳細はこちら http://abyz.me.uk/rpi/pigpio/index.html
ちなみにソケット通信は隠蔽されていてプログラムするときには意識しません。(下記の実験プログラムを見てください)
サーボ用パルス出力の結果
プログラムはどちらもpythonで、オシロは10秒間のパーシスタンス表示です。簡単に言うと10秒間にブレた軌跡が見える設定にしています。
<RPi.GPIOの時間ブレ>
写真には写っていませんが、時折0.1msくらい遅れることがありました。
<pigpio の時間ブレ>
この時間軸設定だと全くブレが見えません。
いかがでしょうか?
この時間のブレの少なさでサーボモーターがジジジっとブレることなくピタっと止まります。RaspberryPiのGPIOでも「使えるサーボ信号」がだせると思いました。
以下は実験したプログラムコードです。 興味のある方はどうぞ。
RPi.GPIO
RPi.GPIO ライブラリ導入方法
sudo apt-get install python-rpi.gpio python3-rpi.gpio
< 実験プログラム pwm.py >----------------
#!/usr/bin/python
# -*- coding: utf-8 -*-
import time
import RPi.GPIO as GPIO
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
GPIO.setup(18, GPIO.OUT)
p = GPIO.PWM(18, 50) # gpio18 frequency=50Hz
p.start(0)
p.ChangeDutyCycle(2) # 2 = 0.5ms 12 = 2.4ms
time.sleep(60)
p.stop()
GPIO.cleanup()
----------------------------------------
実行は./pwm.py
pigpio
sudo apt-get install pigpio python-pigpio python3-pigpio
< 実験プログラム pwm2.py >----------------
#!/usr/bin/python
# -*- coding: utf-8 -*-
import time
import pigpio
pi = pigpio.pi()
pi.set_mode(18, pigpio.OUTPUT)
pi.set_servo_pulsewidth(18, 500) # gpio18 500us
time.sleep(60)
pi.stop()
----------------------------------------
pigpio は実行する前に下記でdaemonを起動しておく必要があります。
sudo pigpiod
プログラムの実行は./pwm2.py
systemdにpigpiodを登録しておくと自動で起動できるようになり便利です。
sudo nano /etc/systemd/system/pigpiod.service で新規ファイルを作り
[Unit]
Description = pigpio daemon
[Service]
ExecStart = /usr/bin/pigpiod
Restart = always
Type = forking
[Install]
WantedBy = multi-user.target
と記載して保存(Ctrl + o)して、閉じる(Ctrl + x)。
pigpiod -s 2 とすると2usサンプリングで起動します。(標準は5us。詳細はこちら)
sudo systemctl enable pigpiod.service
で次回以降、自動起動します。
pigpioのおかげで電子工作の幅が増えること間違いなしです。
ソケット通信でGPIO操作(デーモン)と指示するプログラムが別々になっているということは、ネットワークを介して遠隔操作も可能かもしれませんね。色々と楽しめそうです。
PWM出力テスト
次はPWM出力を試してみました。
周波数は4kHz。
2本のGPIOを使ってdutyを1%から99%、99%から1%までを可変させています。
このくらいの分解能でPWMが出せるとDCモータの制御も滑らかにできると思います。なかなか良いですね。
ちなみに周波数を8kHzにすると若干怪しい挙動をしていました。8kHz以上を使うときはpigpiod(デーモン)のサンプリングレートを2usもしくは1usへと高速化する必要があるかもしれません。
にほんブログ村
ブログランキングに参加中です。 めざせ1位!
もしよろしければ「ぽちっと」お願いします。
« OSC2018東京に沢山のご来場ありがとうございました | トップページ | Volumio2.502用のSabreberry32ドライバをリリース »
「Raspberry Pi」カテゴリの記事
- 2022年版のRaspberry Pi OSではユーザー、パスワード設定が必須に(2022.05.05)
- あのオーディオデザインさんがラズパイオーディオを発売(2022.04.18)
- Volumio/MoodAudioに秋月電子のI2CタイプOLEDを接続して曲名などを表示するPython3版(2022.03.26)
- reTerminal(Raspberry Pi CM4)でMoodeAudioを動かそう(2022.02.20)
- MoodeAudio 7.3をPi4でUSB3.0接続SSDから起動する方法(2021.09.24)
« OSC2018東京に沢山のご来場ありがとうございました | トップページ | Volumio2.502用のSabreberry32ドライバをリリース »
コメント