More...

Който логаритмува — той дълго ще царува!

Категория: Hardware


Nixie clock

Ако следите моя блог, сигурно сте забелязали, че обичам да пиша за разни електронни джаджи, с прогреса от чертожната дъска до физическата им реализация. Това е поредната история, в която този път разглеждаме реален продукт на пазара, а този пост е behind-the-scenes от създаването му до ден днешен. Ами - да се потопим!

Идеята

Всичко тръгна от една тема във форумите на HardwareBG. Още преди това бях голям фен на никси лампите:

picture

Тези индикатори са се произвеждали в огромни количества през 60те и 70те години на миналия век, но LED-овете са ги направили анахронизъм малко по-късно. В тази статия ще разберете отчасти защо.

Решен да си направя собствен Nixie часовник намерих съмишленици, отидох до NN electronics и си накупих 4 лампи Mullard ZM1080.

Първи тестове

На пръв поглед никси лампата е една стъклена ампула, в която има десетина голи проводника и видът на светеща такава е нещо средно между лампа с нажежаема жичка и неонов надпис. Българското им название - газоразрядни индикатори - подсказва същността им: ампулата е с изтеглен въздух и има остатъчно налягане на неон (и други помощни газове), но напрежението между полюсите е твърде ниско за луминесцентно излъчване и се получава газов (тлеещ) разряд, който обхваща непосредствената околност на полюса с отрицателен потенциал[1] (в случая са 10 полюса: оголени проводници, оформени като цифрички). Макар и да прилича на нажежаема жичка, това е само измамно - газоразрядните индикатори не греят изобщо.

Освен катодите, в ампулата има само един анод (положително заредена решетка, която трябва да се държи под високо напрежение от 160-180 волта над потенциала на катодите). За да покажете конкретна цифра на никси лампата е достатъчно да свържете генератор на високо напрежение към анода и някой от катодите към земя. Ако сте нацелили правилното напрежение - получавате светеща цифра:

picture

Отлично!


На практика се налага токът през лампата да се ограничи, иначе тя може да изгори. С тази цел са поставени 10К резисторите, които ще видите в схемите по-долу. Ако съберете 6 лампи на едно място и ги разделите по двойки, можете да си направите цифров часовник с газоразрядни индикатори.

Необходимостта от високо напрежение е досадно[2], но преодолимо препятствие. След като намерих в интернет схема за високоволтово захранване с 555, MOSFET и индуктор, се заех да мисля как да се направи мултиплексирането на схемата.

Мултиплексиране

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

А когато компютърен процесор трябва да командва комплекс светлинни елементи, неизбежно голямата им бройка се превръща в проблем. Да илюстрираме с 6 никси лампи:

Image

Тук имаме микроконтролер, който разполага с 60 контролируеми "заземителни" пинове (open drain изходи). Така може да светнем произволна цифра на произволна лампа.

Малкият проблем е, че трябва да ползваме микроконтролер с поне 60 крака, и да имаме 60 писти, което ще е криво за опроводяване. По-лошото е, че такъв микроконтролер няма - повечето ползват нисковолтови полупроводникови процеси и рядко могат да издържат на напрежения над 20V, а често дори 5.5V е проблем. А нас ни трябва с 160V... Ако вържете нормален микроконтролер тук, той просто ще изпуши моментално.

Ето защо се налага да използваме високоволтови транзистори (например BS108), командвани от TTL изходи на микроконтролера:

Image

Още тук виждате колко "космата" става схемата: броят писти нарасна трикратно и само транзисторите биха изисквали 180 спойки. С микроконтролера и лампите ще са над 300 спойки. Запояването на такава платка би било безобразно досадна и пипкава работа.

Следва да забележим, че схемата ни дава и страхотна свобода какво да светнем, като повечето избори биха били глупави. Например, бихме могли да светнем едновременно катоди "2" и "6" в една и съща лампа, което ще изглежда просто... странно. За всяка лампа следва да можем да покажем някоя от цифрите 0-9 или нищо. 11те опции могат да се кодират в 4 бита, а декодирането да се прави чрез специализирана интегрална схема, например 74141:

Image

74141 е една наистина възхитително полезна за целите схема[3]: 4те входа (маркирани с A, B, C и D) приемат двоично число от 0 до 15. Всеки от 10те (Q0-Q9) изхода е реализиран вътре в кристала чрез високоволтов транзистор с отворен колектор. Ако изберете число 0..9 (например подадете 5V на вход C и 0V на A, B и D), дешифраторът ще види числото "4" и ще свърже Q4 със земя. Числата 10-15 се дешифрират като празни - лампата не свети.

С използване на 6 броя 74141 (или съветските им аналози К155ИД1) броят спойки намаля на 198 общо. Контролерът вече изисква само 24 I/O пина и нещата изглеждат доста по-добре. Все още не сме мултиплексирали нищо, обаче.

Нека разделим лампите в две групи по 3: четни и нечетни. Ще сложим контролиращ елемент на анодите, който да командва коя група е активна:

Image

Ако ключът S1 допусне високото напрежение само на нечетната група, то ние имаме пълен контрол над всяка от лампите 1, 3 и 5: дешифраторите ще командват катодите на лампи 1+2, 3+4 и 5+6 респективно, но четните няма да светят, тъй като нямат напрежение на анодите. Ако искаме да покажем "18:33:40" на дисплея, ще подадем 1, 3 и 4 на дешифраторите и реално потребителят ще вижда "1_:3_:4_".
След което превключваме ключа S1 към четната група и едновременно подаваме на дешифраторите респективно 8, 3 и 0: на дисплея ще се вижда "_8:_3:_0":



Както виждате, ако сменяме между двете показания достатъчно бързо, човек не да забелязва трептенето и ще му се струва, че вижда "18:33:40", но с двойно по-ниска яркост.

Всъщност, можем да стигнем и по-далеч от мултиплексиране на две групи. 6 се дели и на 3:

Image

А можем да направим и пълно мултиплексиране:

Image

Какви са недостатъците на мултиплексирането на повече групи? Първият е, че яркостта намалява: при пълно мултиплексиране тя е едва 1/6 от номиналната. Разбира се, можем да компенсираме с повишаване на напрежението към лампите, но това ги поставя в по-натоварен режим[4].
Вторият недостатък е, че опростявайки командването "долу" (при катодите), сложността се качва "горе" (при анодите). Ключът S1 изисква транзистори (няма удобна интегрална схема като 74141 за тази цел), по два транзистора за група и в даден момент каквото спестим отдолу, се качва отгоре. Вижте следната сравнителна таблица:

Image

Опциите 2x3 и 3x2 изглеждаха като оптимални, така че сковах бърз прототип, за да проверя колко % duty cycle изглежда прилично като яркост в нормални условия ако захранваме лампите със 160 волта. Ето как изглеждаше:

picture

С потенциометъра избирам на колко процента да ШИМ-ирам лампата


picture

Топлото зарево на индикаторната технология от 60те (а на заден фон са 5,760,001 екземпляра на индикаторната технология от 00те - credits to espr1t)


И така, в крайна сметка предпочетох 2х3 схемата: 50% максимална яркост и общо три дешифратора.

Развой

С това бях готов за прехвърлянето на високоволтовата схема и командващата логика на печатна платка[5][6].

Това беше първата ревизия (v1.00):

picture

Първи тест на мултиплексирането


Понеже исках платките да са компактни, използвах стария подход от battery level meter-а да строя двуетажна сглобка. Долу е високоволтовата схема, микроконтролерът, бутоните и часовникарският чип. Горе са лампите, дешифраторите и превключвателят на четни/нечетни лампи (S1).

Тук се сблъсках и с първия проблем при намирането на лампи: имах само 4 бр. За часовник трябват 6, но тук се намеси Private от форумите на HardwareBG , който за късмет имаше точно същия тип и на практика ми подари 2 бройки, за да се завърши комплектът:

picture

v1.00 с лампите


Познайте чии лампи са на Private :)

Насетне v1.00 беше изоставена, тъй като определено не бях предвидил достатъчно място за отстояние между двойките лампи. Отделно си накупих и от тези руснаци:

picture

ИН-12


picture

За сравнение...


Проблемът тук беше, че при тях изводите на лампата са отдолу, а трябва да се гледат "отгоре". Т.е. при тях трябваше платката, на която са запоени, да стои изправена вертикално нагоре. Решението беше да се изведат на малки слоткетни платки, по този начин:

picture

В основната платка има дупки, както за ZM1080, така и за 12-пинов конектор към слоткетите:

picture

picture

Я да видим върви ли:

picture

picture

... и с 6 лампи


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

picture

picture

Отпред


През това време платките минаха през 2 ревизии: в 1.01 поправих масата бъгове, неправилни размери на компоненти, грешни пинаути и др., а в 1.02 уголемих платките до показания размер и добавих възможността за двата вида лампи на горната платка. Във версия 1.03 вече бяха само козметични поправки.

Фърмуер

През това време по долната платка също кипеше работа:



Първи прототипи

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

picture

Сглобка с Z573M лампи


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

picture

Оксидация


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

picture

Шпилки и втулки


Това вършеше работа, но все пак ми се искаше да са черни и прибегнах до ebay. Там можете да си купите 5 метра черна найлонова тръбичка с точно подходящия диаметър. След това тръбичката се нарязва до необходимите размери и втулките са готови. Но така фабрикуваните втулки имат един издайнически елемент - с надписи са и не са съвсем прави. И докато надписът пада лесно със спирт, то закривяването няма махане, колкото и да се старае човек. Опитайте се да го откриете тук:

picture

Рязането на шпилките и втулките беше един досаден и изморителен процес:



След като бях направил по един часовник с двата вида лампи и изглеждаше да работи добре, беше време да го обърна до комплект за запояване, понеже подозирах, че би имало интерес.

Серийно производство

За целта първо следваше да събера по-сериозни количества лампи и дешифратори, понеже вече не се произвеждат и се намират трудно (NOS - new old stock). Отделно цените им варират много. С комбинация от търсене по форуми, оферти в онлайн магазини, преслушване на обявите в български и руски сайтове, и подобни, по някое време бях събрал 100-на лампи в най-различни видове и състояние:

picture

Част от колекцията...


picture

Тази партида ИН-12 бяха от м. Март 1984...


Намирането на дешифратори беше дори по-трудно, за щастие намерих един пловдивчанин, който продава такива в големи количества и неговите са първа употреба:

picture

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

picture
Съвсем проста схемичка, която се захранва през бутона, и бързо преслушва дали всички изходи на дешифратора работят.

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

Голямото количество елементи от всякакъв произход ме накара да ги подредя и именувам в класьори:

picture
picture

Следващата стъпка бяха опаковките. Комплектът за запояване не отнема много място и след кратко ровене из вехториите вкъщи намерих една подходяща по размер кутия от видеокарта:

picture

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

picture

които после трябва да си сгънете сами, за да образувате кутийки. Ето как изглежда една такава кутийка със съдържанието ѝ:

picture

Опаковането на елементите не беше особено трудно, предвид че само лампите са чупливи, съответно само те искат индивидуална грижа с картон или аерофолио. За резисторчета, транзисторчета и подобни вършат работа и обикновени zip-lock пликчета[9]. Последното беше да измисля как да разполагам интегралните схеми и цоклите. По принцип доставените от магазина, ако не са в тръба, ги слагат на нещо като твърд дунапрен или стиропор. Оказа се, че в Динакорд продават подобен относително твърд дунапрен (със съвсем друга цел - там е за звукоизолация), който е евтин и го продават на квадратен метър. После с макетното ножче се реже до необходимите размери.

Впоследствие се научих да "редя тетриса" все по-добре и да прахосвам все по-малки количества от въпросния дунапрен:

picture

Това е моят шедьовър :)


И така произведох първата голяма партида:

picture

Ето как изглеждаха надписите:

picture

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

Image

Разбира се, какво е един комплект за запояване без подробна и добре илюстрирана документация? След дълго писане и много корекции от страна на Алекс, указанията бяха готови.

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

picture

picture

С малко напудряне


Постановката изглеждаше така:

picture

picture

... какво ли няма да направи човек, за да кадрира правилно нещата...


Съществен елемент тук е осветлението. Лампите са със студено бяла светлина - 6500К. По принцип цялото ми осветление вкъщи е с топъл спектър, 2700К, обаче като вкарате корекцията на бялото при осветление 2700К, цветът на светещите цифри става неприятно лилав и студен.

След което се загледах в разни шукарийки как да използвам така направените висококачествени снимки за full-screen презентация на продукта (не ще и дума, външният вид е водещ тук). Чрез supersized сглобих една минимална страничка в този стил, която да демонстрира продукта.

Опирахме вече до дистрибуция и продажби. Тук се включиха моите познати от Роботев, с които уговорихме цени и условия, занесох им една партида и те вкараха продукта в каталога си. И оставаше само да чакаме първите продажби.

За подпомагане на продажбите направих две неща - първото беше да изхарча кредита си за Google AdWords, който ми бяха подарили преди 6 години.
Макар да е тривиално да се направи Google ads кампания, уцелването на правилната аудитория е предизвикателство. Ако keyword-ите са строго специфичните (nixie clock, газоразрядни индикатори, никси часовник), посетителите на ден са много малко. Google ми предлагаше да добавя keyword-а "часовник", сам по себе си. Послушах ги, но се оказа лошо предложение - така пък обирах от огромния трафик от хора, които търсеха ръчен часовник. А като предлагаш никси часовник на онзи, който е отворил да търси за Rolex-и и Fossil-и... те просто няма да цъкат. Импресиите се качиха много, но click-through rate-ът падна значително. Накрая зарязах кампанията, беше ясно, че не помага.

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

picture

Сглобени комплекти

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

picture

Фирмената им котка ми даваше препоръки


Белият цвят на кутиите даваше възможност надписите да са малко по-джиджани:

picture
picture

За поддръжка на продукта (по предложение на Роботев) сложих форум. Освен това продължавах да експериментирам с нови елементи и идеи. Ето един часовник, сглобен специално за кръглата годишнина на приятел, като тук за разделителни точки използвам ИНС-1 индикатори:

picture

А ето един, на който тествах алтернативна цветова гама:

picture

picture

Това не е часовник - това е decimal-to-binary конвертор :)



Изводи

Какво научих:


За в бъдеще остава:

  1. Да намеря начин за износ и извън България, тъй като тук пазарът е малък, а продуктът е зверски специфичен. Между другото, ако някой желае да се занимава с продажби на комплектите по ebay - да ми пише :);
  2. Да добавя PIR сензор, за да може събуждането от скрийнсейвъра да става и при движение, не само при шум;
  3. Да прехвърля кода върху AVR, понеже се оказва, че това е платформата за хоби програмиране и повече хора имат познания (и програматори) за целта;
  4. Да добавя опция за автоматично сверяване на часа през GPS;
  5. и още много други...


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


Публикувано в категория Hardware -- clock 11 Dec 2016, 06:43, 3 коментара -- English View in English


thought

TRRS

Както е добре известно, технологиите колкото помагат, почти толкова и пречат и днешният ми rant е за един такъв пример.

Преди време, компютрите и лаптопите имаха по два аудио порта: един - изход - за слушалки и един - вход - за микрофон. Трудно може да се направи по-просто от това, но най-важното е, че всичко работеше:

picture

Е, някъде от 4 години насам постепенно се налага модата портът да е заменен с един 4-пинов (TRRS):

picture

По каква причина производителите на лаптопи са решили, че това е добра идея - не знам, но модата тръгва от смартфоните, където мястото наистина е кът и трикът с комбинирането там е доста основателен[1]. В резултат на обединяването на двата порта в едно, обаче, се появяват теми като тази или тази, където хората се жалват, че не могат да ползват съществуващите си микрофони. Проблемът е, че комбо портът работи за слушалки, или за слушалки с микрофон (и то само ако са с правилното опроводяване при жака), но не и за "гол" микрофон, понеже неговото опроводяване е напълно несъвместимо.
Стандартното решение на проблема по форумите носи характерния дебилен оттенък на 21ви век: купете си USB микрофон! Работи чудесно, няма грижи, ала бала.

Хубаво, само дето моето устройство, което искам да вържа, не е микрофон, а е лично измайсторен light-to-sound converter, с който си преточвам данните от Battery level meter-а. От него идва три-пинов жак, но с това свършват приликите.

Разбира се, човек може да си купи сплитер като този:

picture

Аз имах необходимите жакове и си направих мой сплитер, но той не работеше. Както се оказа, лаптопът иска да има вързани слушалки, за да се усети, че има нещо в порта.

Това ми дойде в повече, и воден от обсесивно разстройство си измислих следната схемичка:
picture
С 15-омовите резистори симулирам слушалките :)

Нещото се събираше на съвсем миниатюрна платчица:
picture

Тук идва кабела с 4-пиновия жак. От другата страна на платката са резисторите и женския 3-пинов куплунг. В 3-пиновия куплунг си вкарвате кабела от микрофона. 4-пиновия се мушка в лаптопа, който си мисли, че към него е закачено комбо от слушалки + микрофон.

Понеже исках целия преходник да е малко по-защитен и по-безопасен, му измайсторих кутийка. Всъщност идеята на горната снимка е единствено да мога да меря точни разстояния, след което последва малко CAD-ене на Blender:

picture
picture

И след което си го разпечатах на 3D принтер и напъхах платчицата вътре:

picture
picture

И понеже тея тънки кабелчета плачат да се прекъснат с времето, залях цялото нещо с горещ силикон:

picture

С което адаптерът беше готов - микрофонният вход на лаптопа вече не се правеше на интересен. А дали имаше смисъл да си губя цялото това време да майсторя джаджата - сигурно не, но бях бесен на инженерите от Lenovo и тяхната късогледа тъпотия. А на зла круша се полага зъл прът!


Публикувано в категория Hardware -- clock 23 Nov 2016, 06:37, 0 коментара -- English View in English


thought

Сбогом, телевизия

Днес ще ви разкажа за едно малко проектче и каква е връзката между телевизорите, инфрачервените лъчи и ментовите бонбонки.

Нещо като въведение


Винаги съм мислел, че програмата в училищата, особено по природонаучните предмети, би могла да се направи много по-интересна. Често теорията, която се обяснява, е окей сама по себе си, но учителите пропускат да добавят някое отклонение, което рано или късно ще възникне като чуденка в съзнанията на учениците (или поне на по-любознателните от тях). xkcd дава много добър пример с урока по физика, в който ни обясняват за "вдъхновената от птиците" форма на крилата на самолета, и как тя генерирала подемна сила. И тотално пропускат да споменат очевидния въпрос: добре, а на авиошоутата има самолети, летящи с главата надолу. Те как не падат? Най-красивото в случая е, че обяснението (свързано с ъгъла на атака) се проверява тривиално от всеки шестокласник, който си подаде ръката навън през прозореца на колата, докато пътува.

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

Моят случай беше с обяснението на инфрачервените вълни. Казаха ни, че всяко топло нещо излъчва ИЧ, в зависимост от температурата. Казаха ни също (но може би беше в друг урок), че дистанционните за телевизора също работят с ИЧ. Това, което пропуснаха е, как телевизорът различава едните ИЧ от другите ИЧ. Хайде, в спокойна стая, фоновите ИЧ ще са повече или по-малко статични и си представях, че телевизорът може да ги различи така. Но какво става, ако поставим телевизора пред добре разпалена камина? Виждал съм го наяве и очаквах по някое време да почне да си сменя каналите и да се побървка. Нъцки.

Чак когато задълбах в електрониката, разбрах за тази нейна сила на цифровите схеми. Лесно се генерира сигнал, много кратък като дължина (спрямо човешките възприятия), но достатъчно сложен и специфичен, че природата няма шанс да го създаде случайно никога, дори за милиони години. Нещо повече, тези сигнали, поне за ИЧ дистанционните, са добре описани и категоризирани, има ги в табличен вид. И оттам - някой хитър човечец се сетил да направи универсално устройство, което може да изгаси всеки телевизор. Натискате само един бутон, и за една минута се изстрелват кодовете за "вкл/изкл" за всеки съществуващ телевизор в света (над 60 варианта, понеже всеки производител обича да си създава своя таблица с кодове). Полученото устройство е достатъчно дискретно за да се скрие в чанта или джоб и да изгасите досадният телевизор в заведението, понеже вие сте дошли да ядете и да водите интелигентни разговори, а не да гледате футбол (примерно!).

TV-B-Gone!


Така се стигна до това, че си поръчах кита за запояване TV-B-Gone от Adafruit (има и готови, ама аз исках да си го къстъмизирам). Сглобен, той представлява малка платка с 4 диода (покриващи леко различни части от инфрачервения спектър, и с леко различно фокусиране), бутонче и държачка за 2хАА батерии. Само че в този си вариант не става за носене в джоб или поне не за дълго. Стърчащите части с лекота могат да бъдат откъртени, а тънките кабелчета от държачката плачат да се прекъснат. Затова взех да мисля кутийка. И с полимерна глина я мислех, и с готова от Комет - най-накрая, обаче, спасението дойде от един колега, който ми донесе тенекийка от Altoids бонбонки, явно собствен внос от щатите. Точните му думи бяха - "гледам се занимаваш с хоби електроника, това май ще ти е полезно".

А бях гледал американските сайтове и доста съм се чудел каква е тази тяхна фиксация за Altoids кутийките. Все едно няма други на пазара! Направил си си аварийно зарядно с 9V батерия и 7805? В Altoids кутийка. Слушалков усилвател? Altoids. Китарен ефект? Altoids.

Чак когато хванах въпросното нещо оцених колко добро е наистина. Има капаче. Ама се държи здраво, не е на някакви пластмасови пантички. Искате да покажете какво има отвъртре? Няма проблем:

Image
TV-B-Gone отворено

Закопчавате и то се държи здраво, не може да се отвори без да иска:

Image

Освен това, държачката за 2хАА се събра до милиметър по ширината на кутийката. Платката пък фитва идеално по дължина. Съвпадение? Не мисля:

Image
Прецизна работа

Сигурно се учудвате защо микроконтролера (в случая един 8-битов Атмел) не командва диодите директно, ами има по цял транзистор за всеки. Причината е, че диодите са мощни (то затова е и с AA батерийки, ААА не биха били достатъчни) - идеята е с това чудо да можете да изгасите телевизор на над 50 метра. Доста по-мощно е от обикновено дистанционно. Дори ако гледате диодите челно, докато излъчват, в напълно тъмна стая, можете даже едва забележимо да видите как примигват. Кой казва, че хората не виждали ИЧ?

Пробиването на дупките за диодите и ключето тривиална работа, а накрая си имате зъл уред, дегизиран небрежно като кутийка с ментови бонбонки:

Image

Трудно бих измислил нещо по-коварно — тържество на науката! (с привкус на канела)


Публикувано в категория Hardware -- clock 15 Mar 2015, 10:42, 2 коментара -- English View in English


thought

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

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

Началото на годината трябваше да направя един малко по-сериозен ремонт, при което бях удивен от цените, които ми предложи препоръчан от приятели майстор. 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 е гнусно, трудно и анахронично? Нищо не знаеш ти :)


Публикувано в категория Hardware -- clock 12 Sep 2014, 01:09, 5 коментара -- English View in English


thought

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

Как изглежда:
Image

А какво се случва, всъщност, отдолу:

Image
Пръст: боц!

Image
Тъчскрийн до драйвера: имаме регистрирано натискане на ред 15, колона 3.
Драйвер: Ще постоя малко да видя какво се случва...

след малко...

Image
Драйвер до ядрото: получихме натискане, интересува ли те?
Ядро: бе тъкмо подготвях да пращам на NSA едни много важни данни...
Драйвер: зарежи ги за малко, човека тука натиска нещо.
Ядро: а как натиска, единично, двойно, има ли движение?
Драйвер: няма движение, единично натискане е, на координати (36, 388)
Ядро: а задържане има ли?
Дравйер: не, вече се махна.
Ядро: ОК

Image
Ядро към UI слой: имате единично натискане на (36, 388)
UI слой: това е в приложната част. Браузър, имаш единично натискане на (36, 356)

Image
Браузър: натиснали са ми една картинка, но на нея има image map с javascript зад него. И има onClick хендлър - javascript, ти си.
Javascript: първо, можеш ли да смениш картинката с "i/on.png"?
Браузър: имам я кеширана, ще ти я сменя.
Javascript: второ, прати тоя GET рекуест към command.py от същата директория. Има параметри - channel=1&state=1.
Браузър: пращам го, ще ти кажа, когато получа отговора.

Image
Браузър към ядро: може ли да ми отвориш една TCP връзка към 192.168.0.40, порт 80?
Ядро: ОК

Image
Ядро към безжична карта: тука едно SYN пакетче, ако може, да пратиш на 192.168.0.40? Теб те интересува MAC адресът де, прати го на, чакай да видя, 00:1C:C0:BF:87:A1.
Безжична карта: дадено.

Image
Невидими, незабележими електровълни, по нищо не различаващи се от околните, се понасят в етера сред останалия естествен и изкуствен шум. Микроскопични, мимолетни напрежения се отблъскват от стените, прелитат въздуха и събуждат интереса на един нищо неподозиращ рутер...
Image

Image
Рутер: я, пакетче? Обаче не е за мен, 00:1C:C0:BF:87:A1 го знам - той е на порт 2, препращам.

Image
Суич/сървърно: приходящ пакет по порт 5... адресиран до 00:1C:C0:BF:87:A1, него го знам - той е на порт 1, препращам.

Image
Мрежова карта към ядро: имате приходящ пакет.
Ядро: това е IP пакет от 192.168.0.101. Като гледам файъруола - трябва да го приемем. Я да видим какво има вътре? Аха, TCP, порт 80.
Ядро до уебсървър: слушаш ли още?
Уебсървър: да!
Ядро: добре. Ще пусна SYN-ACK обратно.
Ядро до мрежова карта: Един пакет, до D4:22:3F:81:03:9E, моля.
Мрежова карта: пращам.

Image
Суич/сървърно: сега пък пакет от порт 1... адресиран до D4:22:3F:81:03:9E, него го знам - на порт 5, препращам.

Image
Рутер: пакет, D4:22:3F:81:03:9E го знам - той е по безжичния интерфейс.

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

Image
Безжична карта до ядро: имаме пакет от рутера.
Ядро към безжична карта: чудесно, отговорили са ни на SYNа. Прати им един ACK.
Браузър: направо и още един пакет им прати (муш един HTTP GET).
Безжична карта: действам.

Image
Невидими, незабележими електровълни ... абе - ясно ви е
Image

Image
Рутер: два пакета за 00:1C:C0:BF:87:A1 - порт 2, препращам.

Image
Суич/сървърно: два пакета за 00:1C:C0:BF:87:A1 от порт 5, препращам на порт 1.

Image
Мрежова карта до ядро: два пакета има за нас.
Ядро до мрежова карта: дай ги!
Мрежова карта: в какъв ред?
Ядро: все едно.
Мрежова карта: ето ти първия.
Ядро: ъ? Някакви данни пристигат. Ама тая връзка още не е отворена! Дай другия пакет ... ааа, ето го и ACK-а, който очаквах. Яснооо.
Ядро до уебсървър: приходяща връзка, искаш ли я?
Уебсървър: дай я насам.
Ядро: ето.
Уебсървър: аха, искат да им предоставя страницата http://192.168.0.40/widlar/command.py, с параметри channel=1&state=1. Като си гледам в конфигурацията, това е CGI скрипт.

Image
Уебсървър до Питон: имаш връзка, кажи какво да върна на хората?
Питон: от къде е тая връзка?
Уебсървър: 192.168.0.101
Питон: добре, щом са от вътрешната мрежа. Параметри има ли?
Уебсървър: да, channel=1, state=1.
Питон: каналът е зададен. В [0..3] ли е? Да. State? Има. [0..1]? Да. Окей, време да викнем една малка C програмка.

Image
Малка C програмка: я, някой ни изпълни. Имаме параметри, чудесно. Първият? '1', влиза в [0..3]. Вторият? '1', влиза в [0..1]. Чудесно.
Малка C програмка до ядро: може ли достъп до паралелния порт?
Ядро: имаш ли права?
Малка C програмка: имам, от групата на апачите съм.
Ядро: Окей, ето ти дескриптор за порта.
Малка C програмка: искам ексклузивен достъп, и да пратя стойност 0x5f на него.
Ядро: дадено

Image
Микроконтролер/сървърно: прозяв? Някой ни е включил, сигурно ще искат нещо от нас. Захранващите пинове са 3 ..., не - четири. Това вече е сериозно, ще запаля трансмитера.
Малка C програмка: готов ли си?
Микроконтролер/сървърно: мхм.
Малка C програмка до ядро: прати стойност 0xdf на паралелния порт.
Ядро: дадено
Микроконтролер/сървърно: я, смениха ни старшия бит, значи командата е истинска. Трябва да сложим канал 1 на състояние 1...
Микроконтролер към трансмитер: можеш ли да изпратиш тази серия от битове по безжичната връзка?
Трансмитер: действам

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

Image
Стоманобетонна стена: YOU SHALL NOT PASS!

Image
Микроконтролер към трансмитер: прати ги пак, че не се знае стигнали ли са...
Трансмитер: щом трябва...
Стоманобетонна стена: YOU SHALL NOT PASS!

Image
Микроконтролер към трансмитер: още веднъж...
Трансмитер: ОК

Image
Микроконтролер/кухня: абе напоследък някой май се опитва да говори с нас, обаче част от битовете са изкривени. Ето, вече трети път пращат очаквания хедър... обаче този път е ОК! Я да видим каква ще е командата? Канал 1 = on. Значи палим канал 1, а той в момента не е запален.
Микроконтролер/кухня към Q2: транзисторче, как я караш?
Транзистор Q2: удържам засега електроните.
Микроконтролер/кухня: пусни ги да минат.

Image
Транзистор към реле: към теб идва една орда електрони - да знаеш.
Реле: Цък

Image
Електричество: я, нов път се разкри. Какво ли има там? Я да проверя... Гадоост, импулсно захранване. Мразя импулсни захранвания!
Импулсно захранване към лампи: Светнете, чада мои!

Та така де. Занимавам се с разучаване на RF и си пиша тестови програмки за някакви smart house подобрения. Вижте и втора част, където съм описал (със снимки) отделните компоненти на системата.


Благодарности на Мишо Станчев за JS частта.
Този пост се стреми да е както забавен, така и акуратен в техническо отношение. Ако видите грешки - пишете в коментарите.


Публикувано в категория Hardware -- clock 10 Sep 2014, 01:17, 3 коментара -- English View in English


thought

Чай, термометри, музикална теория и математика

Обичате ли чай?

Чаят е много хубаво питие, но, за да е полезен, трябва да се направи с наистина гореща вода, а поради това има следното много неприятно свойство:

Image
:D

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

В процеса на разработка на този проект научих



Ако ви е интересно - нека се потопим!

1. Интерфейсът


Идеята е проста - малка платчица с бутонче, говорителче, диодче, и стърчаща температурна пробка. Слагате пробката в чая, пускате уреда - когато температурата стигне оптималната за пиене, уредът изписуква мелодия и примигва настойчиво (ако случайно пропуснете звъненето). Пиете си чая, уреда се изгася сам след 10 минути.

2. Термистори


Термисторът е полупроводник със съпротивление, което се мени осезаемо с промяна на температурата. В случая ползвах 10К термистор, което ще рече, че съпротивлението му при 25 градуса е 10 kΩ, а за други температури се смята чрез уравнението на Щайнхарт-Харт. За съжаление, последното е прекалено сложно за изчисляване върху рахитични микроконтролери като споменатия PIC, затова обикновено се преизчисляват две точки с известни температури/съпротивления и се интерполира линейно между тях. За малки температурни обхвати това е напълно достатъчно, като за по-големи (примерно 0-100°, както ни е нужно на нас) се прави многосегментна линейна интерполация.

На практика нещата откъм реализация са дори по-прости. За да се измери съпротивлението на термистора, той е вързан в делител на напрежение, като PIC-а чете напрежението и го обръща в 10-битово число. На конкретно 10-битово число отговаря конкретна температура. Прави се lookup табличка - във вид [число→температура], покриваща целия температурен обхват. Реализацията на това е във функцията get_temperature() в кода (виж по-долу).

3. Standby режим (който наистина не харчи батерия)


Поне в началото ми се струваше като интересна главоблъсканица, как да можем да палим и гасим уред от едно бутонче (незадържащо! с ключе е ясно), както и с възможност устройството да се самоизключва. В началото си го представях с една схема, която логически управлява захранването, с възможност контролера сам да си "дръпне шалтера". Но има и доста по-лесен начин, а именно режимът Sleep.
Всички процесори имат начин да си изключват тактовия генератор и по този начин спират изпълнението на инструкции и свеждат консумацията до почти 0. Изключването не е необратимо - някои базови части остават активни, и чрез тях устройството може да бъде събудено - примерно при промяна на състоянието на даден крак на микроконтролера (т.е., следи за промяна на напрежението там, а ние можем да направим тази промяна да се случи при натискане на бутонче). Реално животът на фърмуера протича така - процесорът се включва с поставяне на батерията, и оттам насетне винаги "работи", просто в sleep консумира прекалено малко ток, за да го правим на въпрос (60 nA измерих). Когато потребителят го "включи", всъщност се преминава в активно състояние, а при гасене (дали чрез бутон или по таймер), просто заспива отново, реално продължавайки да "трупа uptime".
За да е ниска консумацията и в активен режим, процесорът работи на 32 kHz, което го прави много, много, много бавен. Средната консумация, която се постига, е под 0.3 mA. Батерийката, която съм сложил (CR2032) ще издържи направата на поне 5000 чая :)

4. Как се оптимизира за място


Програмната памет е наистина малко - 1024 думи - което значи че трябва да се пише наистина стегнат код за да се събере цялата функционалност.
Затова:



В крайна сметка програмата е 1022 думи, имам даже къде да натъпча още функционалност :)

5. Как се издават звуци


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

Другият момент е как да издаваме конкретна мелодия. От учебниците знаем, че Ла от първа октава е 440 Hz, следователно възпроизвеждането й, като код, би могло да стане така:



Ако горния цикъл се изпълни 440 пъти, ще имаме тон "ла" в продължение на 1 секунда.
Лошото е, че няма как да се докарат редовете с delay 1/880s: процесорът работи на 32kHz тактова честота, а PIC ядрото оперира с по инструкция на 4 такта, т.е. около 8000 инст/секунда. Забавянията можем да ги направим само целочислен брой инструкции (контролерът няма PWM изводи, но и да имаше, не биха помогнали особено). Ако целим да докараме "Ла", то най-добрият избор е забавянето да е 9 инструкции (нали ви казах, че процесорът е бавен!). Това е 9/8192 от секундата забавяне (≈1/910), т.е. тонът ще е доста фалшив. Бихме могли да "благословим" полученото като "наше, custom Ла", и да градим тонова стълбица, базирана на него, но тук ще срещнем един фундаментален проблем - честотите на повечето ноти не са цели (или дори рационални числа). Обяснението на това се крие в избора на темпериране на нотите в съвременната музика (известен още като 12-tone equal temperament). Става дума за следното - известно е, че ако удвоим честотата на една нота, получаваме нотата с една октава отгоре. 440→880 Hz за горно Ла - дотук добре. Обаче помежду тях има още 12 полутона (ако сте запомнили "седем" от уроците по музика, това е защото не броите черните клавиши). Респективно честотите растат експоненциално нагоре, т.е. отношението между честотите на два съседни полутона винаги е една и съща константа (затова и equal temperament). От честотата за Ла умножавате по константата C и получавате Ла#. От нея, умножавате пак и получавате следващото - Си. Така 12 пъти и получавате горно Ла. Константата по тази логика излиза дванадесети корен от 2 и е приблизително 1.059463... (може да мислите за нея като за фундаменталната константа на музиката :)). Но поради факта, че тук имаме корен, следва, че даже и да тръгнем от кръгло число (примерно, нека приемем, че "до" е 100 херца), то всички останали тонове без до-тата ще са ирационални числа. Поради което няма как да ги възпроизведем по никакъв начин със забавания от вида X/8192, т.е. всичките ни тонове ще са фалшиви. Положението може да се подобри с повишаване на тактовата честота (пак няма да можем да уцелваме "точните" тонове, но поне ще сме по-близо). Впрочем, подозирам, че причината китайските детски играчки да свирят толкова фалшиво произлиза именно от проблеми от този характер...

Все пак: на 8 килохерца сме, можем ли да направим нещо по въпроса за музиката? Оказва се, че можем да приложим една средновековна инторнираща схема, която идва още от времето на Питагор. Нека приемем, че "до" е 100 херца и искаме да пресметнем "ми". ДоДо#РеРе#→Ми, т.е. четири полутона, честотата на Ми е 100 * C⁴ (където C е фундаменталната константа). Получаваме 125.992.. херца. Това говори ли ни нещо? Нека видим колко е Сол спрямо До. Там са 7 полутона и излиза 149.830... Hz. Лампичка? Да, ми е приблизително 5/4 от честотата на До, а сол е приблизително 3/2. В това няма нищо странно. Когато два тона звучат заедно, ако отношенията на честотите им са дроби от малки цели числа, ефектът е, че звучат хармонично и приятно за ухото (и в следствие до-ми звучи хармонично, до-сол също, до-ми-сол е мажорен акорд и т.н.). Този вид темпериране (всички тонове да се изразяват един от друг с малки, "прости" дроби) се нарича just intonation и е бил основният метод за настройване на инструментите близо 20 века.

Как можем да приложим това интониране при нас? Да речем, че ще реализираме тоновете до, ми и сол. От питагоровата теория, отношението на честотите до-ми трябва да е 5/4, а до-сол да е 3/2. Понеже в кода не работим с честоти, а с интервали на изчакване (реципрочните на честотите), така че ако за до трябват X цикъла закъснение, за ми ще са ⅘ X, а за сол - ⅔ X. След привеждане към НОД, излиза, че до трябва да е 15 цикъла, ми - 12, а сол - 10 цикъла. Свиренето на нотите е внимателно написано на асемблер, защото само така има прецизен контрол над това колко цикъла точно се събират - вижте функциите note6(), note5() и note4().

Една последна хитрост се налага тук - така описаните функции генерират правилни до, ми и сол, но те са твърде басови като честоти и не звучат добре на малките говорителчета, с които разполагах. На пръв поглед няма какво да се направи - за да се вдигнат нотите, трябва да се скъсят циклите, а така няма как да се запазят отношенията. Какво ще стане, ако все пак се опитаме да вдигнем тоновете с една октава? Получават се дължини на циклите, респективно, 7½, 6 и 5. Тук можем да приложим следната хитрост, за да реализираме интервала 7½. От кода горе се вижда, че за един цикъл на синусоидата всъщност има два полуцикъла, всеки по 7½ инструкции. Всъщност може да се реализира с 7 цикъла '1'-ца, и 8 цикъла '0' (или обратно). Каква е разликата? Синусоидата вече не е симетрична около средното положение. Практическият тест, обаче показва, че човешкото ухо не чува разликата. Тази хитрост ми позволи да вдигна нотите с една октава и така имаме перфектни три тона, с които могат да се измислят весели мелодийки :)

Кодът на всичко това се намира в noteplayer.c.

С това фърмуера беше готов и пристъпих към реализацията. Както обикновено, започнах с бредборда:
Image

После бързо го прехвърлих на монтажна платка:
Image

Ето го в действие:
Image

6. Проектиране на печатни платки



От любопитство, а и нали се бях заклел повече да не правя неща на перфборд, рекох да видя как ще изглежда нещото на печатна платка. Проектирането на схемата и платката става, естествено, с CAD софтуер, като аз ползвах CadSoft EAGLE, понеже последният работи под Linux и има напълно функционална безплатна версия. Проектирането става на две фази (в instructables има повече от достатъчно инфо, ако ви потрябва). Първата е разполагането на схемата с елементите. EAGLE и подобните му програми имат голяма библиотека с електронни компоненти, като се почне от стандартните резистори, конденатори, транзистори, интегрални схеми и се стигне до специализирани неща като микроконтролери, 7-сегментни дисплеи и т.н.
Всеки елемент в библиотеката има както означение за схематиката, така и 2D модел за разполагане върху платката. Ето как изглежда проектираната схема във EAGLE:

Image

Да се прехвърлим на платката. В началото всички елементи са "скупчени" отстрани и от вас се очаква да ги подредите:

Image

След подредбата, все още тези тънки линии (airwires, показващи кое с кое е свързано) следва да ги оптимизирате така, че да няма много пресичания. После е прекарването на самите пътечки по платката (routing). Макар и да има автоматичен алгоритъм за рутиране, използването му не е препоръчително, тъй като рядко може да се справи толкова добре, колкото човек. За тази малка схема е окей всъщност (а можете и винаги да откажете някои от избраните от него пътечки и да си ги прекарате ръчно).

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

Image

Следващата стъпка, ако работите с платкаджийница, е да създадете Gerber файлове от вашия дизайн, след което ги пращате на фирмата и те ги произвеждат. Препоръка за платкаджийница в България не мога да дам, тъй като след известна фурстрация с въпросните Gerber файлове, попаднах на един американски доставчик - OSH Park - на който директно пращате EAGLE-ския .brd файл и те ви го печатат. Тяхната услуга е изключително подходяща за аматьори (те за тази цел съществуват), но имат няколко недостатъка - времето от поръчка до получаване е дълго (около три седмици), и една съществена част от цената всъщност е транспорт от Орегон до тук. Като изключим това, услугата е чудесна и крайната цена за 3 бройки платки ми излезе около 35 лева (OSH Park изискват минимум три бройки да пратят).

Ето как изглежда една бройка:

Страна с елементи:
Image

Обратна страна:
Image

Платката и елементите насипно:
Image

Тук стигаме до един проблем, който е мое недоглеждане при проектирането. В библиотеката с компоненти на EAGLE има десетки хиляди артикула и примерно държач за CR2032 батерия има 5-6 вида. Очевидно съм избрал вариант с три крака, докато реалният компонент, който съм купил е двукраков:

Image

Другият момент е, че краката на EAGLE-ския компонент са по-тънки от реалния. Малко работа с дремела и проблемът е решен:

Image Image

Всичко е наситено, остава говорител и термосондата:

Image

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

Image Image

Говорители с нужните характеристики има, но защо да купуваме, след като могат да се рециклират? Старите GSM апарати, които иначе биха отишли в кошчето, са ценен източник на елементи: вибриращи моторчета, подсветки, екранчета, клавиатури и говорители:

Image Image

Наливане на софтуера. Това е минималистична конфигурация за програмиране на PIC:

Image Image

Готовият урОд:

Image Image

И те така. Надявам се пътешествието да ви е харесало!

Благинки:
Сорскод, платки: (EAGLE sch/brd, png, pdf), User manual.

Ако някой иска да си сглоби своя бройка, имам две излишни платки - да се свърже с мен, подарявам ги :)


Публикувано в категория Hardware -- clock 5 Jun 2013, 02:54, 2 коментара

По-стари статии >>

Language:

bgБългарски
enEnglish


Категории:

Мета
Hardware
Технологии
Забава
Open source
Интересно
Наляво-надясно
Простотии
Програмиране
Музика
Картинки
Фотография
Всички


Архив:

+ 2008 (21)
Март '08 (3)
Април '08 (5)
Май '08 (5)
Юли '08 (2)
Септември '08 (1)
Октомври '08 (2)
Декември '08 (3)
+ 2009 (15)
Януари '09 (2)
Февруари '09 (1)
Март '09 (1)
Юни '09 (1)
Юли '09 (1)
Август '09 (3)
Септември '09 (1)
Октомври '09 (2)
Ноември '09 (1)
Декември '09 (2)
+ 2010 (11)
Януари '10 (1)
Април '10 (2)
Юни '10 (2)
Юли '10 (1)
Септември '10 (1)
Ноември '10 (2)
Декември '10 (2)
+ 2011 (11)
Януари '11 (3)
Февруари '11 (1)
Юли '11 (1)
Август '11 (2)
Септември '11 (1)
Октомври '11 (3)
+ 2012 (19)
Януари '12 (3)
Февруари '12 (1)
Март '12 (1)
Април '12 (2)
Май '12 (3)
Юни '12 (1)
Август '12 (2)
Септември '12 (1)
Ноември '12 (3)
Декември '12 (2)
+ 2013 (6)
Март '13 (3)
Юни '13 (1)
Август '13 (1)
Октомври '13 (1)
+ 2014 (7)
Март '14 (1)
Април '14 (1)
Юни '14 (1)
Септември '14 (3)
Декември '14 (1)
+ 2015 (5)
Януари '15 (1)
Март '15 (3)
Май '15 (1)
+ 2016 (5)
Юни '16 (1)
Юли '16 (1)
Септември '16 (1)
Ноември '16 (1)
Декември '16 (1)
+ 2017 (1)
Август '17 (1)


Последни коментари:

3 Dec 2024, 01:10 от France
23 Jun 2024, 18:01 от anrieff
21 Jan 2020, 09:01 от anrieff
20 Jan 2020, 11:38 от Владо
30 May 2017, 02:02 от anrieff
26 May 2017, 01:00 от Mathew


Valid XHTML 1.0 Strict

Blogroll:

linkТимур и неговите командоси
linkivanatora
linkБезброй математици...
linkJoel on Software
linkRidiculous Fish
linkXKCD blag