こんにちは!駆け出しエンジニアのまっきーです。
今回から、演習課題に取り組んでいきたいと思います!
まずはこの2つです。
- LEDを2つの点灯パターンで交互に表示させる
- 2進数でカウントアップ
復習
使用する関数
wiringPi.h | wiringPi用のヘッダーファイル |
wiringPiSetupGpio() | wiringPiの初期化 |
pinMode(int pin,int mode) | ピンのモードを決める(OUTPUT INPUT) |
digitalWrite(int pin,int value) | valueにHIGHかLOWを設定する |
ラズパイピン配置図

回路図

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

図のように、2つのパターンでLEDを点灯させるプログラムです。(こちらから引用)
ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
#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進数表示の方法がわからなかったので、著者のコードを引用しました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
#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の点灯を制御できる
・関数に分けたりすることで、できるだけシンプルなコードを書くことを意識する