スイッチ回路

手動でオン/オフするスイッチは、ディジタル回路の基本的な入力デバイスになります。ここではスイッチの値を読み込み、その値でLEDの点滅時間を変更する表示する方法を紹介します。

  1. スイッチ素子

     スイッチは一番簡単な入力素子です。ここでは下のような小型の押しボタンスイッチ(tactile switch(触感のあるスイッチ):タクトスイッチともいいます)を利用します。上のボタンを押すている間、端子の A-B 間、および、C-D 間が導通します。この素子を記号で表現すると右のようになります。中央の赤い部分が一般的な押しボタンスイッチで、「ボタンを押すと左右の端子が導通する」意味です。
       
        タクトスイッチ           スイッチの記号

     このスイッチを利用して スイッチのオン/オフ を ディジタル電圧の HIGH と LOW に変換します。

         スイッチ回路

     VCC と GND は UNO の電源端子の5V(+)と GND(0V:−) の端子に接続します。スイッチの一方は 10k Ωの抵抗を通して、VCC に接続します。スイッチと抵抗の接続点を UNO の D10 端子に接続します。ボタンを押すと上下の端子が(A-B、および、CーD 間)導通します。すると、D10 の端子は GND と同じ 電圧になりますから LOW の状態となります。ボタンを離すと、10kΩの抵抗を通して電源(VCC)が D10 に接続するため、D10 の端子は電源の電圧(5V)になり HIGH の状態になります。抵抗の値は数百オーム以上なら何でもかまいませんが、無駄に電流を流したくない場合、20k-100k オーム程度とします。

  2. 変数と入力命令

     UNO では 2〜13 の端子をディジタル端子として利用できます。(0 と 1 番の端子はUSBの通信用の端子として利用していますから、他の目的には利用しない方が無難です)。ディジタル端子は 入力または出力端子として利用で きますから、入力として利用する場合、次のような命令が必要です。
       pinMode(ピン番号,INPUT); //ピン番号は 2-15
     指定したピン番号の出力端子の値(状態)を設定するには次の命令を利用します。int din ; は読み込んだ値を記憶する「変数の名前」を定義します。 digitalRead(ピン番号) で ピン番号 の状態を読み込み、その値(HIGH または LOW)を 変数 din に記録します。
     int din ;
      din = digitalRead(ピン番号);

  3. スイッチによる点滅回路

     ブレッドボードにスイッチ回路と LED の回路を組み込みます。LED の配線は先の点滅回路と同様です(UNOとの接続端子を8番に変更しました)。スイッチ回路の配線は 、まず、スイッチの右下の端子と UNO の GND の端子(黒いコネクタ右から3番)を接黒い線で接続します。次に UNO の VCC の端子と 10kΩの抵抗を接続し、抵抗の他端をスイッチ右下の端子と同じ列に差し込みます。
     最後に、スイッチの右上と UNO の D10(10番端子) を緑の線で接続します。

       スイッチとLEDの回路の写真                配線図

  4. 演算と条件判断

     ここで、Arduino で利用できる演算や条件判断をまとめておきます。詳細は、「ヘルプ」メニューの「レファレンス」で参照できます。演算には、加減乗除(+,-,*,/)を行う「算術演算」と、大小関係を判断する「比較演算」、判断の結果を連結する「論理演算」があります。
     算術演算の対象となる数には「整数」と「小数」があります。「小数」の計算は UNO では時間がかかる(0.1m秒程度)ので、できるだけ「整数」演算を利用します。整数の割り算は余りを無視します。 10 / 3 は 3 、3 / 5 は 0 になります。 整数の余りを利用したい場合 % 演算を資料します。 10 % 3 は 1 、3 % 5 は 3 になります。
     「比較演算」には >, >= ,< ,<= , ==, != があります。より大きい、以上、より小さい、以下、等しい、等しくない の比較を行い、結果を TRUE、FALSE で返します。
     複数の比較演算を、&&(and:論理積) や || (or:論理和)で連結できます。x が 3 以上で 5 以下をチェックしたい場合以下のようになります。
    比較と論理演算の例 ( x >= 3 ) && (x <= 5)
     & や | は整数の各ビットの 1、0 を TRUE、FALSE の論理値と考え、各ビットごとに 論理積、論理和を計算します。
     int x=6;int y=3; int w = x & y; int v= x | y; 
     x=0110、 y= 0011 ですから w=0111、 v=0010 となります。
    また、代入と演算を組み合わせた演算もあります。
     i++ は i = i + 1 、i-- は i = i -1、の意味です。
    また、x += 1 x = x + 1 の省略形で、左辺にある変数を右辺の先頭に加えます。同種の省略はすべての演算で可能です。( -= ,*= .&= )など。

  5. スイッチ利用の点滅プログラム

     先に、一定時間感覚で点滅するプログラムを紹介しました。今回は スイッチの状態で 発光する時間を変更します。
      if(<条件>) 命令1 ; else 命令2
    は、<条件>が満たされたとき、続く 命令1 を実行し、満たされない場合は 命令2 を実行します。
    以下のプログラムでは  din が  LOW になり delay(1000)を実行します。スイッチが オフ なら delay(200) を実行します。
      if(din == LOW) delay(1000); // スイッチはオンなら1秒
      else delay(200);             //オフなら0.2秒 待つ  
     スイッチを利用した点滅プログラムは以下のようになります。led 端子を8番に変更しました。
    //swの状態で異なる点滅
    
    int led = 8;
    int sw = 10;
    int din;
    
    // 初期設定
    void setup() {                
      // 端子のモード設定
      pinMode(led, OUTPUT);
      pinMode(sw,INPUT);     
    }
    
    // 繰り返し実行
    void loop() {
      digitalWrite(led, HIGH);   // LED点灯
      din = digitalRead(sw);
      if(din == LOW) delay(1000); // スイッチはオンなら1秒
      else delay(200);            //オフなら0.2秒 待つ           
      digitalWrite(led, LOW);    // LEDwp消す
      delay(1000);               // 1秒待つ
    }
     UNO のボードをUSBで接続し、プログラムを入力後 UNO ボードに送りこみます。スイッチを切り替えて、点滅の周期が変化すれば成功です。

  6. 発展

     
    1. 他の種類のスイッチはありませんか?

      タクトスイッチは押している間、オンになります。他に、スライドさせると オンオフが変化するスライドスイッチ、スライドスイッチを4-8個並べたディップスイッチ、回転すると複数の状態が設定できるロータリー型スイッチなどもあります

        
       スライドスイッチ        ディップスイッチ        ロータリースイッチ

    2. テンキーのようなスイッチはありませんか?

       シート状のメンブレムスイッチ(SMF1217)などが利用できます。読み方は 「パターン表示」が参考になります。


    3. スイッチの値が読めないときがある

       5節のプロウラムでスイッチの値を読むのは、digitalRead(sw); をした瞬間だけです。delay(1000) などでお休みしているときにスイッチを押しても読み取りはできません。押したら確実に検知するには、「割り込み」の章を参照してください。

  7. スイッチを1回押しただけなのに、数回押したように反応する

     機械的スイッチは押したり,離れたりするとき、数回オン、オフを繰り返します。「割り込み」の章を参照してください。