mbedのAnalogInとDigitalOutとSerial通信の機能を使った。
CdS+LED on mbed


CdSを手で隠すとLEDが光るようにした。
CdSは光に反応して抵抗値が変わるセンサー。mbedに6ポートあるADコンバータでCdSの電圧を計測すると、明るさがわかる。
CdS+LED on mbed

プログラムはcds_led_serial | mbedにpublishした。
mbedのアカウントを持っている人ならすぐに右上のImport program into Compilerというリンクからいじれる。


動作確認用に基板上のLED1は0.3秒間隔で点滅させつつ、p15のADCの値を見てブレッドボード上のLED2を点灯/消灯させるコード

#include "mbed.h"

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);
    }
}
C++はboostばかり使っていたので、printfを久しぶりに使った。
他のサンプルコードを読んでるとたまに上の方でusing std;している物もあるので、mbedでstdは使えるんだろうな多分。

ADコンバータのレジスタへの操作はAnalogInのオブジェクトを作った時点で隠蔽されてるけど、変数ainとして作ったAnalogInのオブジェクトを読む毎にAD変換が行われるんだろうか??
たぶん行われる気がするので、今回は一度値を別のint型変数に代入するようにした。



回路図。今回使った小さいCdSは、光の状態で変動するがだいたい1kΩ前後の抵抗値を持っている。
GNDとmbedのADコンバータ(15番ピン)の間に同じく1kΩ程度の抵抗を入れて分圧し、電圧を計測した。
CdS+LED on mbed


mbedはSerialライブラリでパソコンと通信できる。MacやLinuxなら特にドライバ等必要なしに、/dev/tty*にusbmodemとして認識されているはず。windows用にはCOMポートとして認識できるドライバが公開されている。
シリアル通信をモニタしてみると、CdSからの電圧を計測している15番ピンは0.1〜0.6の間の値を出力している事がわかった。
mbedのプログラム中で、ADCが0.4以下の値の時にブレッドボード上の緑色のLED(led2)を点灯させ、逆の時は消灯するようにした。
mbed-adc-serial


シリアル通信のモニタにはruby-serialportで作ったterminalを使っている