Isi kandungan:

Arduino UNO Logic Sniffer: 8 Langkah (dengan Gambar)
Arduino UNO Logic Sniffer: 8 Langkah (dengan Gambar)

Video: Arduino UNO Logic Sniffer: 8 Langkah (dengan Gambar)

Video: Arduino UNO Logic Sniffer: 8 Langkah (dengan Gambar)
Video: Tutorial Dasar Arduino (Arsitektur dan Mapping Pin Mikrokontroller AT Mega 328) 2024, Julai
Anonim
Arduino UNO Logic Sniffer
Arduino UNO Logic Sniffer

Projek ini dimulakan sebagai eksperimen sederhana. Semasa membuat penyelidikan mengenai lembaran data ATMEGA328P untuk projek lain, saya dapati sesuatu yang agak menarik. Unit Tangkap Masukan Timer1. Ini membolehkan pengawal mikro Arduino UNO kami untuk mengesan kelebihan isyarat, menyimpan cap waktu, dan mencetuskan gangguan, semuanya dalam perkakasan.

Saya kemudian bertanya-tanya di mana aplikasi itu berguna, dan bagaimana mengujinya. Oleh kerana saya ingin mendapatkan penganalisis logik untuk beberapa waktu sekarang, saya memutuskan untuk mencuba menerapkannya di papan Arduino UNO saya, hanya untuk menguji ciri tersebut, dan melihat apakah kita dapat memperoleh hasil yang baik daripadanya.

Saya bukan satu-satunya yang mempunyai idea ini, dan anda akan mendapat banyak idea dengan hanya menggunakan "Arduino Logic Analyzer". Pada permulaan projek, kerana baru sahaja bermula sebagai eksperimen, saya bahkan tidak menyedari bahawa orang sudah berjaya, dan terkesan dengan hasil yang baik yang mereka capai dengan perkakasan kecil ini. Namun, saya tidak dapat mencari projek lain menggunakan unit tangkapan input, jadi jika anda sudah melihatnya, beritahu saya!

Sebagai kesimpulan, penganalisis logik saya akan:

  • Mempunyai satu saluran,
  • Mempunyai antara muka grafik,
  • Berkomunikasi dengan antara muka melalui USB,
  • Berlari di papan Arduino UNO.

Akhirnya akan mempunyai 800 sampel kedalaman memori, dan berjaya menangkap mesej UART 115200 bauds (saya tidak benar-benar mengujinya pada kelajuan yang lebih tinggi).

Instruksional ini mengandungi bahagian "bagaimana ia berfungsi" dan "bagaimana menggunakannya" dalam projek ini, jadi bagi mereka yang tidak berminat oleh pihak teknikal, anda boleh langsung melangkah ke langkah 4.

Bekalan

Saya mahu alat penganalisis semudah mungkin, jadi memerlukan perkakasan yang sangat sedikit.

Anda perlu:

  • Papan Arduino UNO (atau setara asalkan bergantung pada ATMEGA328P MCU),
  • Komputer,
  • Sesuatu untuk disahpijat (papan Arduino UNO yang lain berfungsi dengan baik untuk melakukan beberapa ujian).

Kod untuk kedua-dua antara muka Arduino UNO dan web boleh didapati di sini. Anda juga memerlukan perisian p5.serialcontrol, dan PulseView.

Langkah 1: Prinsip Kerja

Prinsip Kerja
Prinsip Kerja

Idea itu mudah. Anda memilih tetapan tangkapan, dan klik "memperoleh". Antara muka web akan menghantarnya ke perisian p5.serialcontrol, yang memungkinkan kita menggunakan antara muka bersiri dari penyemak imbas, kerana tidak dapat mengaksesnya secara langsung. Perisian p5.serialcontrol kemudian menyampaikan maklumat tersebut ke papan Arduino UNO, yang menangkap data, dan menghantarnya kembali ke antara muka melalui jalan yang sama.

Mudah! Baiklah … Oleh kerana saya tidak begitu mahir dalam pengaturcaraan antara muka manusia / mesin atau teknologi web, saya pasti agak jelek dan kereta. Tetapi ia membolehkan saya memulakan tangkapan dan mengambil kembali data saya, yang memang telah dirancang, jadi saya fikir ia baik-baik saja. Untuk kerja analisis yang lebih serius, saya mengimport rekod saya ke PulseView, yang mudah digunakan dan menawarkan sekumpulan ciri dan dekoder protokol yang baik, seperti yang akan kita lihat kemudian.

Unit tangkapan input Arduino UNO dapat dikonfigurasi untuk menggunakan pembahagian jam yang berbeza, sehingga dapat mengurangkan resolusi, tetapi meningkatkan penundaan sebelum meluap. Ia juga dapat memicu kenaikan, kejatuhan atau kedua sisi untuk mulai menangkap data.

Langkah 2: Lakaran Arduino UNO

Lakaran Arduino UNO
Lakaran Arduino UNO

Saya menulis dan menyusun lakaran dengan Arduino IDE. Saya mula-mula memulakan dengan mengatur Pemasa1 dalam mod operasi "Normal" dengan menulis ke daftar TCCR1A dan TCCR1B dalam penyediaan (). Saya kemudian membuat beberapa fungsi untuk memudahkan penggunaannya di masa depan, seperti yang mengatur bahagian jam bernama "setTim1PSC ()". Saya juga menulis fungsi untuk mengaktifkan dan menyahaktifkan unit tangkapan input Timer1 dan gangguan limpahan.

Saya menambahkan susunan "sampel", yang akan menyimpan data yang diperoleh. Ini adalah susunan global yang saya tetapkan ke "tidak stabil" untuk mengelakkan penyusun membuat pengoptimuman dan memasukkannya ke dalam kilat, seperti yang dilakukannya semasa kompilasi pertama saya. Saya mendefinisikannya sebagai array "uint16_t", kerana Timer1 juga 16bit, dengan panjang 810. Kami berhenti menangkap pada 800 nilai, tetapi kerana ujian dilakukan di luar gangguan kerana alasan kelajuan yang jelas, saya memilih untuk mengekalkan 10 lebih banyak nilai untuk mengelakkan limpahan. Dengan beberapa pemboleh ubah tambahan untuk selebihnya kod, sketsa menggunakan memori 1313 byte (88%), meninggalkan kita dengan 235 byte RAM percuma. Kami sudah menggunakan memori yang tinggi, dan saya tidak mahu menambahkan lebih banyak kapasiti sampel, kerana ia boleh menyebabkan tingkah laku pelik kerana ruang memori terlalu sedikit.

Dalam usaha saya untuk selalu meningkatkan kelajuan pelaksanaan, saya menggunakan penunjuk fungsi dan bukannya jika pernyataan di dalam mengganggu, untuk mengurangkan masa pelaksanaannya ke minimum. Pin penangkap akan selalu menjadi Arduino UNO nombor 8, kerana ia adalah satu-satunya yang disambungkan ke unit tangkapan input Timer1.

Proses tangkapan ditunjukkan pada gambar di atas. Ia bermula apabila Arduino UNO menerima kerangka data UART yang sah, yang mengandungi tetapan tangkapan yang diinginkan. Kami kemudian memproses tetapan tersebut dengan mengkonfigurasi register kanan untuk menangkap di tepi yang dipilih, dan menggunakan pembahagian jam yang tepat. Kami kemudian mengaktifkan gangguan PCINT0 (penukaran pin) untuk mengesan tepi isyarat pertama. Apabila kami mendapatkannya, kami menetapkan semula nilai Timer1, mematikan gangguan PCINT0, dan membolehkan ICU (Input Capture Unit) mengganggu. Sejak saat itu, setiap tepi jatuh / naik pada sinyal (bergantung pada konfigurasi yang dipilih), akan memicu unit tangkapan input, sehingga menyimpan cap waktu peristiwa ini ke dalam daftar ICR1, dan melakukan gangguan. Dalam gangguan ini, kami memasukkan nilai daftar ICR1 ke dalam array "sampel" kami, dan menambah indeks untuk tangkapan seterusnya. Apabila Timer1 atau array meluap, kami menonaktifkan interupsi tangkapan, dan mengirim data kembali ke antara muka web melalui UART.

Saya memutuskan untuk menggunakan pin perubahan interrupt untuk mencetuskan tangkapan, kerana unit tangkapan input hanya memungkinkan untuk menangkap pada satu atau tepi yang lain, bukan keduanya. Ia juga menimbulkan masalah ketika anda ingin menangkap kedua-dua tepi. Penyelesaian saya kemudiannya adalah untuk membalikkan bit yang mengawal pemilihan tepi dalam daftar kawalan tangkapan input pada setiap sampel yang diambil. Dengan cara itu kita kehilangan kelajuan pelaksanaan, tetapi kita masih dapat menggunakan fungsi unit tangkapan input.

Jadi, seperti yang anda perhatikan, kami tidak benar-benar menangkap setiap sampel pada selang waktu yang tetap, tetapi kami menangkap momen di mana peralihan isyarat berlaku. Sekiranya kita mengambil satu sampel pada setiap pusingan jam, walaupun dengan pembahagian jam tertinggi, kita akan mengisi buffer dalam kira-kira 0.1s, dengan asumsi bahawa kita menggunakan jenis uint8_t, yang merupakan yang terkecil dalam memori tanpa menggunakan struktur.

Langkah 3: Antara Muka Web dan P5.js

Antara Muka Web dan P5.js
Antara Muka Web dan P5.js

Sesuai dengan tajuknya, antara muka web dibuat dengan bantuan p5.js. Bagi mereka yang belum mengetahuinya, saya sangat mengesyorkan anda pergi dan memeriksa laman web, kerana ia adalah perpustakaan yang sangat bagus. Ia didasarkan pada Pemrosesan, mudah digunakan, memungkinkan anda memperoleh hasil yang sangat cepat, dan didokumentasikan dengan baik. Atas sebab itulah saya memilih perpustakaan ini. Saya juga menggunakan perpustakaan quicksettings.js untuk menu, grafica.js untuk memplot data saya, dan pustaka p5.serialport untuk berkomunikasi dengan Arduino UNO.

Saya tidak akan menghabiskan terlalu banyak masa di antara muka, kerana saya hanya merancangnya untuk pratonton data dan kawalan tetapan, dan juga kerana itu bukan subjek percubaan saya sama sekali. Akan tetapi saya akan menerangkan di bahagian berikut langkah-langkah yang berbeza untuk menggunakan keseluruhan sistem, dengan itu menerangkan pelbagai kawalan yang ada.

Langkah 4: Persediaan Sistem

Perkara pertama adalah memuat turun Arduino UNO dan kod antara muka di sini jika belum dilakukan. Anda kemudian boleh memprogramkan semula papan Arduino UNO anda dengan lakaran "UNO_LS.ino" melalui Arduino IDE.

Anda semestinya memuat turun perisian p5.serialcontrol dari repositori githubnya. Anda mesti mendapatkan fail zip yang sepadan dengan sistem operasi anda (saya hanya mengujinya di Windows). Ekstrak zip dalam folder, mulakan pelaksanaan yang terdapat di dalamnya, dan biarkan seperti itu. Jangan cuba menyambung ke port bersiri mana pun, biarkan ia berjalan di latar belakang, ia akan digunakan sebagai geganti.

Buka folder "Antaramuka". Anda harus mencari fail bernama "index.html". Buka di penyemak imbas anda, itu adalah antara muka web.

Dan itu sahaja! Anda tidak perlu memuat turun perpustakaan tambahan, semuanya mesti dimasukkan ke dalam pakej yang saya sediakan.

Langkah 5: Sambungan, Konfigurasi dan Pemerolehan

Sambungan, Konfigurasi dan Perolehan
Sambungan, Konfigurasi dan Perolehan

Untuk menyambungkan antara muka ke papan Arduino UNO, pilih port yang sesuai dalam senarai dan tekan butang "Buka". Sekiranya operasi berjaya, mesej "state" akan memaparkan sesuatu seperti "COMX dibuka".

Anda kini boleh memilih pilihan tangkapan anda. Pertama adalah pemilihan kelebihan. Saya mengesyorkan anda untuk selalu menggunakan "Kedua-duanya", kerana ia akan memberikan gambaran terbaik mengenai isyarat sebenar. Sekiranya tetapan "Kedua-duanya" gagal menangkap isyarat (jika frekuensi isyarat terlalu tinggi misalnya), anda boleh mencuba dengan tetapan tepi "Meningkat" atau "Jatuh", bergantung pada isyarat yang anda cuba lihat.

Tetapan kedua ialah pembahagian jam. Ini akan memberi anda resolusi di mana anda dapat menangkap isyarat. Anda boleh memilih untuk menetapkan faktor pembahagian dengan "8", "64", "256" dan "1024". Papan Arduino UNO menggunakan kuarza 16MHz untuk jam mikrokontroler, jadi frekuensi pensampelan akan menjadi "16MHz / faktor pembahagian". Hati-hati dengan tetapan ini, kerana ini juga akan menentukan berapa lama anda dapat menangkap isyarat. Oleh kerana Timer1 adalah pemasa 16bit, masa tangkapan yang dibenarkan sebelum limpahan akan menjadi "(2 ^ 16) * (faktor pembahagian) / 16MHz". Bergantung pada tetapan yang anda pilih, ia akan berkisar antara ~ 33ms dan 4.2s. Ingatlah pilihan anda, anda akan memerlukannya kemudian.

Pengaturan terakhir adalah penghilang bunyi. Saya tidak menjalankan banyak ujian, dan anda tidak memerlukannya dalam 99% kes, jadi biarkan ia tidak diperiksa. Bagi mereka yang masih tertanya-tanya, anda boleh mencari pembatalan kebisingan di bahagian Pemasa / Kaunter1 pada lembaran data ATMEGA328P.

Jangan lupa untuk menyambungkan pin 8 papan Arduino UNO ke isyarat anda, dan pasangkan landasan bersama untuk mempunyai rujukan voltan yang sama untuk rangkaian ujian dan penganalisis logik. Sekiranya anda memerlukan pengasingan tanah, atau perlu mengukur isyarat dengan tahap yang berbeza dari 5V, anda mungkin perlu menambahkan pengasing opto ke litar anda.

Setelah semuanya dikonfigurasi dengan betul, anda boleh menekan butang "Acquire".

Langkah 6: Tangkap Hasil dan Eksport Data CSV

Tangkap Hasil dan Eksport Data CSV
Tangkap Hasil dan Eksport Data CSV

Setelah Arduino UNO anda selesai menangkap, secara automatik akan menghantar kembali data ke antara muka web, yang akan memplotnya. Anda boleh memperbesar atau memperkecil dengan gelangsar kanan, dan mencari sampel dengan yang paling bawah.

Plot hanya memberi anda pratonton, dan tidak mempunyai alat analisis data. Oleh itu, untuk melakukan analisis lebih lanjut mengenai data anda, anda harus mengimportnya ke PulseView.

Langkah pertama adalah mengeksport fail csv yang mengandungi semua data anda. Untuk melakukannya, anda hanya perlu mengklik butang "Eksport" dari antara muka web. Simpan fail anda di lokasi yang diketahui apabila diminta.

Sekarang buka PulseView. Pada bar menu atas, klik "Buka" (ikon folder), dan pilih "Import nilai yang dipisahkan koma …". Pilih fail csv yang dihasilkan sebelumnya yang mengandungi data anda.

Tetingkap kecil akan muncul. Tinggalkan semuanya sebagaimana adanya, anda hanya perlu mengubah tetapan "Samplerate" mengikut faktor pembahagian jam yang dipilih untuk tangkapan. Kekerapan samplerate anda adalah "16MHz / (faktor pembahagian)". Kemudian klik "Ok", isyarat anda akan muncul di skrin.

Langkah 7: Analisis Isyarat PulseView

Analisis Isyarat PulseView
Analisis Isyarat PulseView

PulseView mempunyai banyak penyahkod protokol. Untuk mengaksesnya, klik "Tambahkan dekoder protokol" di bar menu atas (alat paling kanan). Untuk percubaan saya, saya baru sahaja menghantar mesej UART sederhana pada 9600 baud, jadi saya mencari "UART".

Ini akan menambah saluran dengan teg di sebelah kirinya (sama seperti saluran untuk data anda). Dengan mengklik pada tag, anda boleh mengubah tetapan penyahkod. Setelah memilih yang betul, saya dapat mengambil mesej yang sama dengan yang dihantar oleh alat ujian saya. Ini menunjukkan bahawa keseluruhan sistem berfungsi seperti yang diharapkan.

Langkah 8: Kesimpulannya

Kesimpulannya
Kesimpulannya

Walaupun projek itu pada awalnya merupakan percubaan, saya gembira dengan hasil yang saya dapat. Saya dapat mencuba isyarat UART hingga 115200 baud dalam mod tepi "Kedua-duanya" tanpa masalah, dan saya juga berjaya mencapai 230400 baud dalam mod tepi "Jatuh". Anda dapat melihat persediaan ujian saya pada gambar di atas.

Pelaksanaan saya mempunyai beberapa kelemahan, bermula dari kenyataan bahawa ia hanya dapat menangkap satu isyarat pada satu masa, kerana hanya pin 8 Arduino UNO yang "mampu menangkap input". Sekiranya anda mencari penganalisis logik Arduino dengan lebih banyak saluran, periksa Catoblepas 'satu.

Anda tidak boleh mengharapkan sebuah Arduino UNO dapat menangkap isyarat dengan frekuensi tinggi (beberapa MHz), kerana ia hanya jam 16MHz (jika ada yang melakukannya, saya akan tertarik untuk melihat kaedahnya). Namun, saya masih kagum dengan hasil yang dapat kita perolehi dari mikrokontroler ATMEGA328P ini.

Saya tidak fikir bahawa saya akan melakukan banyak kerja pada kod tersebut. Saya menjalankan eksperimen saya, dan mendapat hasil yang saya cari. Tetapi jika ada yang ingin menyumbang, sila ubah dan edarkan semula semua atau sebahagian kod saya.

Itu adalah pengajaran pertama saya, dan saya fikir panjang. Saya harap ia menjadi bacaan yang menarik untuk anda.

Beritahu saya jika anda menemui kesilapan, atau jika anda mempunyai sebarang pertanyaan!

Disyorkan: