正弦波インバーター用　エンジン連動機器作製

# 概要
車に取り付けた1,200Wのインバーターをエンジンの始動に連動してON/OFFできるように
マイコンを利用した機器を作製しました。

インバーターには純正の有線スイッチが付属しており、このスイッチに並列に回路を
割り込ませることで制御をしています。このスイッチは長押しが必要で、その動作を
プログラムで再現しています。

エンジン始動の検知は車の純正AC電源（100W）にUSBアダプタを取り付け、
この5V出力で検知しています。また、エンジン停止は5Vが停止することで検知します。

![スクリーンショット 2024-01-13 204730.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611426/5756760b-4ec4-855f-139f-c7a08f00ebdb.png)
![スクリーンショット 2024-01-13 171901.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611426/aacad9b7-ea8d-ee9a-6f38-d10387cd68fb.png)


# 環境
エディタ：VisualStudioCode（拡張機能：PlatformIO IDE）
マイコン：Seeed Studio XIAO RP2040

# 回路図/動作説明
![スクリーンショット 2024-01-13 203159.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611426/fd0b1525-9e38-e2ac-59fb-d41aedad486c.png)

■エンジン始動時の動作
・車両の純正AC電源を介してUSBアダプタからの電源供給でマイコンが動作開始します。
・約10秒でフォトリレーをON（有線リモコンSWを押す動作再現）
・2秒後にフォトリレーをOFF（有線リモコンSWを離す動作再現）
　　⇒この時点でインバーターがONになる。
・2秒後に負荷接続用リレーをONにする。

■エンジン停止時の動作
・USBアダプタの電源供給が無くなるため負荷接続用リレーが切れます。
・マイコンは5V電源ラインに取り付けた電気二重層コンデンサにより動作を継続します。
　（ダイオードを設けることで、負荷接続用リレー側への電流を遮断しています）
・USBアダプタの電源供給が無くなったことを検知し、
　フォトリレーをON（有線リモコンSWを押す動作再現）
・2秒後にフォトリレーをOFF（有線リモコンSWを離す動作再現）
　⇒この時点でインバーターがOFFになる。

 数秒間のマイコンの動作を維持させるため1.5Fの電気二重層コンデンサを使用しています。
 実験では15秒くらいはマイコンを駆動できています。

 ※回路図にある「インバーターUSB接続」はこれはエンジン始動時に
 　すでにインバーターがONの場合を検知するために設けました。
  　しかし、よくよく考えるとエンジンが掛っているとき以外はインバーターを
   　使用しないためこの「インバーターUSB接続」未使用にしました。

■使用部品
　秋月電子通商で下記部品を購入。汎用基板、SWは手持ちを利用。
　・大電流大型リレーモジュールキット　５Ｖ版
　・プラスチックケース　ＳＷ－１２５Ｂ
　・電気二重層コンデンサー１．５Ｆ５．５Ｖ（タテ型）
　・フォトカプラ　フォトリレー　４０Ｖ２Ａ　ＴＬＰ２４１Ａ
　・ショットキーバリアダイオード　４５Ｖ２Ａ　ＳＢＭ２４５Ｌ
　・極性統一ＤＣジャック　電圧区分２　パネル取付型　ＭＪ－１７
　・抵抗内蔵５ｍｍＬＥＤ　５Ｖ　黄緑色
 
# プログラムコード
``` cpp
#include <Arduino.h>
#include <Adafruit_NeoPixel.h> //マイコン内蔵フルカラーLED用ライブラリ


int state=0;//現在の状態保持　0:停止中　1:駆動中

//フルカラーLED使用設定
int Power = 11;
int PIN  = 12;
#define NUMPIXELS 1
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

void start_seq(){
  //インバーターがOFFの場合ONにする、ONの場合は何もしない
  if(digitalRead(27)==LOW){
    digitalWrite(28, HIGH);
    delay(2000);
    digitalWrite(28, LOW);
    delay(2000);
  }  
  //ACリレーON
  digitalWrite(1, HIGH);
}

void stop_seq(){
  //ACリレーOFF
  digitalWrite(1, LOW);
  delay(2000);
  
  //インバーターOFF
  digitalWrite(28, HIGH);
  delay(2000);
  digitalWrite(28, LOW);
}


void setup() {
  //user LED消灯設定
  pinMode(16,OUTPUT); //赤
  pinMode(17,OUTPUT); //緑
  pinMode(25,OUTPUT); //青
  digitalWrite(16, HIGH);//赤消灯（負論理）
  digitalWrite(17, HIGH);//緑消灯（負論理）
  digitalWrite(25, HIGH);//青消灯（負論理）

  //出力ピン設定
  pinMode(28,OUTPUT);//インバーターON/OFF制御
  pinMode(1,OUTPUT);//ACリレー制御
  digitalWrite(28, LOW);
  digitalWrite(1, LOW);

  //入力ピン設置
  pinMode(26,INPUT);//USBアダプタ状態入力（≒エンジン始動検知）
  pinMode(27,INPUT);//インバーター状態入力

  //マイコン内蔵フルカラーLED用設定
  pixels.begin();
  pixels.setBrightness(10); //明るさ調整 0～255
  pinMode(Power,OUTPUT);
  digitalWrite(Power, HIGH);
}

void loop() {
  if(state==0){
    if(digitalRead(26)==HIGH){
      delay(10000);//スタート時間遅延10秒
      start_seq();
      state=1;//駆動中フラグセット
      
      //LED点灯
      pixels.clear();
      pixels.setPixelColor(0, pixels.Color(0,191,255));//青
      pixels.show();
    }
  }else{
     if(digitalRead(26)==LOW){
      stop_seq();
      state=0;//駆動中フラグリセット
      
      //エンジン停止したにも関わらず、インバーターがONにならないよう
      //念のためUSBアダプタの電荷が切れるまで待機する10秒程度
      delay(10000);
      
      pixels.clear();
      pixels.show();
    }
  }
  delay(10); 
}
```
# 配線について
　インバーターの有線リモコンのスイッチに並列に配線（水色）を行いました。
 　有線リモコンもこれまで通り使用できます。
![スクリーンショット 2024-01-13 175153.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611426/6dc173c5-06b4-521b-7937-3c3d3fe88160.png)

内部はこんな感じで。ケースが結構ギリギリでした。
![スクリーンショット 2024-01-13 175606.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611426/19628932-7d27-deae-df52-1552869b5058.png)