Saya pikir saya secara tidak sengaja menemukan kebutuhan dalam hidup saya untuk sistem embedded. Bagus sekali! Dan agak menakutkan. Dan saya butuh bantuan.
Latar Belakang : Saya disewa untuk membangun aplikasi GUI yang mengambil pindaian dari dua SICK LMS-291s dan mengintegrasikannya dengan GPS akurasi sub-inci, sehingga Anda tahu di mana setiap pemindaian terjadi. Sebagai programmer web yang naif saya, saya mengerti bahwa waktu akan menjadi penting, tetapi tidak menyadari itu juga akan sulit! Jika Anda tidak tahu kapan setiap titik GPS dan setiap pemindaian terjadi, Anda tidak dapat mengetahui di mana pemindaian terjadi. Ups.
Mereka telah menetapkan windows 7 sebagai platform, serta membeli SeaLevel RS422 ke kotak USB untuk menghubungkan sensor dan GPS, dan dalam waktu singkat saya menemukan kebodohan saya. Di suatu tempat antara sensor dan program komputer saya, ada sesuatu yang mencegah pemindaian datang tepat waktu. LMS mengeluarkan 75 scan per detik, atau pada 13,32 ms / scan. Program saya tidak mendapatkannya tepat waktu. Itu membuat mereka setiap 100 atau lebih milidetik, dalam kelompok 7 atau 8 atau 10 atau sesuatu. Juga kadang-kadang tidak cukup pemindaian muncul, atau rusak. Entah adaptor SeaPort ini hanya mengirim sepuluh kali per detik (apakah itu mungkin? Saya tidak tahu cara kerja USB) atau Windows tidak memeriksa buffer (harus ada buffer di suatu tempat, kan?) Hampir cukup sering.
Present Day : Ini mengarah pada beberapa ketidakakuratan bahwa pada dasarnya klien tidak keberatan. Namun, saya tidak, dan karena saya memiliki kesempatan untuk melakukan pekerjaan serupa untuk klien (mengintegrasikan lebih banyak input sensor!), Saya ingin mencari tahu bagaimana melakukannya dengan benar, misalnya mengingat keakuratan GPS , dapat memberikan jaminan tentang ketepatan dan keakuratan lokasi pemindaian.
Seperti apa itu? Saya memerlukan UI, dan untuk dapat memeriksa input dari ketiga perangkat ini setiap 13,32 milidetik. Jika saya menggunakan FreeRTOS dengan, katakanlah, Nano-X untuk GUI, berjalan pada laptop yang mereka sediakan, apakah itu terdengar seperti solusi yang waras? Apakah mungkin bahwa adaptor RS-422 ke USB menyebabkan penundaan ini, dan menggunakan Windows sebenarnya baik-baik saja untuk tujuan ini?
Jawaban:
Masalahnya hampir pasti di buffering USB terkait dengan konverter USB-RS422. USB memiliki latensi variabel dan cukup tinggi.
Solusi termudah hanya akan menjadi antarmuka RS422 yang lebih baik, idealnya berbasis PCI / PCI-e. Itu akan menyelesaikan masalah latensi.
Anda juga dapat memodifikasi laju polling USB, meskipun ini cukup tergantung pada OS host (platform apa yang Anda gunakan?).
Untuk apa nilainya, saya mencari di situs web sistem sealevel, dan itu SANGAT terinfeksi dengan omong kosong pemasaran. Mereka benar-benar menghabiskan 10 halaman dan beberapa kertas putih untuk mengatakan "kami menggunakan hub USB secara internal, daripada melakukan MCU multiplexing".
Hai SeaLevel! Itulah yang antarmuka USB-serial 4-port murah-pantat $ 50 yang saya beli di e-bay dari Cina juga! Anda tidak istimewa, bahkan jika Anda menulis setengah lusin whitepaper yang hampa berusaha membuatnya terdengar seperti Anda!
Sudahkah Anda mencoba memaksakan hal-hal tersebut untuk menggunakan driver FTDI? Saya akan menaruh uang untuk itu mereka hanya menggunakan FTDI FT232 rawa-standar atau serupa. Bisakah Anda membuka kotak di salah satu dari mereka terbuka, dan mengambil gambar?
Jika Anda benar-benar ingin memutar perangkat keras Anda sendiri, untuk bersenang-senang atau peluang pendidikan, saya sangat menyarankan Anda untuk tidak mencoba melakukan semua yang ada di perangkat keras. Karena Anda hanya perlu waktu-korelasi ketiga sinyal, semua yang Anda benar-benar membutuhkan adalah sesuatu yang dapat mendengarkan pada tiga baris serial (dua RS422, satu RS232 (GPS)), waktu-perangko data, dan meneruskannya ke komputer utama .
Setelah data dicap waktu, Anda bebas untuk memiliki semua latensi-penyangga yang Anda inginkan, karena Anda selalu dapat melihat prangko waktu.
Secara realistis, jika Anda tidak memiliki dasar dalam perangkat keras, mendesain sesuatu dengan cukup banyak untuk menggambar GUI yang bagus adalah tugas yang cukup.
Secara pribadi, saya mungkin akan melemparkan MCU ARM cukup chunky pada masalah buffering, dan selesai dengan itu. Terlepas dari kenyataan bahwa itu adalah Arduino, the Arduino Due memiliki banyak SRAM, dan lebih dari cukup cepat untuk apa yang Anda butuhkan (dan ada banyak dukungan, yang selalu baik).
Atau, seri STM32 memiliki kinerja yang serupa, dan lebih ditujukan untuk pengguna "mahir" (baca, ada lebih sedikit, atau tidak ada contoh untuk referensi). ST membuat banyak papan eval yang cukup bagus, sangat murah juga.
Dengan Due, Anda mendapatkan port USB asli, di mana Anda dapat memutar driver CDC Anda sendiri jika Anda mau. Beberapa papan STM32 memiliki USB asli juga.
sumber
16C954
quad hardware UART IC (mungkin ada dua dari mereka pada kartu).Jika saya mengerti pertanyaannya, apa yang terjadi adalah mengambil pesan waktu / tempat dari GPS melalui satu saluran serial, dan menghubungkan berbagai pesan data yang diterima melalui saluran serial lainnya. Idealnya, pesan pencari jangkauan akan memiliki stempel waktu mereka sendiri, dan jika Anda dapat menyinkronkan semua jam, Anda dapat menentukan lokasi di mana rentang tersebut diambil dengan menginterpolasi cap waktu rentang antara dua pesan gps dengan perangko waktu pencocokan terdekat. Tetapi tentu saja, Anda tidak memilikinya.
Beberapa solusi muncul di pikiran, sepanjang menggunakan mikrokontroler untuk melakukan korelasi data real-time, dan memompa output yang ke dalam PPC untuk keperluan tampilan. Pada dasarnya mikrokontroler ada untuk menangani masalah waktu yang ketat.
Jadi untuk solusi yang lebih sederhana, yang Anda butuhkan adalah beberapa cara untuk mengumpulkan semua pesan dari beberapa baris serial yang berbeda, dan menggabungkannya menjadi satu aliran, sesuai urutan penerimaannya, dan memompanya ke dalam PC. Anda dapat menyimpulkan bahwa pesan pencari jangkauan antara dua pesan GPS terjadi di antara dua pesan tersebut.
Ini memberi Anda tingkat ketidakpastian tentu saja, tergantung pada frekuensi pesan GPS. Imbalannya adalah saat Anda meningkatkan frekuensi pesan GPS (untuk mendapatkan korelasi yang lebih akurat), Anda meningkatkan tuntutan pada mikrokontroler, dan tuntutan pada tautan serial ke dalam PC. Pada titik ekstrim, tautan serial dipenuhi pesan GPS dengan pesan rentang sesekali dilemparkan. Jelas sebagian besar pesan GPS itu tidak diperlukan. Keuntungan dari solusi ini, adalah bahwa mikro memiliki sangat sedikit untuk dilakukan, dari sudut pandang perangkat lunak. Anda bisa melakukan semuanya dalam satu lingkaran bahasa rakitan sederhana, tidak perlu OS.
Untuk solusi yang lebih kompleks, Anda dapat membentuk jam lokal di mikro, dan menggunakan GPS untuk sinkronisasi yang jam, sehingga ketika Anda mendapatkan pesan jangkauan, Anda dapat memperoleh cap waktu menggunakan jam mikro. Menggunakan mikro dengan basis waktu kristal, Anda mungkin bisa bertahan dengan pesan GPS 1Hz dan masih jauh lebih baik daripada waktu akurasi milidetik yang tertera pada pesan jangkauan. Seseorang dengan sistem embedded yang kompeten mungkin juga dapat melakukan ini dalam assembler pada mikro ujung bawah, tetapi Anda menyebutkan bahwa Anda baru memulai. Anda bisa melihat mikro yang lebih kuat yang dapat menjalankan linux, dan mungkin menemukan solusi yang sudah ada sebelumnya untuk menyinkronkan jam linux ke GPS.
sumber
Apa yang saya mungkin akan lakukan adalah multiplex data serial menjadi datastream serial baru pada tingkat yang lebih tinggi, dengan interleave statis. Kemudian beri makan datastream melalui USB-UART ke komputer. Dengan begitu Anda akan tahu bahwa byte pertama adalah dari perangkat 1, byte kedua dari perangkat 2, byte ketiga dari perangkat 3 dan dalam hal ini byte keempat sebagai CRC atau nomor urut. Lemparkan beberapa byte mulai dari frame marker untuk disinkronkan pada datastream, padding byte jika tidak ada data yang tersedia dan Anda selesai. Anda mungkin tidak tahu waktu absolut, tetapi Anda tahu bahwa waktu relatif antara berbagai potongan data.
sumber
Saya juga menggunakan mikrokontroler untuk menerima data RS, stempel waktu, dan meneruskannya ke PC. Anda tidak dapat melakukan pekerjaan kritis pengaturan waktu I / O dengan PC Windows (kecuali dengan kartu suara, mungkin), karena perangkat lunak dan drivernya berubah setiap saat karena driver diperbarui di belakang Anda.
Tetapi hal pertama yang akan saya lakukan adalah mendapatkan penganalisis logika USB, Anda dapat membeli satu dengan harga kurang dari USD100, mengambil beberapa pesan dari penerima GPS dan memeriksa kapan setiap byte diterima. Gunakan info itu untuk mencoba / menghitung seberapa akurat ketepatan waktu data di tempat pertama: misalnya persis apa dan kapan kotak GPS mentransmisikan. Maka Anda dapat mengetahui ketepatan yang dapat dicapai, dan berapa banyak usaha yang Anda ingin lakukan untuk mencapai tingkat akurasi tertentu.
Di atas, gambar beberapa penganalisis logika USB (Saleae?).
[Sunting] Haha, menggunakan kartu suara bisa menjadi cara yang lucu untuk membuatnya benar-benar berfungsi; Anda dapat menghubungkan data UART ke input kartu suara (melalui beberapa resistor dan kapasitor) dan menulis perangkat lunak untuk mendeteksi setiap sisi dalam aliran serial, memberikan Anda ketepatan waktu yang indah !. Ok, saya tidak benar - benar menyarankan ini dengan serius, hanya untuk beberapa tertawa!
sumber