arduino nanoで内気外気をタイマーリレーで切り替え制御

みんカラにプログラミング的なことを投稿するには畑が違うというのと、専門的かなということで初めてアカウントを作成して投稿する。
######車の空調というか、空気を外気から取り入れるか、内気循環にするかのスイッチがあるが、これをタイマーで定期的に内気と外気を切り替えたいため
######今までエアコンのコンプレッサーへの電磁スイッチをリレーで制御していたことがあったが、今回はエアコンはエバポレーターセンサーへの抵抗を入れたので、内気外気切り替えをタイマーで行う。

####arduino nanoへ内気循環ランプの信号を入れて、現在の状態が内気か外気かを判断して、次のタイマー割り込みをセットする。

##arduino nano とリレーをケースに入れ、インスパイアのカーナビパネルに組み込む。
![0171a5f93d4e7763f254c0bafcf1dcda8ec749a2ad.jpg](https://qiita-image-store.s3.amazonaws.com/0/200517/84e571f8-19b5-5f67-a5d0-2109a2bd9149.jpeg)

####２つの可変抵抗は、内気モードの時間と外気モードの時間をそれぞれ設定できるように。
arduinoのプログラムはこのタイマー時間の管理のために２つの変数を保持して３秒ごとに可変抵抗の値からくる電圧値を保持していて、タイマー割り込みが入ると別のモードのタイマー値から次のタイマー割り込みをセットする。
基本的にはインターバルで交互に割り込みの時間を取り出してセットするようになっている。
######現在は内気時間と外気時間を可変抵抗で調整しつつ、交互に一定時間で内気モードと外気モードを切り替えができるようになっている。
![011d24adcaca62c16096ce2b1fdd855b5e4e664137.jpg](https://qiita-image-store.s3.amazonaws.com/0/200517/f070146a-e81c-4dee-4e5d-288c2ea361a2.jpeg)




しかし、できれば現在の内気／外気がどちらになっているか判断してから割り込みをセットしたいところ。
そのために内気循環のモードになっているときにエアコンパネルのスイッチにLEDが光るようになっていることから、このLED電圧によって制御できるのではないかと配線までとりまわして取り出せるようにした。

### ホンダインスパイアのエアコンパネルの内気循環時のLEDの電圧
このLEDが光れば、普通は電圧が両端にかかり、光らないときは0Vだろう
と安易に考えていた。
![kiban-inspire.jpg](https://qiita-image-store.s3.amazonaws.com/0/200517/73e2cf37-3d1f-cabc-b460-f36785a21439.jpeg)
しかし、そう甘くなかった。ポジションランプ点灯時はこのLEDは若干暗くなるように両端の電圧が制御されていた。通常は点灯時12V、（両端ではなくて片方とアース間の電圧）、非点灯時は0V。
ポジションランプなど夜間のアクセサリ電源が入っている場合は点灯時12Vで非点灯時10Vとなる。両端の電圧は2V程度だがポジションランプ点灯時は電圧差を小さくして弱い光にしている。
そのため、arduino側のアナログ電圧判断としては難しい判断となってしまう。
####arduinoのアナログ入力について
実は可変抵抗を読み取るのにanalogRead()の関数を使っているが、この関数は電圧を読み取るのではなく、GNDとの抵抗値で値が変化する。
（もちろん、デフォルトではなく外部電源の読み取りモードもあるらしいが壊れやすく一度そのモードにするとすべてのアナログ入力がそうなってしまって可変抵抗のアナログ入力がうまくいかなくなってしまった。）
電圧計として少しarduinoを使おうという記事もあったが、アナログ入力は通常のモードでは電圧によって値がうまく変化しなかった。
むしろ、GND間の抵抗値を変化させるほうがうまく値を制御できる。
そのため、車の内気モードになっているときは、arduino側のアナログ入力端子ではGNDでショートさせ、外気モードの時はショートを切り離すなどを考えていた。しかし車のLEDの電圧がそうは簡単に問屋がおろさない。
ポジションランプ点灯時はOFFでも10Vあるため12Vと10Vの2Vの差を判断しなければならないということがわかった。
しらべるとダイオードによってリレーの駆動を制御とかあるが2V差というのはかなりシビアで厳しい。コンパレータというオペアンプなら判断できそうということまでわかる。車のエアコンパネルの基盤の電流でリレーを動作させることは車側を誤動作させるなどのリスクがありやるべきではないので、
コンパレータで出力電圧でリードリレーを使ってアナログ入力をアースしたり切り離したりという方針でいくことにした。

###コンパレータとarduinoのアナログ入力読み取り
以下の関数がアナログ入力のモードを決める関数
 analogReference(DEFAULT);
このデフォルトモードは、アナログの電圧を判断するのではなく、むしろＧＮＤとの抵抗差を読み取ると判断したほうがよい。読み取る電源の元が同じなら電位差も読み取れる可能性もあるが、異なるDC-DCコンバータである場合は電位差は読み取れない。
今回、車両側の電位を判断するので、コンパレータを介して判断する。
コンパレータとして使用したのは、たまたまヤフオクで安価に複数個手に入ったものを使用した。特性などよく調べずに落札したが、有名どころのものと動作が違って最初は壊れているのかと思ってしまう。
**HA17393 日立製**
![image.png](https://qiita-image-store.s3.amazonaws.com/0/200517/7bc9683d-e23e-58e4-9971-8b703c1b91a1.png)

出力に電圧がたり、０Ｖだったりの違いがコンパレータだと思っていたし、チップのレイアウトはそういうＬＭＸＸＸのものと同じだったし。
しかし実際にはHA17393は出力はVin+端子の入力が高いときはＧＮＤとショートして、Vin-端子がVin+以下のとき、絶縁されるという特性。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/200517/26729192-df31-fbd4-604f-9e018c518707.png)
（上の図を見れば、Voutはコレクタとエミッタ接続されているので原理はなるほどと納得）
実はarduinoのアナログ入力モードのデフォルトであれば、あるアナログ入力端子にこのコンパレータの出力を直接つなげばはっきりとアナログ入力が0か（コンパレータのマイナス入力端子に基準以上の電圧があるとき）、200以上の値になるときはVin-が基準以下の電圧でコンパレータに入るときである。

最初は単純にVin-側の電圧がなければ（0Vならば）VoutはＧＮＤと遮断されると思っていたが、作成してしばらくいろいろチェックしていると、単純にそれだけではだめということがわかる。
Vin-端子に何もつないでいないと、Voutはショート状態で12Vの電圧を入れたときと同じ状態になってしまった。これは不安定で絶縁されることもあったしそうでない場合もあり不安定。
いろいろ考えていて、arduinoのアナログ入力についてもGNDとの抵抗値がないとだめだった記憶があり、それではコンパレータのVin-にもちょっと抵抗を入れてみるかと100KΩほどの抵抗をいれてみる。
すると、確実に電圧がないときはVoutは絶縁されるようになった。