Hadiah kekasih untuk 14 Februari dari seorang insinyur elektronik

Salam pembaca GT. Bagi saya, sebagai orang teknis dan tidak terlalu romantis, memilih hadiah untuk setiap kesempatan adalah rasa sakit yang luar biasa. Semuanya akan sederhana jika kekasih saya dapat memberikan RAM ke laptop atau slide prosesor, tetapi dia tidak pernah seorang teknisi.

Tetapi karena: Hadiah tidak semahal perhatian mahal (s) - kami akan mencoba berinvestasi dalam waktu. Saya sajikan untuk perhatian Anda "Heart v1.0"



Gagasan dasar perangkat ditemukan secara kolektif dengan tim saya untuk "Pohon Natal v1.0". Secara singkat, serangkaian fungsi:

- ucapan selamat terukir pada jantung
- ditenagai oleh charger telepon (konektor microUSB)
- lampu latar RGB dengan kemampuan untuk merekam profil yang berkedip yang dapat diaktifkan dengan tombol
- mode lampu malam
- memori internal untuk merekam salam. Ketika terhubung ke PC, itu didefinisikan sebagai flash drive.

Setelah berdiskusi / bersukacita atas fungsi yang melekat, kami memutuskan untuk melakukannya - tidak ada yang curiga berapa waktu yang dibutuhkan jantung ...

Besi


Ternyata - bagian paling sederhana dari hati. Langkah pertama adalah menyusun diagram struktural perangkat:



Rincian diambil dari yang ada di gudang kami, dan juga digunakan lebih dari satu kali di perangkat. Menurut skema, kita dapat mengatakan: MK termurah dengan USB pada papan STM32F042F6P6, LDO sederhana - XC6206P332MR, memori 32Mbps SPI W25Q32FVSSIG (2 buah diletakkan di papan, tetapi akhirnya mereka menyolder satu), RGB28 yang dikendalikan LED WS2812.

Diagram skematik:



Detail minimum dan kesalahan perhitungan yang paling penting adalah harapan bahwa WS2812 akan bekerja secara normal dari level 3.3V (Slavik! Ya, saya melakukannya ratusan kali ... banyak yang mengatakan).

Papan itu dibuat dari lebar minimum, untuk menyembunyikannya sebanyak mungkin di bawah tepi hati. Warnanya putih. Hasilnya didapat pada gambar.



Feil


Ingat, saya menyebutkan harapan malu-malu bahwa WS2812 akan bekerja dari 3.3V? Jadi tidak akan !!! Lebih tepatnya, semuanya tampak berfungsi seperti sebelum dimulainya pertukaran melalui USB. Pada saat yang sama, saluran Biru mulai gagal. Kami mencari masalah dalam perangkat lunak untuk waktu yang lama, berpikir bahwa tidak ada sumber daya prosesor yang cukup, tetapi kemudian menarik kaki PB1 ke 5V melalui resistor 1kΩ dan semuanya bekerja dengan jelas. Pada saat yang sama, level log.1 menjadi sekitar 4.3V. Saya mengerti bahwa ini tidak baik, tetapi tidak ada pilihan. Papan ternyata menjadi "pertanian kolektif" yang agak elegan:



MK lunak


Untuk memfasilitasi pemrograman MK, diputuskan untuk menggunakan Perpustakaan STM HAL, karena hampir semuanya sudah ada, Anda hanya perlu menambahkan logika dan menghubungkan semua modulnya satu sama lain. Sebagian, STM32CubeMX membantu kami dengan ini - generasi sebagian besar kode dapat ditugaskan untuk itu. Namun, di sini setiap orang memutuskan sendiri - kode yang dihasilkan masih harus diperbaiki secara substansial, dan ukuran firmware harus dibayar - perpustakaan HAL tidak kompak.

Namun demikian, 32kb tersedia di mikrokontroler kami, firmware akan memakan waktu lebih dari setengah, jadi logis untuk menyimpan dalam urutan memori yang tersisa dari tiga byte (RGB), yang ditransmisikan pada gilirannya ke input LED. Menekan tombol akan berputar di sekitar urutan yang direkam dalam flash MK.

Di sini kita dihadapkan dengan masalah pertama: LED WS2812 sangat menuntut periode dan durasi pulsa, sedangkan waktu pulsa (0,4-0,8 μs) cukup kecil untuk prosesor yang beroperasi pada 48 MHz. Selain itu, kita harus memperhitungkan bahwa selain mengendalikan LED, rangkaian mikro kita juga harus melayani komunikasi dengan PC via usb dan memori baca / tulis flash.
Untungnya, dioda ini cukup populer dan beberapa metode untuk mengimplementasikan protokolnya dijelaskan di Internet, termasuk pada mikrokontroler STM. Kami telah memilih, mungkin, salah satu yang paling sulit dalam hal implementasi, tetapi juga pada saat yang sama paling efektif dalam hal waktu CPU - DMA + timer. DMA menulis langsung ke port GPIO, timer mengontrol saluran DMA. Karena DMA menulis ke seluruh port sekaligus, itu tidak akan berfungsi untuk menggunakan pin port lain sebagai output. Itu sebabnya pin PB1 dipilih untuk mengontrol LED. Secara ideologis, semuanya sederhana, tetapi saya harus mengotak-atik implementasi cukup banyak jika bukan karena perpustakaan indah yang Martin Hubáček tulis dan diposting di github. Setelah sedikit selesai di bawah MK kami dan metode yang dipilih untuk menyimpan urutan RGB, kami mendapatkan LED yang berfungsi.

Memori flash


Bayangkan memberi Anda hati dengan ucapan selamat pribadi. Anda datang, bersukacita, pulang, sambungkan ke komputer, dan alih-alih “Aku mencintaimu!”, Memberi Anda “Driver perangkat yang diperlukan tidak ditemukan” atau sesuatu seperti itu. Itu tidak baik.

Oleh karena itu, jantung harus dikenali sebagai flash drive di salah satu sistem operasi yang umum, tanpa memerlukan instalasi driver. Oleh karena itu, kita akan menggunakan kelas usb yang disebut "Mass Storage Device", karena STM32 USB Device Library memberi kita solusi turnkey. Hentikan itu! Siap ???? Sekarang mari kita lihat.

Kami membuat proyek di STM32CubeMX, menggabungkan metode baca / tulis untuk memori flash spi dengan panggilan yang sesuai dalam modul penyimpanan massal usb dan menemukan dua masalah sekaligus: USB flash drive tidak ingin dihapus dengan aman dan "tersedak" ketika mencoba menulis sesuatu lebih dari teks "Halo" World ”dalam file README.txt.

Masalah pertama mudah dipecahkan - Anda perlu mengimplementasikan pemrosesan SCSI yang hilang dari perintah StartStopUnit. Yang kedua lebih sulit untuk dipecahkan. Ukuran blok sistem file (secara alami, hanya memiliki ruang 8mb, kita akan menggunakan Fat16) adalah 512 byte. Memori hanya dapat dihapus dalam blok 4k. Kami harus memesan salah satu blok untuk penyimpanan sementara (kami tidak mampu membeli 4kb RAM dengan 6kb yang tersedia). Yaitu, untuk menulis 512 byte, Anda harus menyalin 4kb, menghapus 4kb, dan menyalinnya kembali. Selain itu, jika file tersebut cukup besar, sistem operasi ingin menulis ke drive 64kB sekaligus, dan pengontrol kami tidak dapat menangani data dalam jumlah besar untuk itu pada waktu yang tepat, mengingat bahwa flash drive yang digunakan juga bukan yang tercepat. Secara umumsementara controller perlahan-lahan menulis data 256 byte pada satu waktu (ukuran halaman memori), sistem operasi (setidaknya Fedora, di mana semua ini diuji) sudah berhasil memutuskan bahwa drive telah mati dengan berani.

Penikmat mungkin akan menunjukkan solusi yang lebih elegan untuk masalah ini, tetapi "kita akan pergi ke arah lain." Memori flash akan dibaca melalui antarmuka perangkat penyimpanan massal dan dalam mode ini akan memposisikan dirinya sebagai Read-Only (pada saat yang sama, jantung dapat dengan mudah "ditarik keluar" dari komputer tanpa "ekstraksi aman", tetapi karena takut merusak sistem file), kami akan menuliskannya melalui virtual port-com (alias Kelas Perangkat Komunikasi). Melalui antarmuka yang sama, kami akan menulis urutan RGB kami hingga akhir memori MK.

Mode boot (penyimpanan massal atau cdc) akan dipilih saat memuat dengan menekan tombol (atau tidak).
Tidak lebih cepat dikatakan daripada dilakukan (seperti biasa, sebagian besar waktu dan kopi dihabiskan untuk dua kata ini). Kami mengembalikan read-write ke antarmuka MSC, karena ditemukan bahwa dalam mode read-only, macO menolak untuk mengenali USB flash drive - itu tidak masalah, di sini kami menipu sistem operasi dan akan mengembalikan "sukses" ke setiap permintaan penulisan tanpa melakukan apa-apa (sekali lagi, solusi dari kategori "meskipun tidak elegan, tapi murah dan ceria"). Intinya kecil - perangkat lunak untuk PC.

PC lunak


Karena diputuskan untuk mengonfigurasi dan mem-flash melalui antarmuka cdc, Anda tidak dapat menarik dan melepaskan file dengan mouse dan Anda memerlukan aplikasi khusus yang dapat melakukannya. Tugas utamanya: untuk memberi pengguna kesempatan membuat disk image, mengunggah file pengguna di sana dan menulis gambar ini ke memori flash. Aplikasi juga harus menyediakan antarmuka untuk membuat / membaca / menulis urutan RGB.

Aplikasi harus lintas-platform, dan di sini pustaka Qt untuk membuat antarmuka grafis dan ChaN FatFS untuk membuat dan mengelola image disk akan membantu kami. Pertukaran data dengan perangkat melalui port com tersedia dalam Qt versi terbaru "out of the box" (modul QSerialPort), untuk operasi gambar disk, kami menggunakan QTreeView dengan model item yang diwarisi dari QabstractItemModel, di mana operasi Drag & Drop juga diterapkan (drag and drop, apa pun yang Anda katakan) dengan mouse ”nyaman dan tidak asing ketika datang ke file / folder). Untuk membuat urutan RGB, Anda dapat menggunakan QListWidget (untuk menampilkan urutan warna), perpustakaan QtColorWidgets (oleh Mattia Basaglia) untuk memilih warna, dan kelas QEasingCurve dibangun ke Qt untuk transisi yang halus (atau sebaliknya spasmodik) antara warna dan menciptakan efek pelangi.

Hasil: aplikasi memiliki dua tab:

1) "Penyimpanan" untuk file



2) "LED" untuk mengelola urutan RGB



Dialog untuk membuat urutan RGB:



Dialog berfungsi dalam tiga mode:

a) RGB - memungkinkan Anda menentukan transisi antara dua warna yang ditentukan dalam notasi RGB.
b) HSV - hal yang sama, tetapi dalam notasi HSV - luapan lebih akrab bagi mata manusia, khususnya, mode "HSV" + "Iterate-> HUE" memungkinkan Anda untuk membuat pelangi.
c) Kustom - mode ini memungkinkan Anda untuk mengatur setiap warna urutan secara manual. Tidak mungkin membuat urutan besar seperti ini, tetapi sangat nyaman untuk mengeluarkan hati Anda untuk sementara waktu (mengatur warnanya menjadi "hitam").

Dan akhirnya, definisi perangkat kami sebagai flash drive di Windows / macOs / Linux (Gnome):







Kesimpulan


Dan setelah semua pekerjaan dilakukan dan teks tertulis, saya menemukan bahwa saya belum mengambil satu foto pun yang normal dari hati itu sendiri. Oleh karena itu, saya melampirkan opsi "bagaimana hal itu terjadi":





Pada kenyataannya, itu tampak hebat (terutama dengan ukiran). Cintai orang yang Anda cintai !!!

Source: https://habr.com/ru/post/id401013/


All Articles