C言語

タクタルスイッチでLED点灯①(応用編)

スポンサーリンク

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

今回はタクトスイッチ操作の復習と応用問題に取り組みたいと思います。

使用言語はC言語です。

課題一覧

  1. タクタルスイッチでLEDを点灯させる(その1)
  2. タクタルスイッチでLEDを点灯させる(その2)

復習

タクタルスイッチ使用時に必要な関数

pullUpDnControl(int pin, int pud)pudでプルアップダウンの設定を行います
プルアップ PUD_UP
プルダウン PUD_DOWN
抵抗なし  PUD_OFF
pinMode(int pin,int mode)ピンのモードを設定します
今回は入力なのでINPUTです
digitalRead(int pin)指定したGPIOの状態を読み込みます
HIGHまたはLOW(1,0)が戻り値です

ピン配置図

画像に alt 属性が指定されていません。ファイル名: image-21.png

電子回路

雑ですみません。Frizingの使い方はもう少し練習します…

ラズパイ4を使っている方は、スイッチに3kΩ程の抵抗をつけてください。

ラズパイ3,3B+を使用している方は内部抵抗が使えるので下の図の通りで大丈夫です。

スイッチは右からSW0~SW7

LEDは右からLED0~LED3とします

以下、GPIOの対応表です

スイッチ,LED番号GPIO
LED0GPIO23
LED1GPIO24
LED2GPIO20
LED3GPIO21
SW0GPIO25
SW1GPIO17
SW2GPIO27
SW3GPIO5
SW4GPIO6
SW5GPIO13
SW6GPIO19
SW7GPIO26

タクタルスイッチでLEDを点灯させる(その1)

スイッチを押している間、LEDが点灯するプログラムを作成します。

ソースコード

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

int led[4] = {23,24,20,21};//LED0,LED1,LED2,LED3
int sw[8] = {25,17,27,5,6,13,19,26};//SW0~SW7

int main(void){
	int i;
	//wiringPi初期化処理(エラー対策込み)
	if(wiringPiSetupGpio() == -1) return 1;

	//led,swの初期設定 swはプルアップ抵抗を使用
	for(i = 0;i < 4;i++){
		pinMode(led[i],OUTPUT);}
	for(i = 0;i < 8;i++){
		pinMode(sw[i],INPUT);
		pullUpDnControl(sw[i],PUD_UP);
	}
	while(1){
		//負論理のためLOW(0)で押したと判断
		if(digitalRead(sw[0])==LOW){
			digitalWrite(led[0],HIGH);
		}else if(digitalRead(sw[1])==LOW){
			digitalWrite(led[1],HIGH);
		}else if(digitalRead(sw[2])==LOW){
			digitalWrite(led[2],HIGH);
		}else if(digitalRead(sw[3])==LOW){
			digitalWrite(led[3],HIGH);
		}else{
			for(i = 0;i < 4;i++){
				digitalWrite(led[i],LOW);
			}
		}
	}
		
	return 0;
}

スイッチ一つずつ条件分岐で判定をさせました。for文でシンプルに記述できそうですね。

著者のソースコードでは、

/*for(i=0;i<4;i++){			//別解
          digitalWrite(ledGpio[i],digitalRead(swGpio[i]));
      } */

というように、私が10行以上書いたコードをたったの3行にまとまっています。

for文おそるべし、ですね。

タクタルスイッチでLEDを点灯させる(その2)

ソースコード

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

int led[4] = {23,24,20,21};//LED0,LED1,LED2,LED3
int sw[8] = {25,17,27,5,6,13,19,26};//SW0~SW7

int main(void){
	int i;
	//wiringPi初期化処理(エラー対策込み)
	if(wiringPiSetupGpio() == -1) return 1;

	//led,swの初期設定 swはプルアップ抵抗を使用
	for(i = 0;i < 4;i++){
		pinMode(led[i],OUTPUT);}
	for(i = 0;i < 8;i++){
		pinMode(sw[i],INPUT);
		pullUpDnControl(sw[i],PUD_UP);
	}
	while(1){
		//負論理のためLOW(0)で押したと判断
		if(digitalRead(sw[0])==LOW || digitalRead(sw[4])==LOW){
			digitalWrite(led[0],HIGH);
		}else if(digitalRead(sw[1])==LOW || digitalRead(sw[5])==LOW){
			digitalWrite(led[1],HIGH);
		}else if(digitalRead(sw[2])==LOW || digitalRead(sw[6])==LOW){
			digitalWrite(led[2],HIGH);
		}else if(digitalRead(sw[3])==LOW || digitalRead(sw[7])==LOW){
			digitalWrite(led[3],HIGH);
		}else{
			for(i = 0;i < 4;i++){
				digitalWrite(led[i],LOW);
			}
		}
	}
	return 0;
}

先ほどとほとんど同じです。if文の条件式を追加しただけです。

これももう少しシンプルにできそうです…

まとめ・反省

・内部抵抗を利用することで、簡単にプルアップ、プルダウンの設定ができる(ラズパイ4除く)

・for文をうまく使いこなせていない

まだまだシンプルにコードを書くことができていないですね…

スイッチなどの使い方と同時に、様々なコードの書き方も学んでいきたいと思います。

本日はここまでです。ありがとうございました!

スポンサーリンク

-C言語