Reverse-Engineering Qualcomm Quick Charge 2.0/3.0 Menggunakan ATtiny85: Panduan Praktis
Komponen dan Perlengkapan
Microchip Technology ATtiny85
1
Regulator SparkFun LM1117 3.3V
1
SparkFun USB Male A
1
Resistor 10k ohm
2
Resistor 2.21k ohm
1
Arduino Proto Shield
1
Tombol Tekan SparkFun 12mm
1
Power Bank atau Charger QC
1
Jumper Umum (0.1")
8
Male-Header 36 Posisi 1 Baris - Panjang (0.1")
1
Resistor 0.05 ohm
10
Arduino UNO
1
Kabel Jumper Laki/Perempuan
7
LED (umum)
1
Resistor 22.1k ohm
1
Alat dan Mesin yang Diperlukan
Pemancah solder (umum)
Aplikasi dan Layanan Online
Arduino IDE
Tentang Proyek Ini
Pendahuluan
Banyak perangkat elektronik konsumen yang diberi daya USB memiliki solusi Qualcomm QC (Quick Charge) bawaan untuk pengisian daya cepat pada berbagai voltase alih-alih 5.0 volt biasa. Ini membuka kesempatan untuk menggunakan Power Bank kompatibel QC untuk proyek yang membutuhkan lebih banyak daya atau voltase lebih tinggi seperti 9/12 volt.
Tujuan proyek ini adalah mengembangkan perangkat yang dapat mengubah protokol QC dan membiarkan hobi, pengembang, insinyur menggunakan power bank mereka untuk lebih banyak voltase/daya untuk proyek berikutnya yang membutuhkan banyak daya.
Gambar di atas menunjukkan output 5, 9, 12 Volt dari power bank kompatibel QC 2.0 yang memberi daya resistor 10 Ohm 5 Watt.
Mengembangkan Hack * Perangkat
Seluruh perangkat memiliki dua komponen aktif - regulator tegangan LM1117 3.3V dan mikrokontroler ATtiny85 untuk mengontrol. Semua bagian lain adalah resistor, tombol tekan, konektor, jumper, header, terminal, papan prototipe, dll.
Untuk membangun perangkat, pertama komponen ditempatkan dalam tata letak rapi, lalu dipancarkan. Beberapa jumper 0 ohm digunakan untuk menghubungkan berbagai bagian.
Ada jumper untuk menonaktifkan rangkaian papan dan mengaktifkan pemrograman. Karena garis pemrograman (SPI - MOSI, MISO, SCK) juga bertindak sebagai GPIO selama operasi perangkat.
Memprogram ATtiny85 dengan ISP
Sebelum memprogram ATtiny85, itu dikeluarkan dari IC Base dan ditempatkan pada papan roti. Untuk memprogram ATtiny85, papan Arduino UNO diubah menjadi programmer ISP dengan mengunggah sketsa "ArduinoISP" dari File > Contoh > ArduinoISP. Sketsa ini tersedia di Arduino IDE.
Memprogram ATtiny85 memerlukan langkah berikut:
Menginstal dukungan ATtiny untuk Arduino IDE (terima kasih kepada David A. Mellis)
Membakar Bootloader untuk ATtiny85 menggunakan Arduino UNO sebagai ISP
Mengembangkan dan Mengunggah Kode menggunakan Arduino UNO sebagai ISP
Rangkaian berikut disiapkan untuk memprogram ATtiny85:
ISP = in system programmer
Secara alternatif, ATtiny85 dapat diprogram dengan tetap berada pada perangkat dengan mencabut semua jumper di sekitarnya.
Operasi Perangkat
Untuk menggunakan perangkat, pertama perlu dihubungkan ke Power Bank (atau Charger) kompatibel QC. Secara default voltase USB Power Bank QC akan 5.0 volt.
Semua jumper harus dihubungkan setelah mengunggah kode, sehingga MCU dapat berkomunikasi melalui D+/- ke sumber QC.
Regulator LM1117 3.3 V akan menyala dan memberi daya ke ATtiny85. MCU ini akan mulai mengeksekusi kode. 4 pin I/O ATtiny85 terhubung ke resistor pembagi tegangan yang akan digunakan sebagai Output High dan Low. Pin I/O lain terhubung ke tombol yang akan diinisialisasi sebagai input Pull Up. Tombol ini mengambil input pengguna untuk mengubah voltase sumber QC.
Sekarang, sebelum masuk ke detail, penting untuk mengetahui bagaimana Output akan berubah. Terdapat setidaknya 4 garis/kabel yang umum untuk setiap jenis USB (USB A, B, C, 1.1, 2.0, 3.0+).
Ini adalah :-
VBUS (Vcc +5V secara default)
D +
D -
Ground
Dalam Charger/Power Bank biasa, VBUS tetap, karena itu pengiriman daya terbatas oleh arus yang mungkin 500 mA, 1 A, 2 A menghasilkan 2.5 Watt, 5 Watt dan 10 Watt masing-masing.
Namun dalam perangkat sumber QC, ada konverter boost internal yang dapat menaikkan voltase tergantung pada permintaan perangkat penerima daya (PD) !!!
QC 2.0 ( juga 3.0 ) menggunakan D+ dan D- USB untuk berkomunikasi dengan PD. PD mengirim sinyal voltase pada D+ dan D- dan charger QC akan memberikan daya sesuai dengan mengubah voltase VBUS. Menurut Datasheet CHY ini, berikut adalah tabel yang menjelaskan pasang sinyal apa pada D+/D- dari PD yang akan membuat QC memberikan output voltase apa:
Dukungan QC 2.0 dimulai ketika voltase pada D+ dan D- sama dengan nilai pada baris ke-4 dari tabel ini dan tetap setidaknya 1.25 detik. Jika D+ menjadi 0.0 volt (di bawah 0.325 Volt sebenarnya) dukungan QC akan berhenti dan Output akan 5.0 volt. Dengan mengatur voltase menurut tabel ini, output pada VBUS dapat diubah.
Di sini, 4 Output ATtiny85 terhubung ke 2 jaringan pembagi tegangan yang terdiri dari dua resistor 10k dan dua resistor 2.2k untuk menghasilkan sinyal voltase ini untuk garis D+/D-.
Misalnya, untuk menghasilkan 3.3 V pada D+, resistor atas dan bawah yang terhubung ke dua pin Output ATtiny85 PB3 dan PB4, keduanya akan dibuat High dari kode.
Demikian pula, untuk menghasilkan 0.6 V pada D-, resistor atas dan bawah yang terhubung ke dua pin Output ATtiny85 lainnya (PB1 dan PB3) akan dibuat High dan Low masing-masing.
Dengan cara ini charger/power bank QC 2.0 menerima permintaan perubahan voltase dan berubah sesuai. Tombol Tekan dikonfigurasi sebagai Input PULLUP, saat tidak ditekan, dibaca HIGH oleh MCU dan eksekusi kode terperangkap dalam while loop mencegah perubahan set voltase apa pun. Saat pengguna menekan Tombol Tekan, while loop terputus dan voltase berikutnya diatur. Kemudian lagi, eksekusi kode memasuki while loop berikutnya untuk memegang voltase VBUS saat ini.
Ada LED yang menyala redup (5V), sedang (9V) dan terang (12V) untuk memberikan representasi visual output voltase kepada pengguna.
Aplikasi yang Mungkin
Mengemudikan Stripe LED 12V
Memberi daya transmitter/penerima RF untuk jarak lebih jauh
Mengemudikan Relai 12V, Motor, dll
Dapatkan voltase apa pun antara 1.25 hingga 10 volt menggunakan LM317 atau LM2596
Drive remote IR 9V
Daya Mobil Robot
Pengisian Laptop dengan 20V
Sistem apa pun hingga 18 Watt seperti WiFI, LTE, perangkat S2E untuk aplikasi IoT
Daya cadangan untuk sistem jarak jauh
Monitor LCD, LED, Printer, Scanner kebanyakan
PC portabel Daya Rendah
Dukungan untuk Kelas QC Lainnya
Karena QC 2.0 Class B, QC 3.0 dan QC 4.0 kompatibel mundur dengan QC 2.0 Class A, maka perangkat ini mungkin bekerja dengan semua charger dan power bank terbaru. Namun opsi voltase akan 5.0, 9.0 dan 12.0 volt. Jika voltase output lain diperlukan, silakan baca datasheet CHY 100, 101, 103 dan ubah kode sesuai.
Peringatan!
Power Bank atau Charger QC berkualitas Tinggi dengan Perlindungan Short Circuit harus digunakan, beban eksternal Tidak boleh Melebihi 18 Watt. Ini dapat dipastikan dengan Memeriksa Label Daya pada perangkat beban.
Menghasilkan 20 Volt Harus Dihindari karena regulator 1117 3v3 dapat Menangani Maksimal 15 Volt, ini harus dihindari dari Kode MCU dengan Jangan pernah membiarkan garis D+ dan D- memiliki 3.3 Volt pada waktu yang sama.
Jika output 20 Volt diperlukan (didukung oleh QC 2.0 Class B dan QC 3.0, QC 4.0) , regulator tegangan (LM317 dikonfigurasi untuk 3.3 V) yang dapat menangani lebih dari 20 Volt harus digunakan. Jika tidak, baik Regulator dan MCU akan Hancur !!!!
Perhatian Harus Diberikan pada Polaritas Output Voltase, +ve ditunjukkan oleh kabel kecil MERAH dan -ve ditunjukkan oleh kabel kecil BIRU di samping Terminal Output.
Koneksi longgar pada kopling USB Laki/Perempuan harusdihindari atau Panas akan dihasilkan sebagai konsekuensi dari Resistensi Kontak dan Efisiensi Daya akan Turun.
Selama Pemrograman ISP Semua Jumper Harus Dilepaskan untuk Mengisolasi pin MOSI, MISO, SCK, VCC, GND, RESET dari rangkaian lain pada papan untuk Menghindari Gangguan dengan Pemrograman.
Modifikasi kode Tidak boleh dilakukan tanpa Memahami Protokol Pengisian Daya QC dengan Jelas, Desain Ini Dirancang Utama untuk Sumber Daya QC 2.0 (Class A)namundapatdigunakansecara parsialuntukStandar QCyang lebih tinggi
HackMungkinTidakBerfungsi dengan beberapa Charger/Power Bank QC
Pengalihan GPIO Harusdilakukan dalam Urutan yang Tepatuntuk Menghindari Pemutusan Mode Tegangan Tinggi
Catatan:Direkomendasikan untuk tidak mereplikasi proyek ini jika poin-poin di atas tidak dipahami oleh seseorang, jika tidak, Risiko Bahaya Kebakaran atau Kehilangan Peralatan mungkin terjadi!
Tidak mungkin untuk mengubah voltase secara manual tanpa menggunakan mikrokontroler. Hanya 4 kabel jumper diperlukan untuk meniru kondisi pada tabel D+/D- dengan menghubungkan ke Vcc (3.3V) dan Gnd (0V) ke resistor dalam urutan yang tepat. Karena menggunakan MCU mungkin terlalu berlebihan untuk transisi sederhana seperti ini.
///========================= 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 }