2023年11月6日月曜日

raspberry pi : C言語で LED 調光 (pigpio を使用した PWM 制御)

目的:

WiringPi は 非推奨になったとのことの為、pigpio を使用して PWM 制御を 行う。

概要:

pigpio による ハードウェアPWM を使用する場合、以下の2種類がある。
  1. gpioHardwarePWM を使用
    この場合、
    1. pigpiod (デーモン) を使用しない。( 動作していてはいけない )
    2. 実行は sudo を付けて行う必要がある。(管理者権限が必要)
  2. hardware_PWM を使用
    この場合、
    1. 実行 は sudo を 付けて実行する必要がある。
    2. 管理者権限は不要。
以下、この2種類について、記す。
( 参考 : The pigpio library )

gpioHardwarePWM による PWN 制御:

書式

gpioHardwarePWM(gpio番号, PWM周波数, PWMデューティ)
PWM周波数は 0 ~ 125000000  ( 0 ~ 125MHz)
PWMデューティ は 0 ~ 1000000 ( 0 ~ 100% )

注意事項等

インクルードファイル : pigpio.h
最初に、初期化 として 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 を使用する。

hardware_PWM による PWN 制御

pigpiod の注意事項

hardware_PWM を使用するには pigpiod を走らせる必要があるが、
pigpiod を走らせると、CPU のパワーを消費してしまう。
これは、ソフトウェア PWN の為 とのこと。
ソフトウェア PWM を使用しないのであれば、サンプリング機能を無効にする
オプション(-m) を付加することで、CPU の消費が少なくなる。

サンプリング機能を無効にする方法 ( CPUの使用率を下げる為)

設定は、 /lib/systemd/system/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 を追加する。

pigpiod 開始

pigpiod (デーモン) の開始は、
sudo systemctl enable pigpiod.service
sudo systemctl start pigpiod.service
で行う。
尚、pigpiod の停止は、
sudo systemctl disable 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% )

注意事項等

インクルードファイル : pigpiod_if2.h
最初に、初期化 として 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.h


0 件のコメント:

コメントを投稿