4月 212010
mbedのAnalogInとDigitalOutとSerial通信の機能を使った。
CdSを手で隠すとLEDが光るようにした。
CdSは光に反応して抵抗値が変わるセンサー。mbedに6ポートあるADコンバータでCdSの電圧を計測すると、明るさがわかる。
プログラムはcds_led_serial | mbedにpublishした。
mbedのアカウントを持っている人ならすぐに右上のImport program into Compilerというリンクからいじれる。
動作確認用に基板上のLED1は0.3秒間隔で点滅させつつ、p15のADCの値を見てブレッドボード上のLED2を点灯/消灯させるコード
#include "mbed.h"C++はboostばかり使っていたので、printfを久しぶりに使った。
Serial pc(USBTX, USBRX);
DigitalOut led1(LED1); // on board LED
DigitalOut led2(p11);
AnalogIn adc(p15);
float ain;
int main() {
while(1) {
led1 = !led1; // blink LED
ain = adc;
if(ain < 0.4) led2 = 1;
else led2 = 0;
pc.printf("%f\r\n", (float)ain);
wait(0.3);
}
}
他のサンプルコードを読んでるとたまに上の方でusing std;している物もあるので、mbedでstdは使えるんだろうな多分。
ADコンバータのレジスタへの操作はAnalogInのオブジェクトを作った時点で隠蔽されてるけど、変数ainとして作ったAnalogInのオブジェクトを読む毎にAD変換が行われるんだろうか??
たぶん行われる気がするので、今回は一度値を別のint型変数に代入するようにした。
回路図。今回使った小さいCdSは、光の状態で変動するがだいたい1kΩ前後の抵抗値を持っている。
GNDとmbedのADコンバータ(15番ピン)の間に同じく1kΩ程度の抵抗を入れて分圧し、電圧を計測した。
mbedはSerialライブラリでパソコンと通信できる。MacやLinuxなら特にドライバ等必要なしに、/dev/tty*にusbmodemとして認識されているはず。windows用にはCOMポートとして認識できるドライバが公開されている。
シリアル通信をモニタしてみると、CdSからの電圧を計測している15番ピンは0.1〜0.6の間の値を出力している事がわかった。
mbedのプログラム中で、ADCが0.4以下の値の時にブレッドボード上の緑色のLED(led2)を点灯させ、逆の時は消灯するようにした。
シリアル通信のモニタにはruby-serialportで作ったterminalを使っている