30.8.12

i2c boduje

Ako som pisal v minulom clanku, postavil som i2c usb adapter. Dalsia meta bola pripojit k nemu relatka. Rozhodol som sa, ze z dovodu co najvyssej spolahlivosti postavim i2c usb adapter a aj relatka na jednu dosku.
Nepouzil som 23008 (8 bitov I/O), rozhodol som sa pre cip 23016 - za tip nan vdacim clankom o Raspberry Pi - ma 16 I/O vystupov.
8 pouzijem na relatka a 8 necham vyhradenych na dalsie vstupy alebo vystupy - potencionalne cidlo vlhkosti pody, vysky hladiny vody, zistovanie, ci prsi a podobne. Uvidime...
Zistil som, ze existuje zaujimavy program - eagleCAD. Je free s nejakymi obmedzeniami - velkost dosky, pocet vrstiev PCB a podobne. Mne ale tie obmedzenia nejako neprekazali, dokazal som sa s nimi popasovat. Je jedna vec navrhnut dosku a uplne ina ju vyrobit. A to je celkom problem. Nasiel som zaujimavy navod na youtube. Postup je to sice skvely, ale moc sa mi nedaril - 3x som nazehlil tu dosku a 3x som ju musel zmazat. Nikdy sa mi nepodarilo nazehlit okraje. Stred bol viac-menej OK, ale to je k nicomu. Nakoniec som to skusil po stvrty krat a vyleptal - nebol to dobry napad. Polovica dosky sa zle vyleptala a preleptala aj spoje tam, kde mali byt. A co je horsie, vsetky okrajove linky sa proste nevyleptali - cokolvek malo ist niekde pri kraji zmizlo. Musel som ist do GME kupit novy plosak. A tento krat som si dal zalezat - od Moki som si ukradol laserovu tlaciaren domov, v ovladaci som nastavil kvalitu tlace na Dark (co najviac toneru). Prekreslil som aj plosak tak, aby v nom boli hrubsie linky - nech je vacsia sanca, ze aj ked sa nepodaria, tak budu dostatocne dobre na fungovanie. Opat boli 2 pokusy o nazehlenie, ale tento krat som uz ten 2. pokus povazoval za dost dobry. Skoda, ze som nemal nejaku olejovu fixku na opravenie tych okrajovych liniek - musim si kupit. Vyleptal som to, nevyzeralo to tak zle, ako som si myslel. Nakoniec sa nepodarili asi 4 linky + dalsie asi 4 boli nevyrazne. Tie nevyrazne som prebehol cinom (pre istotu) a tie poskodene som proste nahradil kuskami odstrihnutych noziciek z rezistorov. Vrtanie 0.6mm vrtakom je blbost - ani samotne rezistory mi do tych dierok nesli vocpat. Takze som to nakoniec prevrtal este raz 0.8mm vrtakom, niektore diery (na konektory pre silove kable) som musel riadne zvacsit a rozvrtat. Podarilo sa - az na maly detail. Znicil som jeden z konektorov. Nevadi - kedze momentalne mam len 4 realne vystupy z cerpadla, zapojim len tie a na to mam konektorov dost.
Kazdopadne, tu je doska. Musim uznat, ze ta schema je prasacka, ale vznikla spojenim existujucej schemy pre i2c-tiny-usb a mojho navrhu. Nepodarilo sa mi prepojit korektne zem a 5V napajania, takze som to musel polinkovat dratmi. Musim sa s tym naucit poriadne robit. Nasiel som vynikajuci navod na pouzitie EagleCADu na youtube.
Sice je to dlhe (vela casti) a obcas zdlhavo vysvetlovane, ale nakoniec to bolo presne to, co som potreboval - naucil som sa otacat tie suciastky, vyrabat spoje, optimalizovat prepojenia, menit sirku ciary a podobne. Podarilo sa mi s vynimkou jedineho spoja vyrobit dosku na jednej vrstve. Drobny problem toho navrhu bol, ze som mal v povodnej scheme chybu - prehodil som data a hodiny z i2c do 23016 - cim sa zapojenie, samozrejme, stalo nefunkcnym. V navrhu tu uz je to opravene, ale len za cenu, ze su tam 2 spoje (nevedel som preskocit datovu linku). Ale to nie je az taka tragedia.
No v konecnom dosledku som uz mal vyrobenu dosku podla povodneho navrhu, to znamenalo, ze som musel trosicku vrtat, rozskriabat datove a hodinove spoje a zletovat to rucne. Problem vyrieseny ;) Kedze spoje sa musia nazehlovat opacne, tak som sem prihodil aj obraz dosky v pozitive, pripraveny na nazehlovanie. Dosku som po vyvrtani este natrel vrstvou kolofonie, rozdrvenej v alpe - je to finta od profesora, co nas na zakladke ucil letovat. Finta je to skvela - je to zaroven vrstva proti oxidacii a este k tomu to zjednodusuje letovanie. Jedina nevyhoda je, ze to lepi pri vrtani, ale to sa da prezit. Pretrel som to par krat, aby som si bol isty, ze to je kvalitne (a hlavne preto, ze som toho roztoku spravil prilis vela).
Dosku som s vynimkou spomenuteho konektora naletoval, ozivil, opravil tie spoje a hotovo - relatka cvakaju tak, ako maju. Uznavam, ze do presneho vrtania alebo rovneho letovania mam co dohanat, ale ucel to splnilo - doska funguje na 100%, dokonca som odskusal aj ten RJ11 vystup, ktory som si tam dal - na pripadne rozsirenie o dalsie dosky s i2c zbernicou - toto je len tak na pobavenie, kedze este stale mam na tej doske 8 I/O portov.
Trosku ma potrapili tie WAGO svorky - naletovane boli OK, ale nevedel som, ako do nich vlastne vtrepat kable. Ukazalo sa, ze vlastne velmi jednoducho - do jednej dierky clovek silno zatlaci srobovakom, tym sa v druhom otvore spravi dierka medzi pritlacnymi plechmi a da sa tam efektne vlozit drotik. Akonahle som vybral srobovak, zubky sa zavreli a extremne pevne uzavreli drotik - parada.
Otestovane, pracujuce zariadenie som zobral na zahradu - pripojil som 12V adapter, ventily a zacal sa hrat - cvakal som cidlami tak rychlo, ze to doslova stihlo vystreknut 3 kvapky - extremne super.
Pripojil som aj 220V vstupu a aj vystup pre cerpadlo, odskusal som aj to a bolo - vsetko fungovalo, ako ma.
Zostal posledny problem - samotnemu zariadeniu moc nevonia voda. Takze som zobral krabicu na potraviny, spravil som dozadu dierku na srob, ktorym som to vonku prichytil o konstrukciu, v ktorej je aj cerpadlo. Pripojil som USB, vsetky kable som pospajal rychlosvorkami a pozatvaral - hotovo.
Pripojil som Alix. Zmenil som v podstate len par riadkov v polievacom programe - namiesto vystupu na USB-bit-whacker som posielal vystup na i2c.
Rozdiel voci 23008, o ktorej som pisal minule, bol v tom, ze bolo treba nastavit 2 registre (0x00 a 0x01 - jeden ovlada prvych 8 bitov a druhy ostatnych 8, vsetko na vystup) a hodnoty sa posielaju na ine porty (0x12 a 0x13, opat rozdelene po 8 bitov na vystup).
V Alix-e som prehodil system. Z Voyage som presiel radsej na OpenWRT - mam ho radsej a hlavne malo uz skompilovany modul pre i2c-tiny-usb :)
Webserver zostal na lighttpd tak, ako bol na Voyage predtym.
Akurat som prehodil par riadkov - pridal som ficuru, ktora zabezpeci, ze ked sa vypina vystup, tak sa najskor vypne cerpadlo a az 2 sekundy na to sa vypne samotny okruh - aby tam zbytocne nezostala natlakovana voda.
No a pridal som na poziadavku uzivatelov (Lusimta) moznost napisat si vlastny program polievania - takze ked clovek zada povedzme 30 5 7 30 10 5 5 10, tak sa bude polievat v tomto poradi:

  • 30 minut platan
  • 5 minut visna
  • 7 minut ceresna
  • 30 minut jablon
  • 10 minut opat platan
  • 5 minut visna
  • 5 minut ceresna
  • a nakoniec 10 minut jablon
Samozrejme sa da ktorekolvek polievatko preskocit - ak chcem napriklad len 10 minut polievat ceresnu, staci napisat do programu 0 0 10 - prve 2 sa preskocia a 10 minut sa bude polievat ceresna.
Myslim, ze v tomto momente som s polievatkom skoncil - funguje uz 3 tyzdne absolutne spolahlivo, takze som spokojny - zadanie sa podarilo.
Snad tento navod pomoze aj niekomu inemu - podobne slahnutemu, ako ja :)

14.7.12

OpenWRT a i2c

Chcel som spravit ovladanie zahradnych polievatok. Kupil som kvoli tomu zariadenie od SparkFun (USB bit whacker). Problem je, ze to zariadenie je nestabilne. Vacsinu casu ide, ale prave ked sa nan clovek spolahne, tak zvazi, ze sa odpoji od USB. A co je dalsi probem - zariadenie nema obojsmerny buffer pre vsetky I/O porty. Konkretne clovek posle na vystup hodnotu a chce si ju precitat a ma smolu - precita prve 3 alebo 4 bity a hotovo. Tak som hladal ine zariadenie - nieco, co by bolo potencionalne lacnejsie, ako UBW. A nasiel som. Zistil som, ze existuje zbernica s nazvom I2C. Na nu su za doslova par halierov pripojitelne vstupno-vystupne expandery, teplotne cidla a podobne srandy. Dalej som zistil, ze v linuxe je modul, ktory dokaze zbernicu I2C simulovat - v podstate ju simuluje z obycajnych I/O vystupov, ktore routery uz davno maju. Problem je, ze som sa nechcel hned hrabat v HW - v podstate by som nemal sancu zistit, ci to realne funguje. Kedze nemam k dispozicii ziadne ine i2c zariadenie, o ktorom by som vedel, ze funguje, mohol by to byt zdlhavy postup. A tak som pozeral po nejakom i2c adaptery. Po niecom, co by nestalo 60 EUR teda ;) A nasiel som, projekt, kde 2 adaptery (HW na nich) stali 10 EUR spolu. Kupil som si aj jedno Arduino (to bolo trosku nad rozpocet popravde), aby som do toho maleho cipu (ATtiny45) mohol nahrat firmware. Podla navodu som to vyskusal a fungovalo to.
Nahral som tam teda firmware zo stranky i2c-tiny-usb. To chvilu trvalo, musel som trosku zmenit subor Makefile a upravil som tam riadok
FLASH_CMD = avrdude -P$(TTY) -c stk500hvsp -p attiny45 -U lfuse:w:0xdf:m -U hfuse:w:0x5f:m -U flash:w:main.hex
a upravil vzhladom na to, ze pouzivam na nahravanie firmware Arduino, takze je tam teraz takyto:
FLASH_CMD = avrdude -v -v -P$(TTY) -c arduino -b 19200 -p attiny45 -U lfuse:w:0xdf:m -U hfuse:w:0x5f:m -U flash:w:main.hex
Ma to jednu malinku nevyhodu - musi sa to nahrat na prvy pokus, pretoze to pouziva aj vystup na RESET a tym padom po napaleni uz bez dalsich hraciek (12V prepisovanie poistky) nejde prehrat firmware. Nastastie sa to podarilo a tak som sa dal do stavby samotneho adapteru. To slo lahsie, ako by sa zdalo. Znicil som kvoli tomu USB kabel, nech nemusim letovat a bol to dobry napad - na prve zapojenie ho detekovalo Ubuntu! To bola super sprava - to znamena, ze som rovno mohol zacat skusat pripajat zariadenia.
Doma som nemal nic, len 23008 (8bit I/O) a vsetko ostatne len na 3.3V. Aby som hned nieco neznicil, tak som neriskoval a zobral tu 23008. Na moje testovacie pole sa to ledva zmestilo (testovacie diody uz nemam kam pripojit, tak sa s odpormi spajaju len tak - vo vzduchu). Kazdopadne som to pripojil a... No a teraz to bolo treba otestovat. Ubuntu sice zariadenie detekovalo, ale nevznikol ziadny zaznam v
/dev/i2c-*
, co znamena, ze pri pouziti i2cdetect z balika
i2c-tools
vypisal program len ze nenasiel zbernicu. Nakoniec to poriesila blbost:
modprobe i2c-dev
, cim vznikol zaznam v /dev strome a zrazu vsetko ficalo. Po spusteni
# i2cdetect -l
sa uz objavil adapter. Tak som skusil
i2cdetect -y 0
a ten nasiel zariadenie na adrese 0x20. Tu som nastavil ja - 23008 ma 3 adresne bity a dovoli nastavit adresy od 0x20 po 0x27, podla toho, aka binarna hodnota je na ich pinoch. To okrem ineho znamena, ze mozem pripojit az 8 takychto zariadeni, co mi dava 64 I/O vystupov (!!!). No a kedze som uz vedel zariadenie a videl ho na zbernici, zacal som robit pokusy. V prvom rade je potrebne nastavit I/O porty na vystup, pricom 0 pre dany bit znamena vystup a 1 znamena vstup. A nastavuju sa registrom na adrese 0x00. Takze prikaz znie
i2cset -y 0 0x20 0x00 0x00
, tym som nastavil vsetky bity na vystup.
A kedze na poslednom bite (7. bit, hexa-prepis 0x80) bola dioda a chcel som ju rozsvietit, pouzil som zapis na vystup (register 0x09). Prikaz teda vyzera takto:
i2cset -y 0 0x20 0x09 0x80
Prva 0 reprezentuje /dev/i2c-0, nasledne adresa 0x20 je zariadenie, ktore nasiel i2cdetect, 0x09 je vystupny register a 0x80 je samotna hodnota, ktora na 7. I/O vystup posle logicku 1. Analogicky prikaz
i2cset -y 0 0x20 0x09 0x00
diodu vypne. Tak som sa este pohral a nasiel som vsetky diody, co som mal po ruke (6 kusov). Vsetky som pripojil cez 100ohm rezistory na vystupy, konkretne su pouzite (0x80, 0x40, 0x20, 0x10, 0x02, 0x01). A spravil som si script, ktory ich rozsvecuje a zhasina - beziaci "svetelny" had. Tak a to znamena, ze teraz uz mam fungujuce i2c zariadenie a mozem skusit rozobrat router a vytiahnut z neho softwarovu i2c zbernicu :) Ale az zajtra, dnes sa mi uz nechce. A mam k dispozicii 8 vystupov pre spinanie cerpadlovych vystupov (cez rele) a samotne cerpadlo (relatko, ktore mu zopne 220V). Relatka uz mam davno hotove, su zapojene cez ten USB bit whacker zo Sparkfun-u. Ale prehodim ich - a odvtedy bude cela zahrada riadena routerom a nie Alixom, ktory je podstatne drahsi, samozrejme. Mam dobry pocit zo zivota :)

3.3.12

Maly fix pre webkamery

Zistil som, ze ked nastavim pocet obrazkov za sekundu na 5, tak na niektorych modeloch kamier nefunguje automaticka expozicia (konkretne Microsoft Livecam VX-700, s ktorou som inak spokojny).
Takze som zdvihol pocet obrazkov na 30, co nema ziadny realny dopad na vykonnost systemu a vsetko je OK.
V tomto momente Alix streamuje 3 webkamery, kazdu s rozlisenim 640x480 bodov, 30 obrazkov za sekundu a pouzitie CPU je 14% ;)