[tech] Quick Charge 2.0 電源から 12V とる | Mon, Dec 7. 2015 - 氾濫原 というのを書いたが 、これだと12V だけしかとれない。

12Vとれれば個人的にはいいんだけど、9V もとるには(というより任意の電圧をとる) にはどうするかなと思って考えた。

[Qualcomm認証済み]Aukey モバイルバッテリー 大容量 10400mAh スマホ充電器 [Quick Charge 2.0対応] 急速充電可能 (シルバー)PB-T1 -

3.0 / 5.0

ルートアール QC2.0対応 USB簡易電圧・電流チェッカー RT-USBVA3HV -

3.0 / 5.0

回路図

追記: 特に3段にする必要もないので計算が簡単で定数が簡単な回路にかえた

古い回路図:

D12をハイ(5V)にすると D- に 0.6V、 D11 をハイにすると 3.3V がかかるように分圧抵抗を選び、このポートをコントロールする。D+ 側も同様 (D10, D9)

どっちかがハイのときはどっちかはHi-Zにして回路を切断する。

ファームウェア

例によって Arduino で試した

#include <Arduino.h>
#include <avr/sleep.h>

const int D_PLUS_0V6 = 12;
const int D_PLUS_3V3 = 11;
const int D_MINUS_0V6 = 10;
const int D_MINUS_3V3 = 9;

enum EVoltage {
	E_12V,
	E_9V,
	E_5V
};

void setup() {
	EVoltage voltage = E_9V;

	// init with hi-Z
	pinMode(D_PLUS_3V3, INPUT);
	pinMode(D_PLUS_0V6, INPUT);
	pinMode(D_MINUS_3V3, INPUT);
	pinMode(D_MINUS_0V6, INPUT);
	digitalWrite(D_PLUS_3V3, LOW);
	digitalWrite(D_PLUS_0V6, LOW);
	digitalWrite(D_MINUS_3V3, LOW);
	digitalWrite(D_MINUS_0V6, LOW);

	// wait until stable connection
	delay(1000);

	// reset line (D+ = 0V, D- = 0V)
	pinMode(D_PLUS_0V6, OUTPUT);
	pinMode(D_MINUS_0V6, OUTPUT);
	delay(100);

	// D+ = 0.6V, D- = 0.6V for 1.25s
	digitalWrite(D_PLUS_0V6, HIGH);
	digitalWrite(D_MINUS_0V6, HIGH);
	delay(1500);

	// D- to 0V for 1ms
	digitalWrite(D_MINUS_0V6, LOW);
	delay(2);

	// Set voltage
	// (now: D+ = 0.6V, D- = 0)
	// D+ must not be low; it cause reset.
	switch (voltage) {
		case E_12V:
			// D+ = 0.6V, D- = 0.6V
			digitalWrite(D_MINUS_0V6, HIGH);
			break;
		case E_9V:
			// D+ = 3.3V, D- = 0.6V
			digitalWrite(D_PLUS_3V3, HIGH);
			pinMode(D_PLUS_3V3, OUTPUT);
			pinMode(D_PLUS_0V6, INPUT);
			digitalWrite(D_PLUS_0V6, LOW);

			digitalWrite(D_MINUS_0V6, HIGH);
			break;
		default:
			// nothing to do
			break;
	}

	set_sleep_mode(SLEEP_MODE_PWR_DOWN);
	sleep_mode();
}

void loop() {
}

出力

赤は VBUS, 黄は D-

9V とれたよ〜

9V 時の D+, D-

12V 時の D+, D-

懸念点

0.6V 出力時かなりドライブ能力が低いのが心配。

メモ

スイッチ切り替えで任意電圧とれるアダプタみたいなのがあると便利そうですね。

  1. トップ
  2. tech
  3. Quick Charge 2.0 電源から 9V をとる (任意の電圧をとる)

とりあえずとれるところまではやっていたが、ちゃんと負荷をかけていなかったのでかけたメモ

[Qualcomm認証済み]Aukey モバイルバッテリー 大容量 10400mAh スマホ充電器 [Quick Charge 2.0対応] 急速充電可能 (シルバー)PB-T1 -

5.0 / 5.0

例によってこのバッテリーで、結論からいうとスペック通り(12V 1.35A) の出力はとれ、ノイズ(リプル)も定格内だと全く問題なさそう。

  • 実際は 1.5A超ぐらいまでは出力され、1.6Aぐらいでシャットダウンされる。電源ボタンを押すとすぐリセットされるのでポリスイッチ以外での制御もしている? ショートされた場合はしばらくリセットもできないのでポリスイッチも入ってそうだけど
  • QucikCharge モードに入っている場合でも、低電流状態が続くと自動シャットダウンされる。1分ぐらい。閾値は面倒なので調べていない 。スペックに表記はない。

ちなみにこれ、安い割に外装がちゃんとアルミで、しっかりしている。ただしパワーが入っている間は常にコイル鳴きが聞こえる。負荷があがるとコイルもさらによく鳴く。

  1. トップ
  2. tech
  3. Quick Charge 2.0 バッテリーから12Vをとる(追試)

前行におく

promise.
  then(function () { }).
  catch(function () { });

後行におく

promise
  .then(function () { } )
  .catch(function () { });

どっちもいいんだけど、僕は前行においております

  • JS には自動セミコロン挿入があるので閉じ括弧で行が終わっていると不安になる
  • 上から順に読んでいく場合は行継続のマークが行の最後にあったほうが読みやすい気がする
  • then 〜 . で、ピリオドを文の終わりのように見せられる

行頭を重点的に見ながらコード読む人にとっては前の行との繋がりがわかりやすいのは、後行にドットなので (前行に置いた場合に行頭だけ読んでいくとただの関数コールに見える)、難しいところですね。

JS の場合セミコロン自動挿入があるのが嫌で、これが一番の理由で前行につけているフシがある。(文法違反になってはじめてセミコロン挿入がくるので、この場合どちらもセミコロン自動挿入は起きませんが……)

then 〜 . で1行にするとセミコロンと対応する感じになるので良いような気がする。

条件演算子で

var piyo = foo ? bar:
           fuu ? baz:
                 buz;

みたいに書くとき : と ; が対応していい感じなので、そういうイメージでいます

  1. トップ
  2. tech
  3. JS のメソッドチェインでドットを前行に置くか後行に置くか