工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Manufacturing Technology >> 製造プロセス

ATtiny85でQualcomm Quick Charge 2.0/3.0をリバース・エンジニアリング:実践ガイド

部品と材料

部品数量備考
Microchip ATtiny851
SparkFun LM1117 3.3V レギュレーター1
SparkFun USB Type-A オス・コネクタ1
抵抗 10kΩ2
抵抗 2.21kΩ1
Arduino Proto Shield1
SparkFun タクト・スイッチ 12mm1
QC対応モバイル・バッテリーまたは充電器1QC 2.0/3.0対応品
ジャンパー・ワイヤー (0.1インチ)8
ピン・ヘッダー 36ピン 1列1
抵抗 0.05Ω(シャント)10負荷用
Arduino UNO1ISPプログラマー用
オス/メス ジャンパー・ワイヤー7
LED1電圧インジケーター用
抵抗 22.1kΩ1

必要な工具

使用ソフトウェア

プロジェクト概要

はじめに

多くのUSB機器はQualcomm Quick Charge(QC)に対応し、通常の5Vではなく9V/12Vなどの高電圧で急速充電します。このプロジェクトは、QCプロトコルを解析・エミュレートし、ホビー用途でQC対応モバイル・バッテリーから高電圧・大電力を取り出せるデバイスを作るものです。

ATtiny85でQualcomm Quick Charge 2.0/3.0をリバース・エンジニアリング:実践ガイド
5V出力時
ATtiny85でQualcomm Quick Charge 2.0/3.0をリバース・エンジニアリング:実践ガイド
9V出力時
ATtiny85でQualcomm Quick Charge 2.0/3.0をリバース・エンジニアリング:実践ガイド
12V出力時(10Ω 5W抵抗負荷)

デバイス開発

アクティブ部品はLM1117 3.3VレギュレーターとATtiny85のみ。その他は抵抗、スイッチ、コネクタ、ジャンパー、ヘッダー、端子、ユニバーサル基板など。

ATtiny85でQualcomm Quick Charge 2.0/3.0をリバース・エンジニアリング:実践ガイド
部品配置とはんだ付け。0Ωショート・リンクで相互接続

プログラミング用と動作用でジャンパーを切り替えます(SPIピンが動作時はGPIOとして使用されるため)。

ATtiny85でQualcomm Quick Charge 2.0/3.0をリバース・エンジニアリング:実践ガイド
プログラミング時は全ジャンパーを外す

ATtiny85のISPプログラミング

ATtiny85をICソケットから外し、ブレッドボード上でプログラミングします。Arduino UNOを「ArduinoISP」スケッチ(ファイル>スケッチ例>ArduinoISP)でISPプログラマー化します。

  1. ATtinyサポートをArduino IDEにインストール(David A. Mellis氏作)
  2. Arduino UNOをISPとしてATtiny85にブートローダー書き込み
  3. スケッチを開発・アップロード
ATtiny85でQualcomm Quick Charge 2.0/3.0をリバース・エンジニアリング:実践ガイド
ISPプログラミング用回路

※ISP = In-System Programmer。デバイス上でプログラミングする場合はATtiny周辺のジャンパーを全て外せば可能です。

デバイス動作

  1. QC対応モバイル・バッテリーに接続(デフォルト5V)
  2. コード書き込み後、全ジャンパーを接続(MCUがD+/-でQCソースと通信)
  3. LM1117が3.3Vを生成しATtiny85に給電
  4. ATtiny85の4つのI/Oピンが分圧抵抗ネットワークに接続され、D+/D-に電圧信号を出力
  5. もう1ピンはプルアップ入力のスイッチに接続、押下で電圧切り替え

QC 2.0/3.0 プロトコルの電圧テーブル(D+/D-電圧 → VBUS出力)

ATtiny85でQualcomm Quick Charge 2.0/3.0をリバース・エンジニアリング:実践ガイド
CHYデータシートより

D+/D-がともに0.325〜2.0Vで1.25秒以上維持されるとQCモードに入ります。D+が0.325V未満になるとQC終了、5Vに戻ります。

分圧ネットワークによる電圧生成

ATtiny85でQualcomm Quick Charge 2.0/3.0をリバース・エンジニアリング:実践ガイド
ATtiny85の4出力で2組の分圧回路を駆動

タクト・スイッチはプルアップ入力。未押下時はHighでwhileループで待機、押下でループ脱出→次の電圧設定→再びwhileループで保持。LEDが5Vで暗く、9Vで中程度、12Vで明るく光り、出力電圧を視覚確認できます。

応用例

他のQCクラスへの対応

QC 2.0 Class B、QC 3.0、QC 4.0はClass Aと後方互換があるため、このデバイスでも動作する可能性がありますが、電圧選択は5V/9V/12Vのみ。他の電圧が必要な場合はCHY 100/101/103データシートを参照し、コードを修正してください。

⚠️ 重要な警告

※ 上記を理解せずに複製することは、火災や機器破損のリスクがあるため推奨しません。

※ 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() {
  // 電圧レギュレーター変更必須!自己責任で
}

回路図

Circuits.io で回路図公開中

ATtiny85でQualcomm Quick Charge 2.0/3.0をリバース・エンジニアリング:実践ガイド
完全回路図

製造プロセス

  1. NeoPixelリングとArduinoで作るインタラクティブジャイロスコープLEDディスプレイ
  2. DIYクラウドコスチューム: LEDストリップ、Arduino Nano & SparkFunパーツで光る雲に
  3. Arduinoでシンプルな障害物センサーを自作 – IR LEDとフォトダイオード入門
  4. 3Dプリントで作るコンパクトMIDIドラムキット
  5. Arduino Dueでマスターする音声認識と音声合成
  6. Icom無線機用 外部Sメーター(CI-V + Arduino)
  7. コンパクトなRDA5807ミニステレオラジオ:Arduino Nanoプロジェクト
  8. IoT4Car: Arduino MKR1000で車両テレメトリー取得・クラウド可視化 – OBD-II対応
  9. Stratasys InsightでFDMパーツを密封する実践ガイド
  10. Markforged Mark Two、MIT 2016年ハードウェアハッカソンでイノベーションを加速
  11. Qualcomm、自律UAVイノベーションを推進する5G対応AIドローンプラットフォームを発表