ラズベリーパイ 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には問題がないので、プログラムの記述が足りないのか、物理的な問題があるのかを確かめたいと思います。
続きは、以下の記事で。。。