Теми от: Септември '14
Батерийни тестове
Не бях бутал страничката с батерийни тестове от известно време, но проектът далеч не е мъртъв. Бях зает с разни други неща (за които също ще пиша), но базата данни постепенно се попълва с нови и нови измервания, които чакат публикуване. Всъщност, имам година и половина натрупани данни за публикация :)
Има няколко нови неща,
- Facebook страница;
- тествани са 9 NiMH AA батерии, вижте changelog-а;
- В страниците с детайлни характеристики на батериите е присъства датата на тестването.
Публикувано в категория Интересно -- 30 Sep 2014, 18:07, 0 коментара -- View in English
Дистанционно (част 2)
В предходния пост обещах да разкажа детайли около дистанционното управление на товари, което си сковах. Но първо, малко предистория...
Началото на годината трябваше да направя един малко по-сериозен ремонт, при което бях удивен от цените, които ми предложи препоръчан от приятели майстор. 200%+ над пазарните. Открих грешката си, разбира се - бях му казал какво работя. В България, очевидно, много хора смятат, че програмистите копаем парите с кофите и общо взето каквато и цена да обявят - малко ни е. Ето защо, пред следващите майстори бях инженер - схемотехник. Вечно разхвърляните кабели, бредборди и поялник на масата помагаха за имиджа ;)
Е, гредата беше, като се стигна до прекарването и вързването на кабели. Майсторите оставят работата на теб - все пак би трябвало доста по-добре от тях да "чаткаш тоците". Та в моя случай се озовах с 8 лунички, които трябваше да вържа, и нямаше към какво: единственият ключ за осветление в кухнята беше най-обикновен: отдолу идва фаза, нагоре отива към лампата на тавана. Отделно, че трябваше да се разбива каналче за кабели към луничките, даже и да бях намерил нула отнякъде.
Ето защо луничките вързах с обикновени ключета като за нощна лампа, включени в скрити контакти. Но така бяха неудобни. А и твърдо исках да мога да си контролирам всичкото осветление в кухнята от едно място.
В същото време имах отдавна купени два модула за RF комуникация - 434 MHz-ови от Robotev (точно тези). Тези модули са предназначени за хоби дейност и идват направо с пинове за вкарване в бредборд. Позволяват безжично предаване на "1 пин" информация - каквото напрежение дадете на входния пин на трансмитера, такова се появява на изходния пин на ресийвъра. Та идеята беше да си направя някаква схема, която да стои по пътя между вътрешните контакти и луничките, и чрез релета и ресийвър да ги пуска или спира. А в стенния ключ да вградя миниатюризирана схема с трансмитер.
Та казах, 434 MHz модулите са с хоби насоченост, и макар интерфейсът им да е много удобен, абстракцията, която предлагат ("предаваш състоянието на един пин безжично") е малко... илюзорна. Първо, предаваното състояние е с дискретизация - 4800 bps - което е доста бавно. На нас скорост не ни трябва и даже в началото се блазних да реализирам цялото нещо като "аналогова" схема без логика - от едната страна един ключ командва трансмитера, а от другата страна сигналът се дава директно на транзистори, командващи релетата. Е, с може би малка RC група за филтриране на евентуални шумове. Обаче някой ми беше казал, че този тип предаватели са много кекави - и се заех да проверя така ли е.
И съвсем вярно. Когато предавателят е изключен, ресийвъра получава случаен шум. Дори когато е включен (а се очакваше да не е постоянно), се появяват от време на време дефектни битове - на тласъци - така че необходимостта от цифрова схема с шумозащитено предаване на данните беше задължителна, освен ако не исках рандом дискотека в кухнята :)
Цялото нещо хванах първо да реализирам на бредборд. Трансмитера и ресийвъра работеха добре, чуваха се, а за защита срещу случайните шумове, в началото се праща един "магически байт", който трябва ресийвъра да получи бит по бит верен. Какво беше учудването ми, когато спрях трансмитера, забравих ресийвъра включен, и след половин час беше светнал диодчетата - явно случайния шум от етера беше успял да докара магическия байт и гадинката беше интерпретирала следващия шум като команден байт...
Та вследствие увеличих магическите байтове на 4, а командния байт се предава двукратно, за да може да се свери. С това нещата потръгнаха, но пък вече не всеки път командата минаваше, особено ако устройствата са през една стена (това бяха онези случаи с YOU SHALL NOT PASS). Т.е. случайния шум сменя някой от битовете на магическия хедър и ресийвъра отказва съобщението. За целта: съобщението се предава 10 пъти, с надеждата поне един да мине.
След като прототипът работеше, се заех да направя максимално миниатюрна версия на изпращача:
И след орязването:
Идеята е, че това нещо трябва да се събере в дупка за стенен ключ - а там мястото е много оскъдно. За щастие, дизайнерите на трансмитера явно са мислили за случаи като моя, и са го направили доволно компактен:
Платката е само за удобство, реално цялото нещо можех да запоя директно крак-за-крак:
Идеята за финално свързване е такава:
Оff
On
Интересното тук беше как да измисля захранването. Трансмитера иска около 8 mA при поне 3 волта (но спокойно може и повече). При тази консумация, всяка нормална батерия би се изчерпала за под седмица, затова направих трансмитера да е изключен, контролера - също, и да се буди само при смяна на състоянието. Така постоянната консумация е около 0.1 µA, но моментната е голяма за литиевите батерии като CR2032: под товар напрежението щеше да падне под 3V, така че отпадаха. Мислих си също за комбинация от три клетки сребърен оксид (SR44), които щяха да свършат работа, но тяхния общ капатитет беше малък, щеше да даде работно време от под 2 години. По подобен начин отпадаха и малките, но удобни A23 батерийки. Малка литиево-йонна батерийка щеше да е окей - и като напрежение, и като капацитет, но ме съмняваше да издържи постоянно включена повече от година-две. Накрая намерих какво ползват за точно такива цели в индустрията: литиево тионил-хлоридна химия. Тези чудовища издържат десетки години, губейки по 1% заряд на година в стейдбай, и съдържат огромен капацитет за единица обем. Номиналното напрежение е 3.6 волта, идеално за целите ми. Недостатъка на тази химия е опасното поведение при случайно окъсяване: може да се взриви, а вътрешността е силно токсична. Например, Комет отказаха да ми доставят една такава батерия по такива причина: попада в категорията опасни пратки. За щастие ги има в dcpower.eu, макар и в малко по-голям формат, отколкото реално беше нужно.
След като трансмитера беше готов и тестван, се заех да реализирам истински ресийвъри (трябваха ми два: за двете страни на кухнята).
Тук варианта с перфборд щеше да е неприятен - да пуснеш 220 волта по хвърчаща платка с много издадени под високо напрежение крачета и писти... затова си проектирах, а LUBO_1 ми разпечата, едни платки:
С релета, изправител и стойка за предпазител:
И останалите неща:
В началото бях сложил тези предпазители:
по 0.5 А, което за моите 80 ватови лунички трябваше да стигне. Но на всички лампи, особено с нажежаема жичка, моментния ток при първоначално пускане е значително по-голям и в крайна сметка тези предпазители изгоряха моментално. Затова в последствие си взех и монтирах бавнодействащи.
Готовият ресийвър:
Бях направил две бройки:
Забележете как двете платки са идентични - опроводени и потготвени са да командват четири канала; на едната съм запоил реле и транзистор само на 1-ви канал, а на другата - 2-ри и 3-ти.
Печатната платка решава проблема със стърчащите пинове под високо напрежение. Отгоре няма нищо метализирано, което да е опасно. Отдолу съм залепил 4 гумени крачета (случайно бях забърсал комплект такива от Lidl и сега ме е яд, че не взех повече), за да изолирам и спойките от контакт с нещо евентуално проводимо. В последствие се сетих, че скобата за предпазителя, заедно с него, все още не са обезопасени. Почти очаквах да има решение на този проблем, и... след кратко търсене в Комет, се оказа, че има:
Пластмасова изолираща кутийка... стандартизация ftw
Двата ресийвъра, готови за монтаж:
Канали 2 и 3:
Канал 1:
Ползването на цифрова логика има своите несъмнени предимства. Направил съм тези модули да изключват лампите автоматично, ако съм ги забравил пуснати над час и половина.
Та това беше основната система. За забавата, реших да направя и компютърно управление, което беше показано в клипчето от предния пост. Начини да се върже микроконтролер към компютър има всякакви, но един от най-простите е чрез паралелен порт. За съжаление вече малко компютри имат такъв, но за щастие имам един старичък домашен сървър... Интересното в случая е, че платката с трансмитера се захранва директно от паралелния порт. Учудва ли ви? За разлика от USB, този стандарт няма опроводено захранване; но бихме могли да "откраднем" малко количество ток от сигналните линии. По най-строгите спецификации, около 2 mA на пин, а реално - обикновено до 8-10 не е проблем. За всеки случай съм вързал 4 от 8-те пина като захранване - паралелно един с друг през шотки диоди - така че разполагам с между 8 и 40 милиампера ток за трансмитера. Когато програмно зададете на паралелния порт да установи младшите 4 бита в '1', от дъното идват по 5 волта, а микроконтролерът ми вижда това и тогава включва трансмитера. Останалите 4 бита са за комуникация, с тях предавам командата, която следва да се изстреля. За контролиране на паралелния порт ползвам libieee1284 чрез C програмка под Linux. А за уебинтерфейс има проста страничка, търкаляща се върху апачито. Та сега мога да си включвам лампите (а и какъвто друг товар се сетя реално) - от ключ, през телефона, от таблета, през ssh, периодично чрез cron даже...
Хардуерът на това нещо все още стои върху бредборд:
Ето как изглежда връзката:
Бях леко притеснен, дали ще сработи, понеже домашния сървър беше в друга стая и сигналът трябваше да мине през две стени. За щастие, при десетократно пращане си минава като пич :)
И те така.
За в бъдеще планирам да работя с комуникационни модули от по-високо ниво, нещо от вида на ZigBee, защото писането и дебъгването на шумозащитен протокол далеч не е толкова забавно, колкото изглежда. Впрочем, докато правех компютърния интерфейс, имах един много странен проблем. Първоначално, нямаше как да се пусне първия канал, можеше само да се изключи, чрез команда за изключване на 3-ти. Втори и трети канал се контролираха чрез команди за първи и втори. В началото ми изглеждаше като бъг, но след щателна проверка, се оказа, че не е никъде по стека. Просто ... предавателя пускаше данните прекалено бързо (открих го чрез проба-грешка). Когато имате само един пин за комуникация, сигналът, който пращате, трябва да е self-clocking, т.е. по някакъв начин двата края трябва да поддържат синхронизация. UART постига това чрез старт и стоп битове, но аз пращах битовете директно понеже, ебаси, за 48 бита, какво толкова може да се обърка. Е, в случая потокът излизаше от синхрон, и то някъде след като успяваше да прати първите 4 байта магически хедър. Този феномен е познат като bit slip и накрая след като увеличих малко един delay всичко си дойде на мястото. Та наистина, все още ли си мислиш, че printf-debugging или под терминалче с gdb е гнусно, трудно и анахронично? Нищо не знаеш ти :)
Публикувано в категория Hardware -- 12 Sep 2014, 01:09, 5 коментара -- View in English
Дистанционно (част 1)
Как изглежда:
А какво се случва, всъщност, отдолу:
Пръст: боц!
Тъчскрийн до драйвера: имаме регистрирано натискане на ред 15, колона 3.
Драйвер: Ще постоя малко да видя какво се случва...
след малко...
Драйвер до ядрото: получихме натискане, интересува ли те?
Ядро: бе тъкмо подготвях да пращам на NSA едни много важни данни...
Драйвер: зарежи ги за малко, човека тука натиска нещо.
Ядро: а как натиска, единично, двойно, има ли движение?
Драйвер: няма движение, единично натискане е, на координати (36, 388)
Ядро: а задържане има ли?
Дравйер: не, вече се махна.
Ядро: ОК
Ядро към UI слой: имате единично натискане на (36, 388)
UI слой: това е в приложната част. Браузър, имаш единично натискане на (36, 356)
Браузър: натиснали са ми една картинка, но на нея има image map с javascript зад него. И има onClick хендлър - javascript, ти си.
Javascript: първо, можеш ли да смениш картинката с "i/on.png"?
Браузър: имам я кеширана, ще ти я сменя.
Javascript: второ, прати тоя GET рекуест към command.py от същата директория. Има параметри - channel=1&state=1.
Браузър: пращам го, ще ти кажа, когато получа отговора.
Браузър към ядро: може ли да ми отвориш една TCP връзка към 192.168.0.40, порт 80?
Ядро: ОК
Ядро към безжична карта: тука едно SYN пакетче, ако може, да пратиш на 192.168.0.40? Теб те интересува MAC адресът де, прати го на, чакай да видя, 00:1C:C0:BF:87:A1.
Безжична карта: дадено.
Невидими, незабележими електровълни, по нищо не различаващи се от околните, се понасят в етера сред останалия естествен и изкуствен шум. Микроскопични, мимолетни напрежения се отблъскват от стените, прелитат въздуха и събуждат интереса на един нищо неподозиращ рутер...
Рутер: я, пакетче? Обаче не е за мен, 00:1C:C0:BF:87:A1 го знам - той е на порт 2, препращам.
Суич/сървърно: приходящ пакет по порт 5... адресиран до 00:1C:C0:BF:87:A1, него го знам - той е на порт 1, препращам.
Мрежова карта към ядро: имате приходящ пакет.
Ядро: това е IP пакет от 192.168.0.101. Като гледам файъруола - трябва да го приемем. Я да видим какво има вътре? Аха, TCP, порт 80.
Ядро до уебсървър: слушаш ли още?
Уебсървър: да!
Ядро: добре. Ще пусна SYN-ACK обратно.
Ядро до мрежова карта: Един пакет, до D4:22:3F:81:03:9E, моля.
Мрежова карта: пращам.
Суич/сървърно: сега пък пакет от порт 1... адресиран до D4:22:3F:81:03:9E, него го знам - на порт 5, препращам.
Рутер: пакет, D4:22:3F:81:03:9E го знам - той е по безжичния интерфейс.
Невидими, незабележими електровълни, по нищо не различаващи се от околните, се понасят в етера сред останалия естествен и изкуствен шум...
Безжична карта до ядро: имаме пакет от рутера.
Ядро към безжична карта: чудесно, отговорили са ни на SYNа. Прати им един ACK.
Браузър: направо и още един пакет им прати (муш един HTTP GET).
Безжична карта: действам.
Невидими, незабележими електровълни ... абе - ясно ви е
Рутер: два пакета за 00:1C:C0:BF:87:A1 - порт 2, препращам.
Суич/сървърно: два пакета за 00:1C:C0:BF:87:A1 от порт 5, препращам на порт 1.
Мрежова карта до ядро: два пакета има за нас.
Ядро до мрежова карта: дай ги!
Мрежова карта: в какъв ред?
Ядро: все едно.
Мрежова карта: ето ти първия.
Ядро: ъ? Някакви данни пристигат. Ама тая връзка още не е отворена! Дай другия пакет ... ааа, ето го и ACK-а, който очаквах. Яснооо.
Ядро до уебсървър: приходяща връзка, искаш ли я?
Уебсървър: дай я насам.
Ядро: ето.
Уебсървър: аха, искат да им предоставя страницата http://192.168.0.40/widlar/command.py, с параметри channel=1&state=1. Като си гледам в конфигурацията, това е CGI скрипт.
Уебсървър до Питон: имаш връзка, кажи какво да върна на хората?
Питон: от къде е тая връзка?
Уебсървър: 192.168.0.101
Питон: добре, щом са от вътрешната мрежа. Параметри има ли?
Уебсървър: да, channel=1, state=1.
Питон: каналът е зададен. В [0..3] ли е? Да. State? Има. [0..1]? Да. Окей, време да викнем една малка C програмка.
Малка C програмка: я, някой ни изпълни. Имаме параметри, чудесно. Първият? '1', влиза в [0..3]. Вторият? '1', влиза в [0..1]. Чудесно.
Малка C програмка до ядро: може ли достъп до паралелния порт?
Ядро: имаш ли права?
Малка C програмка: имам, от групата на апачите съм.
Ядро: Окей, ето ти дескриптор за порта.
Малка C програмка: искам ексклузивен достъп, и да пратя стойност 0x5f на него.
Ядро: дадено
Микроконтролер/сървърно: прозяв? Някой ни е включил, сигурно ще искат нещо от нас. Захранващите пинове са 3 ..., не - четири. Това вече е сериозно, ще запаля трансмитера.
Малка C програмка: готов ли си?
Микроконтролер/сървърно: мхм.
Малка C програмка до ядро: прати стойност 0xdf на паралелния порт.
Ядро: дадено
Микроконтролер/сървърно: я, смениха ни старшия бит, значи командата е истинска. Трябва да сложим канал 1 на състояние 1...
Микроконтролер към трансмитер: можеш ли да изпратиш тази серия от битове по безжичната връзка?
Трансмитер: действам
Невидими, незабележими електровълни, по нищо не различаващи се от околните, се понасят в етера сред останалия естествен и изкуствен шум...
Стоманобетонна стена: YOU SHALL NOT PASS!
Микроконтролер към трансмитер: прати ги пак, че не се знае стигнали ли са...
Трансмитер: щом трябва...
Стоманобетонна стена: YOU SHALL NOT PASS!
Микроконтролер към трансмитер: още веднъж...
Трансмитер: ОК
Микроконтролер/кухня: абе напоследък някой май се опитва да говори с нас, обаче част от битовете са изкривени. Ето, вече трети път пращат очаквания хедър... обаче този път е ОК! Я да видим каква ще е командата? Канал 1 = on. Значи палим канал 1, а той в момента не е запален.
Микроконтролер/кухня към Q2: транзисторче, как я караш?
Транзистор Q2: удържам засега електроните.
Микроконтролер/кухня: пусни ги да минат.
Транзистор към реле: към теб идва една орда електрони - да знаеш.
Реле: Цък
Електричество: я, нов път се разкри. Какво ли има там? Я да проверя... Гадоост, импулсно захранване. Мразя импулсни захранвания!
Импулсно захранване към лампи: Светнете, чада мои!
Та така де. Занимавам се с разучаване на RF и си пиша тестови програмки за някакви smart house подобрения. Вижте и втора част, където съм описал (със снимки) отделните компоненти на системата.
Благодарности на Мишо Станчев за JS частта.
Този пост се стреми да е както забавен, така и акуратен в техническо отношение. Ако видите грешки - пишете в коментарите.
Публикувано в категория Hardware -- 10 Sep 2014, 01:17, 3 коментара -- View in English