こんにちは!駆け出しエンジニアのまっきーです。
今回はタクトスイッチ操作の復習と応用問題に取り組みたいと思います。
使用言語はC言語です。
課題一覧
- タクタルスイッチでLEDを点灯させる(その1)
- タクタルスイッチで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)が戻り値です |
ピン配置図

電子回路
雑ですみません。Frizingの使い方はもう少し練習します…
ラズパイ4を使っている方は、スイッチに3kΩ程の抵抗をつけてください。
ラズパイ3,3B+を使用している方は内部抵抗が使えるので下の図の通りで大丈夫です。

スイッチは右からSW0~SW7
LEDは右からLED0~LED3とします
以下、GPIOの対応表です
スイッチ,LED番号 | GPIO |
LED0 | GPIO23 |
LED1 | GPIO24 |
LED2 | GPIO20 |
LED3 | GPIO21 |
SW0 | GPIO25 |
SW1 | GPIO17 |
SW2 | GPIO27 |
SW3 | GPIO5 |
SW4 | GPIO6 |
SW5 | GPIO13 |
SW6 | GPIO19 |
SW7 | GPIO26 |
タクタルスイッチでLEDを点灯させる(その1)

スイッチを押している間、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 |
#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文でシンプルに記述できそうですね。
著者のソースコードでは、
1 2 3 |
/*for(i=0;i<4;i++){ //別解 digitalWrite(ledGpio[i],digitalRead(swGpio[i])); } */ |
というように、私が10行以上書いたコードをたったの3行にまとまっています。
for文おそるべし、ですね。
タクタルスイッチでLEDを点灯させる(その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 <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文をうまく使いこなせていない
まだまだシンプルにコードを書くことができていないですね…
スイッチなどの使い方と同時に、様々なコードの書き方も学んでいきたいと思います。
本日はここまでです。ありがとうございました!