جدول المحتويات:

Arduino UNO Logic Sniffer: 8 خطوات (بالصور)
Arduino UNO Logic Sniffer: 8 خطوات (بالصور)

فيديو: Arduino UNO Logic Sniffer: 8 خطوات (بالصور)

فيديو: Arduino UNO Logic Sniffer: 8 خطوات (بالصور)
فيديو: 35 видео со страшными призраками: мегасборник 2023 года [V1] 2024, شهر نوفمبر
Anonim
اردوينو UNO Logic Sniffer
اردوينو UNO Logic Sniffer

بدأ هذا المشروع كتجربة بسيطة. أثناء بحثي حول ورقة بيانات ATMEGA328P لمشروع آخر ، وجدت شيئًا مثيرًا للاهتمام إلى حد ما. وحدة التقاط الإدخال Timer1. إنه يسمح لمتحكم Arduino UNO الخاص بنا باكتشاف حافة الإشارة وتخزين طابع زمني وتشغيل مقاطعة ، كل ذلك في الأجهزة.

ثم تساءلت في أي تطبيق يمكن أن يكون مفيدًا ، وكيفية اختباره. نظرًا لأنني أرغب في الحصول على محلل منطقي لبعض الوقت الآن ، فقد قررت تجربة تطبيق واحد في لوحة Arduino UNO الخاصة بي ، فقط لاختبار الميزة ، ومعرفة ما إذا كان بإمكاننا الحصول على نتائج جيدة منها.

أنا لست الوحيد الذي لديه هذه الفكرة ، وسوف تجد الكثير منها بمجرد البحث على Google "Arduino Logic Analyzer". في بداية المشروع ، حيث بدأ للتو كتجربة ، لم أكن أدرك حتى أن الناس قاموا بذلك بالفعل ، وقد تأثرت بالنتائج الجيدة التي حققوها مع هذه القطعة الصغيرة من الأجهزة. ومع ذلك ، لم أتمكن من العثور على مشروع آخر باستخدام وحدة التقاط المدخلات ، لذا إذا كنت قد رأيت هذا بالفعل ، فأعلمني بذلك!

للتلخيص ، سوف يقوم محلل المنطق الخاص بي بما يلي:

  • لديك قناة واحدة ،
  • لها واجهة رسومية ،
  • التواصل مع الواجهة من خلال USB ،
  • قم بتشغيل لوحة Arduino UNO.

ستحصل أخيرًا على 800 عينة من عمق الذاكرة ، وتمكنت من التقاط 115200 bauds UART رسالة (لم أختبرها بالفعل بسرعات أعلى).

يحتوي هذا التوجيه على أجزاء "كيف يعمل" و "كيفية استخدامه" في هذا المشروع ، لذلك بالنسبة لأولئك الذين لا يهتمون بالجانب التقني ، يمكنك الانتقال مباشرةً إلى الخطوة 4.

اللوازم

أردت أن أبقي المحلل بسيطًا قدر الإمكان ، لذلك لا يتطلب سوى القليل جدًا من الأجهزة.

سوف تحتاج:

  • لوحة Arduino UNO (أو ما يعادلها طالما أنها تعتمد على ATMEGA328P MCU) ،
  • كمبيوتر،
  • شيء ما لتصحيحه (تعمل لوحة Arduino UNO الأخرى بشكل جيد لإجراء بعض الاختبارات).

يمكن العثور على الكود الخاص بكل من Arduino UNO وواجهة الويب هنا ، وستحتاج أيضًا إلى برنامج p5.serialcontrol و PulseView.

الخطوة 1: مبدأ العمل

مبدأ العمل
مبدأ العمل

الفكرة بسيطة. يمكنك اختيار إعدادات الالتقاط ، والنقر على "اكتساب". سترسلهم واجهة الويب إلى برنامج p5.serialcontrol ، والذي يسمح لنا باستخدام الواجهة التسلسلية من متصفح ، حيث لا يمكنه الوصول إليها مباشرة. يقوم برنامج p5.serialcontrol بعد ذلك بترحيل المعلومات إلى لوحة Arduino UNO ، والتي تلتقط البيانات وترسلها مرة أخرى إلى الواجهة من خلال نفس المسار.

سهل! حسنًا … بما أنني لست جيدًا حقًا في برمجة واجهة الإنسان / الآلة أو تقنيات الويب ، فإنني بالتأكيد قبيح بعض الشيء وعربات التي تجرها الدواب. لكنه يسمح لي بالبدء في التقاط واستعادة بياناتي مرة أخرى ، وهو ما تم تصميمه من أجله ، لذلك أعتقد أنه جيد. لمزيد من العمل الجاد في التحليل ، أقوم باستيراد سجلاتي إلى PulseView ، وهو سهل الاستخدام ويقدم مجموعة جيدة من الميزات وأجهزة فك تشفير البروتوكول ، كما سنرى لاحقًا.

يمكن تكوين وحدة التقاط المدخلات في Arduino UNO لاستخدام أقسام مختلفة على مدار الساعة ، وبالتالي تقليل الدقة ، ولكن زيادة التأخير قبل تجاوز التدفق. يمكن أن يؤدي أيضًا إلى ارتفاع أو هبوط أو كلا الحافتين لبدء التقاط البيانات.

الخطوة 2: Arduino UNO Sketch

اردوينو UNO Sketch
اردوينو UNO Sketch

لقد كتبت وجمعت الرسم باستخدام Arduino IDE. لقد بدأت أولاً بإعداد Timer1 في وضع التشغيل "العادي" من خلال الكتابة إلى سجلات TCCR1A و TCCR1B في الإعداد (). ثم قمت بعمل بعض الوظائف لتسهيل استخدامه قليلاً في المستقبل ، مثل تلك الخاصة بضبط قسم الساعة المسمى "setTim1PSC ()". لقد كتبت أيضًا وظائف لتنشيط وإلغاء تنشيط وحدة التقاط الإدخال Timer1 ومقاطعات تجاوز التدفق.

أضفت مصفوفة "العينات" ، والتي ستحتفظ بالبيانات التي تم الحصول عليها. إنها مصفوفة عالمية قمت بضبطها على "متغير" لمنع المترجم من إجراء التحسينات ووضعها في صورة فلاش ، كما كان يفعل خلال عمليات التجميع الأولى. لقد حددته على أنه مصفوفة "uint16_t" ، لأن Timer1 هو أيضًا 16 بت ، بطول 810. نتوقف عن الالتقاط عند 800 قيمة ، ولكن نظرًا لأن الاختبار يتم خارج المقاطعات لأسباب واضحة تتعلق بالسرعة ، اخترت الاحتفاظ بـ 10 المزيد من القيم لمنع الفائض. مع بعض المتغيرات الإضافية لبقية الكود ، يستخدم الرسم 1313 بايت (88٪) من الذاكرة ، مما يترك لنا 235 بايت من ذاكرة الوصول العشوائي المجانية. نحن بالفعل نستخدم ذاكرة عالية ، ولم أرغب في إضافة المزيد من سعة العينة ، حيث قد يتسبب ذلك في سلوكيات غريبة بسبب قلة مساحة الذاكرة.

في سعيي لزيادة سرعة التنفيذ دائمًا ، استخدمت مؤشرات الوظائف بدلاً من عبارات if داخل المقاطعات ، لتقليل وقت تنفيذها إلى الحد الأدنى. سيكون دبوس الالتقاط دائمًا هو Arduino UNO رقم 8 ، لأنه الوحيد المتصل بوحدة التقاط الإدخال في Timer1.

تظهر عملية الالتقاط في الصورة أعلاه. يبدأ عندما يتلقى Arduino UNO إطار بيانات UART صالحًا ، يحتوي على إعدادات الالتقاط المطلوبة. ثم نقوم بمعالجة هذه الإعدادات عن طريق تكوين السجلات الصحيحة لالتقاطها على الحافة المختارة ، واستخدام تقسيم الساعة الصحيح. ثم نقوم بتمكين مقاطعة PCINT0 (تغيير الدبوس) لاكتشاف حافة الإشارة الأولى. عندما نحصل عليه ، نقوم بإعادة تعيين قيمة Timer1 ، وتعطيل مقاطعة PCINT0 ، وتمكين مقاطعة ICU (وحدة التقاط الإدخال). من تلك اللحظة ، ستؤدي أي حافة هبوط / صاعدة على الإشارة (اعتمادًا على التكوين المختار) إلى تشغيل وحدة التقاط المدخلات ، وبالتالي توفير طابع زمني لهذا الحدث في سجل ICR1 ، وتنفيذ مقاطعة. في هذه المقاطعة ، نضع قيمة تسجيل ICR1 في مصفوفة "العينات" الخاصة بنا ، ونزيد الفهرس للالتقاط التالي. عندما يفيض Timer1 أو المصفوفة ، نقوم بتعطيل مقاطعة الالتقاط ، ونرسل البيانات مرة أخرى إلى واجهة الويب من خلال UART.

قررت استخدام مقاطعة تغيير الدبوس لبدء الالتقاط ، حيث تسمح وحدة التقاط الإدخال فقط بالتقاط على حافة واحدة أو أخرى ، وليس كليهما. كما أنه يسبب مشكلة عندما تريد التقاط كلا الحافتين. كان الحل بعد ذلك هو عكس البت الذي يتحكم في تحديد الحافة في سجل التحكم في التقاط المدخلات في كل عينة يتم استردادها. بهذه الطريقة نفقد سرعة التنفيذ ، ولكن لا يزال بإمكاننا استخدام وظائف وحدة التقاط الإدخال.

لذلك ، كما لاحظت ، لا نلتقط حقًا كل عينة على فترات زمنية محددة ، لكننا نلتقط اللحظة التي يحدث فيها انتقال الإشارة. إذا كنا قد أخذنا عينة واحدة في كل دورة ساعة ، حتى مع أعلى تقسيم للساعة ، فسنملأ المخزن المؤقت في 0.1 ثانية تقريبًا ، بافتراض أننا كنا نستخدم النوع uint8_t ، وهو أصغر نموذج في الذاكرة دون استخدام البُنى.

الخطوة 3: واجهة الويب و P5.js

واجهة الويب و P5.js
واجهة الويب و P5.js

كما يوحي العنوان ، تم إنشاء واجهة الويب بمساعدة p5.js. بالنسبة لأولئك الذين لا يعرفون ذلك بالفعل ، أوصيك بشدة بالذهاب والتحقق من موقع الويب ، لأنه مكتبة جيدة حقًا. يعتمد على المعالجة ، وهو سهل الاستخدام ، ويسمح لك بالحصول على نتائج جيدة بسرعة كبيرة ، وموثق جيدًا. لكل هذه الأسباب اخترت هذه المكتبة. استخدمت أيضًا مكتبة quicksettings.js للقوائم ، ومكتبة grafica.js لرسم بياناتي ، ومكتبة p5.serialport للتواصل مع Arduino UNO.

لن أقضي الكثير من الوقت على الواجهة ، لأنني صممتها للتو لمعاينة البيانات والتحكم في الإعدادات ، وأيضًا لأنها لم تكن موضوع تجربتي على الإطلاق. ومع ذلك ، سأشرح في الأجزاء التالية الخطوات المختلفة لاستخدام النظام بأكمله ، وبالتالي شرح الضوابط المختلفة المتاحة.

الخطوة 4: إعداد النظام

أول شيء هو تنزيل Arduino UNO ورمز الواجهة هنا إذا لم يكن قد تم بالفعل. يمكنك بعد ذلك إعادة برمجة لوحة Arduino UNO الخاصة بك باستخدام رسم "UNO_LS.ino" من خلال Arduino IDE.

يجب أن تكون قد قمت بتنزيل برنامج p5.serialcontrol من مستودع جيثب الخاص به. يجب أن تحصل على ملف مضغوط يطابق نظام التشغيل الخاص بك (لقد اختبرته فقط على Windows). قم باستخراج ملف zip في مجلد ، وابدأ تشغيل الملف القابل للتنفيذ الموجود فيه ، واتركه هكذا. لا تحاول الاتصال بأي منفذ تسلسلي ، فقط اتركه يعمل في الخلفية ، وسيتم استخدامه كمرحل.

افتح مجلد "Interface". يجب أن تجد ملفًا يسمى "index.html". افتحها في متصفحك ، إنها واجهة الويب.

وهذا كل شيء! لا تحتاج إلى تنزيل مكتبات إضافية ، يجب تضمين كل شيء في الحزمة التي قدمتها.

الخطوة 5: الاتصال والتكوين والاستحواذ

الاتصال والتكوين والاستحواذ
الاتصال والتكوين والاستحواذ

لتوصيل الواجهة بلوحة Arduino UNO ، ما عليك سوى تحديد المنفذ المقابل في القائمة والضغط على الزر "فتح". في حالة نجاح العملية ، يجب أن تعرض رسالة "الحالة" شيئًا مثل "تم فتح COMX".

يمكنك الآن اختيار خيارات الالتقاط الخاصة بك. الأول هو اختيار الحافة. أنصحك دائمًا باستخدام "كلاهما" ، حيث ستمنحك أفضل تمثيل للإشارة الحقيقية. إذا فشل الإعداد "كلاهما" في التقاط الإشارة (إذا كان تردد الإشارة مرتفعًا جدًا على سبيل المثال) ، يمكنك تجربة إما إعداد حافة "الارتفاع" أو "الهبوط" ، اعتمادًا على الإشارة التي تحاول رؤيتها.

الإعداد الثاني هو تقسيم الساعة. سوف يمنحك الدقة التي ستتمكن من خلالها من التقاط الإشارة. يمكنك اختيار ضبط عامل القسمة إما على "8" و "64" و "256" و "1024". تستخدم لوحة Arduino UNO كوارتز بتردد 16 ميجاهرتز لتسجيل وحدة التحكم الدقيقة ، وبالتالي فإن تردد أخذ العينات سيكون "16 ميجاهرتز / عامل الانقسام". كن حذرًا مع هذا الإعداد ، لأنه سيحدد أيضًا المدة التي ستتمكن فيها من التقاط إشارة. نظرًا لأن Timer1 هو مؤقت 16 بت ، فإن وقت الالتقاط المسموح به قبل التدفق الزائد سيكون "(2 ^ 16) * (عامل القسمة) / 16 ميجا هرتز". اعتمادًا على الإعداد الذي اخترته ، سيتراوح بين ~ 33 مللي ثانية و 4.2 ثانية. ضع اختيارك في ذهنك ، فستحتاجه لاحقًا.

الإعداد الأخير هو إلغاء الضوضاء. لم أجري الكثير من الاختبارات عليها ، ولن تحتاجها في 99٪ من الحالات ، لذا اتركها دون رادع. بالنسبة لأولئك الذين لا يزالون مهتمين بهذا الأمر ، يمكنك البحث عن أداة إلغاء الضوضاء في قسم Timer / Counter1 من ورقة بيانات ATMEGA328P.

لا تنس توصيل دبوس 8 الخاص بلوحة Arduino UNO بالإشارة الخاصة بك ، وقم بتوصيل الأسباب معًا للحصول على نفس مرجع الجهد لكل من دائرة الاختبار والمحلل المنطقي. إذا كنت بحاجة إلى عزل أرضي ، أو كنت بحاجة إلى قياس الإشارات بمستويات مختلفة عن 5 فولت ، فربما تحتاج إلى إضافة عازل بصري إلى دائرتك.

بمجرد تكوين كل شيء بشكل صحيح ، يمكنك الضغط على الزر "اكتساب".

الخطوة 6: التقاط النتائج وتصدير بيانات CSV

نتائج التقاط وتصدير بيانات CSV
نتائج التقاط وتصدير بيانات CSV

بمجرد انتهاء Arduino UNO الخاص بك من الالتقاط ، سيقوم تلقائيًا بإرسال البيانات مرة أخرى إلى واجهة الويب ، والتي سترسمها. يمكنك التكبير أو التصغير باستخدام شريط التمرير الأيمن ، والانتقال عبر العينات مع الجزء السفلي.

يمنحك المخطط معاينة فقط ، ولا يحتوي على أي أدوات لتحليل البيانات. وبالتالي ، لإجراء مزيد من التحليل على بياناتك ، سيتعين عليك استيرادها إلى PulseView.

تتمثل الخطوة الأولى في تصدير ملف csv يحتوي على جميع بياناتك. للقيام بذلك ، ما عليك سوى النقر فوق الزر "تصدير" من واجهة الويب. احفظ ملفك في مكان معروف عندما يُطلب منك ذلك.

افتح الآن PulseView. في شريط القائمة العلوي ، انقر فوق "فتح" (رمز المجلد) ، وحدد "استيراد قيم مفصولة بفواصل …". حدد ملف csv الذي تم إنشاؤه مسبقًا والذي يحتوي على بياناتك.

ستظهر نافذة صغيرة. اترك كل شيء كما هو ، فأنت تحتاج فقط إلى تعديل إعداد "Samplerate" وفقًا لعامل تقسيم الساعة المختار للالتقاط. سيكون تردد العينة "16 ميجا هرتز / (عامل القسمة)". ثم انقر فوق "موافق" ، يجب أن تظهر الإشارة الخاصة بك على الشاشة.

الخطوة 7: تحليل إشارة PulseView

PulseView تحليل الإشارة
PulseView تحليل الإشارة

يتميز PulseView بالعديد من وحدات فك ترميز البروتوكول. للوصول إليها ، انقر فوق "إضافة وحدة فك ترميز البروتوكول" في شريط القائمة العلوي (الأداة الصحيحة). بالنسبة لتجربتي ، أرسلت للتو رسالة UART بسيطة عند 9600 باود ، لذلك بحثت عن "UART".

سيضيف قناة بعلامة على يسارها (تمامًا مثل تلك الخاصة ببياناتك). من خلال النقر على العلامة ، يمكنك تغيير إعدادات وحدة فك التشفير. بعد اختيار الرسائل الصحيحة ، تمكنت من استرداد نفس الرسالة التي أرسلها جهاز الاختبار الخاص بي. هذا يدل على أن النظام بأكمله يعمل كما هو متوقع.

الخطوة 8: الخاتمة

استنتاج
استنتاج

حتى لو كان المشروع ، في البداية ، تجربة ، فأنا سعيد بالنتائج التي حصلت عليها. لقد تمكنت من أخذ عينات من إشارات UART بمعدل يصل إلى 115200 باود في وضع الحافة "كلاهما" دون أي مشكلة ، حتى أنني تمكنت من رفع ما يصل إلى 230400 باود في وضع الحافة "السقوط". يمكنك أن ترى إعداد الاختبار الخاص بي على الصورة أعلاه.

يحتوي تطبيقي على العديد من العيوب ، بدءًا من حقيقة أنه لا يمكنه التقاط سوى إشارة واحدة في كل مرة ، نظرًا لأن دبوس Arduino UNO 8 فقط هو "قادر على التقاط الإدخال". إذا كنت تبحث عن محلل منطق Arduino مع المزيد من القنوات ، فانتقل إلى أحد Catoblepas.

لا يمكنك أن تتوقع أن يكون Arduino UNO قادرًا على التقاط إشارات بترددات عالية (بعض MHz) ، حيث يتم تسجيلها فقط عند 16 ميجاهرتز (إذا فعلها أي شخص ، سأكون مهتمًا برؤية طريقتها). ومع ذلك ، ما زلت معجبًا بالنتائج التي يمكننا الحصول عليها من هذا الميكروكونترولر ATMEGA328P.

لا أعتقد أنني سأفعل الكثير من العمل على الكود. أجريت تجاربي وحصلت على النتائج التي كنت أبحث عنها. ولكن إذا أراد أي شخص المساهمة ، فلا تتردد في تعديل وإعادة توزيع كل أو جزء من التعليمات البرمجية الخاصة بي.

كان هذا أول Instructable لي ، وأعتقد أنه طويل. آمل أن تكون قراءة ممتعة بالنسبة لك.

أخبرني إذا وجدت أخطاء ، أو إذا كان لديك أي سؤال!

موصى به: