JapaninoでのADCについて

前の記事でJapaninoと温度センサを使って温度計を作ったが、温度がやけに高めになってしまう問題があったのでちょっと調べてみた。

デジタル温度計を作ってみる - andooのメモとか

Arduinoでアナログ信号をADC(アナログデジタル変換)する際に使用できる参照電圧には以下の3つがある。

  • DEFAULT: 電源電圧(5V、正確に言うとAVCCピン電圧)
  • INTERNAL: 内部で作られる1.1V
  • EXTERNAL: AREFピン電圧

ADCの出力はこれらの参照電圧を1024としたときの10bitの値で得られる。USBから供給される5V電源はそれなりの精度で安定しているだろうと考え、上記温度計ではDEFAULTの5Vを用いてADCを行うように設定していた。ところが、Arduinoに供給されている電源の電圧を測ってみると4.75Vしかないことがわかった。つまり、参照電圧が期待していた値よりも低かったため、ADCの結果が高めに出ていたということだ。Japanino基板上の電圧を調べてみたところ、どうやら犯人は電流の逆流防止用と思われるダイオードのようだ。このダイオードの入力と出力で電圧が5.05Vから4.75Vに降下していることがわかった。

対策として、参照電圧が4.75Vであるとして温度を計算するように式を修正した。これにより実際の温度にかなり近い値が表示されるようになった。


void loop() {
  int num = 20;
  long sum = 0;
  for (int i = 0; i < num; i++) {
    sum += analogRead(analogPin0);
    delay(5);
  }
  int temp = (int) (sum * 4750 / num / 1024 - 600);
  
  lcd.clear();
  lcd.print("Temp:");
  lcd.print(temp/10, DEC);
  lcd.print(".");
  lcd.print(temp%10, DEC);
    
  if (serial_gets(buffer, 16) > 0) {
    if (strcmp(buffer, "temp?") == 0) {
      Serial.println(sum, DEC);
    }
  }
}