アナログ入力

  1. アナログ信号

     「ディジタル」信号は、H と L の二つの状態しかとりません。入力端子の電圧が 1.2V のような中途半端な電圧でも、 val=digitalRead(ピン番号) で読み取ると、結果は 0(LOW) または 1(HIGH) の2値になってしまいます。1.0V でも 1.2V でも結果は 読み取ると 0 で同じです。
     「アナログ」信号は 連続した電圧に意味がある信号で、多くのセンサー素子は「アナログ」型で出力します。例えば、明るさセンサー(CDS)は明るさにより抵抗値が連続的に変化します。UNO には、アナログ入力を 複数ビットのディジタル信号に変換する機能があります。これは一般のPCでは利用できない機能です。

  2. AD変換

     Arduinoでは アナログ信号は A0-A5 の端子に接続します。アナログ信号の読み取り結果は 10bit の整数になりますから次のように読み込みます。
     int dv;
     dv=analogRead(ピン番号);ピン番号は A0〜A5、
     アナログ端子の電圧が電源の電圧(UNOの場合5V)のとき AD 変換値は 10bit がすべて1(10進数1023)になります。アナログ端子の電圧が最少(0V)のとき AD 変換値は10bit がすべて0(10進数0)になります。中間の電圧では変換値はアナログ電圧に比例した数値になります。アナログ端子の電圧が av のとき、AD変換値は入力電圧に比例しますから、つぎのようになります。ここで、右辺の( )の式は小数計算で。 int(値) は 「値」 の整数値を意味します。
     dv = (int)((av / 5.0) * 1024)
    av の値が 5/1024 [V] 大きくなると、av の値は1だけ増加します。
     AD 変換が 10bit に制限されているのは、AD変換回路の精度の問題があります。16bit の精度のするには 5/65536[v] =0.015[mV] の電圧の精度が必要ですが、電源や部品に高い精度が必要になります。
     
  3. DA変換機能

     DA変換とは逆に、指定したディジタル値でアナログ電圧を出す機能をDA変換と呼びます。UNO には厳密な意味では DA 変換機能は組み込まれていません。したがって、A0-A5 の端子は標準では「アナログ入力専用」になります。しかし、「PWM」とよばれる「平均的なパワー制御型」の DA 変換機能は利用可能です。「PWM」については別項目で説明します。

  4. 明るさセンサー

     AD変換を利用して明るさ(照度)計測するセンサー 「CdS」センサーを紹介します。「CDS」センサー は入射する光の強度が強くなると抵抗値が下がる物質(CdS:硫化カドミウム)で、フォトレジスタ(光依存性抵抗)とも呼ばれます。CdS は利用が簡便のためここでも紹介いたしますが、「環境汚染物質」なので EU(欧州連合) では使用禁止になっています。日本では部品の入手は可能ですが(40円程度)、廃棄には注意をしてください。多くの種類がありますが、この実験では変化を見るだけですから、どれでもかまいません。
     下図が CdS 素子で、大きさにより抵抗値は変化しますが、暗い場所では100「kΩ」以上、通常の明るさで数kΩ、明るく照明すると数百Ωと抵抗値が大きく変化します。
     
     
     CdS 素子          上面のCdSのパターン

     光強度に伴う CdS の抵抗の変化は 20[mS]程度かかります。この時間は、一般的なディジタル計測時間と比較して遅いので、高速に変化する光強度の計測には適していません。

  5. 実験回路

     抵抗の変化を電圧として取り出すために、固定の抵抗(10k)と CdS センサーを直列に接続し、接続点を「アナログ端子」 A1 に接続します。A1 の端子の電圧 Va は A1 から流れる電流を 0 とすると、
      Va = (Vc /(R + 10)) * R
    となります。ここで、Vc は電源の電圧(5V)、R を CdS の抵抗値とします。Vc /(R + 10) が回路を流れる電流になります。R に対して 直列抵抗の値(10kΩ)が十分大きくないと、 Va は R の値には比例しませんから注意してください。直列抵抗の値を大きくすると Va の値が小さくなり対応するディジタル値も小さくなってしまいます。

    この回路を、Uno に接続するブレッドボードに組み込みます。5V から 赤い線で抵抗(10k)に接続、抵抗の右端にCdSセンサー(右端)を接続し、CdSセンサー(左端)を黒色の線で UNO ボードの GND に接続します。最後に、CdS(抵抗)の右端を、緑の線で、UNO の A1 端子に接続します。

       Cds センサー回路の写真                    Cds センサー回路図

  6. シリアルモニター

     Cdsセンサーの値を表示するには前の項で照会したシリアルモニターを利用します。まず、Arduino の setup() で Serial.begin(9600); を実行します。 これで、シリアルモニターが利用できるようになります。Cdsセンサーの値を表示するには、Serial.print(<文字列>または<変数> ); を利用します。、Serial.print("sensor = " ); で は( )内の文字列 "sensor = " を送信します。 Serial.println(sensorValue); では sensorValue の値を文字に変換して送信し、改行します(println の最後の ln が改行を指示します)。 シリアルモニターで表示するには、Arduinoのメニューバーで 右の (シリアルモニター)をクリックします。

  7. 実験(CDS)

     まず、setup()が実行され、Serial.begin(9600); でシリアル通信を準備します。次に loop()を繰り返し実行します。まず、sensorValue = analogRead(analogInPin); で analogPin(A1端子)を読みこみ、SerialPrintln()でその値を表示し、100mS待ちます。
    これを繰り返します。
    //プログラム AD_Serial.c
    //AD変換とシリアル送信
    const int analogInPin = A1;  // A1をアナログ入力
    int sensorValue = 0;        // value read from the pot
    
    void setup() {
      // シリアルモニターを準備
      Serial.begin(9600);
    }
    
    void loop() {
      // アナログ端子 A1 をAD変換
      sensorValue = analogRead(analogInPin);                  
      // シリアルモニターに送る
      Serial.print("sensor = " );                      
      Serial.println(sensorValue);  //printの後に ln を付加する   
      delay(100);  //値を変更                    
    }

  8. 回路テスター

     CdS の端子の抵抗を回路テスター(通常テスターと呼びます)で測定します。回路テスターは 電子回路の部品屋さんや「ホームセンター」でも入手できます(1000円―2000円程度)。下部の端子に回路接続用の端子を接続し、赤、黒の端子を測定したい端子に接続します。中央のロータリースイッチで、直流電圧(DC)、抵抗、など測定したい項目を選択します。
     抵抗値を測ると、AD変換された「ディジタル値」の値を確認することができます。電圧や抵抗の測定など、回路のチェックに便利ですので、ぜひ、用意してください。

      回路テスター

  9. 応用

     
    1. 明るさの単位は何ですか?

       光の照度の単位は ルックス です。読み書きする室内の机上の明るさは 200-300 ルックス程度になります。身近に照度計があれば、それで校正することで、「簡易照度計」を作成することもできます。

    2. どんな応用がありますか

      「暗くなったら点灯する」、あるいは「明るい時には点灯しない」、などの装置の部品として利用することもできますね。

    3. 環境基準を満たした明るさセンサーはありませんか?

       NJL7502L などのフォトトランジスターが利用できます。これは、光エネルギーで流れる電流が変化するトランジスターの1種(フォトトランジスター)です。

        フォトトランジスタ