Дистанционно (част 2)

~ 12 Sep 2014, 01:09

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

Началото на годината трябваше да направя един малко по-сериозен ремонт, при което бях удивен от цените, които ми предложи препоръчан от приятели майстор. 200%+ над пазарните. Открих грешката си, разбира се - бях му казал какво работя. В България, очевидно, много хора смятат, че програмистите копаем парите с кофите и общо взето каквато и цена да обявят - малко ни е. Ето защо, пред следващите майстори бях инженер - схемотехник. Вечно разхвърляните кабели, бредборди и поялник на масата помагаха за имиджа ;)

Е, гредата беше, като се стигна до прекарването и вързването на кабели. Майсторите оставят работата на теб - все пак би трябвало доста по-добре от тях да "чаткаш тоците". Та в моя случай се озовах с 8 лунички, които трябваше да вържа, и нямаше към какво: единственият ключ за осветление в кухнята беше най-обикновен: отдолу идва фаза, нагоре отива към лампата на тавана. Отделно, че трябваше да се разбива каналче за кабели към луничките, даже и да бях намерил нула отнякъде.

Ето защо луничките вързах с обикновени ключета като за нощна лампа, включени в скрити контакти. Но така бяха неудобни. А и твърдо исках да мога да си контролирам всичкото осветление в кухнята от едно място.

В същото време имах отдавна купени два модула за RF комуникация - 434 MHz-ови от Robotev (точно тези). Тези модули са предназначени за хоби дейност и идват направо с пинове за вкарване в бредборд. Позволяват безжично предаване на "1 пин" информация - каквото напрежение дадете на входния пин на трансмитера, такова се появява на изходния пин на ресийвъра. Та идеята беше да си направя някаква схема, която да стои по пътя между вътрешните контакти и луничките, и чрез релета и ресийвър да ги пуска или спира. А в стенния ключ да вградя миниатюризирана схема с трансмитер.

Та казах, 434 MHz модулите са с хоби насоченост, и макар интерфейсът им да е много удобен, абстракцията, която предлагат ("предаваш състоянието на един пин безжично") е малко... илюзорна. Първо, предаваното състояние е с дискретизация - 4800 bps - което е доста бавно. На нас скорост не ни трябва и даже в началото се блазних да реализирам цялото нещо като "аналогова" схема без логика - от едната страна един ключ командва трансмитера, а от другата страна сигналът се дава директно на транзистори, командващи релетата. Е, с може би малка RC група за филтриране на евентуални шумове. Обаче някой ми беше казал, че този тип предаватели са много кекави - и се заех да проверя така ли е.

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

Цялото нещо хванах първо да реализирам на бредборд. Трансмитера и ресийвъра работеха добре, чуваха се, а за защита срещу случайните шумове, в началото се праща един "магически байт", който трябва ресийвъра да получи бит по бит верен. Какво беше учудването ми, когато спрях трансмитера, забравих ресийвъра включен, и след половин час беше светнал диодчетата - явно случайния шум от етера беше успял да докара магическия байт и гадинката беше интерпретирала следващия шум като команден байт...

Та вследствие увеличих магическите байтове на 4, а командния байт се предава двукратно, за да може да се свери. С това нещата потръгнаха, но пък вече не всеки път командата минаваше, особено ако устройствата са през една стена (това бяха онези случаи с YOU SHALL NOT PASS). Т.е. случайния шум сменя някой от битовете на магическия хедър и ресийвъра отказва съобщението. За целта: съобщението се предава 10 пъти, с надеждата поне един да мине.

След като прототипът работеше, се заех да направя максимално миниатюрна версия на изпращача:

Image

И след орязването:
Image

Идеята е, че това нещо трябва да се събере в дупка за стенен ключ - а там мястото е много оскъдно. За щастие, дизайнерите на трансмитера явно са мислили за случаи като моя, и са го направили доволно компактен:

Image

Платката е само за удобство, реално цялото нещо можех да запоя директно крак-за-крак:

Image

Идеята за финално свързване е такава:

Image
Оff
Image
On

Интересното тук беше как да измисля захранването. Трансмитера иска около 8 mA при поне 3 волта (но спокойно може и повече). При тази консумация, всяка нормална батерия би се изчерпала за под седмица, затова направих трансмитера да е изключен, контролера - също, и да се буди само при смяна на състоянието. Така постоянната консумация е около 0.1 µA, но моментната е голяма за литиевите батерии като CR2032: под товар напрежението щеше да падне под 3V, така че отпадаха. Мислих си също за комбинация от три клетки сребърен оксид (SR44), които щяха да свършат работа, но тяхния общ капатитет беше малък, щеше да даде работно време от под 2 години. По подобен начин отпадаха и малките, но удобни A23 батерийки. Малка литиево-йонна батерийка щеше да е окей - и като напрежение, и като капацитет, но ме съмняваше да издържи постоянно включена повече от година-две. Накрая намерих какво ползват за точно такива цели в индустрията: литиево тионил-хлоридна химия. Тези чудовища издържат десетки години, губейки по 1% заряд на година в стейдбай, и съдържат огромен капацитет за единица обем. Номиналното напрежение е 3.6 волта, идеално за целите ми. Недостатъка на тази химия е опасното поведение при случайно окъсяване: може да се взриви, а вътрешността е силно токсична. Например, Комет отказаха да ми доставят една такава батерия по такива причина: попада в категорията опасни пратки. За щастие ги има в dcpower.eu, макар и в малко по-голям формат, отколкото реално беше нужно.

След като трансмитера беше готов и тестван, се заех да реализирам истински ресийвъри (трябваха ми два: за двете страни на кухнята).

Тук варианта с перфборд щеше да е неприятен - да пуснеш 220 волта по хвърчаща платка с много издадени под високо напрежение крачета и писти... затова си проектирах, а LUBO_1 ми разпечата, едни платки:

Image
Image

С релета, изправител и стойка за предпазител:

Image

И останалите неща:
Image

В началото бях сложил тези предпазители:
Image

по 0.5 А, което за моите 80 ватови лунички трябваше да стигне. Но на всички лампи, особено с нажежаема жичка, моментния ток при първоначално пускане е значително по-голям и в крайна сметка тези предпазители изгоряха моментално. Затова в последствие си взех и монтирах бавнодействащи.

Готовият ресийвър:

Image

Бях направил две бройки:

Image

Забележете как двете платки са идентични - опроводени и потготвени са да командват четири канала; на едната съм запоил реле и транзистор само на 1-ви канал, а на другата - 2-ри и 3-ти.

Печатната платка решава проблема със стърчащите пинове под високо напрежение. Отгоре няма нищо метализирано, което да е опасно. Отдолу съм залепил 4 гумени крачета (случайно бях забърсал комплект такива от Lidl и сега ме е яд, че не взех повече), за да изолирам и спойките от контакт с нещо евентуално проводимо. В последствие се сетих, че скобата за предпазителя, заедно с него, все още не са обезопасени. Почти очаквах да има решение на този проблем, и... след кратко търсене в Комет, се оказа, че има:

Image
Пластмасова изолираща кутийка... стандартизация ftw

Двата ресийвъра, готови за монтаж:

Image

Канали 2 и 3:
Image
Image

Канал 1:
Image

Ползването на цифрова логика има своите несъмнени предимства. Направил съм тези модули да изключват лампите автоматично, ако съм ги забравил пуснати над час и половина.

Та това беше основната система. За забавата, реших да направя и компютърно управление, което беше показано в клипчето от предния пост. Начини да се върже микроконтролер към компютър има всякакви, но един от най-простите е чрез паралелен порт. За съжаление вече малко компютри имат такъв, но за щастие имам един старичък домашен сървър... Интересното в случая е, че платката с трансмитера се захранва директно от паралелния порт. Учудва ли ви? За разлика от USB, този стандарт няма опроводено захранване; но бихме могли да "откраднем" малко количество ток от сигналните линии. По най-строгите спецификации, около 2 mA на пин, а реално - обикновено до 8-10 не е проблем. За всеки случай съм вързал 4 от 8-те пина като захранване - паралелно един с друг през шотки диоди - така че разполагам с между 8 и 40 милиампера ток за трансмитера. Когато програмно зададете на паралелния порт да установи младшите 4 бита в '1', от дъното идват по 5 волта, а микроконтролерът ми вижда това и тогава включва трансмитера. Останалите 4 бита са за комуникация, с тях предавам командата, която следва да се изстреля. За контролиране на паралелния порт ползвам libieee1284 чрез C програмка под Linux. А за уебинтерфейс има проста страничка, търкаляща се върху апачито. Та сега мога да си включвам лампите (а и какъвто друг товар се сетя реално) - от ключ, през телефона, от таблета, през ssh, периодично чрез cron даже...

Хардуерът на това нещо все още стои върху бредборд:

Image

Ето как изглежда връзката:

Image

Бях леко притеснен, дали ще сработи, понеже домашния сървър беше в друга стая и сигналът трябваше да мине през две стени. За щастие, при десетократно пращане си минава като пич :)

И те така.

За в бъдеще планирам да работя с комуникационни модули от по-високо ниво, нещо от вида на ZigBee, защото писането и дебъгването на шумозащитен протокол далеч не е толкова забавно, колкото изглежда. Впрочем, докато правех компютърния интерфейс, имах един много странен проблем. Първоначално, нямаше как да се пусне първия канал, можеше само да се изключи, чрез команда за изключване на 3-ти. Втори и трети канал се контролираха чрез команди за първи и втори. В началото ми изглеждаше като бъг, но след щателна проверка, се оказа, че не е никъде по стека. Просто ... предавателя пускаше данните прекалено бързо (открих го чрез проба-грешка). Когато имате само един пин за комуникация, сигналът, който пращате, трябва да е self-clocking, т.е. по някакъв начин двата края трябва да поддържат синхронизация. UART постига това чрез старт и стоп битове, но аз пращах битовете директно понеже, ебаси, за 48 бита, какво толкова може да се обърка. Е, в случая потокът излизаше от синхрон, и то някъде след като успяваше да прати първите 4 байта магически хедър. Този феномен е познат като bit slip и накрая след като увеличих малко един delay всичко си дойде на мястото. Та наистина, все още ли си мислиш, че printf-debugging или под терминалче с gdb е гнусно, трудно и анахронично? Нищо не знаеш ти :)



Коментари:

#1 от Иван, изпратено на 26 Sep 2014, 13:43


Оле, само видях Robotev и прекратих всичкото четене за да стигна до долу и напиша това: НЕ!

Цените там са с пъти (някои - ДЕСЕТКИ пъти) завишени цени. Мога да ти дам конкретни примерни, ако искаш. Електроника си купувам от Bangood (ще се въздържа от УРЛ да не ми реджектне поста), Comet/Quazar и разни китайци от Ебей.

Е, ако много бързаш и модула ти трябва за вчера, тогава си плащаш като поп при Роботев.

----

Така, очевидно трябва да изчакам, защото блога си мисли че го флудя заради другия коментар от преди 10 минути на съседния пост :)

Захранването на трансмитера мисля че можеше да стига до 12V?


#2 от anrieff, изпратено на 26 Sep 2014, 14:19


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

Иначе да, трансмитера е от 3 до 12 волта. Лошото е, при по-високо напрежение, PIC-а му се увеличава осезаемо консумацията в спящ режим, най-оптимално е на 3 волта, ама там не измислих как да го захраня. CR2032 щеше да кляка под товар.

ПП. намалих изискването за интервал между постовете, вече е 60 секунди.


#3 от Николай, изпратено на 8 Dec 2016, 01:06


Страхотна статия, може ли да се свържа с теб да питам 2-3 неща?


#4 от anrieff, изпратено на 8 Dec 2016, 01:23


Разбира се, пиши ми на [името на сайта, без ".net" накрая] в "gmail.com".




Име:
За връзка: (Линк към вашия блог/сайт/e-mail; незадължително)
Вашият коментар:

Сметнете израза: двадeт и двe плюс тридeceт и чeтиρи = (въведи с цифри)


<<

Valid XHTML 1.0 Strict