“Kami tidak bisa memperbaikinya” sang mekanik berkata, sambil menyerahkan kunci Chevrolet Estate yang baru saya beli. Mimik mukanya berubah seperti teringat akan horor yang dia temukan di balik panel pintu sisi kanan depan kemarin. “Tapi”, lanjutnya, “kami ganti motor power window itu dengan yang baru gratis untuk anda, sebagai kompensasi karena tidak bisanya kami menepati janji kami untuk memperbaiki fungsi auto tersebut”. Meninggalkan bengkel, saya terbayang akan betapa pegalnya jari saya nanti kala harus menahan tombol itu untuk membuka dan menutup jendela saat mengambil kartu di gerbang tol kelak.
Alat | Obeng +, Solder, Multimeter, ATTINY programmer / Arduino |
Spare Part | IC LM78L05, IC ATTINY25 |
Lain-lain | shrink wrap, pembungkus kabel (bahan kain) |
Lama Waktu | 1 minggu, jika sudah membaca artikel ini: 1 hari |
Sabtu berikutnya, saya temukan bahwa fungsi power window kanan depan saya telah diakali, wajar saja sang mekanik tidak bisa mengembalikan fungsi auto tersebut. Mungkin, pada suatu saat yang lalu, sebelum Estate ini menjadi milik saya, modul power window tersebut mengalami kerusakan dan untuk memperbaikinya diakali dengan memasang 2 relay tambahan di balik panel pintu, fungsi naik-turun jendela pun bisa kembali, meski harus kehilangan moda auto tersebut.
Mengembalikan Perkabelan Standar
Penampakan relay yang dimaksud
Hal pertama yang saya lakukan adalah memotong relay horor tersebut.
Saya lupa mengambil gambar saat relay tersebut masih tersambung di panel pintu.
Kabel coklat dan biru yang tadinya telah dipotong dan dimasukkan ke relay, dikembalikan ke standar pabrikan dengan menyolder ulang dan membungkus dengan shrink wrap.
Diakhiri dengan membungkus ulang kabel modul power window menggunakan pembungkus kabel berbahan kain.
Sampai tahap ini saya pede kalau perbaikan ini akan berhasil, nyatanya setelah dicoba, power window kanan depan malah mati total, meskipun jendela lainnya tetap bisa dibuka-tutup lewat saklar di kanan depan. Waduh.
Diagnosa
Saatnya bongkar modul kontrol power window.
Lagi-lagi saya lupa mengambil gambar keseluruhan bagian atas rangkaian modul kontrol power window tersebut setelah dibongkar.
Block diagram hasil penelusuran. Merah merupakan jalur tegangan utama, biru merupakan jalur sinyal, hitam merupakan jalur tegangan daya rendah.
Block diagram hanya difokuskan pada rangkaian power window kanan depan, karena rangkaian untuk jendela lainnya hanya berupa saklar biasa.
PIC12C508 *tepokjidat. Saya tidak menyangka akan menemukan sebuah microcontroller di rangkaian kontrol power window yang harusnya cukup sederhana, apalagi microcontroller yang butuh alat khusus untuk memprogramnya, thanks GM Daewoo!
LM78L05 regulator ditugaskan untuk menurunkan tegangan 12V ke 5V yang kemudian digunakan untuk menyuplai tegangan ke PIC12C508. Sinyal high 5V juga dilewatkan ke saklar power window yang kemudian ditangkap oleh microcontroller dan diolah secara algoritma untuk menghasilkan fungsi: auto up, auto down, normal up, dan normal down dengan cara mengontrol on-board relay. Feedback dikembalikan ke microcontroller berupa sinyal high 5V yang menandakan posisi jendela sudah tertutup penuh atau terbuka penuh.
Konfigurasi pin PIC12C508 yang terpasang:
- VCC 5V
- Relay up (kontrol jendela naik)
- Relay down (kontrol jendela turun)
- Feedback (5V = jendela terbuka penuh atau tertutup penuh)
- Tidak digunakan
- Switch down (sinyal saklar ditekan turun)
- Switch up (sinyal saklar ditekan naik)
- Ground
Saya hanya berharap microcontroller itu tidak rusak…
Si Biang Masalah
Menyalakan modul kontrol dengan aki motor, merah: positif, hitam: negatif. Saya temukan bahwa output regulator LM78L05 hanya 0V alias jebol. Pengujian on-board relay dengan multimeter menunjukkan relay dalam keadaan bagus.
Proses penggantian regulator, setelah terpasang, kaki regulator dipotong dan bagian yang di solder dibersihkan.
Penggantian berhasil, tegangan 5V konstan keluar dari kaki output regulator. Tapi menekan atau menarik saklar tetap tidak menghasilkan respon dari relay. Tes pada microcontroller, hampir semua kaki mengeluarkan tegangan 5V, microcontroller positif jebol.
Saya tidak memiliki alat EEPROM programmer untuk memprogram ulang microcontroller tersebut. Kalaupun harus membuat sendiri PIC programmer, saya tidak memiliki komputer dengan serial port fisik, dan karena saya tidak tahu algoritma dari program asli dalam microcontroller tersebut (yang sudah tentu terhapus), artinya saya harus bisa memprogram di atas mobil menggunakan laptop. Karena mencari dan melakukan eksperimen untuk mendapatkan algoritma yang tepat butuh waktu yang cukup lama. Saatnya mencari alternatif lain.
Bypass
Kalau diperhatikan, posisi pin sinyal masuk dari saklar power window (pin 6, 7) dan pin kontrol keluar ke on-board relay (pin 2, 3) pada microcontroller saling berhadapan. Karena sinyal masuk dari saklar adalah 5V dan relay juga di kontrol menggunakan tegangan 5V, maka memungkinkan untuk dilakukan bypass.
Bypass: menyambungkan pin dari saklar ke pin kontrol relay menggunakan kawat. Kawat yang digunakan adalah potongan dari kaki resistor.
Terlebih dahulu microcontroller PIC12C508 dicabut dan saya memasangkan soket IC 8 pin di tempat bekas microcontroller tersebut.
Solusi ini ternyata ampuh untuk mengembalikan fungsi naik-turunnya jendela kanan depan, meskipun tidak mengembalikan fungsi auto, tetapi setidaknya tidak perlu diakali menggunakan relay tambahan yang horor.
Jadi jika power window kanan depan anda mati karena jebolnya microcontroller tersebut, dan anda merasa cukup dengan fungsi naik-turun manual, gunakan solusi ini. Bagi saya tentunya solusi ini kurang memuaskan, karena alasan saya membongkar modul kontrol ini pada awalnya memang karena fungsi auto tidak berjalan.
ATTINY Si Penyelamat
Saya ingat saya masih memiliki Arduino Uno pemberian teman saya (hi Ron!), meskipun Arduino dapat digunakan untuk menggantikan fungsi microcontroller yang rusak tersebut, tapi tentu saja terlalu overkill, apalagi Arduino yang bongsor tentu tidak akan masuk ke dalam rumah modul kontrol power window tersebut.
Namun, ada satu hal yang dapat dimanfaatkan dari Arduino tersebut, yaitu memprogram ATTINY.
ATTINY25/45/85 adalah chip microcontroller 8 pin yang menurut saya cocok sebagai pengganti PIC12C508 tersebut, apalagi dengan sudah adanya Arduino sebagai alat pemrogram, memberi kemudahan bagi saya untuk melakukan pemrograman.
Proses pemrograman ATTINY menggunakan Arduino Uno. ATTINY25 memiliki memory cukup banyak untuk program kontrol power window yang akan ditulis.
Saya membuat shield programming menggunakan PCB berlubang, tapi juga dapat menggunakan protoboard seperti link Instructables diatas.
ATTINY Adapter
Tentu saja fungsi pin di chip ATTINY25 tidak sama dengan fungsi pin di PIC12C508, untuk itu perlu dibuat adapter khusus.
Tampak atas layout adapter PIC12C508 ke ATTINY25. Pin biru merupakan pin yang akan di solder ke board kontrol power window. Pin merah merupakan pin yang akan dipasang chip ATTINY25. Resistor 47k ohm dibutuhkan sebagai pull-up agar chip ATTINY25 tidak mengalami reset. Garis hitam adalah jalur penghubung antar pin. PC1-PC8 mewakili pin pada PIC12C208, AT1-AT8 mewakili pin pada ATTINY25.
Hasil akhir pembuatan adapter. Butuh berjam-jam dan kesabaran tinggi untuk menyoldernya. Tampak atas soket dimana ATTINY25 akan ditancapkan. Tampak bawah pin yang akan di solder ke board kontrol power window.
Saya menggunakan kabel kawat 0.25mm yang biasa digunakan sebagai kabel jumper pada protoboard sebagai penghubung antar pin.
Posisi pemasangan adapter pada board kontrol. Perhatikan bahwa orientasi pin 1 chip ATTINY25 menghadap ke arah saklar lock (saklar putih). Adapter di solder langsung ke board kontrol tanpa menggunakan soket.
Program
Berkendara dengan panel pintu seperti pada gambar membuat saya berasa menjadi karakter di film Mad Max. Beberapa hari trial dan error dalam memprogram akhirnya membuahkan hasil.
Kabel merah di dekat tombol lock adalah kabel sinyal feedback, untuk sekedar bereksperimen.
Sebenarnya, anda dapat memprogram PIC12C508 menggunakan Arduino, tetapi anda harus membeli shield khusus untuk melakukannya. Kode sumber di bawah dapat disesuaikan untuk PIC12C508.
Karena pemrograman dilakukan sendiri, artinya saya dapat menentukan perilaku kontrol moda auto yang saya inginkan, berikut daftar yang ingin saya capai dalam pembuatan program:
- Jika pengemudi menekan tombol sesaat, jendela akan otomatis turun (auto-down), jika tombol ditahan maka jendela akan turun manual selama tombol ditekan saja.
- Jika pengemudi menarik tombol sesaat, jendela akan otomatis naik (auto-up), jika tombol ditahan maka jendela akan naik manual selama tombol ditarik saja.
- Saya tidak ingin saat auto-down, jendela terbuka penuh sampai mentok, saya ingin jendela terbuka 3/4 saja saat auto-down.
- Saya ingin ada delay sesaat setelah moda auto berjalan hingga tombol dapat dioperasikan kembali.
Berdasarkan daftar diatas, dibuatlah program sebagai berikut:
/** * ATTINYx5 Chevrolet Estate Driver Side Power Window AUTO Control Program * Arduino C Language * Version: 1.7 * Author: F16D3 (bengkel@f16d3.com) * Author URI: http://f16d3.com/menyembuhkan-fungsi-auto/ * License: GNU General Public License v2 or later * License URI: http://www.gnu.org/licenses/gpl-2.0.html */ /* Daftar konstanta */ const int PB0_OUT_UP = 0; //Pin output ke relay UP (jendela naik) const int PB1_OUT_DOWN = 1; //Pin output ke relay DOWN (jendela turun) const int PB2_STUCK = 2; //Pin feedback jendela sudah naik penuh / turun penuh const int PB4_UP = 4; //Pin input dari saklar UP (ditekan naik) const int PB3_DOWN = 3; //Pin input dari saklar DOWN (ditekan turun) const unsigned long THRESHOLD_AUTO = 250; //Maksimum lama tekanan / tarikan tombol untuk memasuki mode AUTO (dalam milidetik) const unsigned long TIMELIMIT_DOWN = 1500; //Maksimum waktu jendela berjalan turun saat dalam mode AUTO (dalam milidetik) const unsigned long STUCK_TIME = 75; //Minimum lama sinyal feedback diterima sampai jendela dianggap naik penuh / turun penuh (dalam milidetik) const unsigned long STUCK_DELAY = 1000; //Lama delay hingga mode AUTO dapat dioperasikan kembali (dalam milidetik) /* Deklarasi dan inisialisasi variable */ int swUp = LOW; int swDown = LOW; int autoUp = LOW; int autoDown = LOW; int stuck = LOW; unsigned long timeUp = 0; unsigned long timeDown = 0; unsigned long timeStuck = 0; unsigned long temp = 0; /* Setup, saat pertama kali chip mendapat power */ void setup() { /* Setup fungsi masing-masing pin */ pinMode(PB0_OUT_UP, OUTPUT); pinMode(PB1_OUT_DOWN, OUTPUT); pinMode(PB2_STUCK, INPUT); pinMode(PB3_DOWN, INPUT); pinMode(PB4_UP, INPUT); } /* Program utama */ void loop() { /* Baca semua input, posisi saklar dan feedback */ swUp = digitalRead(PB4_UP); swDown = digitalRead(PB3_DOWN); stuck = digitalRead(PB2_STUCK); /* Sinyal feedback HIGH diterima? */ if (stuck == HIGH) { /* Baru saja mendapat sinyal feedback? */ if (timeStuck == 0) { /* Simpan waktu awal sinyal feedback diterima */ timeStuck = millis(); } else { /* Lama sinyal feedback sudah memenuhi threshold? */ if ((millis() - timeStuck) >= STUCK_TIME) { /* Matikan motor power window dengan mengirim sinyal LOW ke relay */ digitalWrite(PB0_OUT_UP, LOW); digitalWrite(PB1_OUT_DOWN, LOW); /* Reset semua variable */ timeUp = 0; autoUp = LOW; timeDown = 0; autoDown = LOW; /* Delay sebelum kontrol dapat dioperasikan kembali */ delay(STUCK_DELAY); return; } } //end feedback logic } else { timeStuck = 0; } /* Saklar power window ditarik (UP) */ if ((swUp == HIGH) || (autoUp == HIGH)) { /* Perintahkan motor untuk menaikkan jendela dengan mengirim sinyal HIGH ke relay */ digitalWrite(PB0_OUT_UP, HIGH); digitalWrite(PB1_OUT_DOWN, LOW); timeDown = 0; autoDown = LOW; /* Catat kapan awal saklar ditarik */ if (timeUp == 0) { timeUp = millis(); } } else { /* Saklar UP pernah ditarik? */ if (timeUp > 0) { /* Cek apakah pengemudi hanya menarik saklar sesaat */ temp = millis() - timeUp; if (temp <= THRESHOLD_AUTO) { /* Hanya ditarik sesaat (kurang dari threshold), masuk ke mode AUTO naik jendela */ autoUp = HIGH; } else { /* Mode manual, berarti saklar sudah dilepaskan, perintahkan motor berhenti */ digitalWrite(PB0_OUT_UP, LOW); timeUp = 0; autoUp = LOW; } } else { /* Mode manual, berarti saklar sudah dilepaskan, perintahkan motor berhenti */ digitalWrite(PB0_OUT_UP, LOW); timeUp = 0; autoUp = LOW; } } /* Saklar power window ditekan (DOWN) */ if ((swDown == HIGH) || (autoDown == HIGH)) { /* Perintahkan motor untuk menurunkan jendela dengan mengirim sinyal HIGH ke relay */ digitalWrite(PB1_OUT_DOWN, HIGH); digitalWrite(PB0_OUT_UP, LOW); timeUp = 0; autoUp = LOW; /* Catat kapan awal saklar ditarik */ if (timeDown == 0) { timeDown = millis(); } else { /* Jika motor sudah berputar sampai batas waktu turun, hentikan motor */ if ((millis() - timeDown) >= TIMELIMIT_DOWN) { digitalWrite(PB1_OUT_DOWN, LOW); timeDown = 0; autoDown = LOW; } } } else { /* Saklar DOWN pernah ditekan? */ if (timeDown > 0) { /* Cek apakah pengemudi hanya menekan saklar sesaat */ temp = millis() - timeDown; if (temp <= THRESHOLD_AUTO) { /* Hanya ditekan sesaat (kurang dari threshold), masuk ke mode AUTO turun jendela */ autoDown = HIGH; timeDown = millis(); } else { /* Mode manual, berarti saklar sudah dilepaskan, perintahkan motor berhenti */ digitalWrite(PB1_OUT_DOWN, LOW); timeDown = 0; autoDown = LOW; } } else { /* Mode manual, berarti saklar sudah dilepaskan, perintahkan motor berhenti */ digitalWrite(PB1_OUT_DOWN, LOW); timeDown = 0; autoDown = LOW; } } }
THRESHOLD_AUTO menentukan hingga berapa milidetik tombol ditekan / ditarik sehingga dianggap menjadi moda auto. Jika diisi 250, maka jika tombol ditekan / ditarik kurang dari 250 milidetik, maka akan dianggap moda auto, dan jendela akan dinaikkan / diturunkan sampai penuh. Jika tombol ditahan lebih dari 250 milidetik maka jendela akan beroperasi manual.
TIMELIMIT_DOWN menentukan batas waktu jendela turun secara otomatis. Jika diisi 1500, maka 1500 milidetik (1.5 detik) setelah jendela mulai turun otomatis, motor akan dihentikan. Ini dilakukan agar jendela tidak terbuka sampai mentok, tetapi hanya 3/4 saja. Tentunya tergantung dari kecepatan motor juga, jika motor sudah berumur dan kecepatan jendela turun dengan lambat, nilai ini harus disesuaikan. Jika ingin jendela turun sampai mentok, isi dengan nilai yang cukup tinggi, seperti 9999.
STUCK_TIME menentukan batas minimum waktu sinyal feedback diterima dimana jendela ditentukan telah mencapai posisi terbuka atau tertutup penuh. Nilai yang optimal antara 50 hingga 100 milidetik. Gunakan nilai yang kecil dulu, jika perilaku jendela berasa aneh, naikkan, hingga maksimum 100 milidetik.
STUCK_DELAY menentukan berapa lama delay setelah moda auto dijalankan sebelum modul dapat menerima input dari pengemudi kembali. 1000 milidetik (1 detik) adalah nilai yang cukup masuk akal. Anda dapat mengisinya dengan 300000, tapi setelah moda auto digunakan, jendela tidak akan dapat dioperasikan selama 5 menit.
Kembalinya Fungsi Auto
Sore itu, hujan mulai deras. Sebuah Estate silver berjalan pelan menuju gerbang tol Pasteur. Sentuhan ringan jari sang pengemudi, menurunkan jendela secara otomatis dengan indahnya. Kartu tol didapat, Estate silver pun melesat meninggalkan gerbang tol dalam lebatnya hujan menuju matahari tenggelam. Tombol ditarik, jendela tak merespon, ternyata sang pengemudi lupa mengatur ulang nilai STUCK_DELAY yang sebelumnya diisi angka 60000. Waduh!
Sayangnya belum ada sistem diskusi yang diimplementasikan di website ini. Gatal ingin berkomentar? Kesini saja.