2023年2月19日日曜日

赤外線で通信する(その2)受信部

 【受信部】

受信部は赤外線を受信モジュール(OSRB38C9AA)で37.9KHzの赤外線キャリヤを受信しPICのEUSARTの受信部に渡す。今回は次のステップを考えてPICにはEUSARTを2セット内蔵するPIC16F15325を選んだ。基本的な回路は次のようにしたがLEDを光らせる条件は後で決める。

ここで私が使った基板にはLEDを正論理で光らせるように予めパターンが作ってあったのでそれに従った回路とした(R1の接地側パターンが接地せず浮いていたのがワゴンセールの理由かな)。なお電源電圧が3Vしかないので青色LEDなど順方向電圧降下(Vf)が大きいLEDはこの回路では光らない。

2023年2月13日月曜日

改造ソーラーライトのLED別必要パーツ

 これまでのソーラーライトのキャンドル化のBLOGでは明確に書かなかったが市販のLEDには幾つかのタイプがある。そこで改造ソーラーライトを組み立てるうえで必要な情報について改めて説明する。

 改造ソーラーライトで追加する回路は次のような構成になっている。

 このなかでD1は前段のソーラーライト用IC(IC1)で作られるパルスを整流して直流に変換する為のものである。D1には順方向電圧降下の少ないショットキーダイオードを使う事が望ましいが普通のダイオードでも動作する。このパルスは100~300Kパルス/秒とかなり高い周波数なのでC1とC2を使って平滑化する。このときC2に使う電解コンデンサの高周波特性は良くないため(積層セラミックコンデンサなど)高周波特性の良いC1を追加して高周波成分を取り除く。C1、C2の値はシビアではないので適当に選べばよい。D2のツエナーダイオードはD1、C1、C2で作成される直流電圧が(LED1が消灯している等の無負荷状態のとき5)IC2やLED1の定格電圧5Vを超えないように保護する為である。IC1の出力端子の定格電圧は不明であるが元々LEDを駆動するための出力なのでせいぜい5V程度に抑えるべきと考えられ、D2はIC1を保護する役目も併せ持つ。

 これらを纏めると次表のようになる。


 この表でSはIC2を実装せず1-2番端子間を短絡(ショート)する事を表す。×印は機能上不要であるが有っても構わない。


2023年2月8日水曜日

赤外線で通信する(その1)送信部

 赤外線リモコンチェッカーが出来たところで、赤外線リモコンのカラクリを使って通信に挑戦してみる。赤外線リモコンは37.9KHzの赤外信号(キャリヤー)の有無で情報を送るので、単純に光をON/OFFして情報を送るよりS/Nが良く、遠くまで信号を送れるはずである。

【送信部】

 まず送信を考える。信号発生は使い慣れているPIC16F18326で実現するとして次の回路を組んでみる。PIC16F18326は以前使ったPIC16F18346と中身は同じものであるが、足の数だけが14本と少なく外部とのインターフェイスの数が制限される。後で言及するがPIC16F18326の Data Signal Modulator(DSM) モジュールは設定で出力を反転できるからトランジスタはPNPでもNPNでも使える。

信号発生にはPIC16F18326の DSM モジュールを使うがDSMに加えるキャリヤーとして Numerical Controlled Oscillator(NCO1) モジュールから37.9KHzを出力させ、変調信号(MOD)として Enhanced Universal Asynchronous Reciever and Transmitter(EUART) の出力を与える事とする(下図参照)。

一応これで赤外リモコンに相当する信号が出せるはずである。但しEUARTで変調速度の1.67Kbpsが出せるか不明だがそれほどシビアではないはず。あと変調信号はリモコンのビット列より扱いやすい非同期(UART)形式でテストする。

DSMモジュールは次の構成をしている(マニュアルの図25-1)。


変調信号(MOD)は16種類の中から選べる。ここでは EUART TX を選ぶ。搬送波(キャリア)はMODがHの時(CARH)とLの時(CARL)で別々に16種類の中から選択できる。EUARTの出力はHが定常(無信号)状態でありこの時キャリアが出力されないようCARHにはVssを選ぶ。CARLには搬送波としてNCO1(上図では誤ってDDSと表記されている)を選ぶ 。

    MDCON = 0x80;      // Enable, 0x90 for inverted output
    MDSRC = 0xA;       // MOD Source is EUART
    MDCARH = 0x0;      // CARH is Vss
    MDCARL = 0x28;     // CARL is NCO1, with SYNC

 NCO1モジュール(マニュアル図23-1)はレジスタ(DDSACCU/H/L)にインクリメントをクロック毎に加算し、レジスタがオーバーフローすると出力を反転する(2分周する)作りである。


 ユーザが設定するのはクロックの選択とインクリメントであり、インクリメント= (キャリア周波数(37.9KHz)*2^21)/クロック周波数 で計算できる。
 クロック入力にHFINTOSC(16MHz)を選択したとき出力に37.9KHzを得るためにはインクリメント(DDSINC)に1968(0x1368)を設定することになる。
 これを実際やってみたが何度やっても上手くいかない。マニュアルを読み返すと、「インクリメントの最下位のバイト書き込みが設定のトリガーとなるので、このバイトを最後に書き込め」と書いてあり、それに従う事で問題は解決した。具体的には次の様に設定した。

    NCO1CON = 0x80;     // NCO1 enable, Fixed DutyCycle Mode
    NCO1CLK = 0x00;     // Clock Source is HFINTOSC(16M)
    NCO1INCU = 0x00;    // write U&H first
    NCO1INCH = 0x13;
    NCO1INCL = 0x68;    // write L last

EUARTの送信部は次の構成になっている(マニュアル図31-1)。GRB(ボーレートジェネレータ)の設定にはシステムクロックを含め複数のパラメータが関係するため苦労したがとりあえず1200bpsでテストするようマニュアルに習って設定した。 EUARTは当初送信部だけをONにしたが全く動作せず、数日悩んだあげく受信部もONにしたら動くようになった。

具体的には次の様に設定した。
    TX1STA      = 0x24;     // enable Tx, Async mode, high speed
    RC1STA      = 0x90;     // enable Rx
    BAUD1CON    = 0x08;     // BRG16
    SP1BRGH     = 0x06;     // 1200: 1666(682) on 8MHz,SYNC=0,
                           // BRGH=1,BRG16=1
    SP1BRGL     = 0x82;

クロック発信機(マニュアル図7-1)

クロック発振器はシステムの心臓部であるが次の図にあるよう複数の発振器や逓倍器、分周器で構成され結構複雑である。おまけに発振器が停止しても機能が停止しないよう他の発振器に切り替える機能(FSCM)まで備えていて信頼性を確保しているようである。しかしマニュアルの記述には幾つか矛盾や誤りがあるので幾つかの信号をPPSを使って外部に出力させ周波数を確認しながらプログラミングする必要があった。


 実際にはHFINTOSCで16MHzを発振させ1/2分周をかけて8MHzのシステムクロック(Fosc)を生成するようにした。

    OSCCON1     = 0x61;     // New ClockSource is HIFNTOSC, Div by 2
    OSCEN       = 0x40;     // HFINTOSC OSC Manual Req Enable
    OSCFRQ      = 0x06;     // HFINTOSC is set to 16MHz
 

 以上の回路は秋月でワゴンセールしていたPICの試作/実験用基板に組み立てた。

この基板はPIC16F690/18344等用と書いてあるがPIC16F18326/18346でもそのまま使えた。さらにPicKit4に直結できる書き込み端子、Vddを除く全13ピンに対応したピンヘッダー、RC0~3に対応したLEDを実装できるパターンも備えている。実際に組み立てた回路は次の通り(書き込み端子の配線は省略した)。

とりあえず(受信部が完成するまでは)一定の文字列を周期的に送信させ、前出のリモコンチェッカーの反応で動作を確認している。この回路の消費電流はLEDを光らせない場合は1.5mA程度、LEDを光らせても10mA以下でまだ余裕がある。

 

2023年2月5日日曜日

赤外リモコンチェッカーを作る

 赤外線(IR)リモコンのカラクリを使って何かできないかな、と少しいじってみることにした。IRリモコンは室内で比較的遠くまで届くうえに情報を乗せられ、ほとんど誤作動もない所が優れている。

先ず秋月でOSRB38C9AAという波長940nmの赤外線(TVのリモコンと同じ)に最大感度を持つ赤外線受信モジュールを買ってきた。これは3Vで働く3端子の素子で出力は負論理で普段はHに保たれ、赤外線を感じるとLになる。


中身は次図のように結構複雑であるが、これが2個入って秋月で100円なのでコスパは良い。

このモジュールと手持ちの部品を使って次図のIRチェッカーを作った。

  このチェッカーは数m離れていてもTV等のリモコンにちゃんと反応するので感度はよい(仕様上は20mとなっている)。赤外線を受けていない時の待機電流は1mAを若干下回る(OSRB38C9AAの仕様では0.9mA)。

 

一方赤外線LED(OSI5FU5111C-40、波長940nm)を直流点灯させてチェッカーに赤外線を照射してみたが反応しない(素子にBPFを内蔵しているので当然ではある)。

 データシートを見るとこのモジュールは次図の赤外光でテストされているようである。即ちTVリモコンと同じく37.9KHzで断続した光(キャリア)の600μs連続を1ビットのデータとし(これは1.67Kbpsに相当)て受信する。さらにフレーム長(Td)の記載は無いが0.1秒毎に繰り返すようで、データ長は最大でもせいぜい167ビットである(これはあくまでテストデータの情報)。

 そこで赤外LEDを37.9KHzで点滅させてみたが、チェッカーのLEDが間欠的に点灯し不安定である。そこでテスト信号に近い37.9KHzの23サイクル(約600μs)のバースト信号を作ってみると(信号発生にはHP-33120Aのバーストモードを使った)連続的なバースト信号に対しチェッカーLEDの光り方は連続だったり間欠だったり変化する。これは赤外線受信モジュールがリモコン信号に特化し連続的な信号には対応していない為だろうか。OSRB38C9AAの特性には少しクセがあるようである。

 チェッカーは最終的に手元にあった鼻炎薬のスプレー容器に組み込んだ。基板は両面テープで単4×2の電池ケースに止めている。基板が汚れているのはジャンク箱から拾ってきた古い基板を使い回している為。このチェッカーは青色の蓋を閉めた状態でもちゃんと反応する。



リモコンの赤外線は以前はスマホのカメラで見えたが最近のスマホのカメラは特性が改善されたのか見えない。このチェッカーを使うとちゃんとリモコンに反応するので電池切れや故障診断に使える。

(その後)

単4電池を2本使うタイプの壊れたパルスオキシメータがあったので、基板を外してそこにチェッカーを組み込んだ。部品は瞬間接着剤で固定し、表示窓には白いマスキングテープを貼って直接中が見えないようにした。小型の電源スイッチは押しボタンスイッチがあった場所にUVレジン(紫外線硬化樹脂)で固定している。