Реверс‑инжиниринг Qualcomm Quick Charge 2.0/3.0 с ATtiny85: практическое руководство
Компоненты и материалы
| Микроконтроллер Microchip ATtiny85 | × | 1 |
| Стабилизатор SparkFun LM1117 3.3 В | × | 1 |
| USB‑разъём Type‑A (SparkFun) | × | 1 |
| Резистор 10 кОм | × | 2 |
| Резистор 2.21 кОм | × | 1 |
| Arduino Proto Shield | × | 1 |
| Тактическая кнопка 12 мм (SparkFun) | × | 1 |
| Power Bank / зарядка с поддержкой QC | × | 1 |
| Перемычки 0.1″ (набор) | × | 8 |
| Пин‑хедер 36 пинов (0.1″) | × | 1 |
| Резистор 0.05 Ом (шунт) | × | 10 |
| Arduino UNO (для программирования) | × | 1 |
| Перемычки «папа‑мама» | × | 7 |
| Светодиод | × | 1 |
| Резистор 22.1 кОм | × | 1 |
Инструменты
- Паяльник
Программное обеспечение
- Arduino IDE
О проекте
Введение
Многие USB‑устройства используют Qualcomm Quick Charge (QC) для быстрой зарядки при напряжениях 9/12 В вместо стандартных 5 В. Это позволяет использовать QC‑совместимые пауэрбанки для питания проектов, требующих большей мощности или напряжения.
Цель проекта — создать устройство, «взламывающее» протокол QC, чтобы хоббисты и инженеры могли получать 5/9/12 В от своих пауэрбанков для энергозатратных задач.



На фото: выход 5, 9, 12 В от QC 2.0 пауэрбанка под нагрузкой 10 Ом / 5 Вт.
Разработка устройства
Два активных компонента: стабилизатор LM1117 3.3 В и МК ATtiny85. Остальное — резисторы, кнопка, разъёмы, перемычки, макетная плата.

Компоненты размещаются аккуратно, затем паяются. Нулевые перемычки используются для перемыканий. На плате есть джамперы для отключения цепей во время прошивки (линии SPI — MOSI, MISO, SCK — в работе являются GPIO).



Прошивка ATtiny85 через ISP
ATtiny85 извлекается из основания и ставится на макетку. Arduino UNO прошивается скетчем ArduinoISP (Файл → Примеры → ArduinoISP).
Шаги:
- Установить поддержку ATtiny в Arduino IDE (работа David A. Mellis).
- Записать загрузчик (Burn Bootloader) через Arduino UNO как ISP.
- Разработать и загрузить код через Arduino UNO как ISP.


ISP = in‑system programmer. Альтернативно — прошить ATtiny85 на плате, сняв все джамперы вокруг него.
Принцип работы
Устройство подключается к QC‑совместимому пауэрбанку (по умолчанию 5 В). После прошивки все джамперы замкнуты — МК общается с источником по линиям D+/D‑.
LM1117 питает ATtiny85. 4 вывода МК подключены к двум делителям напряжения (по два резистора 10 кОм и 2.2 кОм) для формирования уровней на D+/D‑. Ещё один вывод — кнопка с подтяжкой к питанию.
Протокол QC 2.0/3.0 использует линии D+/D‑ для согласования напряжения. Таблица уровней (по даташиту CHY):

QC 2.0 активируется, когда на D+ и D‑ одновременно поданы 0.6 В (строка 4) минимум на 1.25 с. Если D+ падает ниже 0.325 В — режим отключается, вывод 5 В.
ATtiny85 через делители формирует нужные комбинации. Пример: 3.3 В на D+ — оба вывода (PB3, PB4) в HIGH. 0.6 В на D‑ — верхний резистор (PB1) HIGH, нижний (PB3) LOW.

Кнопка (INPUT_PULLUP): пока не нажата — HIGH, цикл ожидания. Нажатие прерывает цикл, устанавливается следующее напряжение, снова ожидание. Светодиод светит тускло (5 В), средне (9 В), ярко (12 В) — визуальная индикация.
Возможные применения
- Питание 12 В LED‑лент
- RF‑передатчики/приёмники для увеличения дальности
- Управление 12 В реле, двигателями
- Получение 1.25–10 В через LM317 / LM2596
- 9 В ИК‑пульты
- Питание робототехнических платформ
- Зарядка ноутбуков (20 В — см. предупреждения)
- Системы до 18 Вт: Wi‑Fi, LTE, IoT‑шлюзы
- Резервное питание удалённых систем
- Мониторы, принтеры, сканеры
- Низковольтные портативные ПК
Поддержка других классов QC
QC 2.0 Class B, QC 3.0, QC 4.0 обратно совместимы с Class A — устройство может работать, но доступны только 5/9/12 В. Для других напряжений изучите даташиты CHY 100/101/103 и адаптируйте код.
⚠ Предупреждения!
- Обязательно используйте качественный QC‑пауэрбанк/зарядку с защитой от КЗ. Нагрузка не более 18 Вт — проверяйте маркировку.
- Не выводите 20 В — стабилизатор LM1117 выдерживает макс. 15 В. В коде никогда не ставьте 3.3 В одновременно на D+ и D‑.
- Если нужен 20 В (QC 2.0 Class B, QC 3.0/4.0) — используйте стабилизатор, выдерживающий >20 В (например, LM317 на 3.3 В). Иначе и стабилизатор, и МК сгорят!
- Соблюдайте полярность выхода: красный — «+», синий — «‑».
- Избегайте слабого контакта в USB‑разъёме — контактное сопротивление вызывает нагрев и потерю КПД.
- Во время ISP‑прошивки все джамперы должны быть сняты для изоляции линий MOSI, MISO, SCK, VCC, GND, RESET.
- Не меняйте код без глубокого понимания протокола QC. Проект ориентирован на QC 2.0 Class A, частично работает с вышестоящими стандартами.
- Возможно, хак не сработает с некоторыми зарядками/пауэрбанками.
- Переключение GPIO должно выполняться в строгой последовательности — иначе QC выйдет из высоковольтного режима.
Внимание: Не повторяйте проект, если пункты выше не понятны — риск пожара или порчи оборудования!
Напряжения можно переключать вручную без МК — достаточно 4 перемычки для воспроизведения состояний D+/D‑ по таблице. МК может быть избыточен для таких простых переходов.
Ссылки
Код
ATtiny85 Code (C/C++) — QC Controller
///========================= Algorithm ========================///
///* First, Connect the D+ pin to a voltage 0.325 to 2 volts and keep the D- floating, then wait at least 2 seconds.
//Two actions happen during this 2 seconds:
//The D+ and D- voltage equal a voltage between 0.325 to 2 volts for 1.25 seconds.
//(because the D+ and D- pins connect together inside the CHY100 at first)
//Then the D+ keeps at a voltage between 0.325 to 2 volts and the D- voltage decrease to zero.
//(because the D+ and D- pins disconnect and a resistor inside the CHY100 discharges the D-)
//*** CHY100 is a QC 2.0 Protocol interface chip inside Power bank/charger
//........ other QC 2.0 chips are probably similar
//Make D+ above 3.0 V first and then connect the D- to a voltage between 0.325 to 2 volts.
//The VBUS jumps to 9V.
//While keeping the D- connection with a voltage between 0.325 to 2 volts,
//make D+ a voltage between 0.325 to 2 volts.
//The VBUS jumps to 12V.
//(because the D+ and D- voltage are between 2V and 0.325V)
//Disconnect the D+ from a voltage between 0.325 to 2 volts.
//VBUS jumps to 5V, Because the QC2.0 exits Voltage changing mode and VBUS goes to the default value 5V.
//start from beginning when needing to enter QC2.0 again)
///============================================================//
//============ IMPORTANT NOTE ================
//*** Sequence of making pins HIGH and LOW is important
//*** If D+ falls below 0.325V during transition because of wrong GPIO Switching Sequence
//*** QC 2.0 will exit High Voltage Mode and VBUS will go back to 5 Volts
//==============================================//
#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);
// Initiating QC Handshake by making D+ 0.6 v keeping D- at Gnd
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(Dn_2k2, INPUT);
//pinMode(Dn_10k, INPUT);
pinMode(Dp_2k2, OUTPUT);
pinMode(Dp_10k, OUTPUT);
digitalWrite(Dp_2k2, LOW);
digitalWrite(Dp_10k, HIGH);
delay(3000);
// now QC protocol is active
}
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() {
// change Voltage Regulator !!!
// do at your own risk
}
Схемы
Производственный процесс
- Qualcomm запускает 5G-включенную AI дрон-платформу для драйвинга автономных БПЛА инноваций
- Герметизация FDM-деталей в Stratasys Insight: практическое руководство
- Принтер Markforged Mark Two ускоряет инновации на хакатоне по аппаратному обеспечению MIT 2016 года
- Интерактивный гироскопический LED-дисплей на NeoPixel Ring и Arduino
- DIY-костюм «Облако»: LED-лента, Arduino Nano и детали SparkFun
- Простой ИК-датчик препятствий на Arduino: ИК-светодиод и фотодиод
- Компактная MIDI-барабанная установка с 3D-печатью
- Освоение распознавания и синтеза речи на Arduino Due
- Внешний S-метр для радиостанций Icom: CI-V + Arduino
- Компактный стерео FM-радио на RDA5807 и Arduino Nano
