Съдържание:

Декодер на RF сензора на Arduino: 5 стъпки
Декодер на RF сензора на Arduino: 5 стъпки

Видео: Декодер на RF сензора на Arduino: 5 стъпки

Видео: Декодер на RF сензора на Arduino: 5 стъпки
Видео: Электронный замок с RFID на Arduino 2024, Ноември
Anonim
Arduino RF сензорен декодер
Arduino RF сензорен декодер

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

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

Стъпка 1: Сензорни модули

Сензорни модули
Сензорни модули
Сензорни модули
Сензорни модули
Сензорни модули
Сензорни модули
Сензорни модули
Сензорни модули

Както можете да видите на снимките по -горе, предавателите включват сензори за отваряне на врати, детектори за движение, дистанционно задействане и безжична клавиатура, използвана за програмиране на алармената кутия. Оказа се, че нито едно от тези устройства не използва еднаква дължина на синхронизация или продължителност на бита. Единственото общо, различно от дължината на съобщението, е основният формат на битовете. Всеки бит заема фиксиран период от време, като разликата между нула и единица е работният цикъл на високите/ниските части.

Красивата форма на вълната, показана по -горе, НЕ е това, което за първи път получих. Тъй като има толкова голям трафик в честотната лента 433-MHz, трябваше да се уверя, че съм активирал сензора точно преди да настроя обхвата за еднократно задействане. За щастие сензорите издават няколко копия на съобщението с данни, когато се активират, а дистанционното управление и клавиатурата продължават да извеждат съобщения, докато е натиснат клавиш. С помощта на обхвата успях да определя дължината на синхронизиране и продължителността на битовете данни за всеки елемент. Както бе споменато по-рано, времената за синхронизиране са различни и времената на битове са различни, но всички формати на съобщенията имат синхронизация на ниско ниво, последвана от 24 бита данни и един стоп бит. Това беше достатъчно, за да мога да създам общ декодер в софтуер, без да се налага да кодирам твърдо всички различни детайли за всяко устройство.

Стъпка 2: Хардуер

Хардуер
Хардуер
Хардуер
Хардуер

Първоначално създадох сензорен декодер, използвайки микроконтролер PIC и език за сглобяване. Наскоро играх с варианти на Arduino, така че реших да видя дали мога да го повторя. Простата схема е показана по -горе и има и снимка на моя прототип. Всичко, което направих, беше да използвам три общи джъмперни проводника, за да премина от Arduino Nano към платката за RF приемник. Захранването и една линия за данни са всичко, което е необходимо.

Ако прочетете моя Instructable на „3-в-1 време и прогноза за времето“, ще видите, че използвам общ приемник RXB6, 433-MHz. Може да успеете да накарате наистина евтините приемници да работят в краткия диапазон, необходим за този проект, но все пак препоръчвам да използвате супер-хетеродинен приемник.

Стъпка 3: Софтуер

Софтуерът преобразува получените битове в показвани ASCII символи. Той извежда стойността на дължината на синхронизирането и дължините на 1 и 0 бита. Тъй като вече знаех дължините на синхронизация и битовите формати, можех да напиша софтуера специално за тях. Вместо това реших да видя дали мога да го напиша, за да подредя дължините на синхронизация и автоматично да разбера битовете данни. Това би трябвало да улесни промяната в случай, че искам да опитам да открия други формати по някое време. Важно е да се отбележи, че софтуерът не знае дали първият бит на съобщението е 1 или 0. Той приема, че е 1, но ако разбере, че е трябвало да е нула, той ще обърне бита в завършеното съобщение, преди да го изпратите през серийния порт.

Времената на синхронизиращия импулс и битовете данни се определят с помощта на външния вход за прекъсване INT0 за задействане на манипулатор на прекъсване. INT0 може да се задейства при издигане, падане или на двата ръба или на стабилно ниско ниво. Софтуерът се прекъсва от двата ръба и измерва времето, през което импулсът остава нисък. Това опростява нещата, тъй като стартирането/синхронизирането на съобщението е импулс на ниско ниво и битовете могат да се определят въз основа на тяхното време на ниско ниво.

Манипулаторът на прекъсвания първо определя дали уловеният брой е достатъчно дълъг, за да бъде пусков/синхронизиращ импулс. Различните устройства, които имам, използват синхронизиращи импулси от 4, 9, 10 и 14 милисекунди. Декларациите за дефиниране на минималните/максимално допустимите стойности за синхронизация са отпред в софтуера и в момента са зададени за 3 и 16 милисекунди. Времената на битове също варират между сензорите, така че алгоритъмът за декодиране на битове трябва да вземе това предвид. Времето на бита на първия бит се записва, както и времето на следващ бит, което има значителна разлика от първия бит. Директно сравнение на следващите времена на битове не е възможно, така че се използва дефиниция на „фалшив фактор“(„Вариация“). Декодирането на битове започва с приемането, че първият бит данни винаги се записва като логика 1. Тази стойност се запазва и след това се използва за тестване на следващите битове. Ако последващ брой битове на данни е в прозореца на дисперсията на запазената стойност, той също се записва като логика 1. Ако е извън прозореца на дисперсията на запазената стойност, той се записва като логика 0. Ако логиката 0 битовото време е по -кратко от първото битово време, след което се задава флаг, който да казва на софтуера, че байтовете трябва да бъдат обърнати преди показването. Единственият случай, когато този алгоритъм се провали, е, когато всички битове в съобщението са 0. Можем да приемем това ограничение, защото този вид съобщение е безсмислено.

Всички сензори, които ме интересуват, имат дължина на съобщението 24 бита данни, но софтуерът не се ограничава до тази дължина. Има буфер за до седем байта (може да се добавят още) и определя минималната и максималната дължина на съобщението в байтове. Софтуерът е настроен да събира битовете, да ги преобразува в байтове, да ги съхранява временно и след това да ги извежда във формат ASCII през серийния порт. Събитието, което задейства изхода на съобщението, е получаването на нов импулс за стартиране/синхронизиране.

Стъпка 4: Регистриране на данни

Регистриране на данни
Регистриране на данни

Софтуерът е настроен да извежда преобразуваните данни като ASCII знаци чрез серийния (TX) изход на Arduino. Когато направих PIC версията, трябваше да се свържа с терминална програма на компютъра, за да покажа данните. Едно от предимствата на Arduino IDE е, че има вградена функция за сериен монитор. Зададох скоростта на серийния порт на 115.2k и след това настройте прозореца на Serial Monitor на същата скорост. Снимката тук показва типичен дисплей с изходи от различни сензори, които имам. Както можете да видите, данните понякога не са перфектни, но лесно можете да определите каква трябва да бъде реалната стойност на всеки сензор.

Стъпка 5: Примерен софтуер за приемник

Примерен софтуер за приемник
Примерен софтуер за приемник

Включих примерен списък със софтуер, който показва как можете да използвате събраната информация, за да получите определен набор от кодове за вашето приложение. Този пример е настроен да подражава на един от моите отдалечени контакти на Etekcity. Едната команда включва светодиода, вграден в Nano (D13), а другата команда изключва светодиода. Ако нямате вграден светодиод във вашия Arduino, добавете резистора и светодиода, както е показано на диаграмата. В реално приложение тази функция ще включва/изключва захранването за електрически контакт (използвайки реле или триак). Времената за синхронизиране, времената на битовете и очакваните байтове за данни са предварително дефинирани за по -лесна промяна. Можете да използвате някой от останалите редове за данни, за да включите/изключите нещата и т.н. за вашето конкретно приложение. Просто добавете приложимите дефиниции на командния код и сменете логиката за включване/изключване на светодиода в „цикъл“, за да отговаря на вашите нужди.

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