Select Your Language

免責事項

  • 本サイトの情報の利用、内容、サービスによって、利用者にいかなる損害、被害が生じても、著者は一切の責任を負いません。ユーザーご自身の責任においてご利用いただきますようお願いいたします。

    本サイトで頒布している基板およびキットは、技術者、またはそれに準ずる電気的知識をお持ちの電子工作ファンの方のためのものです。 一般のオーディオファンの方のためのものではありません。
    また、頒布基板およびキットは、いかなる条件でも動作を保証するものではございませんので、あらかじめご了承ください。

    電子工作では、火傷、感電、火災などの可能性があります。 十分に注意をして作業して下さい。

    営利目的のご使用は認めておりません。  記事の転載や、基板・キットの商用利用の方は、ご連絡ください。
    学生やサークルの学習目的でまとめてご購入する場合は特別なコースをご用意させていただきます。

スポンサー

« OSC2018東京に沢山のご来場ありがとうございました | トップページ | Volumio2.502用のSabreberry32ドライバをリリース »

2018年11月 3日 (土)

RPi.GPIO と pigpio のパルス幅の精度を測定

本日は、OSCにて予想外に質問が多かったGPIOのPWM出力を比較してみましょう。

 

RPi.GPIOは初期のころからサポートされているGPIO操作のライブラリです。

2つあるハードウェアのPWMポートを使うのだと思っていましたが、実はGPIOすべてで使えます。

Pwm01

 

一方の

pigpioは、pigpiodというデーモンがroot権限で走っていてユーザープログラムからSocketで通信してコントロールします。このデーモンが標準5us(最小1us)のサンプルレートで動作し、非常に正確にGPIOを操作するため、PWMの時間的なブレが少ないのが特徴です。こちらもすべてのGPIOからPWMやサーボ用パルスを出せます。

詳細はこちら http://abyz.me.uk/rpi/pigpio/index.html

ちなみにソケット通信は隠蔽されていてプログラムするときには意識しません。(下記の実験プログラムを見てください)

 

 

サーボ用パルス出力の結果

模型用サーボモーターの指令パルスを模して0.5ms幅のパルスを毎秒50回でるようにして計測してみました。

プログラムはどちらもpythonで、オシロは10秒間のパーシスタンス表示です。簡単に言うと10秒間にブレた軌跡が見える設定にしています。

Pwm02 

<RPi.GPIOの時間ブレ>

写真には写っていませんが、時折0.1msくらい遅れることがありました。

 

Pwm03

<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

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へと高速化する必要があるかもしれません。

 

 

 

にほんブログ村 PC家電ブログ PCオーディオへ にほんブログ村
ブログランキングに参加中です。 めざせ1位! 
もしよろしければ「ぽちっと」お願いします。 

« OSC2018東京に沢山のご来場ありがとうございました | トップページ | Volumio2.502用のSabreberry32ドライバをリリース »

Raspberry Pi」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/587107/67341328

この記事へのトラックバック一覧です: RPi.GPIO と pigpio のパルス幅の精度を測定:

« OSC2018東京に沢山のご来場ありがとうございました | トップページ | Volumio2.502用のSabreberry32ドライバをリリース »

サイト内検索

Sponsors link

2018年11月
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30  
無料ブログはココログ