תוכן עניינים:

Arduino UNO Logic Sniffer: 8 שלבים (עם תמונות)
Arduino UNO Logic Sniffer: 8 שלבים (עם תמונות)

וִידֵאוֹ: Arduino UNO Logic Sniffer: 8 שלבים (עם תמונות)

וִידֵאוֹ: Arduino UNO Logic Sniffer: 8 שלבים (עם תמונות)
וִידֵאוֹ: Arduino Programming: Logical Operators 2024, נוֹבֶמבֶּר
Anonim
Arduino UNO Logic Sniffer
Arduino UNO Logic Sniffer

פרויקט זה התחיל כניסוי פשוט. במהלך המחקר שלי על גליון הנתונים של ATMEGA328P לפרויקט אחר, מצאתי משהו די מעניין. יחידת לכידת קלט טיימר 1. הוא מאפשר למיקרו -בקר ה- Arduino UNO שלנו לזהות קצה אות, לאחסן חותמת זמן ולהפעיל הפרעה, הכל בחומרה.

לאחר מכן תהיתי באיזה יישום זה יכול להיות שימושי, וכיצד ניתן לבדוק זאת. מכיוון שאני רוצה לקבל מנתח לוגי מזה זמן מה, החלטתי לנסות ליישם אחד בלוח ה- UNO של Arduino שלי, רק כדי לבדוק את התכונה ולראות אם נוכל להפיק מזה תוצאות טובות.

אני לא היחיד שיש לו את הרעיון הזה, ותוכל למצוא הרבה מהם רק על ידי חיפוש בגוגל "Analyzer Logic Arduino". בתחילת הפרויקט, כשהוא רק התחיל כניסוי, אפילו לא הייתי מודע לכך שאנשים כבר הצליחו, והתרשמתי מהתוצאות הטובות שהם השיגו עם החומרה הקטנה הזו. עם זאת, לא הצלחתי למצוא פרויקט אחר באמצעות יחידת לכידת הקלט, אז אם כבר ראית את זה, הודע לי!

לסיכום, מנתח הלוגיקה שלי יעשה:

  • שיהיה לך ערוץ אחד,
  • בעל ממשק גרפי,
  • לתקשר עם הממשק באמצעות USB,
  • הפעל על לוח UND של Arduino.

סוף סוף יהיה לו עומק זיכרון של 800 דוגמאות, והצליח ללכוד בהצלחה 115200 הודעות UART (לא ממש בדקתי אותו במהירויות גבוהות יותר).

מדריך זה מכיל הן את החלקים "איך זה עובד" ו"איך להשתמש בו "בפרויקט זה, כך שמי שלא מעוניין בצד הטכני, תוכל לקפוץ ישירות לשלב 4.

אספקה

רציתי לשמור על מנתח הכי פשוט שאפשר, ולכן צריך מעט מאוד חומרה.

אתה תצטרך:

  • לוח Arduino UNO (או שווה ערך כל עוד הוא מסתמך על ה- ATMEGA328P MCU),
  • מחשב,
  • משהו לאיתור באגים (לוח אחר של ארדואינו UNO עובד מצוין לביצוע בדיקות).

הקוד עבור ממשק ה- UNO של Arduino וממשק האינטרנט ניתן למצוא כאן. תזדקק גם לתוכנת p5.serialcontrol ותוכנת PulseView.

שלב 1: עקרון העבודה

עקרון העבודה
עקרון העבודה

הרעיון פשוט. אתה בוחר את הגדרות הלכידה ולוחץ על "לרכוש". ממשק האינטרנט ישלח אותם לתוכנת p5.serialcontrol, המאפשרת לנו להשתמש בממשק הטורי מדפדפן, מכיוון שאינו יכול לגשת אליו ישירות. לאחר מכן, תוכנת p5.serialcontrol מעבירה את המידע ללוח ה- Arduino UNO, הלוכד את הנתונים ושולח אותם בחזרה לממשק דרך אותה הנתיב.

קַל! ובכן … מכיוון שאני לא ממש טוב בתכנות ממשק אנושי/מכונה או טכנולוגיות אינטרנט, שלי בהחלט מכוער ומעוות. אבל זה מאפשר לי להתחיל ללכוד ולחזור את הנתונים שלי בחזרה, וזה מה שהוא נועד עבורו, אז אני חושב שזה בסדר. לצורך עבודת ניתוח רצינית יותר, אני מייבא את הרשומות שלי ל- PulseView, שקל לשימוש ומציע מערכת תכונות טובה ומפענחי פרוטוקולים, כפי שנראה בהמשך.

ניתן להגדיר את יחידת לכידת הקלט של Arduino UNO לשימוש בחטיבות שעון שונות, ובכך להפחית את הרזולוציה, אך להגדיל את העיכוב לפני הצפה. זה גם יכול לעורר עלייה, ירידה או שני הקצוות להתחיל ללכוד את הנתונים.

שלב 2: מערכון UNO Arduino

סקיצה של ארדואינו UNO
סקיצה של ארדואינו UNO

כתבתי וריכזתי את המערכון עם ה- Arduino IDE. התחלתי בהגדרת הטיימר 1 במצב פעולה "רגיל" על ידי כתיבה לרשומות TCCR1A ו- TCCR1B שלו בהגדרות (). לאחר מכן עשיתי כמה פונקציות כדי להקל מעט על השימוש בו בעתיד, כמו זה להגדיר את חלוקת השעון בשם "setTim1PSC ()". כתבתי גם פונקציות להפעלה וביטול של יחידת לכידת הקלט Timer1 והפרעות הצפה.

הוספתי את מערך "דוגמאות", שיכיל את הנתונים שנרכשו. זהו מערך גלובלי שהגדרתי כ"נדיף "כדי למנוע מהדר לבצע אופטימיזציות ולהכניס אותו לפלאש, כפי שעשה במהלך האסופים הראשונים שלי. הגדרתי אותו כמערך "uint16_t", שכן טיימר 1 הוא גם 16 ביט, באורך של 810. אנו מפסיקים ללכוד ב -800 ערכים, אך מכיוון שהבדיקה נעשית מחוץ להפסקות מסיבות מהירות ברורות, בחרתי לשמור על 10 ערכים נוספים למניעת הצפה. עם כמה משתנים נוספים לשאר הקוד, המערכון משתמש ב -1313 בתים (88%) של זיכרון, ומשאירים לנו 235 בתים של זיכרון RAM פנוי. אנחנו כבר בשימוש גבוה בזיכרון, ולא רציתי להוסיף יותר קיבולת מדגם, מכיוון שהוא עלול לגרום להתנהגויות מוזרות בגלל מעט מדי מקום בזיכרון.

בשאיפה שלי תמיד להגדיל את מהירות הביצוע, השתמשתי במצביעי פונקציות במקום אם הצהרות בתוך הפרעות, כדי לצמצם את זמן הביצוע למינימום. סיכת הלכידה תמיד תהיה מספר 8 של Arduino UNO, מכיוון שהיא היחידה המחוברת ליחידת לכידת הקלט של טיימר 1.

תהליך הלכידה מוצג בתמונה למעלה. זה מתחיל כאשר ה- UNO של Arduino מקבל מסגרת נתונים תקפה של UART, המכילה את הגדרות הלכידה הרצויות. לאחר מכן אנו מעבדים את ההגדרות האלה על ידי קביעת תצורה של הרישומים הנכונים ללכידה בקצה הנבחר, ומשתמשים בחלוקת השעון הנכון. לאחר מכן אנו מאפשרים את הפרעה PCINT0 (שינוי סיכה) כדי לזהות את קצה האות הראשון. כאשר אנו מקבלים את זה, אנו מאפסים את ערך Timer1, משביתים את הפסיקה PCINT0 ומאפשרים את הפרעה ל- ICU (Input Capture Unit). מאותו רגע, כל נפילה/עלייה בקצה האות (בהתאם לתצורה שנבחרה), תפעיל את יחידת לכידת הקלט, ובכך תחסוך חותמת זמן של אירוע זה לרשם ICR1 ותבצע הפרעה. בהפרעה זו אנו מכניסים את ערך הרישום ICR1 למערך ה"דגימות "שלנו, ומגדילים את האינדקס ללכידה הבאה. כאשר טיימר 1 או המערך עולה על גדותיו, אנו משביתים את הפרעה ללכידה ושולחים את הנתונים בחזרה לממשק האינטרנט באמצעות UART.

החלטתי להשתמש בהפרעה לשינוי סיכה כדי להפעיל את הלכידה, שכן יחידת לכידת הקלט מאפשרת ללכוד רק בקצה אחד או בקצה השני, לא בשניהם. זה גם גורם לבעיה כאשר אתה רוצה ללכוד את שני הקצוות. הפתרון שלי אז הוא להפוך את הסיבית השולטת בבחירת הקצה ברשומת בקרת לכידת הקלט בכל מדגם שאוחזר. כך אנו מאבדים את מהירות הביצוע, אך אנו עדיין יכולים להשתמש בפונקציות של יחידת לכידת הקלט.

אז, כפי שאולי שמתם לב, איננו ממש לוכדים כל מדגם במרווחי זמן קבועים, אך אנו תופסים את הרגע בו מתרחש מעבר אות. אם היינו לוכדים מדגם אחד בכל מחזור שעון, אפילו עם חלוקת השעונים הגבוהה ביותר, היינו ממלאים את המאגר בערך ב -0.1 שניות, בהנחה שאנו משתמשים בסוג uint8_t, שהוא הקטן ביותר בזיכרון ללא שימוש במבנים.

שלב 3: ממשק אינטרנט ו- P5.js

ממשק אינטרנט ו- P5.js
ממשק אינטרנט ו- P5.js

כפי שהכותרת מרמזת, ממשק האינטרנט נעשה בעזרת p5.js. למי שלא יודע את זה כבר, אני ממליץ לך בחום ללכת לבדוק את האתר, כיוון שזו ספרייה ממש טובה. הוא מבוסס על עיבוד, קל לשימוש, מאפשר לך להגיע לתוצאות טובות מהר מאוד ומתועד היטב. מכל הסיבות האלה בחרתי בספרייה הזו. השתמשתי גם בספריית quicksettings.js לתפריטים, באחת grafica.js כדי לשרטט את הנתונים שלי ובספריית p5.serialport לתקשר עם UNO Arduino.

לא אבזבז יותר מדי זמן על הממשק, כיוון שעיצבתי אותו לתצוגה מקדימה של נתונים ולבקרת הגדרות, וגם כי זה בכלל לא היה נושא הניסוי שלי. עם זאת אסביר בחלקים הבאים את השלבים השונים לשימוש במערכת כולה, ובכך אסביר את הפקדים השונים הקיימים.

שלב 4: הגדרת המערכת

הדבר הראשון הוא להוריד את UNO וקוד הממשק של Arduino כאן אם עדיין לא נעשה. לאחר מכן תוכל לתכנת מחדש את לוח ה- UNO של Arduino באמצעות סקיצה "UNO_LS.ino" באמצעות ה- IDE של Arduino.

היית צריך להוריד את תוכנת p5.serialcontrol ממאגר github שלה. עליך לקבל את קובץ ה- zip התואם את מערכת ההפעלה שלך (בדקתי אותו רק ב- Windows). חלץ את ה- zip בתיקייה, הפעל את קובץ ההפעלה שנמצא בו והשאיר אותו כך. אל תנסה להתחבר ליציאה טורית כלשהי, פשוט השאר אותה פועלת ברקע, היא תשמש כממסר.

פתח את התיקייה "ממשק". אתה אמור למצוא קובץ בשם "index.html". פתח אותו בדפדפן שלך, זהו ממשק האינטרנט.

וזה הכל! אינך צריך להוריד ספריות נוספות, הכל צריך להיות כלול בחבילה שסיפקתי.

שלב 5: חיבור, תצורה ורכישה

חיבור, תצורה ורכישה
חיבור, תצורה ורכישה

כדי לחבר את הממשק ללוח ה- Arduino UNO, פשוט בחר את היציאה המתאימה ברשימה ולחץ על כפתור "פתח". אם הפעולה הצליחה, הודעת "המדינה" אמורה להציג משהו כמו "COMX נפתח".

כעת תוכל לבחור את אפשרויות הלכידה שלך. הראשונה היא בחירת הקצה. אני ממליץ לך תמיד להשתמש ב"שניהם ", מכיוון שהוא ייתן לך את הייצוג הטוב ביותר של האות האמיתי. אם הגדרת "שניהם" לא מצליחה ללכוד את האות (אם תדירות האות גבוהה מדי למשל), תוכל לנסות עם הגדרת הקצה "עולה" או "נופל", בהתאם לאות שאתה מנסה לראות.

ההגדרה השנייה היא חלוקת השעון. זה ייתן לך את הרזולוציה שבה תוכל ללכוד את האות. אתה יכול לבחור להגדיר את גורם החלוקה לפי "8", "64", "256" ו- "1024". לוח ה- Arduino UNO משתמש בקוורץ 16 מגה -הרץ לשעון המיקרו -בקר, כך שתדר הדגימה יהיה "16 מגה -הרץ/גורם חלוקה". היזהר עם הגדרה זו, מכיוון שהיא גם קובעת לכמה זמן תוכל ללכוד אות. מכיוון שהטיימר 1 הוא טיימר של 16 ביט, זמן הלכידה המותר לפני הצפה יהיה "(2^16)*(גורם חלוקה)/16MHz". בהתאם להגדרה שבחרת, היא תנוע בין ~ 33 אלפיות השנייה ל -4.2 שניות. שמור על בחירתך בראש, תזדקק לה מאוחר יותר.

ההגדרה האחרונה היא מבטל רעשים. לא ערכתי הרבה בדיקות על זה, ולא תצטרך את זה ב 99% מהמקרים, אז פשוט תשאיר את זה ללא סימון. למי שעדיין סקרן לגבי זה, תוכל לחפש את מבטל הרעשים בחלק הטיימר/מונה 1 בגליון הנתונים של ATMEGA328P.

אל תשכח לחבר את סיכה 8 של לוח ה- Arduino UNO לאות שלך, ולחבר את הקרקע יחד כדי לקבל את אותה הפניה למתח הן עבור מעגל הבדיקה והן של מנתח הלוגיקה. אם אתה צריך בידוד קרקע, או שאתה צריך למדוד אותות ברמות שונות מ- 5V, סביר להניח שתצטרך להוסיף מבודד אופטי למעגל שלך.

לאחר שהכל מוגדר כהלכה, תוכל ללחוץ על כפתור "רכישה".

שלב 6: לכידת תוצאות וייצוא נתוני CSV

לכידת תוצאות וייצוא נתוני CSV
לכידת תוצאות וייצוא נתוני CSV

לאחר ש- UND Arduino שלך יסיים לכידה, הוא ישלח אוטומטית את הנתונים לממשק האינטרנט, אשר ישרטט אותם. אתה יכול להגדיל או להקטין את המחוון הימני, ולנסוע בין הדוגמאות עם החלק התחתון.

העלילה נותנת לך רק תצוגה מקדימה ואין לה כלי לניתוח נתונים. לכן, על מנת לבצע ניתוח נוסף על הנתונים שלך, יהיה עליך לייבא אותם ל- PulseView.

השלב הראשון הוא לייצא קובץ csv המכיל את כל הנתונים שלך. לשם כך, עליך ללחוץ על כפתור "ייצוא" מממשק האינטרנט. שמור את הקובץ שלך במיקום ידוע כשתתבקש.

כעת פתח את PulseView. בשורת התפריטים העליונה, לחץ על "פתח" (סמל תיקיה) ובחר "ייבא ערכים המופרדים בפסיקים …". בחר את קובץ ה- csv שנוצר בעבר המכיל את הנתונים שלך.

יופיע חלון קטן. השאר הכל כפי שהוא, אתה רק צריך לשנות את ההגדרה "Samplerate" בהתאם לגורם חלוקת השעון שנבחר ללכידה. תדירות הדגימה שלך תהיה "16MHz/(גורם חלוקה)". לאחר מכן לחץ על "אישור", האות שלך אמור להופיע על המסך.

שלב 7: ניתוח אותות PulseView

ניתוח אותות PulseView
ניתוח אותות PulseView

PulseView כולל הרבה מפענחי פרוטוקול. כדי לגשת אליהם, לחץ על "הוסף מפענח פרוטוקול" בשורת התפריטים העליונה (הכלי הנכון ביותר). לניסוי שלי, שלחתי הודעת UART פשוטה ב 9600 באדס, אז חיפשתי "UART".

הוא יוסיף ערוץ עם תג משמאל (בדיוק כמו זה של הנתונים שלך). על ידי לחיצה על התג תוכל לשנות את הגדרות המפענח. לאחר שבחרתי את ההודעות הנכונות, הצלחתי לאחזר את אותה ההודעה שנשלחה על ידי מכשיר הבדיקה שלי. זה מראה שכל המערכת פועלת כצפוי.

שלב 8: סיכום

סיכום
סיכום

גם אם הפרויקט היה בהתחלה ניסוי, אני שמח מהתוצאות שקיבלתי. הצלחתי לדגום אותות UART עד 115200 שיפוצים במצב קצה "שניהם" ללא שום בעיה, ואפילו הצלחתי לעלות עד 230400 שידורים במצב קצה "נופל". אתה יכול לראות את הגדרת הבדיקה שלי בתמונה למעלה.

ליישום שלי יש כמה חסרונות, החל בכך שהוא יכול ללכוד רק אות אחד בכל פעם, מכיוון שרק סיכה 8 של ארדואינו UNO היא "מסוגלת ללכוד קלט". אם אתה מחפש מנתח לוגי של Arduino עם יותר ערוצים, עבור אל אחד מהם של Catoblepas.

אתה לא יכול לצפות ש- UNO של Arduino יצליח ללכוד אותות עם תדרים גבוהים (כמה מגה -הרץ), מכיוון שהוא משועבד רק ב -16 מגה -הרץ (אם מישהו היה עושה את זה, הייתי מעוניין לראות את השיטה שלו). עם זאת, אני עדיין מתרשם מהתוצאות שאנו יכולים להוציא מהמיקרו -בקר ATMEGA328P הזה.

אני לא חושב שאעשה הרבה על הקוד. ערכתי את הניסויים שלי וקיבלתי את התוצאות שחיפשתי. אבל אם מישהו רוצה לתרום, אל תהסס לשנות ולהפיץ מחדש את כל הקוד שלי או חלק ממנו.

זו הייתה ההנחיה הראשונה שלי והארוכה לדעתי. אני מקווה שזו הייתה קריאה מעניינת עבורך.

הודע לי אם אתה מוצא שגיאות, או אם יש לך שאלה!

מוּמלָץ: