Avainsana-arkisto: RTC

WS2812B kello

Jeee!! ne saapuivat! IMG_20150324_230440ja noista on jo kellokin rustattu 🙂

Ledit on tehtaalla asennettu  piirilevyn kappaleelle, jossa on kuusi tinattavaa täplää, DATA in ja out, 5v in ja out sekä sama GND:lle.  IMG_20150408_173017Rakentelin noista 3×5 ledin “paneeleita” neljä kappaletta. Ensimmäisessä testissä huomasin Kiinan poikien tekemän “källin”, GND täplät eivät olekaan kytketty yhteen! Toki voi olla, että normaalisti ne on kytketty yhteen, mutta kun etsin ebaysta halvimmat mahdolliset ledit ja tilasin ne niin laatu ei ihan sitä ole mitä pitäisi. Tinasin siis kiltisti johdon joka täplään.  Ledit sinällään muuten toimivat yhtä lukuunottamatta.

Kuvassa näkyy suunnilleen ulkoinen rakenne, ihan prismasta haettu taulukehys ja motonetistä ikkunan tummennuskalvoa ja ledipaneelit kuumaliimalla kiinni lasiin tai no tarkemmin sanottuna ne on liimattu tummennuskalvoon, koska kalvo on asennettu kummallekin puolelle lasia pienen sekaannuksen vuoksi. Tarkoitus oli ostaa tumminta mahdollista kalvoa ja vaitoehdot kulkivat 50%-5% välillä. Nappasin hyllystä rullan johon oli merkitty 50% ajatuksella, että 50% merkintä tarkoittaa 50% prosenttista valon blokkausta ja vastaavasti 5% tarkoittaa, että 5% blokataan. No sinällään se 50/50 oli ihan oikein, mutta kyseessä ei olekaan tummin kalvo vaan vaalein! Prosentti luku ei  kerrokaan valon blokkaus määrää vaan läpäisymäärän. No oppia ikä kaikki.

Ohjaimena on arduino micro ja RTC on joku random DX.comista tilattu DS1307 chippiin perustuva halpis moduli.  Proto versiossa neopixel clockvirtalähteenä on vanha samsungin laturi, joka muuten toimii, mutta siitä hajosi liitin. Virtalähde on totaalisen alimitoitettu, mutta toimii kyllä kunhan vain ei innostu liikaa. Kaikkiaan näyttö voi imaista pahimillaan lähes 4 amppeeria virtaa! (60mA*60kpl=3,6A*5V=18W) Kuvassa näkyy kytkentä osittain, ledejä on 60kpl ja RTC modulia en jaksanut alkaa eaglella piirtelemään, joten käytin pelkkää chippiä. Tarpeelliset kuvasta kyllä näkee.  Ledi ketjussa on lisäksi muutama 100uF kondensaattori tasaamassa virtapiikkejä. Ledit on kytketty niinkin järkevästi, että data lähtee vasemmalta alhaalta ja siirtyy siitä pykälän oikealle ja putoaa alas johdolla ja lähtee taas nousemaan ledejä pitkin. Yllä olevasta videosta näkee asian aika selvästi.

Ihan putkeen ei mennyt koekytkentälevyllä homma. RTC siis on I2C IMG_20150408_142031kytkentäinen, mutta hups! yritin ensiksi käyttää sitä niin, että kello tuli SPI-linjasta, jännä juttu ettei toiminut! Kuvassa siis virheellinen kytkentä, oikeat pinnit ovat 2 ja 3.

Koodi löytyy gihubista.  Se on hyvinkin kokeilu asteella vielä, käytännössä siinä on vain pari esimerkki koodia yhdistetty ja lisätty pari funktiota. Datan syötön ledeille hoitaa Adafruitin kirjasto, WS2812B vaatii sen verran tarkkaa ajoitusta, että arduinon omalla koodilla ei siihen pääse, niinpä kirjastossa on käytetty assemblyä. RTC-koodi on käytännössä suoraan esimerkin koodi.

Videolla on pieni testi kellosta.

 

Ihan täydellinen koodi ei ole, kuten kuvasta näkyy (kello on siis tuossa 19.07).IMG_20150408_190806 Toi bugi on jo korjattu koodista, mutta muita siellä vielä on. Heti ensimmäisenä yönä huomasin myöskin, että vaikka kello ei läheskään täydellä  kirkkaudella toimikaan, on se yöllä totaalisen liian kirkas, varsinkin kun se vaihtaa väriään (ja samalla kirkkauttaan) minuutin välein.  Yksittäinen ledi siis voi saada jokaiselle kolmelle värille arvon välillä 0-255. VIrtalähteen rajoituksista johtuen nykyisessä koodissa jokainen väri voi saada arvon välillä 0-30, mutta missään koodissa ei varmisteta, että kirkkaus pysyy samana. Teoriassa siis väreille voi tulla arvo 0-0-0, jolloin ledit ovat kokonaan sammuksissa!

Tarkoitus olisi viellä väkertää tuolle piirilevy ja ehkä jopa rakentaa toinen niillä korjauksilla mitä tuota ensimmäistä tehdessä on tullut tarpeelliseksi huomattua. Yksi lisäys mikä tohon ehdottomasti tarvitaan on anturi joka mittaa ympäristön valaistuksen ja säätää sen mukaan ledien kirkkauden. Toki senkin voisi tehdä ihan kellolla, mutta onhan se paljon coolimpaa, että oikeasti mitataan se valoisuus.

WS2812B ledejä

Kokeilin ensimmäistä kertaa eläissäni ebaysta ostamista. Tilasin 100kpl WS2812B ledejä, ihan kohtalaisen hyvään hintaan. Ainoa huono puoli on, että toimitusaika on luokkaa kuukausi. Noh ompahan aikaa suunnitella mitä noista tekee.

WS2812B on siis RGB-ledi, jossa on sisään rakennettuna ohjainchippi. Ledistä on usemapia versioita ja tämä minun tilaama versio on asennettuna pienelle jäähdytyslevynä toimivalle alumiinilevyn kappaleelle. Ledi itsessään on neljä pinninen (data-in, data-out, +5v ja gnd). Alumiinisessa taustalevyssä on kuitenkin kuusi pinniä, koska käyttöjännitteellekin on omat IN ja OUT-pinnit.

Jokainen ledi vaatii 24-bittisen komennon (yksi 8-bittinen pätkä R,G ja B värille) ja ohjauskoodi on data transfer timedatasheetin mukaan todella nopeaa! Jopa niin nopeaa, että (teoriassa) 16MHz arduino ja arduinon oma koodi on liian hidasta ohjaamaan noita. Onneksi kuitenkin ilmeisesti sequence charthiukan hitaampikin nopeus riittää ja löytyy valmiita kirjastoja, jotka käyttävät nopeampaa koodia.  Ledeissa on myös piiri, joka muodostaa signaalin uudestaan, jolloin virheet eivät keräänny signaaliin pitkässäkään lediketjussa. composition of 24bit data Katsellaan ohjausta tarkemmin sitten koodissa ja kun pääsen testaamaan itse ledejä.

 

Mielessä olisi siis rakentaa noista ledeistä kello seinälle, vähän niin kuin taulu tai ehkä infinity-mirror tyyppinen ratkaisu, en ole viellä päättänyt. Periaatteessa kuitenkin ohjaukseen arduino (tai mahdollisesti jotain nopeampaa) ja RTC-kello, ehkä myöskin ESP8266, jolloin kelloa voi ohajata netin kautta ja sen saa pysymään NTP:n avulla oikeassa ajassa.

 

 

 

 

 

Omia ja muiden virheitä, mutta toimiva sarastevalo silti.

Joulu meni ja samoin uusivuosi. Edessä siis uudet kujeet, mutta jatketaan hetki viellä vanhoilla kuitenkin. Itead studiosilta tilatut piirilevyt saapuivat “joululoman” aikana.  Itead on erittäin edullinen piirilevyvalmistaja, tekee kuitenkin ihan kohtuullista jälkeä. Välistä kuitenkin on pieniä ongelmia. Kuvassa on lähikuva yhdestä toimitetusta piirilevystä, vihreässä juotteenestopinnoitteessa on ilmeisesti routterin tekemä jälki. Hassua sinällään, että itead toimitti tuon “rikkinäisenkin” levyn, koska pienin tilausmäärä heiltä on kymmenen levyä ja tuo rikkinäinen on yhdestoista.

Tinailin kytkennän kasaan ja poltin koodin atmega328p mikrocontrolleriin ja kas kummaa laite ei toimi! Ei muuta kuin tutkimaan missä vika on. Yllätys ei liene, että se löytyi penkin ja näppäimistön välistä.

Etukäteen oli jo tiedossa, että shift registerit on kytketty väärään järjestykseen piirilevylle, mutta muita yhtä alkeellisia virheitä löytyi levyltä lisääkin. Ts. A7D kytkimiin asetettu aika tulee väärin luettua. (03:45 tulee luettua 45:03) Onneksi kaikki “isot” virheet olivat sellaisia, että ne pystyi koodissa korjaamaan.

Ensimmäinen ongelma oli rotary encoderin kanssa, joka ei toiminut. Syyksi paljastui koodi ja fuse-bittien asettelu. Levylle laitettu pari vastusta ja kondensaattori per encoderin pinni estämään kytkinvärähtelyä, en kuitenkaan aikonut luottaa pelkästään tuohon kytkentään, joten koodissakin oli kytkinvärähtelyjä varten rivi. Kokeilin erillaisia viiveitä ja kaikilla viiveillä tilanne oli että, encoderi ei toiminut. Tilanne korjautui, kun jätti koko viive rivin pois koodista. Myöhemmin huomasin, että viiveet olivat kaiken kaikkiaan liian pitkiä ja syy siihen oli fuse-bittien tila. Koska käytin arduinon IDEä tähän projektiin luulin, että se asettaa fuse-bitit automaattisesti. Näköjään niitä ei aseteta automaattisesti ja mikrocontrolleri toimikin tehdasasetuksilla eli 1MHz taajuudella eikä 16MHz taajuudella niin kuin minä ja koodi olettivat. Kaikki delay-käskyt kestivät siis 16 kertaa pidempään kuin oli tarkoitus.

Seuraava ongelma oli, että sarastuksen asetus ei toiminut. Ongelman ratkaisemiseksi jouduin tekemään koodin, jolla asetettu aika välkyteltiin ledillä, koska systeemissä ei ole muuta näyttöä.  Levylle on kyllä suunniteltu I2C liitäntä näyttöä varten, mutta posti ei ole viellä tuonut tilaamaani I2C-kytkentäistä näyttöä Suomeen asti. Näillä näkymin kuitenkin jätän näytön kokonaan pois.

Ongelmaksi selvisi virhe piirilevyssä. IMG_20150109_233454  Kuvassa näkyy kytkimen kyljessä  numerot 1,2,4 ja 8, jotka kertovat bittien järjestyksen kytkintä luettaessa. Piirilevyllä vedot menevät päinvastaisessa järjestyksessä. Kytkimeen asetettu ykkönen (0b0001) siis tuli luettua numerona kahdeksan (0b1000). Yksi funktio koodiin lisää ja ongelma oli ratkaistu.

Kuvassa näkyy myös seuraava ongelma. Kissa pääsi leikkimään kytkimellä ja testasin vain mekaanisen toiminnan kytkimestä ennen kuin tinasin sen paikoilleen. Olisi kannattanut testata myös sähköinen toiminta. Kissan hammas oli sen verran painassut kytkimen sisuskaluja, että kytkin ei toiminut kunnolla ja jouduin tinaamaan sen irti. Onneksi olin tilannut yhden ylimääräisen, vaikka suhteellisen kalliita mokomat ovat!wpid-wp-1420882629588.jpeg

Kuva ei ole mitenkään selvä, mutta tarkkaan katsomalla siitä näkee, että alhaalta laskien toinen “liuku” on taipunut. Ehkä sen olisi saanut toimimaan, mutta kun oli toimiva kappalekin niin laitoin sen.

 

Koodissa on vielä tekemistä ja RTC-moduli IMG_20150112_012817(kuvassa keltainen) on kotelointia ajatellen aika hankalasti 90 asteen kulmassa alaspäin. Moduli on tinattu noin, koska etupuolelle tinattuna se olisi ollut ICSP liittimen tiellä. Tässä versiossa taidan vain vaihtaa/suoristaa pinnit ja asentaa modulin varsinaisen piirilevyn alle, mutta kaikkien virheiden takia taidan tehdä levystä version kaksi, jossa lisään RTC-modulin piirit suoraan pääpiirilevylle. Tällä hetkellä käytössä ds1307 piiriin prustuva RTC-moduli. Levyltä pitää lisäksi siirtää muutamia komponentteja hiukan, koska nyt ne ovat liian ahtaasti.

Laite siis kuitenkin toimii tällä hetkellä ja jo useampana aamuna olen herännyt helposti. RTC- moduli ei tosin tunnu olevan kovin tarkka, melkein minuutin per päivä heittää kello. Tarkemmin ajatellen itseasiassa kide taitaa olla suurin syyllinen kellon heittoon.

Pieniä harmaita aivosoluja sai kyllä koodatessa käyttää, kuten esimerkiksi miten asettaa RTC-kellon aika, kun laitteessa ei ole yhtään ainutta nappia? Vain A7D-kytkimet ja encoderi. Ratkaisu oli sitten kuitenkin aika yksinkertainen. Mikä tahansa ei kellon ajaksi sopiva asetus A7D kytkimissä, asettaa laitteen tilaan, jossa  kellonajan voi asettaa. A7D-kytkimiin laitetaan kellonaika ja encoderia pyöräyttämällä se siirretään RTC-chippiin. Muitakin asetuksia voinee laittaa vastaavalla menetelmällä, mutta katsotaan.

Lisäksi nälkä kasvaa syödessä! Alunperin oli tarkoitus tehdä valosta ihan oma yksikseen toimiva, mutta nyt mielessä on netin yli ohjauksen lisääminen masiinaan.  Samalla voisi käyttää NTP:tä hyväksi ja pitää sillä kellonaika oikeana.

Voin lähettää koodin ja eagle tiedostot sähköpostilla, jos joku niitä kaipaa. Tänne en niitä (viellä) laita, koska molemmissa on viellä tekemistä aika paljon.  edit: whatta heck!! laitetaan kuitenkin tarjolle vaan. Tuleepahan samalla opeteltua tuota GITHubin käyttöä. Lisäksi noita piirilevyjä on enemmän kuin minä tarvitsen, että niistäkin voidaan päästä sopuratkaisuun. Sarastevalo siis sinällään toimii, mutta en voi sanoa olevani viellä täysin tyytyväinen siihen.