500 Can't connect to lowreal.net:443 (certificate verify failed) というのを書いたが 、これだと12V だけしかとれない。
12Vとれれば個人的にはいいんだけど、9V もとるには(というより任意の電圧をとる) にはどうするかなと思って考えた。
回路図
追記: 特に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 出力時かなりドライブ能力が低いのが心配。
メモ
スイッチ切り替えで任意電圧とれるアダプタみたいなのがあると便利そうですね。