Daftar Isi:

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, Juli
Anonim
Pengendus Logika Arduino UNO
Pengendus Logika Arduino UNO

Proyek ini dimulai sebagai percobaan sederhana. Selama penelitian saya atas lembar data ATMEGA328P untuk proyek lain, saya menemukan sesuatu yang agak menarik. Unit Pengambilan Masukan Timer1. Ini memungkinkan mikrokontroler Arduino UNO untuk mendeteksi tepi sinyal, menyimpan stempel waktu, dan memicu interupsi, semuanya dalam perangkat keras.

Saya kemudian bertanya-tanya di aplikasi mana itu bisa berguna, dan bagaimana mengujinya. Karena saya ingin mendapatkan penganalisis logika untuk beberapa waktu sekarang, saya memutuskan untuk mencoba menerapkannya di papan Arduino UNO saya, hanya untuk menguji fitur tersebut, dan melihat apakah kami bisa mendapatkan hasil yang baik darinya.

Saya bukan satu-satunya yang memiliki ide ini, dan Anda akan menemukan banyak dari mereka hanya dengan googling "Arduino Logic Analyzer". Pada awal proyek, karena baru dimulai sebagai percobaan, saya bahkan tidak menyadari bahwa orang telah membuatnya, dan terkesan dengan hasil bagus yang mereka capai dengan perangkat keras kecil ini. Namun, saya tidak dapat menemukan proyek lain menggunakan unit pengambilan input, jadi jika Anda sudah melihat ini, beri tahu saya!

Untuk meringkas, penganalisis logika saya akan:

  • Memiliki satu saluran,
  • Memiliki antarmuka grafis,
  • Berkomunikasi dengan antarmuka melalui USB,
  • Jalankan di papan Arduino UNO.

Akhirnya akan memiliki kedalaman memori 800 sampel, dan berhasil menangkap pesan UART 115200 baud (saya tidak benar-benar mengujinya pada kecepatan yang lebih tinggi).

Instruksi ini berisi bagian "cara kerjanya" dan "cara menggunakannya" dari proyek ini, jadi bagi mereka yang tidak tertarik dengan sisi teknis, Anda dapat langsung melompat ke langkah 4.

Perlengkapan

Saya ingin membuat penganalisis sesederhana mungkin, sehingga membutuhkan perangkat keras yang sangat sedikit.

Anda akan perlu:

  • Papan Arduino UNO (atau setara selama itu bergantung pada ATMEGA328P MCU),
  • Komputer,
  • Sesuatu untuk di-debug (papan Arduino UNO lainnya berfungsi dengan baik untuk melakukan beberapa pengujian).

Kode untuk Arduino UNO dan antarmuka web dapat ditemukan di sini. Anda juga memerlukan p5.serialcontrol, dan perangkat lunak PulseView.

Langkah 1: Prinsip Kerja

Prinsip bekerja
Prinsip bekerja

Idenya sederhana. Anda memilih pengaturan pengambilan, dan klik "memperoleh". Antarmuka web akan mengirimkannya ke perangkat lunak p5.serialcontrol, yang memungkinkan kita untuk menggunakan antarmuka serial dari browser, karena tidak dapat langsung mengaksesnya. Perangkat lunak p5.serialcontrol kemudian menyampaikan informasi ke papan Arduino UNO, yang menangkap data, dan mengirimkannya kembali ke antarmuka melalui jalur yang sama.

Mudah! Yah… Karena saya tidak terlalu bagus dalam pemrograman antarmuka Manusia/Mesin atau teknologi web, milik saya tentu saja agak jelek dan bermasalah. Tetapi ini memungkinkan saya untuk memulai pengambilan dan mengambil kembali data saya, yang telah dirancang untuk itu, jadi saya pikir itu baik-baik saja. Untuk pekerjaan analisis yang lebih serius, saya mengimpor catatan saya ke PulseView, yang mudah digunakan dan menawarkan serangkaian fitur dan dekoder protokol yang bagus, seperti yang akan kita lihat nanti.

Unit input capture Arduino UNO dapat dikonfigurasi untuk menggunakan divisi clock yang berbeda, sehingga mengurangi resolusi, tetapi meningkatkan penundaan sebelum overflow. Itu juga dapat memicu naik, turun atau kedua sisi untuk mulai menangkap data.

Langkah 2: Sketsa Arduino UNO

Sketsa Arduino UNO
Sketsa Arduino UNO

Saya menulis dan menyusun sketsa dengan Arduino IDE. Saya pertama kali memulai dengan mengatur Timer1 dalam mode operasi "Normal" dengan menulis ke register TCCR1A dan TCCR1B di setup(). Saya kemudian membuat beberapa fungsi untuk sedikit memudahkan penggunaannya di masa depan, seperti yang mengatur pembagian jam bernama "setTim1PSC()". Saya juga menulis fungsi untuk mengaktifkan dan menonaktifkan unit penangkapan input Timer1 dan interupsi overflow.

Saya menambahkan larik "sampel", yang akan menyimpan data yang diperoleh. Ini adalah array global yang saya atur ke "volatile" untuk mencegah kompiler melakukan optimasi dan memasukkannya ke dalam flash, seperti yang dilakukan selama kompilasi pertama saya. Saya mendefinisikannya sebagai array "uint16_t", karena Timer1 juga 16bit, dengan panjang 810. Kami berhenti menangkap pada nilai 800, tetapi karena pengujian dilakukan di luar interupsi untuk alasan kecepatan yang jelas, saya memilih untuk menyimpan 10 lebih banyak nilai untuk mencegah overflow. Dengan beberapa variabel tambahan untuk sisa kode, sketsa menggunakan 1313 byte (88%) memori, meninggalkan kami dengan 235 byte RAM bebas. Kami sudah menggunakan memori yang tinggi, dan saya tidak ingin menambahkan lebih banyak kapasitas sampel, karena dapat menyebabkan perilaku aneh karena terlalu sedikit ruang memori.

Dalam upaya saya untuk selalu meningkatkan kecepatan eksekusi, saya menggunakan pointer fungsi alih-alih pernyataan if di dalam interupsi, untuk mengurangi waktu eksekusi seminimal mungkin. Pin penangkap akan selalu menjadi Arduino UNO nomor 8, karena ini adalah satu-satunya yang terhubung ke unit penangkap input Timer1.

Proses pengambilan ditunjukkan pada gambar di atas. Ini dimulai ketika Arduino UNO menerima bingkai data UART yang valid, yang berisi pengaturan pengambilan yang diinginkan. Kami kemudian memproses pengaturan tersebut dengan mengonfigurasi register yang tepat untuk ditangkap pada tepi yang dipilih, dan menggunakan pembagian jam yang tepat. Kami kemudian mengaktifkan interupsi PCINT0 (perubahan pin) untuk mendeteksi tepi sinyal pertama. Ketika kami mendapatkannya, kami mengatur ulang nilai Timer1, menonaktifkan interupsi PCINT0, dan mengaktifkan interupsi ICU (Input Capture Unit). Sejak saat itu, setiap tepi turun/naik pada sinyal (tergantung pada konfigurasi yang dipilih), akan memicu unit penangkap input, sehingga menyimpan stempel waktu peristiwa ini ke dalam register ICR1, dan mengeksekusi interupsi. Dalam interupsi ini, kami memasukkan nilai register ICR1 ke dalam larik "sampel" kami, dan menaikkan indeks untuk pengambilan berikutnya. Ketika Timer1 atau array meluap, kami menonaktifkan interupsi pengambilan, dan mengirim data kembali ke antarmuka web melalui UART.

Saya memutuskan untuk menggunakan interupsi perubahan pin untuk memicu pengambilan, karena unit pengambilan input hanya memungkinkan untuk menangkap pada satu atau tepi lainnya, bukan keduanya. Ini juga menyebabkan masalah saat Anda ingin menangkap kedua sisi. Solusi saya kemudian adalah membalikkan bit yang mengontrol pemilihan tepi dalam register kontrol pengambilan input pada setiap sampel yang diambil. Dengan begitu kita kehilangan kecepatan eksekusi, tetapi kita masih bisa menggunakan fungsionalitas unit pengambilan input.

Jadi, seperti yang mungkin Anda perhatikan, kami tidak benar-benar menangkap setiap sampel pada interval waktu yang tetap, tetapi kami menangkap momen di mana transisi sinyal terjadi. Jika kita telah menangkap satu sampel pada setiap siklus clock, bahkan dengan pembagian clock tertinggi, kita akan mengisi buffer sekitar 0,1 detik, dengan asumsi bahwa kita menggunakan tipe uint8_t, yang merupakan yang terkecil di memori tanpa menggunakan struct.

Langkah 3: Antarmuka Web dan P5.js

Antarmuka Web dan P5.js
Antarmuka Web dan P5.js

Sesuai dengan judulnya, antarmuka web dibuat dengan bantuan p5.js. Bagi mereka yang belum mengetahuinya, saya sangat menyarankan Anda untuk pergi dan memeriksa situs webnya, karena ini adalah perpustakaan yang sangat bagus. Ini didasarkan pada Pemrosesan, mudah digunakan, memungkinkan Anda mendapatkan hasil yang baik dengan sangat cepat, dan didokumentasikan dengan baik. Karena semua alasan itulah saya memilih perpustakaan ini. Saya juga menggunakan pustaka quicksettings.js untuk menu, pustaka grafica.js untuk memplot data saya, dan pustaka p5.serialport untuk berkomunikasi dengan Arduino UNO.

Saya tidak akan menghabiskan terlalu banyak waktu pada antarmuka, karena saya hanya mendesainnya untuk pratinjau data dan kontrol pengaturan, dan juga karena itu sama sekali bukan subjek eksperimen saya. Namun saya akan menjelaskan di bagian berikut langkah-langkah yang berbeda untuk menggunakan seluruh sistem, sehingga menjelaskan berbagai kontrol yang tersedia.

Langkah 4: Pengaturan Sistem

Hal pertama adalah mengunduh Arduino UNO dan kode antarmuka di sini jika belum selesai. Anda kemudian dapat memprogram ulang papan Arduino UNO Anda dengan sketsa "UNO_LS.ino" melalui Arduino IDE.

Anda seharusnya telah mengunduh perangkat lunak p5.serialcontrol dari repositori github-nya. Anda harus mendapatkan file zip yang cocok dengan sistem operasi Anda (saya hanya mengujinya di Windows). Ekstrak zip di folder, mulai executable yang ditemukan di dalamnya, dan biarkan seperti itu. Jangan mencoba menyambung ke port serial apa pun, biarkan berjalan di latar belakang, itu akan digunakan sebagai relai.

Buka folder "Antarmuka". Anda harus menemukan file bernama "index.html". Buka di browser Anda, itu adalah antarmuka web.

Dan itu saja! Anda tidak perlu mengunduh pustaka tambahan, semuanya harus disertakan dalam paket yang saya berikan.

Langkah 5: Koneksi, Konfigurasi, dan Akuisisi

Koneksi, Konfigurasi, dan Akuisisi
Koneksi, Konfigurasi, dan Akuisisi

Untuk menghubungkan antarmuka ke papan Arduino UNO, cukup pilih port yang sesuai dalam daftar dan tekan tombol "Buka". Jika operasi berhasil, pesan "status" akan menampilkan sesuatu seperti "COMX dibuka".

Anda sekarang dapat memilih opsi pengambilan. Pertama adalah pemilihan tepi. Saya menyarankan Anda untuk selalu menggunakan "Keduanya", karena ini akan memberi Anda representasi terbaik dari sinyal sebenarnya. Jika pengaturan "Keduanya" gagal menangkap sinyal (jika frekuensi sinyal terlalu tinggi misalnya), Anda dapat mencoba dengan pengaturan tepi "Naik" atau "Turun", tergantung pada sinyal yang Anda coba lihat.

Pengaturan kedua adalah pembagian jam. Ini akan memberi Anda resolusi di mana Anda akan dapat menangkap sinyal. Anda dapat memilih untuk menyetel faktor pembagian dengan "8", "64", "256" dan "1024". Papan Arduino UNO menggunakan kuarsa 16MHz untuk clock mikrokontroler, sehingga frekuensi sampling akan menjadi "16MHz/faktor pembagian". Berhati-hatilah dengan pengaturan ini, karena ini juga akan menentukan berapa lama Anda dapat menangkap sinyal. Karena Timer1 adalah timer 16bit, waktu pengambilan yang diizinkan sebelum overflow adalah "(2^16)*(faktor pembagian)/16MHz". Tergantung pada pengaturan yang Anda pilih, itu akan berkisar antara ~33ms dan 4.2s. Simpan pilihan Anda dalam pikiran Anda, Anda akan membutuhkannya nanti.

Pengaturan terakhir adalah peredam bising. Saya tidak melakukan banyak pengujian padanya, dan Anda tidak akan membutuhkannya dalam 99% kasus, jadi biarkan saja tidak dicentang. Bagi yang masih penasaran, Anda bisa mencari peredam bising di bagian Timer/Counter1 pada datasheet ATMEGA328P.

Jangan lupa untuk menghubungkan pin 8 papan Arduino UNO ke sinyal Anda, dan sambungkan ground bersama-sama untuk memiliki referensi tegangan yang sama untuk rangkaian pengujian dan penganalisis logika. Jika Anda memerlukan isolasi tanah, atau perlu mengukur sinyal dengan level yang berbeda dari 5V, Anda mungkin perlu menambahkan opto-isolator ke sirkuit Anda.

Setelah semuanya dikonfigurasi dengan benar, Anda dapat menekan tombol "Acquire".

Langkah 6: Tangkap Hasil dan Ekspor Data CSV

Hasil Tangkap dan Ekspor Data CSV
Hasil Tangkap dan Ekspor Data CSV

Setelah Arduino UNO Anda selesai menangkap, maka secara otomatis akan mengirimkan kembali data ke antarmuka web, yang akan memplotnya. Anda dapat memperbesar atau memperkecil dengan penggeser kanan, dan menelusuri sampel dengan penggeser bawah.

Plot hanya memberi Anda pratinjau, dan tidak memiliki alat analisis data. Jadi, untuk melakukan analisis lebih lanjut pada data Anda, Anda harus mengimpornya ke PulseView.

Langkah pertama adalah mengekspor file csv yang berisi semua data Anda. Untuk melakukannya, Anda hanya perlu mengklik tombol "Ekspor" dari antarmuka web. Simpan file Anda di lokasi yang diketahui saat diminta.

Sekarang buka PulseView. Di bilah menu atas, klik "Buka" (ikon folder), dan pilih "Impor nilai yang dipisahkan koma…". Pilih file csv yang dibuat sebelumnya yang berisi data Anda.

Sebuah jendela kecil akan muncul. Biarkan semuanya apa adanya, Anda hanya perlu mengubah pengaturan "Contoh" sesuai dengan faktor pembagian jam yang dipilih untuk pengambilan. Frekuensi samplerate Anda akan menjadi "16MHz/(faktor pembagian)". Kemudian klik "Ok", sinyal Anda akan muncul di layar.

Langkah 7: Analisis Sinyal PulseView

Analisis Sinyal PulseView
Analisis Sinyal PulseView

PulseView menampilkan banyak dekoder protokol. Untuk mengaksesnya, klik "Tambahkan dekoder protokol" di bilah menu atas (alat paling kanan). Untuk percobaan saya, saya hanya mengirim pesan UART sederhana pada 9600 baud, jadi saya mencari "UART".

Ini akan menambahkan saluran dengan tag di sebelah kirinya (seperti yang untuk data Anda). Dengan mengklik tag, Anda dapat mengubah pengaturan dekoder. Setelah memilih yang tepat, saya dapat mengambil pesan yang sama dengan yang dikirim oleh perangkat pengujian saya. Hal ini menunjukkan bahwa keseluruhan sistem bekerja seperti yang diharapkan.

Langkah 8: Kesimpulan

Kesimpulan
Kesimpulan

Bahkan jika proyek itu, pada awalnya, sebuah eksperimen, saya senang dengan hasil yang saya dapatkan. Saya dapat mengambil sampel sinyal UART hingga 115200 baud dalam mode tepi "Keduanya" tanpa masalah, dan saya bahkan berhasil mencapai 230400 baud dalam mode tepi "Jatuh". Anda dapat melihat pengaturan pengujian saya pada gambar di atas.

Implementasi saya memiliki beberapa kelemahan, dimulai dari fakta bahwa ia hanya dapat menangkap satu sinyal pada satu waktu, karena hanya pin 8 Arduino UNO yang "mampu menangkap input". Jika Anda mencari penganalisis logika Arduino dengan lebih banyak saluran, periksa saluran Catoblepas.

Anda tidak dapat mengharapkan Arduino UNO untuk dapat menangkap sinyal dengan frekuensi tinggi (beberapa MHz), karena hanya memiliki clock 16MHz (jika ada yang melakukannya, saya akan tertarik untuk melihat metodenya). Namun, saya tetap terkesan dengan hasil yang bisa kita dapatkan dari mikrokontroler ATMEGA328P ini.

Saya tidak berpikir bahwa saya akan melakukan banyak pekerjaan pada kode. Saya melakukan eksperimen saya, dan mendapatkan hasil yang saya cari. Tetapi jika ada yang ingin berkontribusi, silakan memodifikasi dan mendistribusikan kembali semua atau sebagian dari kode saya.

Itu adalah Instructable pertama saya, dan saya pikir panjang. Saya harap itu menjadi bacaan yang menarik bagi Anda.

Beri tahu saya jika Anda menemukan kesalahan, atau jika Anda memiliki pertanyaan!

Direkomendasikan: