İçindekiler:

Arduino UNO Logic Sniffer: 8 Adım (Resimlerle)
Arduino UNO Logic Sniffer: 8 Adım (Resimlerle)

Video: Arduino UNO Logic Sniffer: 8 Adım (Resimlerle)

Video: Arduino UNO Logic Sniffer: 8 Adım (Resimlerle)
Video: 35 Korkunç Hayalet Videosu: 2023'ün Mega Derlemesi [V1] 2024, Temmuz
Anonim
Arduino UNO Mantık Sniffer
Arduino UNO Mantık Sniffer

Bu proje basit bir deney olarak başladı. ATMEGA328P'nin başka bir proje için veri sayfası üzerinde yaptığım araştırma sırasında oldukça ilginç bir şey buldum. Timer1 Giriş Yakalama Birimi. Arduino UNO'muzun mikro denetleyicisinin bir sinyal kenarını algılamasına, bir zaman damgasını saklamasına ve tümü donanımda bir kesintiyi tetiklemesine olanak tanır.

Daha sonra hangi uygulamada yararlı olabileceğini ve nasıl test edileceğini merak ettim. Bir süredir bir mantık analizörü almak istediğimden, sadece özelliği test etmek ve bundan iyi sonuçlar alıp alamayacağımızı görmek için Arduino UNO kartımda bir tane uygulamaya karar verdim.

Bu fikre sahip olan tek kişi ben değilim ve "Arduino Logic Analyzer" a göz atarak birçoğunu bulacaksınız. Projenin başlangıcında, henüz bir deney olarak başladığı için, insanların bunu zaten başardığının farkında bile değildim ve bu küçük donanım parçasıyla elde ettikleri iyi sonuçlardan çok etkilendim. Ancak, girdi yakalama birimini kullanan başka bir proje bulamadım, bu yüzden bunu daha önce gördüyseniz bana bildirin!

Özetlemek gerekirse, mantık analizörüm:

  • Tek kanal var,
  • Grafik arayüze sahip,
  • USB üzerinden arayüz ile iletişim kurun,
  • Bir Arduino UNO kartında çalıştırın.

Sonunda 800 örnek bellek derinliğine sahip olacak ve 115200 baud'luk bir UART mesajını başarıyla yakalayabildi (gerçekten daha yüksek hızlarda test etmedim).

Bu talimat, bu projenin hem "nasıl çalışır" hem de "nasıl kullanılır" bölümlerini içerir, bu nedenle teknik açıdan ilgilenmeyenler için doğrudan 4. adıma geçebilirsiniz.

Gereçler

Analizörü olabildiğince basit tutmak istedim, bu nedenle çok az donanım gerektiriyordu.

İhtiyacın olacak:

  • Bir Arduino UNO kartı (veya ATMEGA328P MCU'ya dayandığı sürece eşdeğeri),
  • Bir bilgisayar,
  • Hata ayıklanacak bir şey (başka bir Arduino UNO kartı, bazı testler yapmak için iyi çalışıyor).

Hem Arduino UNO hem de web arayüzü için kod burada bulunabilir. Ayrıca p5.serialcontrol ve PulseView yazılımına da ihtiyacınız olacak.

Adım 1: Çalışma Prensibi

Çalışma prensibi
Çalışma prensibi

Fikir basit. Yakalama ayarlarını seçiyorsunuz ve "al" e tıklıyorsunuz. Web arayüzü bunları doğrudan erişemediği için bir tarayıcıdan seri arayüzü kullanmamıza izin veren p5.serialcontrol yazılımına gönderecektir. p5.serialcontrol yazılımı daha sonra bilgiyi Arduino UNO kartına aktarır, bu da verileri yakalar ve bunları aynı yol üzerinden arayüze geri gönderir.

Kolay! Şey… İnsan/Makine arayüzü programlamasında veya web teknolojilerinde gerçekten iyi olmadığım için benimki kesinlikle biraz çirkin ve buggy. Ama bir yakalama başlatmama ve verilerimi geri almama izin veriyor, ki bunun için tasarlandı, bu yüzden iyi olduğunu düşünüyorum. Daha ciddi analiz çalışmaları için kayıtlarımı, kullanımı kolay ve daha sonra göreceğimiz gibi iyi bir dizi özellik ve protokol kod çözücü sunan PulseView'a aktarıyorum.

Arduino UNO'nun giriş yakalama birimi, farklı saat bölümleri kullanacak şekilde yapılandırılabilir, böylece çözünürlüğü azaltır, ancak taşma öncesi gecikmeyi artırır. Ayrıca verileri yakalamaya başlamak için yükselen, düşen veya her iki kenarda tetiklenebilir.

Adım 2: Arduino UNO Kroki

Arduino UNO Kroki
Arduino UNO Kroki

Arduino IDE ile kroki yazıp derledim. İlk olarak, setup() içindeki TCCR1A ve TCCR1B kayıtlarına yazarak Timer1'i "Normal" çalışma modunda ayarlayarak başladım. Daha sonra, "setTim1PSC()" adlı saat bölümünü ayarlamak gibi, gelecekte kullanımını biraz kolaylaştırmak için bazı işlevler yaptım. Ayrıca Timer1 giriş yakalama birimini ve taşma kesintilerini etkinleştirmek ve devre dışı bırakmak için işlevler yazdım.

Alınan verileri tutacak "örnekler" dizisini ekledim. İlk derlemelerimde olduğu gibi derleyicinin optimizasyon yapmasını ve flash'a koymasını önlemek için "uçucu" olarak ayarladığım global bir dizi. Bunu bir "uint16_t" dizisi olarak tanımladım, Timer1 de 16bit ve 810 uzunluğunda. taşmayı önlemek için daha fazla değer. Kodun geri kalanı için birkaç ekstra değişkenle, taslak 1313 bayt (% 88) bellek kullanıyor ve bize 235 bayt boş RAM bırakıyor. Zaten yüksek bir bellek kullanımındayız ve çok az bellek alanı nedeniyle garip davranışlara neden olabileceğinden daha fazla örnek kapasitesi eklemek istemedim.

Yürütme hızını her zaman artırma arayışımda, yürütme sürelerini en aza indirmek için kesmelerin içindeki if ifadeleri yerine işlev işaretçileri kullandım. Yakalama pimi, Timer1'in giriş yakalama birimine bağlı olan tek pin olduğu için her zaman Arduino UNO numarası 8 olacaktır.

Yakalama işlemi yukarıdaki resimde gösterilmiştir. Arduino UNO, istenen yakalama ayarlarını içeren geçerli bir UART veri çerçevesi aldığında başlar. Ardından, seçilen kenarda yakalamak için doğru kayıtları yapılandırarak bu ayarları işliyoruz ve doğru saat bölümünü kullanıyoruz. Ardından, ilk sinyal kenarını algılamak için PCINT0 (pin değiştirme) kesmesini etkinleştiririz. Aldığımızda, Timer1 değerini sıfırlıyoruz, PCINT0 kesmesini devre dışı bırakıyoruz ve ICU (Giriş Yakalama Birimi) kesmesini etkinleştiriyoruz. O andan itibaren, sinyal üzerindeki herhangi bir düşen/yükselen kenar (seçilen konfigürasyona bağlı olarak), giriş yakalama birimini tetikler, böylece bu olayın zaman damgasını ICR1 kaydına kaydeder ve bir kesme yürütür. Bu kesmede ICR1 kayıt değerini "samples" dizimize koyuyoruz ve bir sonraki yakalama için indeksi artırıyoruz. Zamanlayıcı1 veya dizi taştığında, yakalama kesmesini devre dışı bırakırız ve verileri UART aracılığıyla web arayüzüne geri göndeririz.

Giriş yakalama birimi her ikisinde değil, yalnızca bir veya diğer kenarda yakalamaya izin verdiğinden, yakalamayı tetiklemek için bir pin değiştirme kesmesi kullanmaya karar verdim. Ayrıca her iki kenarı da yakalamak istediğinizde sorun yaratır. Benim çözümüm, alınan her örnekte giriş yakalama kontrol kaydındaki kenar seçimini kontrol eden biti tersine çevirmek olacaktır. Bu şekilde yürütme hızını kaybederiz, ancak yine de girdi yakalama birimi işlevlerini kullanabiliriz.

Bu nedenle, fark etmiş olabileceğiniz gibi, her bir örneği sabit zaman aralıklarında gerçekten yakalamıyoruz, ancak sinyal geçişinin gerçekleştiği anı yakalarız. Her saat döngüsünde bir örnek yakalamış olsaydık, en yüksek saat bölümü ile bile, yapı kullanmadan bellekteki en küçük olan uint8_t türünü kullandığımızı varsayarak, arabelleği yaklaşık 0,1 saniyede doldururduk.

3. Adım: Web Arayüzü ve P5.js

Web Arayüzü ve P5.js
Web Arayüzü ve P5.js

Adından da anlaşılacağı gibi, web arayüzü p5.js yardımı ile yapılmıştır. Henüz bilmeyenler için, gerçekten iyi bir kütüphane olduğu için web sitesine gitmenizi ve kontrol etmenizi şiddetle tavsiye ederim. İşleme dayalıdır, kullanımı kolaydır, çok hızlı bir şekilde iyi sonuçlar almanızı sağlar ve iyi belgelenmiştir. Bütün bu sebeplerden dolayı bu kütüphaneyi seçtim. Ayrıca menüler için quicksettings.js kitaplığını, verilerimi çizmek için grafica.js kitaplığını ve Arduino UNO ile iletişim kurmak için p5.serialport kitaplığını kullandım.

Sadece veri önizlemesi ve ayar kontrolü için tasarladığım ve ayrıca denememin konusu olmadığı için arayüzde çok fazla zaman harcamayacağım. Bununla birlikte, aşağıdaki bölümlerde tüm sistemi kullanmanın farklı adımlarını açıklayacağım, böylece mevcut çeşitli kontrolleri açıklayacağım.

Adım 4: Sistem Kurulumu

İlk şey, Arduino UNO'yu indirmek ve henüz yapılmadıysa buradan arayüz kodunu indirmek. Ardından Arduino UNO kartınızı Arduino IDE üzerinden "UNO_LS.ino" çizimi ile yeniden programlayabilirsiniz.

p5.serialcontrol yazılımını github deposundan indirmiş olmalısınız. İşletim sisteminizle eşleşen zip dosyasını almalısınız (sadece Windows'ta test ettim). Zip'i bir klasöre çıkarın, içinde bulunan yürütülebilir dosyayı başlatın ve bu şekilde bırakın. Herhangi bir seri porta bağlanmaya çalışmayın, sadece arka planda çalışır durumda bırakın, röle olarak kullanılacaktır.

"Arayüz" klasörünü açın. "index.html" adlı bir dosya bulmalısınız. Tarayıcınızda açın, bu web arayüzüdür.

Ve bu kadar! Ekstra kütüphaneler indirmenize gerek yok, her şey verdiğim pakette yer almalı.

Adım 5: Bağlantı, Yapılandırma ve Edinme

Bağlantı, Yapılandırma ve Edinme
Bağlantı, Yapılandırma ve Edinme

Arabirimi Arduino UNO kartına bağlamak için listeden ilgili bağlantı noktasını seçin ve "Aç" düğmesine basın. İşlem başarılıysa, "durum" mesajı "COMX açıldı" gibi bir şey göstermelidir.

Artık yakalama seçeneklerinizi seçebilirsiniz. Birincisi kenar seçimidir. Size gerçek sinyalin en iyi temsilini vereceği için her zaman "İkisini" kullanmanızı tavsiye ederim. "Both" ayarı sinyali yakalayamazsa (örneğin sinyal frekansı çok yüksekse), görmeye çalıştığınız sinyale bağlı olarak "Yükselen" veya "Düşen" kenar ayarını deneyebilirsiniz.

İkinci ayar saat bölümüdür. Size sinyali yakalayabileceğiniz çözünürlüğü verecektir. Bölme faktörünü "8", "64", "256" ve "1024" olarak ayarlamayı seçebilirsiniz. Arduino UNO kartı, mikrodenetleyiciyi saatlemek için 16MHz kuvars kullanır, bu nedenle örnekleme frekansı "16MHz/bölme faktörü" olacaktır. Bir sinyali ne kadar süreyle yakalayabileceğinizi de belirleyeceğinden, bu ayara dikkat edin. Zamanlayıcı1 16 bitlik bir zamanlayıcı olduğundan, taşmadan önce izin verilen yakalama süresi "(2^16)*(bölme faktörü)/16MHz" olacaktır. Seçtiğiniz ayara bağlı olarak ~33ms ile 4.2s arasında değişecektir. Seçiminizi aklınızda tutun, daha sonra ihtiyacınız olacak.

Son ayar gürültü önleyicidir. Üzerinde çok fazla test yapmadım ve vakaların %99'unda buna ihtiyacınız olmayacak, bu yüzden işaretlemeden bırakın. Hala merak edenler için ATMEGA328P'nin veri sayfasının Timer/Counter1 bölümünde gürültü önleyiciyi arayabilirsiniz.

Arduino UNO kartının pin 8'ini sinyalinize bağlamayı ve hem test devresi hem de mantık analizörü için aynı voltaj referansına sahip olmak için toprakları birbirine bağlamayı unutmayın. Toprak izolasyonuna ihtiyacınız varsa veya 5V'tan farklı seviyelerde sinyalleri ölçmeniz gerekiyorsa, muhtemelen devrenize bir opto-izolatör eklemeniz gerekecektir.

Her şey doğru bir şekilde yapılandırıldıktan sonra "Al" düğmesine basabilirsiniz.

6. Adım: Sonuçları Yakalayın ve CSV Verilerini Dışa Aktarın

Sonuçları Yakalama ve CSV Verilerini Dışa Aktarma
Sonuçları Yakalama ve CSV Verilerini Dışa Aktarma

Arduino UNO'nuz bir yakalamayı bitirdiğinde, verileri otomatik olarak onları çizecek olan web arayüzüne geri gönderir. Sağ kaydırıcı ile yakınlaştırabilir veya uzaklaştırabilir ve alttaki ile örnekler arasında gezinebilirsiniz.

Çizim size yalnızca bir önizleme sunar ve herhangi bir veri analiz aracına sahip değildir. Bu nedenle, verileriniz üzerinde daha fazla analiz yapmak için bunları PulseView'a aktarmanız gerekecektir.

İlk adım, tüm verilerinizi içeren bir csv dosyasını dışa aktarmaktır. Bunu yapmak için, web arayüzünden "Dışa Aktar" düğmesini tıklamanız yeterlidir. İstendiğinde dosyanızı bilinen bir konuma kaydedin.

Şimdi PulseView'ı açın. Üst menü çubuğunda, "Aç"a (klasör simgesi) tıklayın ve "Virgülle ayrılmış değerleri içe aktar…" seçeneğini seçin. Verilerinizi içeren önceden oluşturulmuş csv dosyasını seçin.

Küçük bir pencere görünecektir. Her şeyi olduğu gibi bırakın, tek yapmanız gereken yakalama için seçilen saat bölme faktörüne göre "Örnekleme" ayarını değiştirmenizdir. Örnekleme frekansınız "16MHz/(bölme faktörü)" olacaktır. Ardından "Tamam"a tıklayın, sinyaliniz ekranda görünmelidir.

7. Adım: PulseView Sinyal Analizi

PulseView Sinyal Analizi
PulseView Sinyal Analizi

PulseView, birçok protokol kod çözücüye sahiptir. Bunlara erişmek için üst menü çubuğundaki (en sağdaki araç) "Protokol kod çözücü ekle"ye tıklayın. Denemem için 9600 baud'da basit bir UART mesajı gönderdim, bu yüzden "UART" ı aradım.

Sol tarafında etiketi olan bir kanal ekleyecektir (tıpkı verileriniz için olduğu gibi). Etikete tıklayarak kod çözücünün ayarlarını değiştirebilirsiniz. Doğru olanları seçtikten sonra, test cihazım tarafından gönderilen mesajın aynısını alabildim. Bu, tüm sistemin beklendiği gibi çalıştığını gösterir.

Adım 8: Sonuç

Çözüm
Çözüm

Proje başlangıçta bir deney olsa bile, aldığım sonuçlardan memnunum. "Both" kenar modunda 115200 baud'a kadar UART sinyallerini sorunsuz bir şekilde örnekleyebildim ve hatta "Düşen" kenar modunda 230400 baud'a kadar çıkmayı başardım. Test kurulumumu yukarıdaki resimde görebilirsiniz.

Uygulamamın birkaç dezavantajı var, sadece Arduino UNO'nun pin 8'i "giriş yakalama yeteneğine" sahip olduğundan, bir seferde yalnızca bir sinyal yakalayabilmesinden başlayarak. Daha fazla kanala sahip bir Arduino mantık analizörü arıyorsanız, gidip Catoblepas'ınkini kontrol edin.

Bir Arduino UNO'nun yüksek frekanslı (bazı MHz) sinyalleri yakalamasını bekleyemezsiniz, çünkü sadece 16MHz'de saatlidir (eğer biri yaptıysa, yöntemini görmek isterim). Ancak yine de bu ATMEGA328P mikrodenetleyiciden elde edebileceğimiz sonuçlardan etkilendim.

Kod üzerinde fazla bir çalışma yapacağımı sanmıyorum. Deneylerimi yaptım ve aradığım sonuçları aldım. Ancak herhangi biri katkıda bulunmak isterse, kodumun tamamını veya bir kısmını değiştirmekten ve yeniden dağıtmaktan çekinmeyin.

Bu benim ilk Eğitilebilirliğimdi ve sanırım uzundu. Umarım sizin için ilginç bir okuma olmuştur.

Hatalar bulursanız veya herhangi bir sorunuz varsa bana bildirin!

Önerilen: