今日は、LEDを光センサとして使って、外から入射する光を検出できるようにしようと思いました。
ご存知のとおりLEDは電流を流すと発光する素子ですが、逆に、LEDに光を当てると光起電力を生じます。
この起電力を検出することで、タッチパネルみたいなことができるかと思ったわけです。

せっかくSpartan-6という最新のFPGAを使っているし、使っているのはフルカラーLEDなので、検出したレベルに応じて赤→緑→青と色調を変化させることにしました。そのためには、LEDをアナログ的な、滑らかな諧調で表示しなければなりません。
LEDのドライブは昨日はPWMでやっていましたが、今日はΔΣ DACを使いました。これで、個々のLEDをちらつかせずに26万色くらいの諧調で変化させられるようになったはずです。(・・確認はできませんが)
ところで、人間の目の感度は明るさに対して直線的ではないので、LEDに出力するDACの値を補正してやらないと、明るい領域でほとんど変化していないように見えてしまいます。その補正はいろいろあるのですが、表示したい明るさを三乗して、光の量として出力するのが簡単そうです。これで、かなり直線的に変化して見えるようになりました。
(つまり、2倍明るく感じさせるには、8倍の時間光らせなければならない。)
幸い、Spartan-6のFPGAの中にはハードウェア乗算器が32個も入っているので、表示したい明るさを三乗する回路をつくってやりました。RGBでそれぞれに2個という贅沢な使い方をしましたが、それでもまだ6個しか使っていません。Spartan-6のDSP48ブロックはまだまだあまっています。要は
「出力値→3乗で補正→ΔΣ DA変換(16bit)→I/Oから出力」
こんな回路を列ごとに入れています。かなり豪華ですが、それでもSLICE使用率はまだ7%くらいです。
表示回路はこのような感じでかなり良いものに仕上がったので、今度は光検出回路を作ることとします。ためしに室内の明るさをデフォルトとして、それよりも暗いと判断された場合は、LEDを光らせることにします。
しかし実際にやってみると、マトリクスを組んだLEDアレイを光センサにするのは、なかなか難しいことがわかりました。実際にやってみたときの様子は、次のような感じです。
FPGAの端子にLEDが1個だけつながっているならば簡単なのですが、マトリクスにしてしまうと、どうも検出の精度がよくならないようです。隣の素子や、縦横の列にも反応しているようです。
それに、LEDマトリクスの上に指を乗せると、指が影になって暗くなったときに、他の素子がすべて反応してしまいます。これでは、タッチパネルのような操作感が得られません。
LEDマトリクスを光センサにしてタッチパネルのようなことをするには、室内の明るさを検出して行うという方式では難しいことがわかりました。
最近のコメント