Arduinoでスイッチを使ったLED点灯(Lチカ)

プルアップ回路とプルダウン回路

スイッチを使ったLチカを調べていくと、この二つの回路についての説明が出てくる。
ようするに、マイコンを守るための電気回路だと思っておけば大丈夫。

プルアップ回路

何もしてないときに電気を流しておくことをプルアップ回路といいます。


この回路は、電気が流れていると常にマイコンに電気が入力される回路になります。
スイッチを押すとマイコンに流れる電気がOFFになり、離すとONになる回路です。

メリットとして、常に電気が流れているので静電気に対して丈夫。
デメリットとして、マイコンへの入力がスイッチを押すとOFFになるのでプログラムではそれを気にした記述を行わなければならない。


プルダウン回路

スイッチを押したときに電気を流すことをプルダウン回路になります。


この回路は、プルアップとは反対の動きをする回路になります。

メリットとして、プログラムでON/OFFの反転を考えなくてよい。
デメリットとして、静電気がマイコンにONの入力をする恐れがある。

慣例的にプルアップ回路を使う

昔の半導体の特性によって、プルアップ回路が使われてきている。
いろいろ調べてもプルアップ回路が使われてきてるものが多いので、プルアップ回路を使っておけば問題ない。


スイッチを使ったLED点灯・点滅回路

今回はこんな感じの回路を組んでみた。


Arduino互換機にLEDアレイをつなげて、スイッチをつなげてある。

スイッチを押してるときLEDを点灯させる

プログラムはこんな感じ。

void setup(){
  pinMode(11,INPUT);
  pinMode(2,OUTPUT);
  pinMode(3,OUTPUT);
  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);
}

void loop(){
  if(digitalRead(11)==LOW){
    digitalWrite(2,1);
  }
  else{
    digitalWrite(2,0);
  }
}

digitalRead()というのはArduino専用の関数である。
ピンに対して入力信号を入れるときに使う。
プログラム上では、何か入力信号があれば「1」、入力信号がないときは「0」のどちらかの数値を返す関数である。
スイッチを使うときはこの関数をよく使う。

書き込み結果がこちら。



スイッチでLEDの点灯をON/OFFする

プログラムはこんな感じ。

int led;

void setup(){
  pinMode(11,INPUT);
  pinMode(2,OUTPUT);
  pinMode(3,OUTPUT);
  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);
  led=0;
}

void loop(){
  if(digitalRead(11)==LOW){
    led = 1-led;
    digitalWrite(2,led);
    delay(300);
  }
}

グローバル変数を作成し、その数値の変化でLEDのON/OFFを行っている。
dealy()関数を使っている理由は、チャタリングを防止するためである。
スイッチを一回押したと思っていても、スイッチ内部の金属の跳ね返りが何度も起こっているので、実はマイコンにはON/OFFの信号が何度も送られているのである。
なので、思っている動きを実現するためにdelay()関数を使っている。
人のスイッチを動かす時間はだいたい200ミリ秒から400ミリ秒なので、今回は300ミリ秒を設定している。

実行結果がこちら。
動画リンクいっれる


スイッチの押した回数を2進数で表す

2進数は「0」と「1」の繰り返しの数値である。
なので、点灯時は「1」、消灯時は「0」という形でLEDを光らせてみる。
今回は0から15までをLEDの点灯で表してみる。
15を超えたら0に戻るプログラムを記述してみる。

int led;
int count;

void setup(){
  pinMode(11,INPUT);
  pinMode(2,OUTPUT);
  pinMode(3,OUTPUT);
  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);
  led=0;
  count=0;
}

void loop(){
  int i;
  int BLINK;
  
  if(digitalRead(11)==LOW){
    count++;
    if(count>15){
      count=0;
    }

    led=count;

    for(i=2;i<6;i++){
      BLINK = led&0x01;
      digitalWrite(i,BLINK);
      led = led>>0x01;
    }
    delay(300);
  }
}

スイッチを押すと0からカウントを行っていく。
15を超えたとき0にカウントをリセットする。
ledという変数にカウント数を代入しておく。
for文内でLEDの点灯を行っていく。 iをLEDが点灯するピンの番号としてセットする。
ledを論理演算して、最下位ビットをBLINKに代入して、ON/OFFを決定する。
ledを左に1ビットシフト演算を行う。
これが4回繰り返されている。


実行結果がこんな感じ。



論理演算とシフト演算を行って、なるべく短くしてみた。
LEDの点灯を2進数表示にすることができた。





コメント

このブログの人気の投稿

STM32CubeIDEに日本語化プラグインを導入する

STM32F401でLチカをする(LED点灯)

STM32F401-Nucleoでシリアル通信をやってみる