Mündəricat:

Arduino UNO Logic Sniffer: 8 Addım (Şəkillərlə birlikdə)
Arduino UNO Logic Sniffer: 8 Addım (Şəkillərlə birlikdə)

Video: Arduino UNO Logic Sniffer: 8 Addım (Şəkillərlə birlikdə)

Video: Arduino UNO Logic Sniffer: 8 Addım (Şəkillərlə birlikdə)
Video: 35 видео со страшными призраками: мегасборник 2023 года [V1] 2024, Noyabr
Anonim
Arduino UNO Məntiq Sniffer
Arduino UNO Məntiq Sniffer

Bu layihə sadə bir təcrübə olaraq başladı. Başqa bir layihə üçün ATMEGA328P məlumat cədvəli üzərində apardığım araşdırma zamanı olduqca maraqlı bir şey tapdım. Timer1 Giriş Capture Unit. Arduino UNO -nun mikro nəzarətçisinə bir siqnal kənarını aşkar etməyə, bir zaman damgası saxlamağa və hər şeyi bir cihazda kəsməyə imkan verir.

Daha sonra hansı tətbiqdə faydalı ola biləcəyini və bunu necə sınayacağımı düşündüm. Bir müddətdir bir məntiq analizatoru əldə etmək istədiyim üçün, xüsusiyyəti sınamaq və bundan yaxşı nəticələr əldə edə biləcəyimizi görmək üçün Arduino UNO lövhəmdə birini tətbiq etməyə çalışmaq qərarına gəldim.

Bu fikrə sahib olan tək mən deyiləm və yalnız "Arduino Logic Analyzer" i googling edərək çoxunu tapa bilərsiniz. Layihənin əvvəlində, bir təcrübə olaraq başladığı üçün, insanların artıq bunu bacardığının fərqində belə deyildim və bu kiçik aparatla əldə etdikləri yaxşı nəticələrdən təsirləndim. Bununla birlikdə, giriş tutma qurğusundan istifadə edərək başqa bir layihə tapa bilmədim, buna görə də bunu görmüsünüzsə, mənə bildirin!

Xülasə etmək üçün məntiq analizatorum:

  • Bir kanalınız olsun,
  • Qrafik interfeysi var,
  • USB vasitəsilə interfeyslə əlaqə qurun,
  • Bir Arduino UNO lövhəsində işləyin.

Nəhayət 800 nümunə yaddaş dərinliyinə sahib olacaq və 115200 bauds UART mesajını uğurla çəkə bildi (həqiqətən yüksək sürətlə sınamamışam).

Bu təlimat həm bu layihənin "necə işləyir", həm də "necə istifadə ediləcək" hissələrini ehtiva edir, buna görə texniki tərəfi ilə maraqlanmayanlar üçün birbaşa 4 -cü addıma keçə bilərsiniz.

Təchizat

Analizatoru mümkün qədər sadə saxlamaq istədim, buna görə də çox az avadanlıq tələb olunur.

Sizə lazım olacaq:

  • Bir Arduino UNO lövhəsi (və ya ATMEGA328P MCU -ya güvəndiyi müddətcə ekvivalenti),
  • Kompüter,
  • Hata düzəltmək üçün bir şey (başqa bir Arduino UNO lövhəsi bəzi testlər aparmaq üçün yaxşı işləyir).

Həm Arduino UNO, həm də veb interfeysi üçün kodu burada tapa bilərsiniz, həmçinin p5.serialcontrol və PulseView proqramına ehtiyacınız olacaq.

Addım 1: İş prinsipi

İş prinsipi
İş prinsipi

Fikir sadədir. Çəkmə parametrlərini seçin və "əldə et" düyməsini basın. Veb interfeysi onları p5.serialcontrol proqramına göndərəcək ki, bu da seriya interfeysini brauzerdən istifadə etməyimizə imkan verir, çünki ona birbaşa daxil ola bilmir. P5.serialcontrol proqramı sonra məlumatları tutan Arduino UNO lövhəsinə məlumat ötürür və eyni yolla yenidən interfeysə göndərir.

Asan! Yaxşı … İnsan/Maşın interfeysi proqramlaşdırma və ya veb texnologiyalarında həqiqətən yaxşı olmadığım üçün mənimki bir az çirkin və arabasızdır. Ancaq bir çəkiliş başlatmağa və məlumatlarımı geri qaytarmağa imkan verir, bunun üçün nəzərdə tutulmuşdur, buna görə də yaxşı olduğunu düşünürəm. Daha ciddi təhlil işləri üçün qeydlərimi PulseView -ə gətirirəm ki, bu da daha sonra görəcəyimiz kimi istifadəsi asan və yaxşı xüsusiyyətlər və protokol dekoderləri təklif edir.

Arduino UNO -nun giriş tutma qurğusu fərqli saat bölmələrini istifadə etmək üçün konfiqurasiya edilə bilər, beləliklə qətnaməni azaldır, ancaq daşmadan əvvəl gecikməni artırır. Məlumat almağa başlamaq üçün yüksələn, düşən və ya hər iki kənarda da tetikleyebilir.

Addım 2: Arduino UNO Sketch

Arduino UNO eskizi
Arduino UNO eskizi

Eskizi Arduino IDE ilə yazdım və tərtib etdim. İlk olaraq Timer1 -i "Normal" iş rejimində quraraq (TCCR1A və TCCR1B qeydlərinə yazaraq) başladım. Daha sonra "setTim1PSC ()" adlı saat bölgüsünü təyin etmək kimi gələcəkdə istifadəsini bir qədər asanlaşdırmaq üçün bəzi funksiyalar etdim. Timer1 giriş tutma qurğusunu və daşqın kəsilmələrini aktivləşdirmək və söndürmək üçün funksiyalar da yazdım.

Əldə edilmiş məlumatları saxlayacaq "nümunələr" serialını əlavə etdim. İlk tərtiblərimdə olduğu kimi, tərtibçinin optimallaşdırmalarını və flaşa qoymaması üçün "uçucu" olaraq qoyduğum qlobal bir sıra. Bunu "uint16_t" dizisi olaraq təyin etdim, çünki Timer1 də 16bitdir, uzunluğu 810. 800 dəyərdə çəkməyi dayandırırıq, amma aşkar sürət səbəbləri ilə fasilələr xaricində test edildiyinə görə 10 saxlamağı seçdim. daşmasının qarşısını almaq üçün daha çox dəyər. Kodun qalan hissəsi üçün bir neçə əlavə dəyişənlə, eskizdə 1313 bayt (88%) yaddaş istifadə olunur və bizə 235 bayt pulsuz RAM qalır. Artıq yüksək yaddaş istifadəsindəyik və çox az yaddaş sahəsi səbəbiylə qəribə davranışlara səbəb ola biləcəyi üçün daha çox nümunə tutumu əlavə etmək istəmədim.

Həmişə icra sürətini artırmaq istəyimdə, icra müddətlərini minimuma endirmək üçün ifadələr kəsildikdə yerinə funksiya göstəricilərindən istifadə etdim. Tutma pimi, həmişə Timer1 -in giriş tutma qurğusuna qoşulduğu üçün Arduino UNO 8 nömrəsi olacaq.

Çəkmə prosesi yuxarıdakı şəkildə göstərilir. Arduino UNO, istədiyiniz çəkmə parametrlərini ehtiva edən etibarlı bir UART məlumat çərçivəsi aldıqda başlayır. Daha sonra seçilmiş kənarda tutmaq üçün doğru qeydləri konfiqurasiya edərək bu saatları emal edirik və doğru saat bölgüsündən istifadə edirik. Daha sonra ilk siqnal kənarını aşkar etmək üçün PCINT0 (pin dəyişməsi) kəsilməsini təmin edirik. Bunu əldə etdikdə Timer1 dəyərini sıfırlayırıq, PCINT0 kəsilməsini aradan qaldırırıq və ICU (Giriş Capture Unit) kəsilməsini aktivləşdiririk. O andan etibarən, siqnalın hər hansı bir düşən/yüksələn kənarı (seçilmiş konfiqurasiyadan asılı olaraq) giriş tutma qurğusunu işə salacaq, beləliklə bu hadisənin zaman damğasını ICR1 reyestrinə saxlayacaq və bir fasiləni yerinə yetirəcəkdir. Bu fasilədə ICR1 qeyd dəyərini "nümunələr" serialımıza qoyduq və növbəti çəkiliş üçün indeksi artırırıq. Timer1 və ya sıra daşdıqda, tutma kəsilməsini deaktiv edirik və məlumatları UART vasitəsilə yenidən veb interfeysinə göndəririk.

Giriş ələ keçirmə vahidi hər ikisini deyil, yalnız bir və ya digər kənarda çəkməyə imkan verdiyi üçün çəkilişi tetiklemek üçün bir pin dəyişdirmə kəsilməsindən istifadə etmək qərarına gəldim. Hər iki kənarı çəkmək istədiyiniz zaman da problem yaradır. Mənim həllim, alınan hər bir nümunədəki giriş tutma nəzarət qeydindəki kənar seçimini idarə edən biti çevirməkdir. Bu şəkildə icra sürətini itirdik, amma yenə də giriş tutma vahidinin funksiyalarından istifadə edə bilərik.

Beləliklə, fərq edə bildiyiniz kimi, hər bir nümunəni müəyyən zaman aralığında tutmuruq, ancaq siqnal keçidinin baş verdiyi anı tuturuq. Ən yüksək saat bölgüsündə olsa belə, hər bir dövrdə bir nümunə götürsəydik, strukturu istifadə etmədən yaddaşdakı ən kiçik olan uint8_t tipini istifadə etdiyimizi zənn edərək buferi təxminən 0,1 saniyə ərzində doldurardıq.

Addım 3: Veb İnterfeysi və P5.js

Veb interfeysi və P5.js
Veb interfeysi və P5.js

Başlıqdan da göründüyü kimi, veb interfeysi p5.js köməyi ilə hazırlanmışdır. Onsuz da bilməyənlər üçün, həqiqətən də yaxşı bir kitabxana olduğu üçün gedib veb saytı yoxlamağı məsləhət görürəm. İşlənməyə əsaslanır, istifadəsi asandır, çox yaxşı nəticələr əldə etməyə imkan verir və yaxşı sənədləşdirilmişdir. Bu kitabxananı seçməyimin bütün səbəbləri budur. Menyu üçün quicksettings.js kitabxanasından, məlumatlarımı qurmaq üçün grafica.js kitabından və Arduino UNO ilə ünsiyyət qurmaq üçün p5.serialport kitabxanasından da istifadə etdim.

İnterfeysdə çox vaxt sərf etməyəcəyəm, çünki bunu yalnız məlumatların önizlənməsi və parametrlərə nəzarət etmək üçün hazırladım, həm də təcrübəmin mövzusu deyildi. Bununla birlikdə, aşağıdakı hissələrdə bütün sistemi istifadə etmək üçün fərqli addımları izah edəcəyəm və bununla da mövcud olan müxtəlif idarəetmələri izah edəcəyəm.

Addım 4: Sistemin Qurulması

İlk şey, hələ edilməmişsə, Arduino UNO və interfeys kodunu buradan yükləməkdir. Arduino UNO lövhənizi Arduino IDE vasitəsilə "UNO_LS.ino" eskizi ilə yenidən proqramlaşdıra bilərsiniz.

P5.serialcontrol proqramını github deposundan yükləməlisiniz. Əməliyyat sisteminizə uyğun zip faylını almalısınız (yalnız Windows -da sınamışam). Zipi bir qovluğa çıxarın, içərisində tapılan icra faylını başladın və belə buraxın. Hər hansı bir serial portuna qoşulmağa çalışmayın, yalnız arxa planda işləyərək buraxın, bir röle olaraq istifadə ediləcək.

"İnterfeys" qovluğunu açın. "İndex.html" adlı bir fayl tapmalısınız. Brauzerinizdə açın, bu veb interfeysi.

Və bu qədər! Əlavə kitabxana yükləməyinizə ehtiyac yoxdur, hər şey təqdim etdiyim pakete daxil edilməlidir.

Addım 5: Bağlantı, Konfiqurasiya və Satınalma

Bağlantı, Konfiqurasiya və Alınma
Bağlantı, Konfiqurasiya və Alınma

Arduino UNO lövhəsinə qoşulmaq üçün siyahıdakı müvafiq portu seçin və "Aç" düyməsini basın. Əməliyyat uğurlu olarsa, "vəziyyət" mesajında "COMX açıldı" kimi bir şey göstərilməlidir.

İndi çəkmə seçimlərinizi seçə bilərsiniz. Birincisi, kənar seçimdir. Həmişə "Hər ikisini" istifadə etməyi məsləhət görürəm, çünki bu, əsl siqnalın ən yaxşı nümayəndəsi olacaq. "Hər ikisi" ayarı siqnalı tuta bilmirsə (məsələn, siqnal tezliyi çox yüksəkdirsə), görməyə çalışdığınız siqnaldan asılı olaraq ya "Yüksələn" və ya "Düşən" kənar ayarı ilə cəhd edə bilərsiniz.

İkinci seçim saat bölgüsüdür. Siqnal çəkə biləcəyiniz qətnaməni sizə verəcək. Bölmə faktorunu "8", "64", "256" və "1024" ilə təyin edə bilərsiniz. Arduino UNO lövhəsi mikro nəzarətçini işlətmək üçün 16MHz kvars istifadə edir, buna görə də nümunə götürmə tezliyi "16MHz/bölmə faktoru" olacaq. Bu parametrlə diqqətli olun, çünki nə qədər bir siqnal tuta biləcəyinizi də təyin edəcək. Timer1 16 bitlik bir zamanlayıcı olduğundan, daşmadan əvvəl icazə verilən çəkmə müddəti "(2^16)*(bölmə faktoru)/16MHz" olacaq. Seçdiyiniz parametrdən asılı olaraq ~ 33ms və 4.2s arasında dəyişəcək. Seçiminizi ağlınızda saxlayın, sonra ehtiyacınız olacaq.

Son parametr səs -küyün azaldılmasıdır. Bunun üzərində çox sınaq keçirmədim və halların 99% -də buna ehtiyacınız olmayacaq, ona görə də yoxlayın. Hələ də maraqlananlar üçün ATMEGA328P məlumat cədvəlinin Taymer/Sayıcı1 bölməsində səs -küy əleyhinə axtarış edə bilərsiniz.

Arduino UNO lövhəsinin 8 pinini siqnalınıza bağlamağı və həm test dövrəsi, həm də məntiq analizatoru üçün eyni gərginlik istinadına malik olmaq üçün zəmini birləşdirməyi unutmayın. Torpaq izolyasiyasına ehtiyacınız varsa və ya 5V-dən fərqli səviyyələrdə siqnalları ölçmək lazımdırsa, ehtimal ki, dövrənizə bir opto-izolyator əlavə etməlisiniz.

Hər şey düzgün qurulduqdan sonra "Əldə et" düyməsini basa bilərsiniz.

Addım 6: Nəticələri və CSV Məlumat İxracını çəkin

Nəticələri və CSV Məlumat İxracını çəkin
Nəticələri və CSV Məlumat İxracını çəkin

Arduino UNO ələ keçirmə işini başa vurduqda, məlumatları avtomatik olaraq veb interfeysinə göndərəcək və bu da onları quracaq. Doğru kaydırıcıyla böyütə və ya kiçilə və altdakı nümunələrlə gəzə bilərsiniz.

Süjet yalnız bir önizləmə verir və heç bir məlumat təhlili vasitəsi yoxdur. Beləliklə, məlumatlarınız üzərində əlavə təhlil aparmaq üçün onu PulseView -ə daxil etməlisiniz.

İlk addım bütün məlumatlarınızı ehtiva edən bir csv faylını ixrac etməkdir. Bunu etmək üçün veb interfeysindən "İxrac et" düyməsini basmaq kifayətdir. İstədiyiniz zaman faylınızı bilinən bir yerdə saxlayın.

İndi PulseView açın. Üst menyu çubuğunda "Aç" düyməsini (qovluq nişanı) vurun və "Vergüllə ayrılmış dəyərləri idxal et …" seçin. Məlumatlarınızı ehtiva edən əvvəllər yaradılmış csv faylını seçin.

Kiçik bir pəncərə görünəcək. Hər şeyi olduğu kimi buraxın, sadəcə "Samplerate" parametrini çəkmək üçün seçilmiş saat bölmə faktoruna uyğun olaraq dəyişdirməlisiniz. Samplerate tezliyiniz "16MHz/(bölmə faktoru)" olacaq. Sonra "Ok" düyməsini basın, siqnalınız ekranda görünməlidir.

Addım 7: PulseView Siqnal Analizi

PulseView Siqnal Təhlili
PulseView Siqnal Təhlili

PulseView bir çox protokol deşifratoruna malikdir. Onlara daxil olmaq üçün üst menyu çubuğundakı "Protokol dekoderi əlavə et" düyməsini basın (ən sağ alət). Təcrübəm üçün 9600 baudda sadə bir UART mesajı göndərdim, buna görə də "UART" ı axtardım.

Sol tərəfində etiketi olan bir kanal əlavə edəcək (məlumatlarınız üçün olduğu kimi). Etiketi tıklayaraq, dekoderin parametrlərini dəyişə bilərsiniz. Doğru olanları seçdikdən sonra test cihazımın göndərdiyi mesajla eyni mesajı ala bildim. Bu, bütün sistemin gözlənildiyi kimi işlədiyini göstərir.

Addım 8: Nəticə

Nəticə
Nəticə

Layihə əvvəlcə bir sınaq olsa belə, əldə etdiyim nəticələrdən məmnunam. UART siqnallarını heç bir problem olmadan "Hər ikisi" kənar rejimində 115200 baud qədər nümunə götürə bildim və hətta "Düşən" kənar rejimində 230400 baud qədər gedə bildim. Yuxarıdakı şəkildə test quruluşumu görə bilərsiniz.

Tətbiqimin bir neçə çatışmazlığı var, çünki bir anda yalnız bir siqnal tuta bilər, çünki yalnız Arduino UNO -nun pin 8 -i "giriş çəkmə qabiliyyətlidir". Daha çox kanallı bir Arduino məntiq analizatoru axtarırsınızsa, gedin Catoblepas -ı yoxlayın.

Arduino UNO -nun yüksək tezliklərdə (bəzi MHz) siqnalları çəkə biləcəyini gözləmək olmaz, çünki yalnız 16MHz -də işləyir (hər kəs bunu etsə, onun metodunu görmək mənim üçün maraqlı olardı). Ancaq yenə də bu ATMEGA328P mikro nəzarətçisindən çıxara biləcəyimiz nəticələr məni heyran edir.

Kod üzərində çox iş görəcəyimi düşünmürəm. Təcrübələrimi apardım və axtardığım nəticələri aldım. Ancaq kimsə töhfə vermək istəyirsə, kodumun hamısını və ya bir hissəsini dəyişdirmək və yenidən paylamaqdan çekinmeyin.

Bu mənim ilk təlimatım idi və məncə uzun bir dərs idi. Ümid edirəm sizin üçün maraqlı bir oxu oldu.

Səhv tapsanız və ya hər hansı bir sualınız varsa mənə bildirin!

Tövsiyə: