今回は、反射型赤外線センサ(TCRT5000L、下図)を使ってみます。
まずは、TCRT5000Lのデータシートを検索しておきましょう。
TCRT5000Lのデータシートを検索する(別ウインドウが開きます)
IRエミッタ(IR LED)とIRディテクタ(IR photo-transistor)がセットになった素子です。普通は、IRエミッタが発光した赤外線(IR)が、前方の障害物に反射して戻って来たところをIRディテクタで受信して、前方に障害物があることを検知する「障害物センサ」などとして使用されます。
データシートより、この後の設計に必要な特性値をまとめておきます。
IR LEDの波長は、赤外線リモコンに使われているのと同じ、950nmです(「#3-9 キッチンタイマを作る」等を参照のこと)。
そんなに難しい素子ではないので、早速実験してみましょう。
実験用の回路は以下図の様になりました。
ポイントは以下の通りです:
全体の動作としては、ArduinoのD9端子でIRエミッタを光らせ、A0端子でアナログ電圧を計測して判定する形です。基本的には、「前方に障害物が有るか/否か」で判定するので、実用的には、アナログ入力A0の代わりにデジタル入力端子を使っても、良い様に思います。
実験に使用するプログラムをリンクしておきます。
実験プログラム:test_refl.ino
Arduino UNOでコンパイル&書き込むと、シリアルモニタから、以下のコマンドを受け付けるようになっています。
以下、実験中の様子です。
ブレッドボードに挿したTCRT5000Lは、上を向いていますので、上方向に障害物(反射板)を置いて、赤外線を反射させます。障害物は、万能基板(5×7[cm])に表面がつるつるした白い紙を貼り付け、M2スペーサでかさ上げして使っています。
周りに、未使用のブレッドボードが見えているのは、障害物の台座として使うためです。
赤外線の反射率は、障害物の材質や表面状態などによって、変化します。さらに、障害物の大きさによって、跳ね返ってくる赤外線量が変化します。従って、このセンサでは、IRディテクタで検出したレベル値から、絶対的な距離を測定することは困難です。IRディテクタ出力をアナログ値で取得すれば、ある程度、相対的な距離は知ることができるかもしれません。
実験を進めます。
実験サンプル:【 】内はシリアルモニタからの送信データ
【led,128】
OK: ir led duty=128 det=2363[mV]
デューティの後に表示される電圧は、A0端子をanalogRead()した値です。ただし、IR LEDをPWMで発光させているので、PWMがONしたタイミングと、OFFしたタイミングで測定したanalogRead()値はばらつきます。そこで、32回連続でanalogRead()して、その平均値を表示しています。単なる、目安だとお考えください。
この実験は、もう1機Arduinoを立ち上げ、Logiscopeのデジタルオシロスコープ機能(【osc】コマンド)を使って、IRディテクタの出力レベルA0を確認することが主目的です。2機目のArduino(筆者はArduino Microを使いました)でLogiscopeを起動して、以下のコマンドを実行してください。
実験サンプル:【 】内はLogiscopeからの送信データ
【osc,7,-8,5,0】
…… 回路図のA0とGNDをMicroのA0端子とGNDに接続して測定してください。
以下図の様な波形が取得できました。
この時のTCRT5000Lと障害物間の距離は、およそ7mmでした。……めっちゃ、近いです(1^^;)。IR LEDを発光させるPWM周期で、HIGHとLOWレベルが出力されているので、デジタル入力で十分、検知可能です。
480Hz、デューティ50%のPWMで光らせていますので、そのような波形になっています。LOWレベルの期間が発光している時間ですので、出力したPWMに対して、IR LEDの発光時間が伸びているのか、IRディテクタのスイッチングが遅れているのか、少〜しデューティがずれている(LOW幅が広い)みたいです。
少し距離を離して観測してみましょう。今度は、TCRT5000Lと障害物間の距離を103mmに離して観測しました。
検出はしていますが、電圧の変化量はわずかです。さすがに、デジタル信号として検出するのは無理ですね。この回路だと、アナログ信号として検出しないと、無理みたいです。信号の変化量としては、1Vほどありますので、アナログ電圧で測定すれば、十分検出可能なレベルです。
どうしてもデジタル信号として入力したい場合には、コンパレータを使い、適切なレベルを閾値としてデジタル信号に変換すれば、良いと思います。
障害物センサとして使用する場合には、どのくらいの距離で検出したいか?によって、感度を設定する事になります。まだ、IRエミッタ(If)を余裕のあるスペックで使っていますので、スペックぎりぎりまで攻めて使えば、もう少し感度を上げることも可能でしょう。
なお、この実験をする時、赤外線を発光していない時のIRディテクタ出力レベルは、太陽光(自然光)に含まれる赤外線量で多少ばらつくので、昼間なら遮光カーテンを閉めるなどした方が、安定して実験できると思います。
※逆に、フィールドでの応用では、太陽光(自然光)に含まれる赤外線を考慮したシステムにしておく必要があります。
「障害物センサ」であれば、ロボットカーとか、二足歩行ロボットとかへの応用が考えられるのですが、今のところ、興味がありませんf(1^^;)。実は、TCRT5000Lを購入したのは、IR LEDを赤外線リモコンの送信に使用したかったから、なのでした。
ここからは、TCRT5000LのIRエミッタ(IR LED)だけを使って、赤外線リモコン信号を送信してみる実験です。
リモコン用赤外線LEDは、単体でも販売されているのですが、特に安い商品だと、メーカや型番がわからず、電気的特性が不明なものが多くて、使い難いと思いました。
そのような中、反射型赤外線センサとして販売されていたTCRT5000Lは、型番からデータシートを入手することができ、電気的特性を知ることができました。しかも、赤外線リモコンと同じ波長950nmと言うことで、リモコン用に流用可能なこともわかりました。
本ページ最後に購入価格を示しますが、10個入りでこの価格なら、2個や3個壊れたところで替えが利くので、大胆に実験を進めることができます。
「#4-3 赤外線リモコン(送信)」で赤外線リモコン信号を送信した時の記事を復習してみてください。あの時に残った課題は、赤外線リモコン信号の到達距離の問題でした。以下、まとめておきます。
今回、10個入りのTCRT5000Lを入手したことで、だいぶ余裕ができました。2個や3個壊れても、実験に支障は出ませんので、多少電気的特性違反気味であっても、ギリギリまで攻めてみたいと思います。
赤外線リモコン信号を遠くまで飛ばすには、IR LEDの発光強度を上げる必要があります。発光強度は、IR LEDの消費電流で決まるので、IR LEDに流す電流を大きくすることに帰着します。
そこで、前節で示した回路図(以下に再掲)において、IR LEDに流す電流値をギリギリまで大きくして見たいと思います。
まず、IR LEDの駆動に使用するNPNトランジスタ(型番S8050を使用)の仕様を確認しておきます。
S8050のデータシートを検索する(別ウインドウが開きます)
調べてみたところ、複数社のデータシートが見つかりました。困ったことに、各社微妙に仕様が異なります。しかし、手元のS8050のメーカ名がわかりません。複数のデータシートを参照し、ざっくり平均取って、以下の値として設計することとします。
正確なスペックは「不明」なので、十分マージン取って設計するしかありません。
ここで、NPNトランジスタの電流値の関係をまとめておきます。
前の節で示した回路図では、TCRT5000LのIRエミッタ(IR LED)の定格電流値If=60mA(MAX)をきっちり守った上で、更にマージンを持たせ、Rf=100Ωとしたことで、If≒32.5mAとしました。後ほど、この電流値で、どこまで赤外線リモコンが届くか、実験で確かめてみたいと思いますが、「#4-3 赤外線リモコン(送信)」で実験した時と変わらない電流値なので、飛んで〜1mと言ったところではないでしょうか?
今回は、多少定格をオーバしてでも、赤外線リモコンの到達距離を延ばすことにトライしたいと思います。
やることは簡単で、IR LEDに流す電流値を増やします。もっと言うと、限界まで抵抗Rfを小さくして見ます。
定格では、IR LEDに流せる電流値If=60mA(MAX)なのですが、もう一つ、変なスペックがありましたね?
「順方向サージ電流:Ifsm<3A(MAX)、ただしtp≦10μs」
そのまま読み下すと、「パルス幅10μs以下なら、If(ABS.MAX)=60mAを超えて、Ifsm<3Aまで流して良いよ」と、なりますが……。デューティの規定が抜けているんじゃないでしょうか??普通は、デューティの条件が追加されていて、例えば「デューティ≦1%」等が条件になっているのですが……。
38kHz、デューティ1/3のIRリモコンのキャリア波形だと、IR発光時間は1/38kHz/3≒8.8μs≦10μsなので、「tp≦10μs」の条件を満たしています。
今回は、仮に壊れて焼き切れてしまったとしても、数に余裕があるので、ちょっと不安ですが、3Aとまでは言わないまでも、If=60mA(MAX)の規定を超えて、電流を流してみようと思います。
※試してみて、ダメだったら(壊れてしまったら)、諦めます(1^^;)。
抵抗Rf=5Ωくらいまで検討してみましょうか?
抵抗値 Rf[Ω] |
電流値 If[mA] |
電力(抵抗) Prf[mW] |
備考 | 判定 |
100 | 33 | 109 | 定格内で使用する場合。問題なし。 | ◎ |
50 | 65 | 211 |
定格If=60mA(MAX)は、少しオーバするが、 許容範囲(?)。 抵抗で消費する電力Prfが抵抗器の定格1/4[W]に 迫っているので、ちょっと発熱するかも? これは、50Ωを100Ω//100Ωとすることで 回避可能。 |
○ |
25 | 130 | 423 |
Ifは完全に定格オーバ。 拠り所は、Ifsm<3A (tp≦10μs) Prfも、1/4[W]では足りないが、100Ωの4並列で 25Ωを構成すれば、回避可能。 |
△ |
10 | 325 | 1,056 |
UNOの消費電流値約70mAと合わせて、 400mA弱となるので、そろそろ、USBからの給電 (MAX 500mA)では足りなくなる。 10Ω×1個では、1/4[W]に対して定格オーバ。 かなり回りくどいけど、(10//10)+(10//10)=10Ωだと、 抵抗1個で消費する電力は1/4となり、Prf/4=264mWと、 若干オーバ(※)。 |
△ |
5 | 650 | 2,113 |
USBからの給電は無理なので、別途、十分な 電流容量を持った外部電源から給電する 必要がある。 電力も2Wを超えているので、定格の大きな抵抗器が 必要。 |
× |
※IR LEDを光らせるPWMのデューティが1/3なので、平均消費電力で見ると1/3になると考えれば、抵抗器の定格には少し余裕ができます。
ちょっと、手持ち抵抗とブレッドボードでの回路構成では、Rf=10Ω辺りが限界かも知れないですね。
Rf=10Ωを目標に考えて、NPNトランジスタ(S8050)の電流増幅率hFE=50程度だとすると、If=hFE×IbとなるIbをベースに流す必要があります。Ib=If/hFE≒6.5mA程度ですね。先ほど、S8050の仕様を確認したところで導出した式、Ib=(Vcc−Vbe(SAT))/Rbでしたので、Rb=1kΩだと、Ib≒4mAしか流せない計算で、ちょっと足りません。
恐らく、hFE=50の見積もりが、低く見過ぎている感があるので、実力では問題なさそうな気はしますが、Rbを500Ωくらいに下げておいた方が良いかも知れません。
まとめておきます。回路図において、以下の回路定数を変更して実験します。
Rb=500Ω
Rf=10Ω …… =(10//10)+(10//10)Ω (1/4[W]抵抗器×4個)
いきなり、Rf=10Ω(If≒325mA)で実験して、一発でIR LEDが壊れてしまうと、動かない原因がプログラムなのか、回路なのか、訳が分からなくなりますので、まずは、定格内のRf=100Ω(If≒33mA)の回路(上で示した回路図のまま)で試してみます。
なお、評価用のプログラムは、「#4-3 赤外線リモコン(送信)」で作成したプログラムがそのまま使えます。以下にリンクしておきます。
実験用プログラム:test_ir_send.ino
使い方などは、「#4-3 赤外線リモコン(送信)」をご覧ください。Arduino UNOにコンパイル&書き込んで、実験してみます。
※もし、プログラム(test_ir_send.ino)の取り込み機能を使いたいなら、「#4-3 赤外線リモコン(送信)」の回路図に従って、回路を構築してください。今回は、送信のみ、実験します。
実験サンプル:【 】内はシリアルモニタからの送信データ
【send,0】
OK: ir pattern #0 sent
まず、定格内の回路(Rf=100Ω、If≒33mA)で、赤外線リモコンの送信は、成功です。対象機器の動作を確認することができました。
反応した距離ですが、これがなかなか難しい。機器によって、反応する距離は異なりました。1m以上離しても反応する物、80cmくらいまでよらないと反応しない物、様々で、一概には言えません。シリアルモニタからコマンドを送信している都合上、実験装置をPCからあまり離せないという制約もあり、うまく測定できません。
少し電流を増やしてみます。Rf=50Ω、If≒65mAとしたところ、到達距離が伸びた様です。反射センサ用と言うことで、レンズなどでビームを絞ってあるのか、赤外線の広がる範囲が狭い様で、距離が離れて反応しなくなっても、相手の受信器と正対させると、2m近く離しても反応することがありました。
ここまで来たら、一気に電流を増やしてみましょう。Rf=10Ω、If≒325mAとして見ました。更に到達範囲が伸びたことは確認できました。多少、距離が離れて、相手の受信器と方向が合っていなくても、反応することを確認できました。
それでも、If≒33mAの時に80cmだった相手と、If≒325mAでは2mくらいまで離れられただけで、ちょっと期待したほどではない様な……。専用のリモコンだと、3m以上離れていても反応します……。
※何が違うの??この辺で降参ですね。筆者がやりたかったのは、「PCから数m範囲内の機器をリモコンで操作したい」、だったので、ひとまず、目的は果たせそう……。
兎にも角にも、If≒325mA程度流しても、TCRT5000LのIRエミッタ(IR LED)が壊れず(焼ききれず)に光り続けている様なので、その点は収穫でした。実は、「寿命が短くなっている」のかもしれないので、暫く使ってみます。
今回のお買い物は、以下の通りです。
以前にも一度書きましたが、リモコンの送信機って、大抵、スイッチ部分が壊れませんか?押したつもりが送信されなくて、ギュっと力を込めて押すと、やっと反応するみたいな状態で壊れ始めて、最後には、特定のボタンが全く反応しなくなる……。メジャなTVやHDDレコーダ等のリモコンなら、サードパーティから互換機が販売されているので何とかなりますが、マイナなリモコンが壊れると、どうにもなりません。
しかも、ほとんど「リモコン」としては使っていないのですよ、本体の操作パネルが簡略化されてしまっていて、リモコン無しでは操作ができないだけのことで、すぐ手の届く範囲の機器をリモコンで操作していたりします。そのリモコンが壊れると、基本的な操作もままならない状態となります。
メーカさんも、リモコンは「おまけ」ではなくなっているのだから、耐久性に留意して作ってほしいものです。
筆者は、「#4-3 赤外線リモコン(送信)」の回路とプログラムを使って、リモコンの送信波形を取り込んであります。万一、リモコンが壊れて、操作ができなくなってしまっても、Arduinoでエミュレートできるように。今回の赤外線リモコン送信用IR LEDのテストも、そんな野望の一環でした、とさ。