ATtiny85でQualcomm Quick Charge 2.0/3.0をリバース・エンジニアリング:実践ガイド
部品と材料
| 部品 | 数量 | 備考 |
|---|---|---|
| Microchip ATtiny85 | 1 | |
| SparkFun LM1117 3.3V レギュレーター | 1 | |
| SparkFun USB Type-A オス・コネクタ | 1 | |
| 抵抗 10kΩ | 2 | |
| 抵抗 2.21kΩ | 1 | |
| Arduino Proto Shield | 1 | |
| SparkFun タクト・スイッチ 12mm | 1 | |
| QC対応モバイル・バッテリーまたは充電器 | 1 | QC 2.0/3.0対応品 |
| ジャンパー・ワイヤー (0.1インチ) | 8 | |
| ピン・ヘッダー 36ピン 1列 | 1 | |
| 抵抗 0.05Ω(シャント) | 10 | 負荷用 |
| Arduino UNO | 1 | ISPプログラマー用 |
| オス/メス ジャンパー・ワイヤー | 7 | |
| LED | 1 | 電圧インジケーター用 |
| 抵抗 22.1kΩ | 1 |
必要な工具
- はんだごて
使用ソフトウェア
- Arduino IDE
プロジェクト概要
はじめに
多くのUSB機器はQualcomm Quick Charge(QC)に対応し、通常の5Vではなく9V/12Vなどの高電圧で急速充電します。このプロジェクトは、QCプロトコルを解析・エミュレートし、ホビー用途でQC対応モバイル・バッテリーから高電圧・大電力を取り出せるデバイスを作るものです。
デバイス開発
アクティブ部品はLM1117 3.3VレギュレーターとATtiny85のみ。その他は抵抗、スイッチ、コネクタ、ジャンパー、ヘッダー、端子、ユニバーサル基板など。
プログラミング用と動作用でジャンパーを切り替えます(SPIピンが動作時はGPIOとして使用されるため)。
ATtiny85のISPプログラミング
ATtiny85をICソケットから外し、ブレッドボード上でプログラミングします。Arduino UNOを「ArduinoISP」スケッチ(ファイル>スケッチ例>ArduinoISP)でISPプログラマー化します。
- ATtinyサポートをArduino IDEにインストール(David A. Mellis氏作)
- Arduino UNOをISPとしてATtiny85にブートローダー書き込み
- スケッチを開発・アップロード
※ISP = In-System Programmer。デバイス上でプログラミングする場合はATtiny周辺のジャンパーを全て外せば可能です。
デバイス動作
- QC対応モバイル・バッテリーに接続(デフォルト5V)
- コード書き込み後、全ジャンパーを接続(MCUがD+/-でQCソースと通信)
- LM1117が3.3Vを生成しATtiny85に給電
- ATtiny85の4つのI/Oピンが分圧抵抗ネットワークに接続され、D+/D-に電圧信号を出力
- もう1ピンはプルアップ入力のスイッチに接続、押下で電圧切り替え
QC 2.0/3.0 プロトコルの電圧テーブル(D+/D-電圧 → VBUS出力)
D+/D-がともに0.325〜2.0Vで1.25秒以上維持されるとQCモードに入ります。D+が0.325V未満になるとQC終了、5Vに戻ります。
分圧ネットワークによる電圧生成
- 例:D+に3.3V出力するには、上下両抵抗に接続されたPB3/PB4をともにHigh
- D-に0.6V出力するには、上側抵抗(PB1)High、下側(PB3)Low
タクト・スイッチはプルアップ入力。未押下時はHighでwhileループで待機、押下でループ脱出→次の電圧設定→再びwhileループで保持。LEDが5Vで暗く、9Vで中程度、12Vで明るく光り、出力電圧を視覚確認できます。
応用例
- 12V LEDストリップ駆動
- RF送受信機の長距離化
- 12Vリレー、モーター駆動
- LM317/LM2596で1.25〜10V可変電源
- 9V IRリモコン駆動
- ロボット・カー電源
- ノートPC充電(20V対応機種)
- 18WまでのIoT機器(Wi-Fi、LTE、S2E等)
- リモート・システムのバックアップ電源
- 大半のLCD/LEDモニター、プリンター、スキャナー
- 低消費電力ポータブルPC
他のQCクラスへの対応
QC 2.0 Class B、QC 3.0、QC 4.0はClass Aと後方互換があるため、このデバイスでも動作する可能性がありますが、電圧選択は5V/9V/12Vのみ。他の電圧が必要な場合はCHY 100/101/103データシートを参照し、コードを修正してください。
⚠️ 重要な警告
- 短絡保護付きの高品質QCモバイル・バッテリー/充電器を使用し、負荷は18Wを超えないこと(負荷機器の定格ラベルで確認)
- 20V出力は避けること:LM1117 3.3Vレギュレーターの耐圧は最大15V。MCUコードでD+/D-を同時に3.3Vにしないよう制御必須
- 20Vが必要な場合(QC 2.0 Class B / QC 3.0 / 4.0対応)は、20V以上耐圧のレギュレーター(LM317を3.3V設定等)を使用。さもなくばレギュレーターとMCUが破壊される
- 出力極性に注意(赤=+、青=-)
- USBコネクタの接触不良は発熱と効率低下の原因
- ISPプログラミング時は全ジャンパーを外し、MOSI/MISO/SCK/VCC/GND/RESETを隔離
- QC充電プロトコルを明確に理解せずにコードを改変しないこと。主にQC 2.0 Class A向け設計だが、上位規格でも部分的に利用可能
- 一部のQC充電器/モバイル・バッテリーでは動作しない可能性あり
- GPIO切り替えは適切なシーケンスで行い、高電圧モードの意図せぬ終了を防止
※ 上記を理解せずに複製することは、火災や機器破損のリスクがあるため推奨しません。
※ MCUを使わず、4本のジャンパー・ワイヤーでVCC(3.3V)/GNDを分圧抵抗に手動接続するだけでも電圧切り替え可能です。単純な遷移ならMCUはオーバースペックかもしれません。
参考資料
コード
ATtiny85 スケッチ (C/C++)
///========================= Algorithm ========================///
/// 1. D+を0.325-2Vに接続しD-をフロート、2秒以上待機
/// - 最初1.25秒はCHY100内部でD+/D-が短絡され同電位に
/// - その後D+は維持、D-は内部抵抗で放電され0Vへ
/// 2. D+を3.0V以上にし、D-を0.325-2Vに接続 → VBUS 9V
/// 3. D-を維持し、D+を0.325-2Vに → VBUS 12V
/// 4. D+を0.325-2Vから切断 → QBUS 5V(QC終了)
/// 再度QC入りするには最初から
/// ============================================================
// ============ IMPORTANT NOTE ================
// *** ピンのHigh/Lowシーケンスが重要
// *** D+が0.325V未満になるとQC終了し5Vに戻る
// ==============================================
#define PUSH_SWITCH 0
#define Dp_2k2 4
#define Dp_10k 3
#define Dn_2k2 2
#define Dn_10k 1
int Press_Detect = 0;
void setup() {
pinMode(PUSH_SWITCH, INPUT_PULLUP);
Init_QC();
}
void loop() {
//// 5V ////
while (digitalRead(PUSH_SWITCH) == 1) { }
delay(250);
//// 9V ////
Set_9V();
while (digitalRead(PUSH_SWITCH) == 1) { }
delay(250);
//// 12V ////
Set_12V();
while (digitalRead(PUSH_SWITCH) == 1) { }
delay(250);
// Set_5V();
}
///********************** Functions **********************///
void Init_QC() {
pinMode(Dp_2k2, OUTPUT);
pinMode(Dp_10k, OUTPUT);
digitalWrite(Dp_2k2, LOW);
digitalWrite(Dp_10k, HIGH);
delay(3000); // QCプロトコル開始
}
void Set_9V() {
pinMode(Dp_2k2, OUTPUT);
pinMode(Dp_10k, OUTPUT);
digitalWrite(Dp_10k, HIGH);
digitalWrite(Dp_2k2, HIGH);
pinMode(Dn_2k2, OUTPUT);
pinMode(Dn_10k, OUTPUT);
digitalWrite(Dn_2k2, LOW);
digitalWrite(Dn_10k, HIGH);
}
void Set_12V() {
pinMode(Dp_2k2, OUTPUT);
pinMode(Dp_10k, OUTPUT);
pinMode(Dn_2k2, OUTPUT);
pinMode(Dn_10k, OUTPUT);
digitalWrite(Dn_2k2, LOW);
digitalWrite(Dn_10k, HIGH);
digitalWrite(Dp_10k, HIGH);
digitalWrite(Dp_2k2, LOW);
}
void Set_5V() {
pinMode(Dp_2k2, OUTPUT);
pinMode(Dp_10k, OUTPUT);
digitalWrite(Dp_10k, HIGH);
digitalWrite(Dp_2k2, LOW);
pinMode(Dn_2k2, OUTPUT);
pinMode(Dn_10k, OUTPUT);
digitalWrite(Dn_2k2, LOW);
digitalWrite(Dn_10k, LOW);
}
void Set_20V() {
// 電圧レギュレーター変更必須!自己責任で
}
回路図
製造プロセス
- NeoPixelリングとArduinoで作るインタラクティブジャイロスコープLEDディスプレイ
- DIYクラウドコスチューム: LEDストリップ、Arduino Nano & SparkFunパーツで光る雲に
- Arduinoでシンプルな障害物センサーを自作 – IR LEDとフォトダイオード入門
- 3Dプリントで作るコンパクトMIDIドラムキット
- Arduino Dueでマスターする音声認識と音声合成
- Icom無線機用 外部Sメーター(CI-V + Arduino)
- コンパクトなRDA5807ミニステレオラジオ:Arduino Nanoプロジェクト
- IoT4Car: Arduino MKR1000で車両テレメトリー取得・クラウド可視化 – OBD-II対応
- Stratasys InsightでFDMパーツを密封する実践ガイド
- Markforged Mark Two、MIT 2016年ハードウェアハッカソンでイノベーションを加速
- Qualcomm、自律UAVイノベーションを推進する5G対応AIドローンプラットフォームを発表