CLCD-BOOSTERに搭載されている温度センサーと光センサーを読み取って、文字LCDに値を出力すると共に、光センサーの値でRCサーボを動かす例をスケッチしていました。RCサーボは、2つまでつなげられますので、温度センサーの結果でもう一つのRCサーボを動かすようにしてもいいかもしれません。今回、温度センサーではなく、光センサーの出力をRCサーボに出力することを選択したのは、温度の変化は通常ほとんどなかったり緩慢なため、RCサーボが元気に動かないからです。RCサーボを光センサーと組み合わせると、光センサに手をかざしたりライトを当てたりすると、RCサーボが勢いよく動いて結構楽しめます。
センサーを利用するスケッチの動作例
また、温度センサーを手で触ると、計測している温度がすぐに上昇していき、これも面白いですね。
同様なスケッチをPIC用のPICSYSフレームワークで記述した例も参考にして比較してみてください。
#include <LiquidCrystal.h>
#include <Servo.h>
#define VCC 5.1 // あなたのボードの実測の電源電圧は?
#define PHOTO_SENSOR 4 // アナログ4
#define TEMP_SENSOR 5 // アナログ5
#define RCSERVO1 9 // デジタル9 PWM
#define RCSERVO2 10 // デジタル10 PWM
// JP3でR/WはGNDに落としています
// LiquidCrystal clcd(4, 3, 3, 14, 15, 16, 17); // Arduino-0016以前
LiquidCrystal clcd(4, 3, 14, 15, 16, 17); // Arduino-0017以降
Servo rcservo ;
void setup()
{
clcd.begin(16, 2) ; // Arduino-0017以降は追加
clcd.clear() ;
clcd.setCursor(8,0) ;
clcd.print("MicroFan");
clcd.setCursor(4,1) ;
clcd.print("CLCD-BOOSTER");
rcservo.attach(RCSERVO1) ;
delay(5000) ; // タイトルクレジットを見てね
}
void loop()
{
int v ;
float temp ; // 温度の計算は実数で
clcd.clear() ;
v = analogRead(PHOTO_SENSOR) ;
clcd.setCursor(0,0) ;
clcd.print("\261\266\331\273 ") ; // アカルサ
clcd.print(v) ;
rcservo.write(map(v, 0, 1023, 20, 160)) ; // RCサーボを動かす
v = analogRead(TEMP_SENSOR) ;
clcd.setCursor(0,1) ;
clcd.print("\265\335\304\336 ") ; // オンド
clcd.print(v) ;
temp = VCC / 1024 * v ; // 読み取った値を電圧に換算
temp -= 0.4 ; // 温度センサーの0度のオフセット:400mV
temp /= 0.01953 ; // 1度あたり19.53mVの電圧増加
clcd.setCursor(9,1) ;
clcd.print(temp) ; // 小数点以下2桁まで出るみたいだけど精度的には意味はない
clcd.print("\337C") ; // 度C
delay(100) ;
}
このスケッチでは、文字LCDを操作するためにLiquidCrystalライブラリを、RCサーボを操作するために、Servoライブラリを利用しています。
文字LCDへのprintを利用した出力では、バックスラッシュもしくは円マークで始まるわけのわからない?数字の文字列を出力していますが、これは文字コードを8進数であらわしたもので、メッセージの出力に文字LCDのカタカナフォントを表示するために使っています。
printメソッドは実数値も出力できるようになったので、温度計算などで実数演算を使って計算した値をそのまま出力できます。
温度センサーの出力値の温度への換算法は、スケッチに書いている通りです。 :-)
CLCD-BOOSTERに利用しているマイクロチップ社の温度センサーMCP9701は、温度の絶対精度は少し甘いのですが、1度あたりの電圧の変化量が19.53mVと、よく利用されているLM35DZに比べるとほぼ2倍と大きいので、オペアンプなどで増幅しなくてもそれなりに楽しめます。また、3.3Vでも利用可能なので、最近の3.3V系のMCUで利用するのにはうってつけです。