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

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

Last-modified: 2015-05-07 (木) 23:46:23 (839d)
Top / DIY / mbed / MatrixLEDをアナログ入力で読み取ってみる

DIY/mbed

次のステップへ。

前回の DIY/mbed/LEDをアナログ入力で読み取ってみる にて LED 単体でのセンサ的な使い方ができました。
今回は Matrix LED に挑戦します!

mbed の ADC が足りない!

作業し始めた途端に問題が発生(^^;)
まずは mbed の ADC は 6 チャンネルしかないため、Matrix LED の 8 列分賄えません。
そのため今回は 6 列分を ADC で読み込みます。
下図での赤で囲った真ん中 6 列です。

matrix_led_sensor1.jpg

コモンの罠

そしてまたまた問題発生(^^;)
今回使用している Matrix LED は DIY/mbed/MatrixLED と同じものなのですが、
これはアノードコモン。つまり +極がひとまとめになっているものなのです。

何が問題かというと、ADC は電位差を見るものなので、通常は +極の方にピンを入れるはず。
今回は Matrix LED の各 LED をセンサとして値を見たいので、
下図で言うところの Column ピンで測定したいのです。
しかし、アノードコモンのため、Column ピンは -極側、電位0 のため正常に測れません!

matrix_led_sensor2.jpg


そこで測るところを +極にすると、
アノードコモンのため、同じ行の 8個のLEDすべてをカバーしてしまい、
8個中どこが光に照らされているか判別不能です(^^;)

うーん、この実験をする場合はカソードコモンが必要なのですな。。

なにはともあれ、
今回は真ん中の"6列"から"6行"へと変更になります(汗

matrix_led_sensor3.jpg

測定プログラム

以下の様なプログラムを用意しました。
0.2秒おきに ADC 6 チャンネルの値をシリアルで出力するだけのものです。

  1. #include "mbed.h"
  2.  
  3. static const int ANALOG_VALUES_NUMBER = 6;
  4. static const int CATHODE_PIN_NUMBER = 8;
  5.  
  6. AnalogIn analogValues[ANALOG_VALUES_NUMBER] = { PA_0, PA_1, PA_4, PB_0, PC_1, PC_0 };
  7. DigitalOut cathodePinsGreen[CATHODE_PIN_NUMBER] = { PC_10, PC_11, PC_12, PD_2, PA_13, PA_14, PA_15, PB_7 };
  8. DigitalOut cathodePinsRed[CATHODE_PIN_NUMBER] = { PA_11, PA_7, PB_12, PB_6, PC_7, PA_9, PB_2, PA_8 };
  9.  
  10. void setup()
  11. {
  12.     for (int i = 0; i < CATHODE_PIN_NUMBER; i++)
  13.     {   
  14.         cathodePinsGreen[i] = 0;
  15.         cathodePinsRed[i] = 0;
  16.     }
  17. }
  18.  
  19. void readSensor()
  20. {
  21.     float meas;
  22.  
  23.     printf("sensor value(mV) : ");
  24.     for (int i = 0; i < ANALOG_VALUES_NUMBER; i++)
  25.     {
  26.         meas = analogValues[i].read(); // Converts and read the analog input value (value from 0.0 to 1.0)
  27.         meas = meas * 3300; // Change the value to be in the 0 to 3300 range
  28.         printf("%.0f ", meas);
  29.     }
  30.     printf("\n");
  31. }
  32.  
  33. int main()
  34. {
  35.     printf("\nMatrix LED Sensor Test\n");
  36.  
  37.     setup();
  38.  
  39.     while(1)
  40.     {
  41.         readSensor();
  42.  
  43.         wait(0.2); // 200 ms
  44.     }
  45. }


私の環境ではすべて 1V 前後から始まり、

Matrix LED Sensor Test
sensor value(mV) : 1004 1021 1019 1026 1002 1002
sensor value(mV) : 1023 991 978 1015 998 954
sensor value(mV) : 1052 1032 1003 1027 1033 1006
sensor value(mV) : 1042 1011 1007 1025 1005 994
sensor value(mV) : 1048 1008 1029 1018 1042 1002
...


matrix_led_sensor4.jpg


ライトを当ててあげると、200mV 程度上昇します。
下記で言うと右から三番目の値ですね。

sensor value(mV) : 1023 1014 1001 1190 997 957
sensor value(mV) : 1024 997 969 1210 1019 962
sensor value(mV) : 993 1015 990 1200 1019 1007
sensor value(mV) : 1023 1013 1004 1173 1007 1009
sensor value(mV) : 1031 1014 994 1179 1010 1011

mbed の限界?(自分の限界?)

次に DIY/mbed/LEDをアナログ入力で読み取ってみる と同じように、
ある LED (今回はある行の LED 達ですが(汗)) に光を当てたら点灯させる、
をやろうとしたのですがどうやっても上手く行きません!
アノードピンを操作したが最後、0V になるか、3.3V になるかのどっちかになる。

前回がたまたま上手く行っただけで、
やはりちゃんとポートの設定をいじらないとダメなのかもしれませんね。。

さて、mbed だとその辺できるのですかね?
DigitalIn? とか AnalogIn? とか使いやすいクラスは用意されているのですが、生で叩く手段が無いような・・・。
見つけられて無いだけかもしれないですが。

そんなわけで作業をこれ以上進めるにはプラットフォームを変える必要があるかもしれません。
mbed、ピンも多いし手っ取り早いし良かったのですけどね。。

識者の助言(追記)

我がサークルのハードウェアマスター nukiwo に上記について聞いてみたところ、
まだ諦めるには早いとのこと。
しかしアドバイスが高度すぎて私には理解できていないので(苦笑)、
その辺はまた追記します。。


2015/05/07 : 1st
2015/05/07 : 追記