Python/Arduino学習記録,備忘録

コツコツ学んだ学習記録と備忘録。現在Python,Arduino勉強中。

【Arduino#3】ボタンスイッチとLED回路

以前までは,スケッチ例であるBlinkについて扱っていましたが,これ以降は自分でスケッチを書くことでArduinoに対する理解を深めようと思う。
今回はボタンスイッチを用いて,スイッチ押すたびにLEDがON/OFF切り替わる回路を作成する。

1. 必要素子

  • ブレッドボード
  • 抵抗(10kΩ)
  • ボタンスイッチ(以下,SW)
  • LED
  • ジャンパー線 3本

2. 配線図

今回の配線図は以下の通り。
f:id:opuktr:20180805211041p:plain

これはSWのON/OFFを電圧に変換し,マイコンに読み取ることで,LEDを制御する回路となっている。
SWのON/OFFは黄色いジャンパー線が読み取っている。

以下に回路図を用いて説明する。赤い箇所は5Vを表す。
f:id:opuktr:20180805213311p:plain

  • SW=OFFの時

電圧源の+側は5Vであるが,SWがOFFになっていることから,SWの右半分はGNDと同様の0Vとなっている。
ここで,抵抗とGNDを接続しているのはSWの右半分の基準電圧を0Vに設定する為である。
即ち,配線図の黄色いジャンパー線でマイコンが読み取る値はLOWである。

  • SW=ONの時

SWがONになったことによって,5Vの範囲が拡大した。抵抗があることによって,ショートすることを防いでいる。
即ち,配線図の黄色いジャンパー線でマイコンが読み取る値はHIGHである。


以上の回路によって,読み取ったSWのON/OFFに準じた制御指令をLEDに送ることでLEDのON/OFFを達成する。

3. スケッチ

const int SW = 7;     //SWを7番pinに設定
const int LED = 13;  //LEDを13番pinに設定

int val = 0;           //7番pinから読み込んだ値を格納
int val_old = 0;    //古いvalを格納
int state = 0;       //SWの状態を格納

void setup() {
  pinMode(LED,OUTPUT); //13番pinを出力pinに設定
  pinMode(SW, INPUT);    //7番pinを入力pinに設定
}

void loop() {
  val = digitalRead(SW);//7番pinからHIGH/LOWを読込

  //SWのON/OFFでstateの状態を変更
  if((val == HIGH)&&(val_old == LOW)){
    state = 1 - state;   //state=0 → state=1-0,state=1 → state=1-1=0
    delay(10);  //SWのバウンシングを防ぐために間隔設定
    }

    val_old = val;  //1つ前のvalを格納

  //SW=ON⇒LED=ON or SW=OFF⇒LED=OFF
  if(state == 1){
    digitalWrite(LED, HIGH);
    }else{
      digitalWrite(LED,LOW);
    }
}

4. スケッチで用いた関数まとめ

各々の関数についてまとめる。基本的にはArduino Referenceで説明されている。

const int SW = 7;     //SWを7番pinに設定
const int LED = 13;  //LEDを13番pinに設定

変数を読み取り専用の変数として定義するもの
不変の値を設定したい時にconstを用いると良い。

 pinMode(LED,OUTPUT);
 pinMode(SW, INPUT);
//pinMode(pin番号, OUTPUT / INPUT / INPUT_PULLUP);
//戻り値:なし

pinの動作を入力(INPUT, INPUT_PULLUP)か出力(OUTPUT)に設定する関数
入力には以下の2種類ある。
INPUT:普通の入力
INPUT_PULLUP:マイコン内部のプルアップ抵抗を利用する(回路簡素化できる)

digitalRead(SW);
//digitalRead(pin番号);
//戻り値:HIGH/LOW

指定したpinの値を読み取る関数
5Vボードでは,3V以上の電圧がかかるとHIGH,1.5V以下の電圧がかかるとLOWとなる。
3.3Vボードでは,2V以上の電圧がかかるとHIGH,1V以下の電圧がかかるとLOWとなる。

digitalWrite(LED, HIGH);
digitalWrite(LED, LOW);
//digitalWrite(pin番号, HIGH / LOW);
//戻り値:なし

指定したpinにHIGHかLOWを設定する関数
基本的には,HIGH=5V,LOW=0Vだが,3.3VのボードではHIGH=3.3Vと設定される。

 delay(1000);
//delay(時間[単位はms]);
//戻り値:なし

指定した時間だけプログラムを止める関数
ここで,設定する時間はunsigned long型である。