Kisah proses peminjaman dalam pengembangan elektronik pada contoh yang baik.

Merekam log lift sniffer buatan sendiri
Suatu kali saya perlu menyalin perangkat yang cukup sederhana. Perusahaan manufaktur tidak ada lagi, tetapi masih ada permintaan di seluruh negeri untuk penggantian perangkat yang rusak atau bekas.
Perangkat itu sendiri adalah tombol panggilan lift di foto di sebelah kiri. Untuk percobaan, mereka memberi saya dua salinan, salah satunya bisa dibongkar sepenuhnya.
Keseluruhan rencana kerja terlihat seperti ini:
- Mempelajari papan sirkuit;
- Mempelajari elemen dasar papan itu sendiri;
- Membuat sketsa rangkaian listriknya;
- Mencoba membaca file firmware dari mikrokontroler;
- Membongkar firmware;
- Mengekstraksi algoritma operasi;
- Pengembangan dewan baru;
- Menulis firmware baru.
Jika paragraf 4 gagal, rencana selanjutnya akan lebih rumit, tetapi saya beruntung.
Kami mempelajari eksperimen

Mikrokontroler utama

Sepotong sirkuit listrik lift, tempat papan kami dilingkari merah
Papan dirakit pada mikrokontroler 1997, AT89C2051 , yang didasarkan pada arsitektur Intel MCS-51 . Pada tahun 2020, ia merayakan hari jadinya yang ke-40 di pasar sistem embedded.
Penjelasan kecil: mikrokontroler adalah mikrokontroler yang berisi inti komputasi dan seperangkat periferal untuk mengendalikan perangkat eksternal. Sebagai contoh, dalam mesin cuci modern, mikrokontroler melakukan polling tombol kontrol, sensor, menampilkan informasi pada layar dan mengontrol pompa, pemanas, katup dan drum drive. Untuk sebagian besar fungsi ini, tidak memerlukan perangkat perantara, hanya satu set komponen elektronik pasif.

Kami membongkar papan sirkuit
Membuat sketsa diagram rangkaian asli papan di masa mendatang akan membantu untuk mengetahui tujuan pin mikrokontroler, yang diperlukan untuk mengurai kode firmware.
Perangkat asli dikembangkan oleh perusahaan Cina, dan oleh karena itu sirkuitnya sangat membingungkan dan dengan banyak komponen yang tidak perlu. Misalnya, relai dihidupkan melalui kaskade tripel dari transistor bipolar, optocoupler, dan pengontrol medan (dalam urutan itu).
Seorang kenalan yang bekerja dengan pabrik-pabrik Cina memberi tahu saya bahwa orang-orang Cina terlibat dalam komplikasi skema yang serupa untuk meningkatkan biaya pengembangan dan produksi, jika hanya satu orang yang melakukannya. Setelah ini, saya cenderung percaya padanya:

Tempat yang sama di papan dua lapisan Cina di kedua sisi. Tiga resistor besar tidak terhubung dengan apa pun. Saya bahkan menyorot papan dengan senter yang kuat untuk memastikan.
Skema disalin, tempat-tempat misterius dimodelkan dalam multisim , kami mengambil firmware.
Mencoba membaca firmware
Saya sangat beruntung bahwa perlindungan baca tidak diaktifkan di kedua papan di pengendali, jadi saya berhasil menggabungkan kedua opsi firmware dengan pornografi serupa:

Foto dari blog pribadi penggemar Amerika
Membongkar firmware
Langkah selanjutnya kita perlu mengubah kode mesin ini menjadi sesuatu yang lebih mudah dibaca:

Kami mengambil alat IDA Pro yang terkenal, yang sudah memiliki pengontrol kami dengan semua register periferal, dan membuka file firmware HEX:

Memproses data yang diterima oleh dewan dalam bahasa assembly
Setelah itu, ada proses yang agak membosankan untuk mempelajari set instruksi kernel komputasi kami, berkomentar dan mendekode kode assembler.
Penangan interupsi sendiri ditemukan di alamat tabel vektor interupsi, entri dalam register periferal memberikan informasi tentang konfigurasi antarmuka komunikasi. Langkah demi langkah, kode assembler yang tidak disebutkan namanya telah berubah menjadi sesuatu yang bisa dibaca.
Ekstraksi algoritma kerja
Karena saya perlu mengembangkan perangkat baru pada basis elemen yang berbeda, perlu untuk mengekstrak algoritma dari kode. Beberapa waktu kemudian, kode semu tersebut lahir:
void UartISR (void) { counter500ms = 0;
Pemrosesan yang sama dari data yang diterima dalam C
Siapa yang peduli dengan protokol transfer:
Stasiun kontrol elevator berkomunikasi dengan papan tombol panggilan melalui antarmuka dupleks 24-volt penuh. Dalam mode normal, kartu tombol mendengarkan garis, menunggu paket data 9-bit. Jika alamat papan kami datang dalam paket ini (ditetapkan oleh saklar DIP di papan), maka papan beralih ke mode penerimaan 8-bit, dan semua paket selanjutnya diabaikan oleh sisa papan dalam perangkat keras.
Yang pertama setelah alamat adalah paket dengan kode perintah kontrol. Secara khusus, dewan ini hanya membawa 3 tim:
- Menulis ke register data. Misalnya, frekuensi dan durasi tombol berkedip pada panggilan;
- Menyalakan lampu latar tombol;
- Permintaan status tombol (ditekan atau tidak).
Byte terakhir adalah checksum, yang merupakan XOR sederhana dari semua byte setelah alamat.
Setelah checksum, papan kembali masuk ke mode siaga untuk alamatnya.
Pengembangan dewan baru
Untuk tahap pengembangan diagram kabel baru dan papan sirkuit cetak, saya tidak punya gambar, tapi itu seperti ini:

Pengkabelan dan pengkabelan dilakukan di Altium Designer . Pembuatan papan sirkuit cetak dipesan di Zelenograd " Resonite ".
Menulis firmware baru
Sementara papan baru kami sedang dalam produksi, kami pergi ke objek tempat tombol panggilan tersebut dipasang, dan memeriksa kebenaran dari protokol transfer yang dibongkar menggunakan sniffer yang terpasang pada arduino:

Sepotong sirkuit pemancar yang secara elektrik setara dengan aslinya. Penerima hanya optocoupler.
Bicara tentang sniffer kami di ICC AVR
Selanjutnya, perlu bertindak sangat hati-hati agar tidak membakar apa pun di lift dan mencegahnya berhenti.

Kami naik ke tombol panggilan. Kabel kuning tebal - papan daya dan antarmuka transmisi. Putih pada konektor 4-pin - menghubungkan tombol dan lampu latar.
Kami memeriksa bahwa semuanya berfungsi sebagaimana mestinya, memperbaiki jambs dan menulis firmware baru untuk perangkat kami:
Kode C untuk papan baru berdasarkan mikrokontroler AVR ATmega328P
Kesederhanaan perangkat dan firmware dapat diperkirakan dengan jumlah kode, hanya berisi sekitar 600 baris dalam bahasa C.
Proses pembuatannya terlihat seperti ini:
Biayanya berbeda, tetapi prinsipnya sama
Saya tidak bisa melampirkan foto perangkat yang sudah jadi, hanya percaya bahwa itu masih diproduksi dan dijual.
Kesimpulan liris
Mengenai tombol lift "naik" dan "turun" di lantai. Saya perhatikan bahwa banyak orang benar-benar tidak memahami tujuan mereka dan mengguncang keduanya sekaligus.

Dari sini
Lift memiliki dua set tombol: di kabin terdapat panel pesanan, dan di lantai ada panel panggilan. Anda sudah dapat menebak dari nama bahwa panel pesanan memiliki prioritas kontrol yang lebih tinggi.
Semua elevator dengan panel panggilan dengan tombol naik dan turun bekerja dengan semacam algoritma optimasi perjalanan, yang tujuannya adalah untuk mengangkut jumlah penumpang maksimum dalam waktu minimum dan kondisi terpisah untuk waktu tunggu maksimum di lantai (diatur oleh standar negara).
Algoritma seperti itu biasanya melibatkan pemilihan penumpang di lantai jika mereka bepergian ke arah yang sama seperti yang ditunjukkan dengan menekan tombol panggilan "atas" atau "bawah".
Bayangkan sebuah situasi di mana lift dengan penumpang turun dan menerima panggilan "turun" dari lantai di bawah. Lift akan berhenti untuk menjemput penumpang (ya, masih ada akuntansi untuk memuat kabin oleh sensor berat, tapi kami akan menurunkannya).
Lift berjalan dan menerima panggilan "naik" dari lantai di bawah. Adalah logis bahwa lift tidak akan berhenti untuk mengambil penumpang, karena itu tidak akan mengubah arah perjalanan (ini juga diatur oleh standar), dan mengambil penumpang untuk turun dan kemudian naik - konsumsi energi dan ruang yang tidak berguna dalam lift.
Lift berjalan dan menerima dua panggilan "naik dan turun" dari lantai di bawah, yang ditekan oleh beberapa penumpang yang tidak sabar yang perlu naik. Adalah logis bahwa lift akan berhenti di lantai ini, tetapi penumpang tidak akan memasukinya, tetapi akan membutuhkan waktu orang di kabin untuk memperlambat dan menghentikan lift, membuka pintu, menunggu, menutup pintu dan mempercepat ke kecepatan pengenal.
Jika elevator hanya memiliki satu tombol di lantai, maka dalam 99% case lift bekerja sesuai dengan algoritma "kolektif turun", dan jika ada pesanan di kabin, lift hanya berhenti ketika bergerak turun.
Jika Anda memiliki keterampilan pemrograman dalam JS, maka Anda dapat mencoba menerapkan algoritma kontrol serupa di game online Elevator Saga . Ini memiliki semua aspek untuk mengoptimalkan perjalanan tanpa masuk jauh ke dalam hardcore seperti pengoperasian sirkuit pengaman elevator.

Di saluran telegram saya, saya memposting materi serupa. Sekarang di sana Anda dapat mengikuti pengembangan perangkat berikutnya.