Reverse‑Engineering Qualcomm Quick Charge 2.0/3.0 met ATtiny85: Praktische Gids
Onderdelen en benodigdheden
| Onderdeel | Aantal |
|---|---|
| Microchip ATtiny85 | 1 |
| SparkFun LM1117 3.3V Regulator | 1 |
| SparkFun USB Male A connector | 1 |
| Weerstand 10 kΩ | 2 |
| Weerstand 2,21 kΩ | 1 |
| Arduino Proto Shield | 1 |
| SparkFun Drukknop 12mm | 1 |
| QC Power Bank of Lader (Quick Charge 2.0/3.0 compatibel) | 1 |
| Generieke Jumper (0,1") | 8 |
| Male Header 36 posities 1 rij lang (0,1") | 1 |
| Weerstand 0,05 Ω (shunt voor stroommeting) | 10 |
| Arduino UNO (als ISP programmeerder) | 1 |
| Male/Female Jumper Wires | 7 |
| LED (generiek) | 1 |
| Weerstand 22,1 kΩ | 1 |
Benodigde gereedschappen
- Soldeerbout
Apps en online services
- Arduino IDE
Over dit project
Inleiding
Veel USB‑gevoede apparaten gebruiken Qualcomm Quick Charge (QC) voor sneller laden bij hogere spanningen dan de standaard 5V. Dit project ontwikkelt een apparaat dat het QC‑protocol “hackt”, zodat hobbyists en ingenieurs hun QC‑powerbanks kunnen gebruiken voor projecten die 9V of 12V nodig hebben (tot 18W).
Ontwikkeling van de Hack / Apparaat
Het apparaat heeft twee actieve componenten: de LM1117 3.3V regulator en de ATtiny85 MCU. De rest zijn weerstanden, drukknop, connectors, jumpers, headers, protoboard.
Eerst worden componenten netjes geplaatst en gesoldeerd. Nul‑ohm links verbinden delen. Jumpers schakelen de on‑board schakeling uit voor programmeren (SPI pinnen zijn tijdens werking GPIO).
ATtiny85 programmeren met ISP
Voor programmeren haal je de ATtiny85 uit de IC‑voet en zet hem op een breadboard. Een Arduino UNO fungeert als ISP programmeerder via de ArduinoISP sketch (File > Examples > ArduinoISP).
Stappen:
- Installeer ATtiny ondersteuning in Arduino IDE (David A. Mellis).
- Brand de bootloader met Arduino UNO als ISP.
- Ontwikkel en upload code met Arduino UNO als ISP.
Alternatief: programmeer de ATtiny85 op de print door alle jumpers eromheen te halen.
Apparaat werking
Sluit het apparaat aan op een QC‑compatibele powerbank. Standaard levert USB 5V. Na het programmeren moeten alle jumpers zitten zodat de MCU via D+/D‑ met de QC‑bron communiceert.
De LM1117 voedt de ATtiny85. De MCU start de code. 4 I/O pinnen sturen twee spanningsdelers (2x 10k, 2x 2,2k) aan voor D+ en D‑. Een drukknop (input pull‑up) laat de gebruiker de spanning wisselen.
Hoe QC 2.0/3.0 spanningsschakeling werkt
USB heeft 4 lijnen: VBUS (standaard 5V), D+, D‑, GND. Bij gewone laders is VBUS vast. Bij QC zit er een interne boost converter die de spanning aanpast op verzoek van het aangesloten apparaat (PD).
QC 2.0/3.0 gebruikt D+/D‑ voor communicatie. De PD legt spanningen op D+/D‑; de QC‑lader past VBUS aan. Volgende tabel (uit CHY datasheet) toont welke D+/D‑ combinatie welke uitgangsspanning geeft:
QC 2.0 activeert wanneer D+ en D‑ de waarden van rij 4 hebben gedurende minstens 1,25s. Als D+ onder 0,325V daalt, stopt QC en valt VBUS terug naar 5V.
De ATtiny85 genereert via de spanningsdelers de benodigde D+/D‑ signalen:
- Voor 3,3V op D+: beide pinnen (PB3, PB4) HIGH.
- Voor 0,6V op D‑: bovenste pin HIGH, onderste LOW (PB1, PB3).
De drukknop (pull‑up) houdt de code in een while lus zolang niet ingedrukt. Bij indrukken breekt de lus, volgende spanning wordt ingesteld, weer een while lus. Een LED brandt zwak (5V), matig (9V), fel (12V) als visuele indicatie.
Mogelijke toepassingen
- 12V LED‑strips aansturen
- RF zenders/ontvangers voor groter bereik
- 12V Relais, motoren
- Elke spanning 1,25–10V met LM317 of LM2596
- 9V IR remote
- Robot auto voeding
- Laptop laden met 20V (zie waarschuwing)
- Systemen tot 18W (WiFi, LTE, IoT)
- Backup voeding remote systemen
- LCD/LED monitors, printers, scanners
- Lage‑vermogen portable PC
Ondersteuning voor andere QC klassen
QC 2.0 Class B, QC 3.0 en QC 4.0 zijn achterwaarts compatibel met QC 2.0 Class A. Dit apparaat werkt waarschijnlijk met alle actuele laders/powerbanks, maar spanningopties blijven 5V, 9V, 12V. Voor andere spanningen: raadpleeg CHY 100/101/103 datasheets en pas code aan.
⚠️ Waarschuwing!
- Gebruik alleen hoogwaardige QC Power Banks/Laders met kortsluitbeveiliging. Belasting mag niet boven 18W uitkomen. Controleer het typeplaatje van de belasting.
- Vermijd 20V uitgang: de LM1117 3.3V regulator haalt maximaal 15V. In de code nooit D+ en D‑ tegelijk 3,3V laten worden.
- Indien 20V nodig is (QC 2.0 Class B, QC 3.0, 4.0), gebruik een regulator die >20V aan kan (bv. LM317 op 3,3V). Anders worden regulator en MCU vernietigd.
- Let op polariteit van de uitgang: rood = +, blauw = –.
- Vermijd losse USB contacten (contactweerstand = hitte, rendementsverlies).
- Tijdens ISP programmeren alle jumpers verwijderen om SPI pinnen te isoleren.
- Code niet wijzigen zonder QC protocol te begrijpen. Ontwerp bedoeld voor QC 2.0 Class A, deels bruikbaar voor hogere standaarden.
- De hack werkt niet met alle QC laders/powerbanks.
- GPIO schakelvolgorde is cruciaal om afschakeling van hoog‑spanningsmodus te voorkomen.
Let op: Repliceer dit project niet als bovenstaande punten niet begrepen worden; brandgevaar of schade kan ontstaan!
Handmatig spannen wisselen zonder MCU is mogelijk: 4 jumper draadjes die de D+/D‑ condities nabootsen door verbinding met Vcc (3,3V) en GND (0V) op de weerstanden in de juiste volgorde. MCU is voor dergelijke eenvoudige overgangen misschien overkill.
Referenties
Code (ATtiny85)
///========================= 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);
// Now 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
}
Schema
Productieproces
- Interactieve gyroscoop LED-display met NeoPixel-ring en Arduino
- DIY Wolk Kostuum: LED-strip, Arduino Nano & SparkFun Onderdelen
- Een eenvoudige obstakelsensor bouwen met Arduino – IR LED & Fotodiodo Tutorial
- Bouw een Compacte MIDI Drumkit met 3D-printen
- Spraakherkenning & Synthese Meesteren op Arduino Due
- Externe S-meter voor Icom-radios via CI-V en Arduino
- Compacte RDA5807 Mini Stereo Radio – Arduino Nano Project
- IoT4Car: Voertuigtelemetrie Vastleggen & Analyseren met Arduino MKR1000
- FDM-delen afdichten met Stratasys Insight: Een praktische gids
- Markforged Mark Two versnelt innovatie op MIT Hardware Hackathon 2016
- Qualcomm lanceert 5G-ingeschakeld AI-drone-platform voor autonom UAV-innovatie