ラズベリーパイ zero でLEDの明るさを制御する ~ PWM制御

「ラズベリーパイ zero(Raspberry Pi zero)」を使ってモーターの制御を行いましたが、2モーターの場合に動作がうまくいきませんでした。それは最新の「ラズベリーパイ 4 model B」を使っても同様なので、一度原点に戻ってみようと考えました。
モーターの制御にはPWMを使いますが、モータードライバを介すると原因の特定が複雑化するので、2つのLEDを制御してみます。LEDであれば直接GPIOに接続できるので、動作の確認が分かりやすいはずです。
1.ハードウェアの接続
2つのLEDをブレッドボードに配置して、GPIOの18番と13番に接続します。モーターテストの空きの部分を使っているので複雑な接続に見えますが、実際は簡単な回路です。
2.ソフトウェアの作成
前回にモーターテストで使ったプログラムを流用します。
#include <stdio.h>
#include <stdlib.h>
#include <wiringPi.h>
#include <unistd.h>
#define MOTORPWM 18
#define MOTORPWM_2 13
int g_power = 0 ;
int g_power2 = 0 ;
int main(void) {
int i = 0;
int c ;
int isKeyPush = 0 ;
int isKeyPush2 = 0 ;
if ( wiringPiSetupGpio() == -1) {
printf("setup error");
return 1;
}
pinMode(MOTORPWM, PWM_OUTPUT);
pinMode(MOTORPWM_2, PWM_OUTPUT);
digitalWrite(MOTORPWM, 0);
digitalWrite(MOTORPWM_2, 0);
while(1) {
isKeyPush = 0 ;
isKeyPush2 = 0 ;
printf("z:+power\n");
printf("x:-power\n");
printf("n:+power2\n");
printf("m:-power2\n");
printf("q:End\n");
c=getchar();
for(int i=0;i<100;i++) {
if (getchar() == '\n') {
break ;
}
}
if(c == 'q') break;
if(c == 'z') {
g_power += 100 ;
if (g_power > 1000) {
g_power = 1000 ;
}
isKeyPush = 1 ;
} else if (c == 'x') {
g_power -= 100 ;
if (g_power < -1000) {
g_power = -1000 ;
}
isKeyPush = 1 ;
} else if (c == 'n') {
g_power2 += 100 ;
if (g_power2 > 1000) {
g_power2 = 1000 ;
}
isKeyPush2 = 1 ;
} else if (c == 'm') {
g_power2 -= 100 ;
if (g_power2 < -1000) {
g_power2 = -1000 ;
}
isKeyPush2 = 1 ;
}
if (isKeyPush == 1) {
if (g_power > 0) {
pwmWrite(MOTORPWM, g_power);
} else if (g_power < 0) {
pwmWrite(MOTORPWM, g_power*(-1));
} else {
pwmWrite(MOTORPWM, 0);
}
printf("power=%d\n", g_power);
sleep(1) ;
}
if (isKeyPush2 == 1) {
if (g_power2 > 0) {
pwmWrite(MOTORPWM_2, g_power2);
} else if (g_power2 < 0) {
pwmWrite(MOTORPWM_2, g_power2*(-1));
} else {
pwmWrite(MOTORPWM_2, 0);
}
printf("power2=%d\n", g_power2);
sleep(1) ;
}
}
return 0;
}
define名にモーターの名残りがあるのはご了承ください。GPIOの18番、13番を使ってLEDの点灯を制御します。そして、z、xキーでGPIO18の出力を増減し、n、mキーでGPIO13の出力を増減します。
3.動作させてみる

動作させてみると、2つのLEDとも出力制御ができました。数字の増減でLEDの明るさが変わります。
これらにより、ラズベリーパイ zeroでもPWMを2系統制御できることが分かりました。
今回は赤色の輝度が低いLEDを使いましたが、明るいLEDを使えば便利なライトを作れそうです。そのうち、スマートフォンで明るさを制御できるランタン(それ以外の機能も付随させる)を作ってみようかと思っています。
4.それでは2モーターのテストを再びやってみます
LEDでは問題なく2系統の出力を制御できました。今時点では、何でモーターになるとうまくいかないのかが分かりません。
PWMには問題がないので、プログラムの記述が足りないのか、物理的な問題があるのかを確かめたいと思います。
続きは、以下の記事で。。。

日本周遊マップ