トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS

DIY/mbed/LEDをアナログ入力で読み取ってみる

Last-modified: 2015-05-07 (木) 09:54:09 (953d)
Top / DIY / mbed / LEDをアナログ入力で読み取ってみる

DIY/mbed

mbed の AnalogIn?

こちら によりますと、mbed には 12bit の ADC が搭載されていて、6チャンネル (ピン番号で言うと PA_0, PA_1, PA_4, PB_0, PC_1, PC_0) 使えるようです。
今回はこれを使ってセンサの読み込みをしてみます。

LED Tile の衝撃

Maker Faire Tokyo 2012 だったでしょうか、
留守番を nukiwo に任せて他の方のブースを見せてもらっていた時、
秋田純一の日記(あるいは備忘録): LED Tile の記事にある LED Tile に出会いました。

詳しくは上記のリンク先の動画を見てもらいたいと思いますが、
LED に光を当ててその部分を光らせるという光センサ的な使い方をしていました。
自分は LED は出力デバイスという認識しか無かったので、この展示は衝撃的だったのを覚えています。

うちのサークルの nukiwo に電子工作の大御所 chan さんが同じように LED を光センサとして使ってみる記事、
LEDを光センサとして使ってみる を教えてもらって読んでみると、
LED に光を当てると微量ながらアソードカソード間に電流が流れるそうです。
LED Tile はこれを利用して光センサ的なことを LED にさせているのでしょう。

わたくしもチャレンジしてみます!
面白そうだなーと思ってから2年以上経過しているのがツライ。。(^^;)

やってみよう

led_sensor1.jpg


回路としては単純で、

  • A0 を LED+ に接続
  • LED- 側は抵抗(120Ω)を介して GND と接続

とするだけ。

この LED に身近にあった白色ライトを当てます。

led_sensor2.jpg


led_sensor3.jpg


プログラムのソースは mbed の "Read an analog value using ADC" まんまです。

  1. #include "mbed.h"
  2.  
  3. AnalogIn analog_value(PA_0);
  4.  
  5. DigitalOut led(LED1);
  6.  
  7. int main() {
  8.     float meas;
  9.  
  10.     printf("\nAnalogIn example\n");
  11.  
  12.     while(1) {
  13.         meas = analog_value.read(); // Converts and read the analog input value (value from 0.0 to 1.0)
  14.         meas = meas * 3300; // Change the value to be in the 0 to 3300 range
  15.         printf("measure = %.0f mV\n", meas);
  16.         if (meas > 2000) { // If the value is greater than 2V then switch the LED on
  17.           led = 1;
  18.         }
  19.         else {
  20.           led = 0;
  21.         }
  22.         wait(0.2); // 200 ms
  23.     }
  24. }


室内で実行してみたところ、

AnalogIn example
measure = 632 mV
measure = 962 mV
measure = 891 mV
measure = 682 mV
measure = 558 mV
...


大体 0.9V ~ 1.2V あたりを推移してます。
ここで白色光を当ててみます。

measure = 1211 mV
measure = 1385 mV
measure = 1378 mV
measure = 1488 mV
measure = 1492 mV
measure = 1502 mV
measure = 1496 mV
...


かなり近いところまで光を当てると最大 1.5V ぐらいまで上がりました!
光に反応していることが分かりますね。

ちょっと遊んでみる

LED にライトを当てたらその LED 自身を点灯させてみます。
プログラムとしては以下の様な感じ。

  1. #include "mbed.h"
  2.  
  3. int main()
  4. {
  5.     PinName ledPin = PA_0;
  6.     float meas;
  7.  
  8.     printf("\nLED Sensor Test.\n");   
  9.  
  10.     while(1)
  11.     { 
  12.         {
  13.             AnalogIn analogValue(ledPin);
  14.             wait(0.002);
  15.             meas = analogValue.read(); // Converts and read the analog input value (value from 0.0 to 1.0)
  16.             meas = meas * 3300; // Change the value to be in the 0 to 3300 range
  17.             printf("measure = %.0f mV\n", meas);
  18.         }
  19.  
  20.         if (meas > 1400)
  21.         {
  22.             DigitalOut led(ledPin);
  23.             led = 1;
  24.             wait(2); // 2s
  25.             led = 0;
  26.         }
  27.  
  28.         wait(0.2); // 200ms
  29.     }
  30. }


白色ライトを当ててアナログ値が 1.4V になったら LED を2秒点灯させる、というものです。

なんで AnalogIn?DigitalOut? を一番内側のスコープで宣言してるかといいますと、
どっちのインスタンスもある状態でもう一つのインスタンスを作ると上手く動かないんですよね。

例えば DigitalOut? をグローバルで作ってしまうとその値を引きずってしまって、
値を 0 にすると LED との電位差がなくなって AnalogIn? で数値を読めません。。
最初は DigitalInOut? でアナログ値を読む前に input にして入力方向に切り替えれば行けるんじゃね?とも思ったんですけど、ダメでした。

そんなわけでちょっと(かなり?)無駄なプログラムになってしまってます。


動いてますね。
電子工作でも大活躍の LED ですが、入力として使えるとさらに活躍の幅が広がりそうです。


2015/05/07 : 1st