多くの教本では、ここからArduinoの各種ピンの機能の説明などから入り、「Lチカ(ボードについているLEDをチカチカ点滅させること)」から始めます。しかし、これは興味があれば、教本を読んでください。我々は、さっそく電圧を測定します。ピンの機能等については逐次説明していきます。

 

まず1チャネル読んでみる

基本的にはセンサーの出力値を読むのが目標なので、入力電圧は直流(DC)です。Arduino UNOには6つのアナログピン(A0-A5)があります。グラウンド(GND)を基準として、図のように例えば電池を接続すると、その電圧がA0を通して読めます。

 

 

 

 

 

Arduino UNOの場合、読めるのは5Vまでです。当然、これを大きく超えるとぶっ壊れます。アナログ入力分解能は10bit(2^10=1,024段階)なので、だいたい0.005Vの分解能ということになります。0-1000kPaのレンジを0-5Vで出力する圧力センサーの場合、分解能は1kPaということになり、正直イマイチです。より高い分解能で電圧を読むには外部モジュールが必要で、後の回で紹介します。

  

図にある「fritzing」というのは、Arduinoなどの電子工作の作図を助けるソフトで、ロゴが勝手に入るだけなので気にしないでください。また、写真では電池を2つつないでいますが、これも気にしないでください。電池1個のケースが見つからなかっただけです(持っていたはずだけど・・・)。

 

次のコードをArduinoに送り、シリアルモニタを開いてください。

 

void setup(void)
{
    /* ----- Setting up serial communication with PC ------ */
    /* ここでUSBを介してPCとシリアル通信を始める。9600はシリアル通信のボーレート */
    Serial.begin(9600);
    while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
    //何らかの問題があってシリアルポートに接続できないときは、このループにトラップされる    
    }
}

void loop(void)
{
    int ainput; //読み取ったbit数:intは整数
    float vinput; //bit数を電圧に変換したもの:floatは浮動小数点数

    ainput=analogRead(A0); //ピンA0から電圧をbitとして読む
    vinput=5000.0*ainput/1024; //上記を電圧mVに変換
    //ここで5000.0でなく5000とすると、整数としてvinputにキャストされてしまう)
    //粗い値になったり、おかしな値になったりする
    
    Serial.print(ainput);
    Serial.println(" bit"); //" bit"と表示、printではなくprintlnとすることで改行する
    
    Serial.print(vinput);
    Serial.println(" mV"); //" mV"と表示、printではなくprintlnとすることで改行する
    
    delay(2000); //2000ミリ秒=2秒の停止
}

 

このように見えます。

 

 

複数チャネル読んでみる

他につなぐものがなければ、ピンA0-A5を全部使って、最大6チャネル分の電圧を読むことができます。後述のマルチブレクサーを使えればスイッチングでさらに拡張できます。ここでは3つ繋いだ例です。このようにたくさん接続していくと、GNDピンが足りなくなることに気付きます。ここでブレッドボードを使います。ブレッドボードは、内側で穴が下図のように電気的につながっていて、分岐が簡単にできます。

 

 

ですので、GNDを全てこのようにつなげてしまいます。

 

 

コードは配列(apins[])を使ってスマートにしましょう。

 

const int apins[3]={A0, A1, A2}; //配列でA0-A2を定義

void setup(void)
{
    /* ----- Setting up serial communication with PC ------ */
    /* ここでUSBを介してPCとシリアル通信を始める。9600はシリアル通信のボーレート */
    Serial.begin(9600);
    while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
    //何らかの問題があってシリアルポートに接続できないときは、このループにトラップされる    
    }
}

void loop(void)
{
    int cnt1;
    int ainput; //読み取ったbit数:intは整数
    float vinput; //bit数を電圧に変換したもの:floatは浮動小数点数

    for(cnt1=0;cnt1<3;cnt1++)
    {
      ainput=analogRead(apins[cnt1]); //ピンA0-A2から順次、電圧をbitとして読む
      vinput=5000.0*ainput/1024; //上記を電圧mVに変換
      Serial.print("Ch"); Serial.print(cnt1);Serial.print(": "); //チャネル番号を表示
      Serial.print(ainput); //ピンA0から電圧をbitとして読み、表示
      Serial.println(" bit"); //" bit"と表示、printではなくprintlnとすることで改行する
      
      Serial.print("Ch"); Serial.print(cnt1);Serial.print(": "); //チャネル番号を表示
      Serial.print(vinput); //ピンA0から電圧をbitとして読み、電圧に変換して表示
      Serial.println(" V"); //" V"と表示、printではなくprintlnとすることで改行する
    }
    
    Serial.println(""); //結果を見やすいように、ループごとに1行空けましょう
    
    delay(2000); //2000ミリ秒=2秒の停止
}

 

これを走らせると・・・

 

 

この例ではA1, A2に電池をつないでいないのでCh1とCh2には不定値(適当に暴れる値)が出ていますが、電池をつなげばきちんと測れます。

 

これで、10bitという比較的低分解能ながらも、Arduinoで電圧を読むことができました。記録さえできれば(次回、SDカードへの書き込み方を勉強します)、最低限のロガーになります。

 

参考:

ほとんどの種類のArduinoのADCは10bitですが、ARM Cortexプロセッサを搭載したArduino Dueや、Espressif社のESP32というより高機能なマイコンボードは12bitのADCを持っています。ただし、後の回で学ぶように、16bitで読めるモジュールが安く手に入るので、12bit欲しさにこれらを買う必要はありません。