# PCから部屋の照明を操作する
こんなものを作りました:
<iframe src="https://vine.co/v/51TE3xqwj1r/embed/simple" width="600" height="600" frameborder="0"></iframe>
以下で説明します.
## 信号受信編
### 発信源
自室の部屋の照明はNEC製で, リモコンの型番はRE0201です. 照明リモコンの写真を次に示します.

このリモコンからの信号を読み取るためのスケッチを適当に書いて, Arduinoに読み取らせました.
### 受信回路
38kHz変調の赤外線を受信する素子ががあるのでそれを使うだけで簡単に出来ます.
今回は昔のロボカップジュニアの時のものがあったのでそれを流用しました.

### 波形
リモコンの信号は2種類に類別され, それらの代表元は下図のような波形です.

上図aはメモリー(CH1)の信号で, 上図bは明(CH1)の信号です. bはaに比べて尻尾が付いてます.
信号の主要部は下図のような波形でした. (メモリー(CH1))

上図のように適当に符号化(48bit)して16進数にしました. 次の表に示します.
|命令|CH1|CH2|波形|
|:-:|:-:|:-:|:-:|
|メモリー|dfad6b6ab6fb|dfad6b6abdf5|a|
|スリープタイマー|dfad6b55b7db|dfad6b55bfb5|a|
|保安球|dfad6bd56afb|dfad6bd575f5|a|
|全灯|dfad6baed75b|dfad6baeeeb5|a|
|消灯|dfad6baab5fb|dfad6baabbf5|a|
|明|dfad6bb56b7b|dfad6bb576f5|b|
|暗|dfad6b5ab77b|dfad6b5abef5|b|
明/暗の信号は波形bで, それ以外の信号は波形aでした.
この違いはボタンを押し続けた際に信号を吐き続けるかどうかによって分類されていると思われます. (例えばメモリーの信号は立ち上がった時に1回信号を送れば十分ですが, 明の信号はボタンを押している間に照明が明るくなる仕様なのでボタンが押されていると時に信号を吐き続ける必要があります. )
Arduinoでは48bitの大きさを持つ型が無かったので, 実装では2つのunsigned long(32bit)に分割して表現しています.
### 信号の規格
今回は特に意識せずに進めたのですが, 通信フォーマットの規格があって, それを参照して進めるのが手っ取り早かったのかも知れないです:
[赤外線リモコンの通信フォーマット](http://elm-chan.org/docs/ir_format.html)
## 発振回路編
### 回路概要
赤外線リモコンのサブキャリア周波数は大体38kHzだったはずなので, インバータを使って発振回路を作りました. [Digitの40kHzの超音波発振回路](http://eleshop.jp/shop/g/g6C9411/)を参考に74HC04で組みました.

### 発振回路の原理
大まかな動作原理については[インバータ2個の発振回路](http://bbradio.sakura.ne.jp/7404x2/7404x2.html)に書かれています.
ただ, インバータの遷移領域付近の挙動の影響がよく分から無かったので調べてみました. 次の図は74HC04の入力電圧と出力電圧の関係を表しています. ヒステリシス性が気になったので往路と復路で色を変えています. (74HC04の内部構造を知っていれば当然なのかも知れませんが, ヒステリシス性はありませんでした. )

(遷移領域において)入力電圧に対して出力電圧が単調減少でかつ, 勾配が十分大きい事から, 問題無く発振回路が動作しているのだと思われます. (入力電圧=出力電圧となる点があって, そこは平衡点ですが, 不安定な平衡点です. )
以下で不安定な平衡点である事を示します.

上図のように各点の電位と電流の記号を定めます. ただし後述のように電位はGNDを基準としない事に注意が必要です.
インバータの出力電圧が入力電圧のみの関数であり, インバータは入力側から電流を食べない事を仮定します. よって$i_1=0$より$v_a=v_b, i_2=i_3$です.
電圧の基準値をインバータの(入力電圧$v_i$)=(出力電圧$v_o$)となる点(上図より約2.4V)に取り, 線形化して$v_o=-kv_i$とします. (上図より$k\fallingdotseq 5.5$)
抵抗やキャパシタの性質から$i_2=\dfrac{1}{R}(v_a-v_c), \ i_3=C\dfrac{d}{dt}(v_d-v_a)$が得られます.
ここで$v=v_a=v_b$とおくと線形化の仮定から$v_c=-kv_b, v_d=k^2v$です. 以上より
$$\dfrac{1}{R}(1+k)v=C\dfrac{d}{dt}(k^2-1)v$$
が得られ, これを解いて
$$v=v_0\exp\left(\frac{t}{RC(k-1)}\right)$$
です. ただし$v_0$は$t=0$における初期電圧です. $k\fallingdotseq 5.5>1$より, $v=0$が不安定な平衡点である事が分かりました.
しかし, 実際にはインバータの出力電圧は入力電圧のみの関数ではなく, IC内部の保護回路の影響もあるようです. (cf. [インバータ2個の発振回路](http://bbradio.sakura.ne.jp/7404x2/7404x2.html))
### 計測結果
各点の電圧をオシロスコープで観察しました.
計測結果を次に示します.

縦軸は2V/div, 横軸は10μs/divです.
計測場所によって周期が変化しているのはオシロスコープの接続による回路定数の変化の影響だと思われます.
$v_a$と$v_b$の波形が全然違うのはIC内部の保護回路の影響かも知れませんが, (cf. [インバータ2個の発振回路](http://bbradio.sakura.ne.jp/7404x2/7404x2.html)) 詳しいことは全然分かりませんでした. $v_b$の波形が連続なのが解せないです.
$i_1$が思ってたよりも沢山あったので, 先程の議論の意味があったか怪しいですね.
### デューティー比
さて, [赤外線リモコンの通信フォーマット](http://elm-chan.org/docs/ir_format.html)にも書いてあったように, サブキャリア38kHzのデューティー比は1/3にするのが適切だったようですが, 1/2のデューティー比でも問題なく動作しました. デューティー比を変更するにはタイマーICの555を使うか, [インバータ2個の発振回路](http://bbradio.sakura.ne.jp/7404x2/7404x2.html)の「応用回路について」の節を参照すれば良いと思います.
## 装置実装編
### 完成した回路

### 装置概略図

### Arduino互換とPCの接続
Arduino互換とPCの接続は[超小型USBシリアル変換モジュール](http://akizukidenshi.com/catalog/g/gM-08461/)を使って行いました.
間違えてTXD, RXD同士を繋いでしまって, かなり時間を無駄に潰してしまいました…
PCとArduino互換でシリアル通信するプログラムをCで書きました. [C言語でArduinoとシリアル通信してLEDを制御する](http://monitorgazer.blogspot.jp/2013/06/carduinoled.html)を参考にしました.
### ANDの代わり
インバータを使ってANDを構成しました. [電子回路による論理回路の実現](http://markun.cs.shinshu-u.ac.jp/learn/lcirc/lcirc2/lcirc2-2.html)ではダイオード2個と抵抗1つでANDを構成していますが, 今回は余っているインバータとダイオード1つと抵抗1つでANDを構成しました.

抵抗は適当に10kΩ程度にすれば良いです.
NAND(74HC00)を使えば十分でしたが, 手持ちの74HC00を切らしていたのでこの方法を採用した次第です.
### 赤外線LEDに流れる電流
74HC04からの出力電流の定格は最大で25mA…
LEDに欲しい電流は50-100mA…
足りてないですが, 凡そ50mAが流れる抵抗値を手探りで見つけました. (その分74HC04からの出力電圧は下がってます. )
本来ならトランジスタで電流増幅させるのが良いのでしょうが, 無しで動いたので良しとしました.
他にはインバータを並列にして駆動力を増やす方法もあったようです:
https://toshiba.semicon-storage.com/info/docget.jsp?did=12713
## 総括
これで朝の目覚ましに合わせて自動で照明が点灯するようになりました.
良かったですね.