Съдържание:

Arduino UNO Logic Sniffer: 8 стъпки (със снимки)
Arduino UNO Logic Sniffer: 8 стъпки (със снимки)

Видео: Arduino UNO Logic Sniffer: 8 стъпки (със снимки)

Видео: Arduino UNO Logic Sniffer: 8 стъпки (със снимки)
Видео: Control Position and Speed of Stepper motor with L298N module using Arduino 2024, Юли
Anonim
Arduino UNO Logic Sniffer
Arduino UNO Logic Sniffer

Този проект започна като прост експеримент. По време на изследването ми върху листа с данни на ATMEGA328P за друг проект открих нещо доста интересно. Устройството за улавяне на входа на Таймер1. Той позволява на микроконтролера на нашия Arduino UNO да открива ръба на сигнала, да съхранява времева отметка и да задейства прекъсване, всичко в хардуер.

Тогава се чудех в кое приложение може да бъде полезно и как да го тествам. Тъй като искам да получа логически анализатор от известно време, реших да опитам да внедря такъв в моята Arduino UNO платка, само за да тествам функцията и да видя дали можем да постигнем добри резултати от нея.

Не само аз съм имал тази идея и ще намерите много от тях, като просто потърсите в „Arduino Logic Analyzer“. В началото на проекта, тъй като току -що започна като експеримент, дори не знаех, че хората вече са го направили, и бях впечатлен от добрите резултати, които постигнаха с тази малка част от хардуера. Не успях да намеря друг проект с помощта на модула за улавяне на вход, така че ако вече сте виждали това, уведомете ме!

В обобщение, моят логически анализатор ще:

  • Имайте един канал,
  • Имате графичен интерфейс,
  • Комуникирайте с интерфейса чрез USB,
  • Стартирайте на дъска на Arduino UNO.

Най -накрая той ще има дълбочина на паметта от 800 проби и успя успешно да заснеме UART съобщение от 115200 бода (всъщност не го тествах при по -високи скорости).

Тази инструкция съдържа както частите „как работи“, така и „как да го използвате“на този проект, така че за тези, които не се интересуват от техническа страна, можете директно да преминете към стъпка 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

Arduino UNO скица
Arduino UNO скица

Написах и компилирах скицата с Arduino IDE. Първо започнах с настройката на Timer1 в "Нормален" режим на работа, като записах в неговите регистри TCCR1A и TCCR1B в setup (). След това направих някои функции, за да улесня малко използването му в бъдеще, като тази за задаване на часовниковото разделение, наречено "setTim1PSC ()". Написах и функции за активиране и деактивиране на блока за улавяне на вход Timer1 и преливане на преливане.

Добавих масива "проби", който ще съхранява получените данни. Това е глобален масив, който зададох на „променлив“, за да предотвратя компилатора да прави оптимизации и да го поставя във флаш, както правеше по време на първите ми компилации. Определих го като масив „uint16_t“, тъй като Timer1 също е 16 -битов, с дължина 810. Спираме улавянето на 800 стойности, но тъй като тестът се извършва извън прекъсванията по очевидни причини за скоростта, аз избрах да запазя 10 повече стойности за предотвратяване на преливане. С няколко допълнителни променливи за останалата част от кода, скицата използва 1313 байта (88%) памет, оставяйки ни с 235 байта безплатна RAM. Вече използваме много памет и не исках да добавя повече пробен капацитет, тъй като това може да причини странни поведения поради твърде малко място в паметта.

В стремежа си винаги да увелича скоростта на изпълнение, използвах указатели на функции вместо оператори if в прекъсванията, за да намаля времето за изпълнение до минимум. Захващащият щифт винаги ще бъде Arduino UNO номер 8, тъй като е единственият, свързан към входния блок за улавяне на Timer1.

Процесът на заснемане е показан на изображението по -горе. Той започва, когато Arduino UNO получи валиден UART кадър от данни, съдържащ желаните настройки за заснемане. След това обработваме тези настройки, като конфигурираме десните регистри за улавяне на избрания ръб и използваме дясното деление на часовника. След това активираме прекъсването PCINT0 (смяна на щифт), за да открием първия ръб на сигнала. Когато го получим, ние нулираме стойността на Timer1, деактивираме прекъсването PCINT0 и активираме ICU (Input Capture Unit) прекъсване. От този момент всеки падащ/нарастващ ръб на сигнала (в зависимост от избраната конфигурация) ще задейства блока за улавяне на входа, като по този начин ще запише времева отметка на това събитие в регистъра ICR1 и ще изпълни прекъсване. В това прекъсване ние поставяме стойността на регистъра ICR1 в нашия масив "проби" и увеличаваме индекса за следващото улавяне. Когато Timer1 или масивът препълват, деактивираме прекъсването на улавяне и изпращаме данните обратно към уеб интерфейса чрез UART.

Реших да използвам прекъсване при смяна на щифт, за да задействам заснемането, тъй като входният блок за улавяне позволява само заснемане на единия или другия ръб, не и на двата. Това също създава проблем, когато искате да заснемете двата ръба. Моето решение тогава е да обърна бита, който контролира избора на ръбове в регистъра за контрол на улавяне на вход при всяка извлечена проба. По този начин губим скоростта на изпълнение, но все пак можем да използваме функционалностите на блока за улавяне на вход.

Така че, както може би сте забелязали, всъщност не улавяме всяка проба на фиксирани времеви интервали, но улавяме момента, в който се случва преход на сигнал. Ако бяхме заснели по една проба при всеки тактов цикъл, дори и с най -високото деление на часовника, щяхме да запълним буфера за приблизително 0,1 s, като приемем, че използваме типа 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 от неговото хранилище на github. Трябва да получите zip файла, съответстващ на вашата операционна система (тествах го само в Windows). Извлечете ципа в папка, стартирайте изпълнимия файл, намерен в него, и го оставете така. Не се опитвайте да се свържете с който и да е сериен порт, просто го оставете да работи във фонов режим, той ще се използва като реле.

Отворете папката "Interface". Трябва да намерите файл с име "index.html". Отворете го в браузъра си, това е уеб интерфейсът.

И това е! Не е нужно да изтегляте допълнителни библиотеки, всичко трябва да бъде включено в предоставения от мен пакет.

Стъпка 5: Свързване, конфигуриране и придобиване

Връзка, конфигуриране и придобиване
Връзка, конфигуриране и придобиване

За да свържете интерфейса към платката Arduino UNO, просто изберете съответния порт в списъка и натиснете бутона "Отваряне". Ако операцията е била успешна, съобщението "състояние" трябва да показва нещо като "COMX отворен".

Вече можете да избирате опциите за заснемане. Първо е изборът на ръба. Препоръчвам ви винаги да използвате „И двете“, тъй като това ще ви даде най -доброто представяне на реалния сигнал. Ако настройката "И двете" не успее да улови сигнала (ако честотата на сигнала е твърде висока например), можете да опитате с настройката на ръба "Нарастващ" или "Падащ", в зависимост от сигнала, който се опитвате да видите.

Втората настройка е разделението на часовника. Той ще ви даде разделителната способност, при която ще можете да уловите сигнала. Можете да изберете да зададете коефициента на деление или на "8", "64", "256" и "1024". Платката Arduino UNO използва 16MHz кварц за синхронизиране на микроконтролера, така че честотата на дискретизация ще бъде "16MHz/делещ коефициент". Бъдете внимателни с тази настройка, тъй като тя също така определя колко дълго ще можете да заснемете сигнал. Тъй като Timer1 е 16 -битов таймер, разрешеното време за улавяне преди препълване ще бъде "(2^16)*(коефициент на разделяне)/16MHz". В зависимост от избраната от вас настройка тя ще варира между ~ 33ms и 4.2s. Дръжте избора си в съзнанието си, той ще ви е необходим по -късно.

Последната настройка е шумопотискането. Не съм провеждал много тестове върху него и няма да ви е необходим в 99% от случаите, така че просто го оставете без проверка. За тези, които все още се интересуват от него, можете да потърсите шумопотискателя в секцията Таймер/Брояч1 в листа с данни на ATMEGA328P.

Не забравяйте да свържете щифта 8 на платката Arduino UNO към вашия сигнал и да свържете проводниците заедно, за да имате една и съща справка за напрежението както за тестовата верига, така и за логическия анализатор. Ако имате нужда от изолация на земята или трябва да измервате сигнали с нива, различни от 5V, вероятно ще трябва да добавите оптоизолатор към вашата верига.

След като всичко е конфигурирано правилно, можете да натиснете бутона "Придобиване".

Стъпка 6: Уловете резултатите и експортирайте CSV данни

Записване на резултати и експортиране на CSV данни
Записване на резултати и експортиране на CSV данни

След като вашият Arduino UNO завърши улавянето, той автоматично ще изпрати данните обратно към уеб интерфейса, който ще ги начертае. Можете да увеличавате или намалявате с десния плъзгач и да пътувате през пробите с най -долния.

Сюжетът ви дава само визуализация и няма инструменти за анализ на данни. По този начин, за да извършите допълнителен анализ на вашите данни, ще трябва да ги импортирате в PulseView.

Първата стъпка е да експортирате csv файл, съдържащ всички ваши данни. За да направите това, просто трябва да кликнете върху бутона „Експорт“от уеб интерфейса. Запазете файла си на известно място, когато бъдете подканени.

Сега отворете PulseView. В горната лента на менюто кликнете върху „Отваряне“(икона на папка) и изберете „Импортиране на стойности, разделени със запетая …“. Изберете генерирания по -рано csv файл, съдържащ вашите данни.

Ще се появи малък прозорец. Оставете всичко както е, просто трябва да промените настройката "Samplerate" според коефициента на разделяне на часовника, избран за заснемане. Вашата честота на дискретизация ще бъде "16MHz/(коефициент на деление)". След това кликнете върху „OK“, вашият сигнал трябва да се появи на екрана.

Стъпка 7: Анализ на сигнала PulseView

Анализ на сигнала PulseView
Анализ на сигнала PulseView

PulseView разполага с много декодери на протоколи. За достъп до тях кликнете върху „Добавяне на декодер на протокол“в горната лента с менюта (най -десният инструмент). За моя експеримент току -що изпратих просто UART съобщение на 9600 бода, затова потърсих „UART“.

Той ще добави канал с маркер вляво (точно като този за вашите данни). Като щракнете върху маркера, можете да промените настройките на декодера. След като избрах правилните, успях да изтегля същото съобщение като това, изпратено от моето тестово устройство. Това показва, че цялата система работи според очакванията.

Стъпка 8: Заключение

Заключение
Заключение

Дори ако в началото проектът беше експеримент, аз съм доволен от резултатите, които получих. Успях да пробвам UART сигнали при до 115200 бода в режим "И двете" без никакви проблеми и дори успях да отида до 230400 бода в режим "падащ" край. Можете да видите моята тестова настройка на горната снимка.

Моето изпълнение има няколко недостатъка, като се започне с факта, че той може да улавя само един сигнал наведнъж, тъй като само щифтът 8 на Arduino UNO е "способен да улавя вход". Ако търсите логически анализатор Arduino с повече канали, проверете този на Catoblepas.

Не можете да очаквате Arduino UNO да може да улавя сигнали с високи честоти (някои MHz), тъй като той работи само на 16MHz (ако някой го е направил, ще ми е интересно да видя метода му). Все пак съм впечатлен от резултатите, които можем да извлечем от този микроконтролер ATMEGA328P.

Не мисля, че ще свърша много работа по кода. Проведох експериментите си и получих резултатите, които търсех. Но ако някой иска да допринесе, не се колебайте да промените и преразпределите целия или част от кода ми.

Това беше първият ми Instructable и мисля, че е дълъг. Надявам се, че това е било интересно четиво за вас.

Кажете ми, ако откриете грешки или имате някакъв въпрос!

Препоръчано: