فهرست مطالب:

Arduino UNO Logic Sniffer: 8 مرحله (همراه با تصاویر)
Arduino UNO Logic Sniffer: 8 مرحله (همراه با تصاویر)

تصویری: Arduino UNO Logic Sniffer: 8 مرحله (همراه با تصاویر)

تصویری: Arduino UNO Logic Sniffer: 8 مرحله (همراه با تصاویر)
تصویری: MKS Gen L - Marlin 1 1 9 (configuration.h) 2024, نوامبر
Anonim
Arduino UNO Logic Sniffer
Arduino UNO Logic Sniffer

این پروژه به عنوان یک آزمایش ساده آغاز شد. در حین تحقیق در مورد برگه اطلاعات ATMEGA328P برای پروژه ای دیگر ، چیز جالبی پیدا کردم. واحد ضبط ورودی Timer1. این به میکروکنترلر Arduino UNO ما اجازه می دهد تا یک لبه سیگنال را تشخیص دهد ، یک مهر زمان ذخیره کند و یک وقفه ایجاد کند ، همه در سخت افزار.

سپس از خودم پرسیدم که در کدام برنامه می تواند مفید باشد و چگونه آن را آزمایش کنم. از آنجا که مدتی است می خواهم یک تجزیه و تحلیل منطقی تهیه کنم ، تصمیم گرفتم یکی را در برد Arduino UNO خود اجرا کنم ، فقط برای آزمایش ویژگی و بررسی اینکه آیا می توانیم نتایج خوبی از آن بدست آوریم.

من تنها کسی نیستم که این ایده را داشت ، و شما فقط با جستجوی گوگل "Arduino Logic Analyzer" می توانید بسیاری از آنها را پیدا کنید. در ابتدای پروژه ، همانطور که به عنوان یک آزمایش آغاز شد ، من حتی نمی دانستم که افراد قبلاً آن را ساخته اند و تحت تأثیر نتایج خوبی که با این قطعه سخت افزاری کوچک به دست آوردند ، تحت تأثیر قرار گرفتم. با این حال ، من نتوانستم پروژه دیگری با استفاده از واحد ضبط ورودی پیدا کنم ، بنابراین اگر قبلاً این را دیده اید ، به من اطلاع دهید!

به طور خلاصه ، تجزیه و تحلیل منطق من:

  • داشتن یک کانال ،
  • داشتن رابط گرافیکی ،
  • ارتباط با رابط از طریق USB ،
  • روی برد 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

من طرح را با IDE آردوینو نوشتم و گردآوری کردم. من ابتدا با تنظیم Timer1 در حالت عملکرد "معمولی" با نوشتن در رجیسترهای TCCR1A و TCCR1B در تنظیم () شروع کردم. سپس برخی از عملکردها را برای سهولت استفاده از آن در آینده انجام دادم ، مانند عملکردی که بخش تقسیم ساعت را با نام "setTim1PSC ()" تنظیم می کند. همچنین توابع را برای فعال و غیرفعال کردن واحد ضبط ورودی Timer1 و وقفه های سرریز نوشتم.

آرایه "نمونه" را اضافه کردم ، که داده های به دست آمده را در خود نگه می دارد. این یک آرایه جهانی است که من آن را "فرار" قرار دادم تا از کامپایلر برای بهینه سازی و جلوگیری از بهینه سازی آن جلوگیری کنم ، همانطور که در اولین گردآوری های من انجام می شد. من آن را به عنوان یک آرایه "uint16_t" تعریف کردم ، زیرا تایمر 1 نیز 16 بیت است ، با طول 810. ما ضبط در 800 مقدار را متوقف می کنیم ، اما از آنجا که آزمایش به دلایل آشکار سرعت در خارج از وقفه انجام می شود ، من 10 را نگه داشتم. مقادیر بیشتری برای جلوگیری از سرریز با چند متغیر اضافی برای بقیه کد ، طرح از 1313 بایت (88)) حافظه استفاده می کند و 235 بایت RAM رایگان برای ما باقی می گذارد. ما در حال حاضر از حافظه بالایی استفاده می کنیم و من نمی خواستم ظرفیت نمونه بیشتری اضافه کنم ، زیرا به دلیل فضای کم حافظه می تواند باعث رفتارهای عجیب و غریب شود.

در تلاش برای افزایش سرعت اجرا ، از اشاره گرهای تابع به جای دستورهای داخل وقفه استفاده کردم تا زمان اجرای آنها را به حداقل برسانم. پین ضبط همیشه Arduino UNO شماره 8 است ، زیرا تنها پین متصل به واحد ضبط ورودی Timer1 است.

روند تصویربرداری در تصویر بالا نشان داده شده است. هنگامی شروع می شود که Arduino UNO یک فریم داده معتبر UART دریافت کند که حاوی تنظیمات ضبط مورد نظر است. سپس این تنظیمات را با پیکربندی رجیسترهای مناسب برای ضبط در لبه انتخاب شده ، پردازش کرده و از تقسیم ساعت مناسب استفاده می کنیم. سپس وقفه PCINT0 (تغییر پین) را برای تشخیص اولین لبه سیگنال فعال می کنیم. هنگامی که آن را دریافت کردیم ، مقدار Timer1 را بازنشانی می کنیم ، وقفه PCINT0 را غیرفعال می کنیم و وقفه ICU (واحد ضبط ورودی) را فعال می کنیم. از آن لحظه ، هرگونه سقوط/بالا آمدن لبه روی سیگنال (بسته به پیکربندی انتخاب شده) ، واحد ضبط ورودی را فعال می کند ، بنابراین زمان ثبت این رویداد را در ثبت ICR1 ذخیره می کند و وقفه را اجرا می کند. در این وقفه ما مقدار ثبت ICR1 را در آرایه "نمونه" خود قرار می دهیم و شاخص را برای ضبط بعدی افزایش می دهیم. هنگامی که Timer1 یا آرایه سرریز می شود ، وقفه ضبط را غیرفعال می کنیم و داده ها را از طریق UART به رابط وب ارسال می کنیم.

من تصمیم گرفتم از وقفه تغییر پین برای ایجاد ضبط استفاده کنم ، زیرا واحد ضبط ورودی فقط در یکی از لبه های دیگر و نه هر دو را ضبط می کند. همچنین هنگامی که می خواهید هر دو لبه را ضبط کنید ، مشکلی ایجاد می کند. راه حل من این است که بیتی را که انتخاب لبه را در رجیستر کنترل ضبط ورودی در هر نمونه بازیابی شده کنترل می کند ، وارونه کنم. به این ترتیب سرعت اجرا را از دست می دهیم ، اما همچنان می توانیم از عملکردهای واحد ضبط ورودی استفاده کنیم.

بنابراین ، همانطور که ممکن است متوجه شده باشید ، ما واقعاً هر نمونه را در فواصل زمانی مشخص ضبط نمی کنیم ، اما لحظه ای را که یک انتقال سیگنال اتفاق می افتد ، ثبت می کنیم. اگر یک نمونه در هر چرخه ساعت ، حتی با بیشترین تقسیم ساعت ، گرفته بودیم ، با فرض اینکه از نوع uint8_t استفاده می کنیم ، که کوچکترین نمونه در حافظه بدون استفاده از سازه است ، تقریباً 0.1 ثانیه بافر را پر می کردیم.

مرحله 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" از طریق IDE Arduino برنامه ریزی مجدد کنید.

شما باید نرم افزار p5.serialcontrol را از مخزن github آن بارگیری کرده باشید. شما باید فایل زیپ متناسب با سیستم عامل خود را دریافت کنید (من فقط آن را روی ویندوز آزمایش کردم). فایل فشرده را در یک پوشه استخراج کنید ، فایل اجرایی موجود در آن را راه اندازی کنید و آن را به همین ترتیب بگذارید. سعی نکنید به هر پورت سریال متصل شوید ، فقط آن را در پس زمینه بگذارید ، به عنوان یک رله استفاده می شود.

پوشه "Interface" را باز کنید. باید فایلی با نام "index.html" پیدا کنید. آن را در مرورگر خود باز کنید ، این رابط وب است.

و بس! نیازی به بارگیری کتابخانه های اضافی ندارید ، همه چیز باید در بسته ای که من ارائه دادم گنجانده شود.

مرحله 5: اتصال ، پیکربندی و دستیابی

اتصال ، پیکربندی و دستیابی
اتصال ، پیکربندی و دستیابی

برای اتصال رابط کاربری به برد Arduino UNO ، فقط پورت مربوطه را در لیست انتخاب کرده و دکمه "باز" را فشار دهید. اگر عملیات موفقیت آمیز بود ، پیام "state" باید چیزی مانند "COMX باز شده" را نشان دهد.

اکنون می توانید گزینه های ضبط خود را انتخاب کنید. اول انتخاب لبه است. به شما توصیه می کنم همیشه از "هر دو" استفاده کنید ، زیرا بهترین نمایش سیگنال واقعی را به شما می دهد. اگر تنظیم "هر دو" نتواند سیگنال را ضبط کند (اگر فرکانس سیگنال برای مثال خیلی زیاد باشد) ، بسته به سیگنالی که می خواهید ببینید ، می توانید با تنظیم "Rising" یا "Falling" امتحان کنید.

تنظیم دوم تقسیم ساعت است. این وضوح را به شما می دهد که در آن می توانید سیگنال را ضبط کنید. می توانید ضریب تقسیم را با "8" ، "64" ، "256" و "1024" تنظیم کنید. برد Arduino UNO از یک کوارتز 16 مگاهرتز برای کلاک کردن میکروکنترلر استفاده می کند ، بنابراین فرکانس نمونه برداری "16 مگاهرتز/ضریب تقسیم" خواهد بود. مراقب این تنظیمات باشید ، زیرا همچنین تعیین می کند که تا چه مدت می توانید سیگنال را ضبط کنید. از آنجا که تایمر 1 یک تایمر 16 بیتی است ، زمان ضبط مجاز قبل از سرریز "(2^16)*(ضریب تقسیم)/16 مگاهرتز" خواهد بود. بسته به تنظیماتی که انتخاب کرده اید ، بین 33 میلی متر و 4.2 ثانیه متغیر است. انتخاب خود را در ذهن خود نگه دارید ، بعداً به آن احتیاج خواهید داشت.

آخرین تنظیم ، حذف کننده نویز است. من آزمایش زیادی روی آن انجام ندادم ، و شما در 99 the موارد به آن نیاز نخواهید داشت ، بنابراین فقط آن را بدون کنترل رها کنید. برای کسانی که هنوز در مورد آن کنجکاو هستند ، می توانید در قسمت Timer/Counter1 در برگه اطلاعات ATMEGA328P در مورد Timer/Counter1 جستجو کنید.

فراموش نکنید که پین 8 برد Arduino UNO را به سیگنال خود وصل کنید و پایه ها را به هم وصل کنید تا مرجع ولتاژ یکسانی برای مدار آزمایش و تجزیه و تحلیل منطقی داشته باشد. اگر به جداسازی زمین نیاز دارید یا نیاز به اندازه گیری سیگنال هایی با سطوح متفاوت از 5 ولت دارید ، احتمالاً باید یک عایق نوری به مدار خود اضافه کنید.

هنگامی که همه چیز به درستی پیکربندی شده است ، می توانید دکمه "Acquire" را فشار دهید.

مرحله 6: ضبط نتایج و صادرات داده CSV

ضبط نتایج و صادرات داده CSV
ضبط نتایج و صادرات داده CSV

پس از اتمام ضبط Arduino UNO ، داده ها به طور خودکار به رابط وب ارسال می شوند ، که آنها را ترسیم می کند. می توانید با لغزنده مناسب بزرگنمایی یا کوچکنمایی کنید و با نمونه پایینی از طریق نمونه ها حرکت کنید.

طرح فقط یک پیش نمایش به شما می دهد و هیچ ابزار تجزیه و تحلیل داده ندارد. بنابراین ، برای انجام تجزیه و تحلیل بیشتر بر روی داده های خود ، باید آنها را به PulseView وارد کنید.

اولین قدم این است که یک فایل csv حاوی تمام داده های خود را صادر کنید. برای انجام این کار ، فقط باید روی دکمه "صادرات" از رابط وب کلیک کنید. در صورت درخواست فایل خود را در یک مکان شناخته شده ذخیره کنید.

حالا PulseView را باز کنید. در نوار منوی بالا ، روی "باز" (نماد پوشه) کلیک کنید و "وارد کردن مقادیر جدا شده با کاما …" را انتخاب کنید. فایل csv قبلاً ایجاد شده حاوی اطلاعات خود را انتخاب کنید.

یک پنجره کوچک ظاهر می شود. همه چیز را همانطور که هست بگذارید ، فقط باید تنظیم "نمونه" را با توجه به عامل تقسیم ساعت انتخاب شده برای ضبط ، تغییر دهید. فرکانس نمونه گیری شما "16 مگاهرتز/(ضریب تقسیم)" خواهد بود. سپس روی "Ok" کلیک کنید ، سیگنال شما باید روی صفحه ظاهر شود.

مرحله 7: تجزیه و تحلیل سیگنال PulseView

تجزیه و تحلیل سیگنال PulseView
تجزیه و تحلیل سیگنال PulseView

PulseView دارای رمزگشای پروتکل های زیادی است. برای دسترسی به آنها ، روی "افزودن رمزگشای پروتکل" در نوار بالای منو (مناسب ترین ابزار) کلیک کنید. برای آزمایش خود ، من فقط یک پیام ساده UART را در 9600 bauds ارسال کردم ، بنابراین "UART" را جستجو کردم.

این یک کانال با برچسب در سمت چپ خود اضافه می کند (درست مانند کانال داده های شما). با کلیک روی برچسب ، می توانید تنظیمات رمزگشایی را تغییر دهید. پس از انتخاب پیامهای مناسب ، من توانستم همان پیامی را که توسط دستگاه تست من ارسال شده است ، بازیابی کنم. این نشان می دهد که کل سیستم طبق انتظار کار می کند.

مرحله 8: نتیجه گیری

نتیجه
نتیجه

حتی اگر پروژه در ابتدا یک آزمایش بود ، از نتایجی که به دست آوردم خوشحالم. من توانستم سیگنال های UART را تا 115200 باود در حالت لبه "Both" بدون هیچ مشکلی نمونه برداری کنم و حتی در حالت لبه "Falling" به 230400 باود رسیدم. می توانید تنظیمات آزمایش من را در تصویر بالا مشاهده کنید.

پیاده سازی من چندین اشکال دارد ، از آنجا شروع می شود که می تواند فقط یک سیگنال را در یک زمان ضبط کند ، زیرا فقط پین 8 Arduino UNO "قابلیت ضبط ورودی را دارد". اگر در حال جستجو برای تجزیه و تحلیل منطقی Arduino با کانال های بیشتر هستید ، یکی از Catoblepas را بررسی کنید.

شما نمی توانید انتظار داشته باشید که Arduino UNO بتواند سیگنال هایی با فرکانس های بالا (برخی از مگاهرتز) ضبط کند ، زیرا فقط 16 مگاهرتز کلاک می کند (اگر کسی این کار را انجام داد ، من علاقه مند هستم که روش آن را ببینم). با این حال ، من هنوز تحت تأثیر نتایج بدست آمده از این میکروکنترلر ATMEGA328P هستم.

فکر نمی کنم زیاد روی کد کار کنم. آزمایشات خود را انجام دادم و نتایجی را که به دنبال آن بودم به دست آوردم. اما اگر کسی می خواهد مشارکت کند ، می توانید تمام یا قسمتی از کد من را اصلاح و توزیع کنید.

این اولین دستورالعمل من بود و فکر می کنم طولانی باشد. امیدوارم خواندن آن برای شما جالب بوده باشد.

اگر خطایی پیدا کردید یا سوالی داشتید به من اطلاع دهید!

توصیه شده: