Okos ébresztőóra

Eredetileg a téma onnan eredt, hogy jó középiskolás módjára többször is elaludtam, és persze ennek az ébresztőórám (telefon) volt az oka. Így elterveztem egy órát, ami szépen világít és persze egy relével tud kapcsolni bármit, ami képes felébreszteni, még ha semmi kedvem sincs. Ezzel nem sokat haladtam (mármint az órával és a felébredéssel sem), míg idén “ingyen” négy kreditért rá nem kényszerítettem magam, hogy mégis legyen vége a projektnek. Persze sosem lesz…

Mint minden projektem ez is egy egyszerű ötletből nőtt ki, végtelen számú extra funkció adagolásával.

Itt vannak az ötletek kronologikus sorrendben:

  • hat darab, nagy hétszegmenses kijelző
  • 3 gombos vezérlés
  • FET-tel vezérelhető kimenet (reléhez)
  • wifi is legyen benne
  • akkor már USB firmware frissítés is
  • USB-ről legyen a tápfeszültség, hogy spóroljak a lukakkal a dobozon
  • akkor PWM-es fényerőszabályozás, mert a csúcsáram >500mA
  • egyéb elvárás volt, hogy legyen AVR Dragon-nal debug-olható, dwbugWire-ön, standard 6-pin-es ISP csatlakozó)
  • és mindenek előtt bővíthető maradjon!

A tantárgy szerint persze kellett volna rendszerterv meg funkcionális diagram, ezt átugrottam, egyből a fun részre. Ilyen kis projektnél tök fölösleges, egyből a kapcsolással kezdtem.

Még annyit megjegyeznék, hogy a kijelző panelt évekkel ezelőtt legyártottam, és természetesen semmilyen dokumentációt nem hagytam hátra, nagy hiba.

Pár dolog, amit máshogy kellett volna:
-régi projektjeimet dokumentálni, hogy később ne kelljen lábkiosztást beméregetni, panel méreteket méregetni meg hasonlók (persze hogy elrontottam a lábkiosztást)
-ha valamihez a legkisebb esély is van, hogy oda kellhet opcionális alkatrész, akkor feltétlen beletenni a kapcsolásba és a nyák-tervre (elég rondák az átkötések és random helyen a kondik)
-vastag vezetők, nagy pad-ek, ha saját magamnak csinálom a nyák-ot

Alkatrészlista:

  • rotary encoder:ALPS EC11E15244G1
  • mikrokontroller: ATMEL AT90USB162
  • hétszegmenses: KINGBRIGHT SA15-11GWA
  • MOSFET: AP2602GY-HF-3
  • kijelző meghajtó: TI TPIC6C595
  • wifi modul: ESP8266-03
  • feszültségstabilizátor: LD1117V33
  • usb csatlakozó: GCT USB3095
  • kvarc: 16MHz (USB miatt kell ez)
  • +ellenállások, kondenzátorok és millió átkötés

A kapcsolás, javított verzió:
(az USB +5V és a VCC össze van kötve egy zöld dróttal, ennyire mégsem lett javítva)


A 3 gombot végül egy elfordulás jelzővel oldottam meg, ezt is bontottam valahonnan. Úgy volt kezdetben, hogy szoftveresen kell pergésmentesíteni, mert úgy az elegáns. Meg nagytételben biztosan sokba kerülne 3 kondenzátor és pár ellenállás. A mode gombnál ez működött is, de ott amúgy is kellett egy időzítő, a két külön gesztushoz. Vagyis ha pl. 0.7 másodpercnél tovább van lenyomva a gomb, akkor a beállításra ugrik a mód, ha röviden nyomom akkor pedig következő módra lép. (majd világosabb lesz az ábrából). Tehát az elfordulásjelző olyan rettenetesen pregett, mint egy dobzenekar, szoftveresen nem tudtam rá értelmes megoldást. Persze ezen a ponton már megvolt a működő nyáklap. Itt jött képbe egy kis számolás, 10ms alatt érje el a célfeszültséget (földpotenciál vagy tápfeszültség), tehát egy ellenálláson keresztül töltünk egy kondit. Ezt megtanultunk, hogy I*t = Q = C*U, ahol I a töltőáram, Q a kondenzátor töltése adott U feszültségen, C pedig a kapacitás értéke. Tegyük fel, hogy a kondi feszültsége 0V, így az ellenálláson a tápfeszültség esik, így a töltőáram ekkor U/R. Ahhoz hogy a kondi felteljen ilyen töltőárammal, Q/I idő szükséges, máshogy kifejezve (C*U)/(U/R) -> t=C*R, amivel megkapjuk az időállandót. Azt is tudjuk, hogy 5t idő alatt gyakorlatilag beáll a végérték, tehát R-re átrendezve R = t/(5C). Azért pont ellenállás, mert a kondi volt adott, 100nF, amiből a megfelelő ellenállás 20k-ohmnak adódik.

Az esp-modul és a mikrokontroller között a szintillesztést egyszerű feszültségosztóval valósítottam meg, ahol kellett. A 3.3V-ot a mikrokontroller szerencsére még HIGH jelnek érzékeli.

A kijelző elég régi, TPIC6C595-ös shift regisztereket használtam, amiket reteszelni lehet, vagy PWM-mel (pulzusszélesség moduláció) lehet fényerőt állítani. Ehhez persze nem árt a panelra egy nagy pufferkondi (pl. 220uF, 10V), hogy ne nagyon rángassa a tápfeszültséget. Ide SPI buszon viszem ki sorosan az adatokat, egy karaktertáblának megfelelően.

A megvalósított nyákrajzolatot inkább nem csatolom, mert túl sok a hiba rajta:

  • pergésmentesítő kondik nincsenek rajta
  • a kvarc és a vezérlő földelése közös, és zajosabb (de nem zavaró)
  • a kijelző soros órajele és retesz órajele gyönyörű átkötéssel büszkélkedhet
  • mégis az USB-ről kap tápfeszültséget, így itt is átkötés van
  • az esp-modul GPIO02-es felhúzó ellenállása lemaradt
  • mégsem külső tápról megy, így az +5V-os feszültségszabályozó helyén is egy darab drót teljesít
  • szolgálatot, ezzel együtt a csavaros csatlakozó fölöslegessé vált
  • egy kis ügyességgel ezt mind rá lehet zsúfolni egy lapra is…
    (jó, lehet kicsit több ügyességgel, de megoldható)

A doboz:


A fa elég kézenfekvő alapanyagnak bizonyult, főleg mert apa asztalos és mert könnyen megmunkálható. Na és végső sorban elég esztétikus. Ha már van a SEM-ben CNC, akkor azt is meg kell tanulni, itt az alkalom. AutoCAD-del már elég gyakorlott vagyok, így ott terveztem meg a dobozt, amit Inventor-ba exportáltam IGES formátumban, ahol HSM kiegészítővel generáltam kódot a maráshoz (Mach 3 programhoz). Annyit tudni kell, hogy senki sem adja oda egy abszolút nulláról induló CNC-snek a marófejeit. Ezért nem sok értelmét látom a konkrét G-kódot is csatolni.

Itt van a dwg: alarmclock_case

Ezek után már csak az USB-csatlakozónak kellett lyukat reszelni az oldalába, lecsiszolni, pácolni és lakkozni. Az előlap 3mm-es polikarbonát (plexi) lemezből lett marva. Enyhén mattra csiszoltam, mivel ha már lúd, legyen kövér (eleve karcos volt), másrészről pedig nem minden halandót hoz izgalmi állapotba egy csupasz nyáklap látványa. A hátlap 3mm-es rétegeltlemezből lett vágva. Az óra talpait egy fölös set-top box aljáról bontottam.

A szoftver:
Megint csak tárgyi követelmény volt, hogy írjunk egy kis assembly mintaprogramot hozzá. Ezt mindenki örömére itt nem teszem közzé. Nagy kihívás volt, mivel ennyire nem vagyok mazochista.
A rendes programot Atmel Studio 7-ben írtam. A forráskód és vele a hex fájlok csatolva.

A forráskód és a bootloader: ac_firmware

Bootloader:
Elég fárasztó tud lenni, hogy mindig USBASP-n keresztül kell programozni, ezért választottam egy USB interface-szel rendelkező vezérlőt. Első a fejleszthetőség. Ha olyan kedvem van, írok bele még egy funkciót, kijavítok egy hibát. És nyilván ha unatkozok, akkor USB soros portot is implementálhatok, hogy a jól bevált printf-fel lehessen debug-olni.
Ebben a verzióban nem bajlódtam a bootloader megírással, mivel az Atmel adott a vezérlőhöz DFU bootloader-t, amivel a flash-be és eeprom-ba is lehet írni. Ehhez a FLIP nevű programukat adják, ami nekem tökéletesen megfelelt. Ezt beírtam a $3000-es címre USBASP-vel és többet nem is kellett a külső programozó (avrdude programmal írtam addig).
Egy buktatója, hogy mivel a gombot nem a hardveres bootloader választó gombra kötöttem, így a programban, szoftveresen kell mindig ellenőrizni a belépési feltételt, így persze az orvul szoftverfeltöltők ellen lehet védekezni egy rövid jelszóval.
A bootloader-hez a gomb lenyomva tartása közben kell PC-hez csatlakoztatni, ilyenkor bejön a jelszó kérése (0.00000), amit a gomb forgatásával lehet megtenni. Röviden addig forgatjuk, amíg el nem érjük a kívánt hatást. Kicsit hosszabban elkezdjük forgatni, amivel növeljük a helyiértéket. Ha a másik irányba kezdjük fogatni akkor a következő helyiértékre lép (villog a pont). Ha a kijelzett kombináció az e első hat jegye (271828), akkor egy gombnyomás után rövid (_boot_) üzenet következik és a bootloader címe töltődik a programszámlálóba.
Ha mégse sikerült eltalálni a kódot, akkor a hagyományos módon indul el.

Megvalósítandó funkciók:

  • óra kijelzése (óra, perc, másodperc, és villogó pont->fontos)
  • visszaszámláló (a teáimat rendszerint túlfőztem)
  • ébresztő üzemmódok (4 darab gondoltam elég)
  • a wifi ki/be kapcsolása, konfiguráció választása
  • egyéb beállítások (fényerő, ébresztés időtartama, csipogás sebessége)

Tegyük fel, hogy akit ez érdekel, már ismeri annyira a c-nyelvet, hogy kiigazodjon a csatolt forráskódon, hogy mi hogy lett implementálva, vagy hogyan nem. Röviden a 16-bites számláló 10ms-onként meghívja a megszakítást, amiben lépteti a számlálókat és jelzőbiteket (kijelző frissítés, ébresztés ellenőrzés, villogás). A főciklusban fut egy eseményfeldolgozás, ami megnézni a jelzőbiteket, és végrehajtja amit kell, utána a bemeneteket is megnézni és ennek megfelelően lépteti a módokat, változtatja a kijelző kimeneti bufferét vagy éppen változó értékeket módosít.

Röviden mi hol van:
-sysio -> alacsony szintű rendszerfunkciók, vezérlőfunkciók a hardver elrejtésére
-sys -> a rendszer felsőbb szintű funkcióit megvalósító függvények, konstansok és változók
-main ->itt van a főciklus és amit úgy éreztem, hogy nem illik a többibe

Amit a wifi-ről tudni kell:
-sajnos az esp8266 modul alapszoftvere csak AT parancsokkal ért szót
-egy parancssori winsock programmal kommunikál (parancskód, paraméter) formában, működni működik, mert ezt is be kellett mutatni, de javában dolgozok egy HTTP szerveren, amihez nem fog kelleni csak egy böngésző, mellesleg esztétikusabb is…
-nem, még nem támogatja a time-server-ről való időlekérdezést, de a lehetőség persze megvan
-úgy lett a kapcsolás tervezve (elég erős kifejezés), hogy lehessen a mikrokontrolleren keresztül szoftvert frissíteni a modulon
-végezetül, igen, az egész kapcsolást meg tudta volna hajtani egy esp8266 modul is, de a tárgy ezt kívánta, majd lesz második verzió is, és majd ott…

Végül a képek, és a leadott dokumentáció, van, amit csak ott írok le, van amit csak itt, ha valami nem tiszta, akkor nézd meg a dokumentációban, ha még mindig nem, akkor kérdezd meg… 🙂

Dokumentáció-féle: ac_dok