【電子工作】人だと3日かかる評価を自動化して3時間で終わらせた話

これは、勤務している会社で起こった実話である。
（他の会社でも似たような事例はありそうだが、ぜひ無くなって欲しい）


# どうしてこうなった
「土日出る（休日出勤する）しかないか」という上司の一言から始まった。

進めていた商品の開発過程で問題が発覚し、緊急で追加評価を行わなければならなかった。
この時、金曜日の午後3時で、評価結果を翌週月曜日の午後1時の会議までに報告する必要があった。
（**なんで、こんな短納期なんや！！**・・・とは言えず・・・）

# 発生した問題
問題とは、商品の中のとある部品に対する**耐久性の確認が漏れていた**こと。
（実際とは異なるが）LEDのように電流を流すと状態が変わる部品に対して、動作のON/OFFを1万回行っても商品自体の動作に異常がないことを示す必要があったのだが、なぜか漏れていた。。。
（なぜ、ここまで誰も気づかなかったのか。という問題はあるが、いったん置いておく）

# これに対して・・・？
この問題に対して、上司も焦っていたからと思うが、安定化電源[(Amazon)](https://www.amazon.co.jp/%E5%8F%AF%E5%A4%89%E7%9B%B4%E6%B5%81%E5%AE%89%E5%AE%9A%E5%8C%96%E9%9B%BB%E6%BA%90-4%E6%A1%81%E9%9B%BB%E5%9C%A7%EF%BD%A5%E9%9B%BB%E6%B5%81%E8%A1%A8%E7%A4%BA-300W%E4%BD%8E%E9%9B%91%E9%9F%B3%E7%9B%B4%E6%B5%81%E9%9B%BB%E6%BA%90-%E9%9B%BB%E5%9C%A7%EF%BC%86%E9%9B%BB%E6%B5%81%E5%AE%89%E5%AE%9A%E9%9B%BB%E6%BA%90-%E8%87%AA%E5%8B%95%E6%B8%A9%E5%BA%A6%E5%88%B6%E5%BE%A1%E5%86%B7%E5%8D%B4%E3%83%95%E3%82%A1%E3%83%B3/dp/B07NB661B1/ref=sr_1_7?dchild=1&keywords=%E7%9B%B4%E6%B5%81%E5%AE%89%E5%AE%9A%E5%8C%96%E9%9B%BB%E6%BA%90&qid=1598026465&sr=8-7)を利用して手動でON/OFFを繰り返して行うしかないという提案が挙がった。

この時、私は無表情だった（と思う）が、心の中では↓の感じだったに違いない。
<img src="https://1.bp.blogspot.com/-TCTSG7TZTMw/XAnvpyEnQII/AAAAAAABQqs/Zyqb_0Zx6fgYAcpzFzDDXH5hr7VrUFOUACLcBGAs/s800/fusagikomu_woman.png" width="100">

「1万回ON/OFFする＝安定化電源のスイッチを2万回押す」ことであり、評価する部品数も1個ではなく、最低でも10個は確認しなければならなかったため、計20万回の操作が必要である。

スイッチON動作が1秒/回でも、20万秒（約56時間）必要であり、基本業務時間が8時間なので工数としては7人日必要であることから、月曜日に報告するためには3~4人がかりでも大事な休日に出勤しなければならなくなる。

私もこの試験に巻き込まれそうだったので、さりげなく提案してみた。

**「それ、多分自動化できますよ」**・・・と。

# やったこと
- ArduinoUNO、リレースイッチ、安定化電源を接続して、0.5秒ごとにON/OFFを繰り返した
- 部品は並列に並べることで同時に評価する
- 自作の試験機が動作した後、オシロスコープで部品の動作を10分程度監視し、残りの時間はログを取っておくことで試験機に問題ないことは確認しておいた

要した時間：
- 準備：1時間程度
- 試験：3時間弱

午後8時くらいに結果を報告し、翌週月曜の朝に結果をまとめた。

# スケッチ
非常に単純なので省略しようと思ったが、念のため掲載。
（このコードに1万回ON/OFFしたら、動作終了してLINEに通知がくる命令を追加した）

[追記]
LINE通知部についても記載。
自身のメモとして・・・。

```C
#include <WiFi.h>
#include <WiFiMulti.h>
#include <ssl_client.h>
#include <WiFiClientSecure.h>
#include <HTTPClient.h>
#include <Wire.h>

const char* ssid = "xxx";
const char* password = "xxx";

int relay = 21;
int count = 0;

void send_line(String message) {
  const char* host = "notify-api.line.me";
  const char* token = "DJzodtuk2lEUlm5UuFPqsztwH3YKw3RP9d58BYMuXjX";
  WiFiClientSecure client;
  Serial.println("Try");
  //LineのAPIサーバに接続
  if (!client.connect(host, 443)) {
    Serial.println("Connection failed");
    return;
  }
  Serial.println("Connected");
  //リクエストを送信
  String query = String("message=") + message;
  String request = String("") +
               "POST /api/notify HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "Authorization: Bearer " + token + "\r\n" +
               "Content-Length: " + String(query.length()) +  "\r\n" + 
               "Content-Type: application/x-www-form-urlencoded\r\n\r\n" +
                query + "\r\n";
  client.print(request);

  //受信終了まで待つ 
  while (client.connected()) {
    String line = client.readStringUntil('\n');
    Serial.println(line);
    if (line == "\r") {
      break;
    }
  }

  String line = client.readStringUntil('\n');
  Serial.println(line);
}

void wifiConnect(void) {
  Serial.println("\nwifiConnect");
  WiFi.disconnect();
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);  // Wi-Fi接続
  
  while (WiFi.status() != WL_CONNECTED) {  // Wi-Fi 接続待ち
    delay(100);
    Serial.printf(".");
  }
  Serial.println("\nwifi connect ok");
}

void wifiConnect(void) {
  Serial.println("\nwifiConnect");
  WiFi.disconnect();
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);  // Wi-Fi接続
  
  while (WiFi.status() != WL_CONNECTED) {  // Wi-Fi 接続待ち
    delay(100);
    Serial.printf(".");
  }
  Serial.println("\nwifi connect ok");
}

void setup() {
  Serial.begin(115200);
  pinMode(relay, OUTPUT);

　// put your setup code here, to run once:
  wifiConnect();
}

void loop() {
  digitalWrite(relay, HIGH);
  delay(1000);
  digitalWrite(relay, LOW);
  delay(1000);

  count += 1;

  if (count == 10000){
    // LINEに送る
    send_line("Complete!!");
  }
}
```

# わかったこと
- 趣味で電子工作をやっていたからこそ、ハードルが低かったこと
- 知識はあっても、使ったことがないと発想が出てこないこと
- 1万回スイッチをポチポチするより、工作のほうが絶対に楽しかったこと

趣味だけで使用していたArduinoを仕事で使う日が来るとは思わなかったが、 おかげで私の休日は守られた。