WiringPi の SoftPWM機能
Raspberry PI でPWM機能を使えるのは
GPIO18だけだけど
SoftPWM() を使うことで
ソフトウェアでON/OFF させることで
擬似的に他のGPIOポートでPWMを行える
ただし、あくまで擬似的なので
実際に出力されるパルス幅が安定しないし
CPUに負荷がかかるとパルス幅がずれる
LEDを光らせる程度ならわからないレベルのずれ
正確に制御するならGPIO18で制御することになる
試しに
まず
1 | sudo shutdown -h now |
で電源を切って配列を変える
+のほうをGPIO4に接続
そして抵抗を270Ωでつけて
LEDの+になるアノードにつなげる
そして
-になるカノードを
GPIOのGNDに接続
これで制御してみる
今回使う WiringPi のメソッドは
wiringPiSetupGpio()
wiringPi の初期化
softPwmCreate(GPIOポート番号, 初期値, 最大値)
初期値はPWMの初期値
LEDとかなら0にする
最大値はパルス幅の最大値で
定数にしておくとメンテしやすい
softPwmWrite(GPIOポート番号, 値)
値は0から設定した最大値になる
これも最大値を定数にするとメンテが楽
基本的には PWM のときのソースと変わらないので
1 | cp pwm_led.c soft_pwm.c |
でコピーして改造する
まず、ポートを変えるので
1 | #define LED_PORT 18 |
を
1 | #define LED_PORT 4 |
次に softPwmCreate() でポートや初期値
最大値を設定するので
1 2 | //GPIO 18 を PWM pinMode(LED_PORT, PWM_OUTPUT); |
を
1 2 | //softPWM設定 softPwmCreate(LED_PORT,0,RANGE); |
さらに定数を宣言しておく
1 | #define RANGE 100 |
次に、繰り返す幅も変えるので
1 | for (pw=0;pw<1024;pw++){ |
を
1 | for (pw=0;pw<RANGE;pw++){ |
にして
1 | for (pw=1023;pw>=0;pw--){ |
を
1 | for (pw=RANGE;pw>=0;pw--){ |
にする
値の変更がsoftPwm を使うので
1 | pwmWrite(LED_PORT,pw); |
を
1 | softPwmWrite(LED_PORT,pw); |
に変える
そして待ち時間も変更
現在は 0.3ms なので
3ms にする
1 | delayMicroseconds(300); |
を
1 | delay(3); |
に書き換える
ここまでできたら
1 | cc -o softpwm soft_pwm.c -lwiringPi |
でコンパイルして
1 | sudo . /softpwm |
とすると
GPIO4でも PWMが行えることが確認できる