目的:
WiringPi は 非推奨になったとのことの為、pigpio を使用して PWM 制御を 行う。
概要:
pigpio による ハードウェアPWM を使用する場合、以下の2種類がある。
( 参考 : The pigpio library )
- gpioHardwarePWM を使用
この場合、
- pigpiod (デーモン) を使用しない。( 動作していてはいけない )
- 実行は sudo を付けて行う必要がある。(管理者権限が必要)
- hardware_PWM を使用
この場合、
- 実行 は sudo を 付けて実行する必要がある。
- 管理者権限は不要。
( 参考 : The pigpio library )
gpioHardwarePWM による PWN 制御:
書式
gpioHardwarePWM(gpio番号, PWM周波数, PWMデューティ)
PWM周波数は 0 ~ 125000000 ( 0 ~ 125MHz)
PWMデューティ は 0 ~ 1000000 ( 0 ~ 100% )
PWMデューティ は 0 ~ 1000000 ( 0 ~ 100% )
注意事項等
インクルードファイル : pigpio.h
最初に、初期化 として gpioInitialise() を実行する必要がある。
最初に、初期化 として gpioInitialise() を実行する必要がある。
サンプルコード
#include <pigpio.h> #define GPIO_PWM1 18 #define GPIO_PWM2 19 #define PMW_FREQ 10000 int main(void) { int ret = gpioInitialise(); if (ret < 0) { return ret; } else { gpioHardwarePWM(GPIO_PWM1, PMW_FREQ, 100000); gpioHardwarePWM(GPIO_PWM2, PMW_FREQ, 700000); gpioSleep(PI_TIME_RELATIVE,5,0) ; gpioHardwarePWM(GPIO_PWM1, PMW_FREQ, 700000); gpioHardwarePWM(GPIO_PWM2, PMW_FREQ, 100000); gpioSleep(PI_TIME_RELATIVE,5,0) ; gpioHardwarePWM(GPIO_PWM1, PMW_FREQ, 0); gpioHardwarePWM(GPIO_PWM2, PMW_FREQ, 0); gpioTerminate(); } return ret; }
コンパイル
gcc -Wall -pthread -o pigpio_pwm pigpio_pwm.c -lpigpio -lrt
pigpio.h をインクルードしているため、 -lpigpio が必要。実行
sudo ./pigpio_pwm
で gpio 18, 19 に PWMのパルス信号が 出力される。サンプルコードでは 最初に出力した 5秒後に Duty を変えて出力。
その 5秒後に 出力を 停止する。
その他
pigpio を使用する場合は、管理者権限で実行する必要がある。( sudo で実行等)
pigpiod のデーモンは不要。( pigpiod が 動いていると実行できない )
通常の gpio へのアクセスは gpioWrite, gpioRead を使用する。
pigpiod のデーモンは不要。( pigpiod が 動いていると実行できない )
通常の gpio へのアクセスは gpioWrite, gpioRead を使用する。
hardware_PWM による PWN 制御
pigpiod の注意事項
hardware_PWM を使用するには pigpiod を走らせる必要があるが、
pigpiod を走らせると、CPU のパワーを消費してしまう。
これは、ソフトウェア PWN の為 とのこと。
ソフトウェア PWM を使用しないのであれば、サンプリング機能を無効にする
オプション(-m) を付加することで、CPU の消費が少なくなる。
pigpiod を走らせると、CPU のパワーを消費してしまう。
これは、ソフトウェア PWN の為 とのこと。
ソフトウェア PWM を使用しないのであれば、サンプリング機能を無効にする
オプション(-m) を付加することで、CPU の消費が少なくなる。
サンプリング機能を無効にする方法 ( CPUの使用率を下げる為)
設定は、 /lib/systemd/system/pigpiod.service を編集して行う。
pigpiod.service :
pigpiod.service :
1 [Unit]
2 Description=Daemon required to control GPIO pins via pigpio
3 [Service]
4 ExecStart=/usr/bin/pigpiod -l -m
5 ExecStop=/bin/systemctl kill pigpiod
6 Type=forking
7 [Install]
8 WantedBy=multi-user.target
上記の通り、 ExecStart の ところに -m を追加する。2 Description=Daemon required to control GPIO pins via pigpio
3 [Service]
4 ExecStart=/usr/bin/pigpiod -l -m
5 ExecStop=/bin/systemctl kill pigpiod
6 Type=forking
7 [Install]
8 WantedBy=multi-user.target
pigpiod 開始
pigpiod (デーモン) の開始は、
尚、pigpiod の停止は、
sudo systemctl enable pigpiod.service
sudo systemctl start pigpiod.service
で行う。sudo systemctl start pigpiod.service
尚、pigpiod の停止は、
sudo systemctl disable pigpiod.service
sudo systemctl stop pigpiod.service
で行う。sudo systemctl stop pigpiod.service
書式
hardware_PWM(pi, gpio番号, PWM周波数, PWMデューティ)
pi は pigpio_start の戻り値
PWM周波数は 0 ~ 125000000 ( 0 ~ 125MHz)
PWMデューティ は 0 ~ 1000000 ( 0 ~ 100% )
PWM周波数は 0 ~ 125000000 ( 0 ~ 125MHz)
PWMデューティ は 0 ~ 1000000 ( 0 ~ 100% )
注意事項等
インクルードファイル : pigpiod_if2.h
最初に、初期化 として pigpio_start(0,0) を実行する必要がある。
最初に、初期化 として pigpio_start(0,0) を実行する必要がある。
サンプルコード
#include <pigpiod_if2.h> #define GPIO_PWM1 18 #define GPIO_PWM2 19 #define PMW_FREQ 10000 int main(void) { int pi = pigpio_start(0,0) ; if (pi < 0) { return pi; } else { hardware_PWM(pi,GPIO_PWM1, PMW_FREQ, 100000); hardware_PWM(pi,GPIO_PWM2, PMW_FREQ, 700000); time_sleep(5) ; hardware_PWM(pi,GPIO_PWM1, PMW_FREQ, 700000); hardware_PWM(pi,GPIO_PWM2, PMW_FREQ, 100000); time_sleep(5) ; hardware_PWM(pi,GPIO_PWM1, PMW_FREQ, 0); hardware_PWM(pi,GPIO_PWM2, PMW_FREQ, 0); } return pi ; }
コンパイル
gcc -Wall -pthread -o pigpio_pwm pigpio_pwm.c -lpigpiod_if2 -lrt
pigpiod_if2.h をインクルードしているため、 -lpigpiod_if2 が必要。実行
./pigpio_pwm
で gpio 18, 19 に PWMのパルス信号が 出力される。サンプルコードでは 最初に出力した 5秒後に Duty を変えて出力。
その 5秒後に 出力を 停止する。
その他 注意事項等
pigpio を使用する場合は、実行時に sudo は不要。
pigpiod のデーモンが必要。
通常の gpio へのアクセスは gpio_write, gpio_read を使用する。
pigpiod_if2.hpigpiod のデーモンが必要。
通常の gpio へのアクセスは gpio_write, gpio_read を使用する。
0 件のコメント:
コメントを投稿