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