赤外線リモコン受光モジュールでシリアル通信

お金を掛けずに赤外線通信したい

赤外線を使ってシリアルデータを送る方法としてはIrDA用のモジュールを使う方法がありますが、専用の受光モジュールはちょっと高くて気軽に手を出せない感じ。しかも、IrDAよく分からない。

IrDA赤外線通信トランシーバ・モジュールRPM851A(2個入)

一方、赤外線リモコンの受光モジュールは結構安く売られています。(今回の実験につかったPL-IRM-2161-C438は、秋月電子のカタログから消えてしまいました…)

赤外線リモコン受信モジュール PL-IRM2161-XD1

実験してみる

今回は、この赤外線リモコンの受光モジュールを使って実際にシリアル通信が行えるかどうか、実験してみました。

全体の構成はこんな感じ。送信部、受信部はそれぞれUSBシリアル変換器経由でPCに接続されています。PCからは2つのシリアルポートに見えます。

PC(COM3)→USBシリアル→AVR(32KHz変調)→赤外線LED→→→ 受信モジュール→USBシリアル→PC(COM2)

受信部は、赤外線受光モジュール(PL-IRM-2161-C438)の出力にUSBシリアル変換器のRxDを直接つないでいます。

送信部は、USBシリアル変換器のTxDの信号にAVRマイコンを使って38KHzの変調を掛け、それを赤外線LEDに出力しています。

プロジェクトファイルはこちら(AVR Studio):irtrans.zip

ソースだけみたい人はこちら:irtrans.c

全体

赤外線受光モジュールの「PL-IRM-2161-C438」。秋月電子で2個100円でした。GND-VCC間に0.1uFのパスコンを挟んでます。この、「Vout」を直接シリアルのRxDにつなぎ込みます。

PL-IRM-2161-C438

送信部。電流アップ実験のために複数のポートを束ねてます。TxDに32KHzで変調を掛けられさえすればいいので、AVRマイコン使わずにNE555とかでもいいかも。赤外線LEDは、ごく普通のタイプです。秋月電子で5個100円でした。秋月電子大好き!

送信部

通信できた!

通信速度4,800bpsで受信してみます。ちゃんと通信できた!

4800bpsのとき

赤外線LEDの波形(上)と、受光モジュールの波形(下)を比較。これは、通信速度2,400bpsのときの波形です。おおよそ、200us遅延してますね。

2400bps波形

受光モジュールのデータシートではパルス幅Twl、Twhは600us(typ)と書かれています。そもそも赤外線リモコンの信号とは違うので保証外の使い方ですが、趣味で使うということで結果オーライです。(参考:ELM – 赤外線リモコンの通信フォーマット概要)

PL-IRM2161-C438

もうちょっと見てみましょう。通信速度2,400bpsのときの受光モジュールの波形を重ねて表示してみました。色が薄いところが信号のブレです。許容範囲ですね。

2400bps波形

こっちは、通信速度4,800bpsのとき波形。若干ブレてますね。上の実験ではちゃんと受信できてたけど、受信側によってはアウトかもしれない。

4800bps波形

ちなみに、9,600bpsだと、波形がくずれて受信できませんでした。しょんぼり…

9600bpsのとき

まとめ

赤外線リモコンの受光モジュールでも、低速ならシリアル通信出来ることがわかりました。もちろん、モジュールの種類でも結果が変わってくると思いますが、趣味の範疇なら問題なさそうです。

実際に使う場合は、蛍光灯のノイズや他のリモコン、障害物の影響等を考慮して、受信データのエラーチェックが必要になると思います。

応用編

今回の元ネタは、去年のMake Fair Tokyo 2012用に作った「ちっちゃい掲示板(写真)」です。

PCから文字のデータを赤外線で縦16ドットずつ送って、それを赤外線受光モジュールで受信してマトリクスLEDに文字をスクロール表示しています。送信データにはチェックサムを付けて、受信時にチェックサムが合わなかった場合(データ受信に失敗している場合)はデータを読み捨てる処理を入れています。

YouTube Preview Image

PC側のソフト。

掲示板データ送信ソフト

こんな感じで、マイコンのUARTを使った部分をちょっとワイヤレス化したいときに、赤外線のリモコン受光モジュールを使うとお手軽で良いのかなぁ、と思いました。

INA226でお手軽電圧・電流測定(ついでにBit-BangでI2C)

INA226をArduinoで使ってみました。後半にはオマケで、FTDIのBitBangモードを使った疑似I2Cを使ったバージョンもあります。

INA226とはテキサスインスツルメンツのICで、手軽かつ超高精度に電流・電圧・電力を測定することができます。インタフェースはI2Cです。

シャント抵抗まで実装されたモジュールが、ストロベリーリナックスから販売されているので、今回はそれを使いました。シャント抵抗が2mΩと小さいので、電圧降下がほとんど無視できます。

INA226モジュール

Arduinoと接続してみる

Arduinoとつないでみます。と言っても10kΩの抵抗2本なので超簡単。

取得できるのは電圧(Bus Voltage)、シャント抵抗電圧(Shunt Voltage)、電流(Current)、電力(Power)の4種類。電力、シャント電圧→電流の変換、平均化処理はIC内部勝手にやってくれます。電流と電力を計算するために、初期化時にCalibrationレジスタにシャント抵抗の定数を書き込んでおく必要があります。(2mΩの場合は0A00h)

詳しくは、ソースを見てください。

ソースはこちら:ina226_test2

2013/09/04追記:電力が1/10で表示される不具合を修正しました。

レジスタダンプ

回路図(Arduinoで接続)

実際に測ってみる

Nintendo 3DSLLの充電電流を測ってみました。813mAだそうです。(途中で電流が変動したので、写真の電源は0.65Aになってます)

配線がテキトウだったせいで、電源からUSBの付け根までハイサイド・ローサイド合計で約50mVの電位差がありました。きちんと測定するには、配線の抵抗も考慮しないとダメですね…。

3DSLLを充電中

3DSLL充電中

精度はどのくらい?

自宅のデジタルテスターで測った値とはほぼ一致してたので、まあ大丈夫な感じと思うんですが、秋月で4.096Vの高精度シャントレギュレータ(LM4040AIM3-4.1/NOPB)を買ったので、試しにつないでみました。4096mVぴったり!素敵!!

が…この値は、INA226の電源電圧に3.3Vを使ったとき。5.0Vにすると、4098Vになっちゃいました。orz

シャントレギュレータの電圧を測定

シャントレギュレータの電圧

FTDIのBitBangモードで疑似I2Cしてみる

元々は一昨年のKick4勉強会のネタですが、FTDIのFT232/245シリーズにはBitBangモードというICの信号線をパラレルIOのように使える機能があって、それを使って簡易的なI2C通信をやってしまおうという実験です。

できる!Bit-Bangモード

外付け部品がダイオード2本と抵抗3本だけなので、わざわざマイコンまで使いたくない場合にいいかも。

ソースはこちら(Visual C++2010):bitbang_ina226

2013/09/04追記:電力が1/10で表示される不具合があります。そのうち修正します…

BitBangで通信

回路図(BitBangでI2C)

Bitbangでi2c

そんなわけで

調整が要らないし、精度は高い(と思う)ので、なかなか面白いモジュールだと思います。

ゆくゆくはケースに組み込んで、スタンドアロンの計測器にしたいなぁと思ってます。