C言語

ラズパイでLED点灯①(応用編)

ラズパイでLED点灯②(応用編)

スポンサーリンク

こんにちは!駆け出しエンジニアのまっきーです。

今回から、演習課題に取り組んでいきたいと思います!

まずはこの2つです。

  1. LEDを2つの点灯パターンで交互に表示させる
  2. 2進数でカウントアップ

復習

使用する関数

wiringPi.hwiringPi用のヘッダーファイル
wiringPiSetupGpio()wiringPiの初期化
pinMode(int pin,int mode)ピンのモードを決める(OUTPUT INPUT)
digitalWrite(int pin,int value)valueにHIGHかLOWを設定する

ラズパイピン配置図

回路図

LEDを2つの点灯パターンで交互に表示させる

図のように、2つのパターンでLEDを点灯させるプログラムです。(こちらから引用)

ソースコード

#include <stdio.h>
#include <wiringPi.h>

#define LED0 23
#define LED1 24
#define LED2 20
#define LED3 21

int main(void){
	int i;
	if(wiringPiSetupGpio() == -1){
		return 1;
	}
	
	pinMode(LED0,OUTPUT);
	pinMode(LED1,OUTPUT);
	pinMode(LED2,OUTPUT);
	pinMode(LED3,OUTPUT);
	
	for(i=0;i<10;i++){
		digitalWrite(LED0,HIGH);
		digitalWrite(LED1,LOW);
		digitalWrite(LED2,HIGH);
		digitalWrite(LED3,LOW);
		delay(500);
		digitalWrite(LED0,LOW);
		digitalWrite(LED1,HIGH);
		digitalWrite(LED2,LOW);
		digitalWrite(LED3,HIGH);
		delay(500);		
	}
		digitalWrite(LED0,LOW);
		digitalWrite(LED1,LOW);
		digitalWrite(LED2,LOW);
		digitalWrite(LED3,LOW);
		
	
}

少し単調で長いのはお許しください。

for文を用いればもう少しシンプルに書けますね。

2進数でカウントアップ

図のように、LEDを用いて2進数のカウントアップをするプログラムです。

参考ソースは著者のGitHubからダウンロードできます。

ソースコード

この問題は、2進数表示の方法がわからなかったので、著者のコードを引用しました。

#include <stdio.h>          //入出力
#include <stdlib.h>         //一般ユーティリティ
#include <wiringPi.h>       //wiringPi

/* LEDのGPIOを配列で定義 */
const int ledGpio[4] ={23,22,25,24};    //グローバル変数
/* プロトタイプの定義 */
void Led4bit(int ledData);

int main (void){
    int i;
    wiringPiSetupGpio();        //BCMのGPIO番号を使用
    for(i=0;i<4;i++){           //LED0からLED3を出力に設定
        pinMode(ledGpio[i], OUTPUT);}

    while(1){                   //永久ループ
        for(i=0;i<16;i++){      //変数iで0から15までカウントアップする	
            Led4bit(i);         //変数iを4bit出力する
            delay(500);         //0.5秒待つ
        }
    }
    return EXIT_SUCCESS;        //main関数の戻り値、正常終了
}

//関数名  void Led4bit(int ledData)
//引数    ledData  4bitデータ 0から15
//戻り値  なし
//概要    ledDataをLED0からLED3へ出力
void Led4bit(int ledData)
{
    int i;
    for (i=0; i<4; i++){        //LSBのLED0から順番に出力する
        digitalWrite(ledGpio[i], ledData&1);    //LSBだけの値にして出力
        ledData = ledData >> 1;                 //1bit 右シフト
    }
}

ビット操作をする関数void Led4bit(int ledData)がとても勉強になりました。

受け取った2進数の値をledData&1と論理演算を用いて、最下位bit(LSB)のみ点灯するかしないかを判断させるという方法は新たな学びです。

ここで注意しないといけないのは、digitalWrite()の中で論理演算をするということですね。

これを4回繰り返すことによって、全データ(2進数4桁)を表示することができるということがわかりました。

まとめと反省

・ビット操作でLEDの点灯を制御できる

・関数に分けたりすることで、できるだけシンプルなコードを書くことを意識する

スポンサーリンク

-C言語