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

2020年1月16日

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

続きは、以下の記事で。。。