Ankerのクソデカモバイルバッテリーの出力が止まらないようにするための装置

# Ankerのクソデカモバイルバッテリーについて

まずは今回の主役、**Ankerのクソデカモバイルバッテリー**こと**[Anker PowerHouse 100](https://www.ankerjapan.com/products/a1710)**のご紹介です。

![A1710001_500x.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183170/bac43499-f5bc-c5f3-d272-00b5f0456229.jpeg)

## 特徴

- 約27,000mAhという超大容量バッテリー
- **AC110Vの出力端子つき**
- デカイ

## スペック

Ankerの商品ページより抜粋しました。

```
サイズ	約201 × 120 × 31mm
重さ	約862g
入力	USB-C 入力：5V=3A / 9V=3A / 15V=3A / 20V=2.25A (最大45W)
出力	・AC：110V ~ 0.91A, 60Hz, 100W (瞬間最大125W)
※本製品は電力消費を抑えるため、ACポートに接続する機器の必要電力が30分以上10Wを下回る場合に電源が自動的にオフになります。
充電または給電を再開したい場合は、再度電源ボタンを長押ししていただくようお願いいたします。
・USB-A：5V=3A (各ポート最大12W / 合計最大15W)
・USB-C：5V=3A / 9V=3A / 15V=3A / 20V=2.25A (最大45W)
バッテリー容量	27,000mAh / 97.2Wh
合計最大出力	160W (4ポート合計)
容量	27,000mAh / 97.2Wh
```

このスペック表の**「出力」**の部分に注目です🚩。

# ことの経緯

では、本題です。
昨年末、ある方からこんな話を受けました。

* * *
ある方「〇〇(私の名前)よ。」

私「はい、なんでしょう？」

ある方「**30分に1回、10W消費する回路を作って欲しい。**」

私「……ファッ!?」

ある方「いや、いつも使ってるAnkerのクソデカモバイルバッテリーなんだけどさ……」

* * *

と、会話調で書き続けるとしんどいのでここらでやめますが、話を要約すると、

- Ankerのクソデカモバイルバッテリーを外で使っている
- 用途はWi-Fiホームルーター(WiMAX的なやつ)をACポートに接続し、外でネットを構築している
- しかしクソデカモバイルバッテリーは、**出力が30分以上10Wを下回る場合に電源が自動的にオフになる**
- どうやらホームルーターだけでは10Wに満たないらしく、30分を経過したタイミングで電源が切れる
- なので30分経たない間に10W以上の電力を引き出して、ホームルーターが切れないようにしたい

ということらしい。

単純に10W以上消費したいだけなら、iPadの充電等をすれば`5V x 2A = 10W`で解決しそうな気もしますが、余計な電力を消費することや、その他諸事情からこの方法は使えないとのこと。

で、**30分に1回10W消費する回路**を作って欲しいとの依頼がやってきたわけです。

# 回路設計

てなわけで、実際に回路を作っていきます。

## 電力消費機構

実際に製作するにあたり一番悩んだのはやはり、**どうやって10Wもの電力を消費するか**、という点です。

しかも実際には余裕を持って**15W程度**消費出来るようにして欲しいとオーダーを受けていました。

真っ先に思いついた方法として、単純に抵抗器に電気を流すという方法です。
ところが、電子工作でよく使う抵抗(カーボン抵抗)は定格電力が1/4Wや1/2W程度であり、10Wなどという大電力に耐える事ができません。
もしそんな大電力を流してしまったら、多分爆発します。(やったこと無いのでわかりませんが。)

![rd50sja.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183170/5252cad2-9f4c-dcb6-6c1b-ee34454b2e8e.jpeg)
**【⬆こういうのは使えない】**(共立エレショップのサイトより)

抵抗器で、大電力に耐えられるものというと、今回用いる**セメント抵抗**等に限られてきます。

セメント抵抗とは、大電力にも耐えられるように抵抗器の周りをセメントでガチガチに固めたもので、私が発見できたものだと20Wまで耐えられるものがありました。

今回は千石電商さんの[**セメント抵抗 20W 8.2Ω**](https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=6ADT-6UKA#)を用いることとしました。

![8b24dcc0b90689956ab2c4a8ab18ad5a740b48cc0984381c3d98b648f8f8e852.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183170/b3a17766-64d8-3b60-caba-a7157e7c765d.jpeg)
(千石電商さんのせんごくネット通販のサイトより)


又、電源には同じく千石電商さんの格安ACアダプタ、[**ATS036T-W120U 12V3A ACアダプター**](https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-5BSZ)を使用しました。

![6d270c5e56ba4be04933092eba54b05b9481e4415d417ce864174d6581d4d6ec.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183170/c97b6b3f-6d3e-459b-0f99-ebddebdb6773.jpeg)
(同じくせんごくネット通販のサイトより)

これより、流す電気は

```
電圧 : 12 V
電流 : 1.46 A
電力 : 17.52 W
```

となり、要件を満たします。

## 回路制御用のメインマイコン

先述の通り、「30分に1回、10W消費する回路」なので、抵抗に電気を流すかどうかを制御しなければなりません。
今回は私の最近のお気に入り、[**M5Stamp Pico**](https://www.switch-science.com/catalog/7360/)を使います。

![801fe712-c908-498c-bc79-08288806e2cc.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183170/6a332f5e-9c58-de60-9069-23ff19ded740.jpeg)

(スイッチ・サイエンスのサイトより)

M5Stamp Picoについては、私が先月投稿した、
[**M5stamp picoでプレゼンテーションリモコンを作ったら見事に敗北した件**](https://qiita.com/koushiro/items/7cfa3895461171dfc541)
という記事にて散々語りましたので、そちらをご参照ください。

このマイコンで抵抗器に電気を流すかどうかをGPIOを用いて電気的に制御します。
ただし、マイコンを直接抵抗器に接続してしまうと、マイコンが定格電流値を超えてしまい、壊れてしまいます。

実際、今回のプロジェクト中に回路設計ミスで計3つもマイコンを焼いてしまいました…😥

そこで用いるのが、**MOSFET**です。

## MOSFETについて

MOSFET(電界効果トランジスタ)とは、簡単に言うと**電気的なスイッチ**です。

人間が物理的なスイッチによって機械をオン・オフするのと同じように、マイコンが電気的にスイッチを操作し、電気を流すかどうかオン・オフする部品です。

![mosfet.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183170/6130c0c6-1ce8-b13a-2789-c56a2f54a655.png)

非常に簡略化して説明すると、MOSFETは3本の足からなり、ゲートに微弱な電気を流すことで、ドレインからソースに向かって大電流を流すことが出来ます。(Nchの場合)
これでマイコンを保護することが出来ます。

ただこれだと説明として非常に不十分なので、以下のサイトを是非とも参考にしてください。非常にわかりやすく解説されています。
[電子回路の基礎　MOSFETとは？読み方と回路図記号の意味もわかりやすく解説](https://electronic-circuit.com/mosfet-read-symbol/)

今回はいろいろ探した結果、東芝の[**Nch MOSFET TK34E10N1**](https://eleshop.jp/shop/g/gD3T121/)を使うことにしました。

![tk34e10n1a.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183170/287f9d68-d900-8bb1-696b-957940e01222.jpeg)
(共立エレショップのサイトより)

定格電圧・電流ともにクリアしており、オン抵抗が小さいところが魅力です。
又、ゲートしきい電圧が`2 ~ 4V`ということで、マイコンを使っての制御もやりやすいです。

## その他の使用部品について

### 電圧レギュレータ

回路の入力電圧は**`12V`**、対してM5Stamp Picoが動作するために入力すべき電圧は**`5V`**。
よって降圧が必要です。
これに関しては私が非常に使い慣れている、ロームの[**BA05T**](https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-4S4P)という**三端子レギュレータ**を用いました。
![7a5bf135df76d681cc841c28589db7a79fe5318703a5f183da3ab7d6da822dff.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183170/12dd87fb-8496-7a4b-eb0c-5b3b959d2de8.jpeg)
(せんごくネット通販のサイトより)

### ロジックレベルコンバーター

先述のMOSFETのしきい電圧、すなわちオンするためにかけなければならない電圧は4V以上であり、今回は**`5V`**かける想定です。
一方、M5Stamp PicoのIOピンから出てくる電圧は**`3.3V`**です。

つまり、今度は昇圧する必要があるのです。

そこで、家に余っていた、[**BSS138 / 4bit双方向ロジックレベルコンバーター**](https://eleshop.jp/shop/g/gH5J312/)という部品を用いました。

![bob12009a.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183170/03519b3d-f9bc-ed12-18e0-7c1f9d89a245.jpeg)
(共立エレショップのサイトより)

この部品を用いて、M5Stamp Picoから出てきた3.3Vの信号を5Vへと昇圧することにしました。

### 冷却用ファン

セメント抵抗は、短時間電気を流すだけでもかなり発熱します。(ヤケドする程度に)
なので冷却ファンが必要だと考えました。
幸い、[日本橋のデジット](http://blog.digit-parts.com/)にジャンクのDCファン(12V)があったので、そちらを使うことにしました。

![9GA0612H6001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183170/374d4f6e-f310-581f-b2f7-b876d34f0203.png)

※イメージ画像

## 回路図

以上を踏まえて、設計した回路の回路図が以下のものです。

![回路図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183170/866d53fd-e50d-4a92-d76b-0e43ea375c7c.png)

(MOSFETが180度回転していますので注意してください。)

# ソフト開発

今回はマイコンにM5Stamp Pico、すなわち**`ESP32`**を用いるので、Arduinoとして開発可能です。
私は最近はもっぱら、Arduino IDEではなく、Visual Studio Code の拡張機能である`PlatformIO`を用いて開発しています。
今回もそちらで開発を行いました。

## ソースコード

```cpp:main.cpp
#include <Arduino.h>
#include "M5Atom.h"

#define INTERVAL 25
#define RESISTOR 1
#define FAN 7

void setup() {
  // put your setup code here, to run once:
  M5.begin(true, false, true);
  Serial.begin(9600);
  delay(50);
  M5.dis.drawpix(0, 0x707070);
  Serial.print("Reset:\n");

  pinMode(18,OUTPUT);
  pinMode(19,OUTPUT);
  pinMode(36,INPUT);//未使用
}

void loop() {
  unsigned long time = millis();

  int sec = int(time) / 1000;
  int min = int(sec) / 60;
  sec -= min*60;

  Serial.print(min);
  Serial.print(":");
  Serial.println(sec);

  if((min%INTERVAL)<RESISTOR){
    digitalWrite(18,HIGH);
    M5.dis.drawpix(0, 0x00FF00);
  }
  else{
    digitalWrite(18,LOW);
    M5.dis.drawpix(0, 0xFF0000);
  }

  if((min%INTERVAL)<FAN){
    digitalWrite(19,HIGH);
    Serial.println("ON");
  }
  else{
    digitalWrite(19,LOW);
    Serial.println("OFF");
  }

  delay(100);
}
```

では、順に説明していきます。

### 【1~2行目】ライブラリ

```cpp:main.cpp
#include <Arduino.h>
#include "M5Atom.h"
```

今回は`Arduinoライブラリ`と`M5Atomライブラリ`を用いています。
特別なことはしないのでこれだけで動きます。

### 【4~6行目】定数の設定

```cpp:main.cpp
#define INTERVAL 25
#define RESISTOR 1
#define FAN 7
```

ここで、**`何分おきに`**、**`何分抵抗器に電気を流し`**、**`何分ファンを回すか`**を設定しています。
この場合だと、「**25分**おきに、**1分**抵抗器に電気をながし、**7分**ファンを回す」という設定です。

図解するとこんな感じ。

![interval.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183170/4d8e0466-a311-5a80-b913-afdec615f235.png)

### 【8~19行目】setup関数

```cpp:main.cpp
void setup() {
  // put your setup code here, to run once:
  M5.begin(true, false, true);
  Serial.begin(9600);
  delay(50);
  M5.dis.drawpix(0, 0x707070);
  Serial.print("Reset:\n");

  pinMode(18,OUTPUT);
  pinMode(19,OUTPUT);
  pinMode(36,INPUT);//未使用
}
```

ここではM5Stap Picoの初期設定を行っています。
特に13行目の`M5.dis.drawpix(0, 0x707070);`は、Pico上のLEDの色を指定しています。
又、IOピンは抵抗器につながるMOSFET用、ファンにつながるMOSFET用に使用しています。
36番ピンは温度センサをつなげる予定でしたが、うまく行かなかったので諦めました。

### 【21~51行目】loop関数

```cpp:main.cpp
void loop() {
  unsigned long time = millis();

  int sec = int(time) / 1000;
  int min = int(sec) / 60;
  sec -= min*60;

  Serial.print(min);
  Serial.print(":");
  Serial.println(sec);

  if((min%INTERVAL)<RESISTOR){
    digitalWrite(18,HIGH);
    M5.dis.drawpix(0, 0x00FF00);
  }
  else{
    digitalWrite(18,LOW);
    M5.dis.drawpix(0, 0xFF0000);
  }

  if((min%INTERVAL)<FAN){
    digitalWrite(19,HIGH);
    Serial.println("ON");
  }
  else{
    digitalWrite(19,LOW);
    Serial.println("OFF");
  }

  delay(100);
}
```

ここがメインの部分ですね。
22~26行目で回路作動からの時間を計測 & 28~30行目で経過時間をシリアル出力しています。
そして32~48行目で現在の経過時刻に対して抵抗器およびファンを動かすべきかどうかを判断し、IOピンを制御しています。
至ってシンプルですね。

# 完成品

お待たせしました。完成品のお披露目です。

![IMG_4823.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183170/2b409d14-cba4-eeed-3e4e-6ede946574d8.jpeg)

![IMG_4824.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183170/7d22910c-5022-cb05-5b63-13fa2756e151.jpeg)

![IMG_4820.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183170/b0e9cfce-d0fa-0165-83b8-eeafed817d0a.jpeg)

![IMG_4819.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183170/66818d14-b03c-15bd-0621-3dd5e2d60380.jpeg)

![IMG_4828.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183170/c60f276e-a4a5-6b3f-bf56-06cb059f548f.jpeg)

で、このままだとなんかショボいので…

![IMG_4831.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183170/90f650d5-8d73-23be-4a60-c48ec335fc4b.jpeg)

![IMG_4833.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183170/05e35135-9207-7d90-7e56-80bba36158f5.jpeg)

![IMG_4832.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183170/b7573ad4-8946-e754-6917-92db2d31ecc0.jpeg)

![IMG_4834.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/183170/04689248-ee27-c779-5d46-cd2f478b1aa5.jpeg)

こんな感じで手作りシールをつけることにしました。

イキって**APC-01**なんて名前までつけちゃいました。
APCとはAutomatic Power Consumer (自動電力消費器)の略です。
まんまですね(笑)

ちなみに最後の写真の
**"A device just consumes electricity"**
というのは日本語に訳すと、
**「ただ電気を消費するだけの装置」**
って意味で、ちょっとした皮肉です(笑)

と、いった感じで無事完成させる事ができました。

# 最後に

最初は難しそうに思われた依頼でしたが、設計し実験を重ねることで完成まで持っていくことが出来ました。
又今回はあまり触れていませんが、筐体加工も少し上手くなりました。
本当はもう少しサイズを小さくできれば良かったですが、それはまた次の課題ということにしたいと思います。

長文に渡りお読みいただきありがとうございました。