Avainsana-arkisto: arduino

SIM908 modulin liittäminen muuhun maailmaan

Ostin kilkkeen, jossa on samassa GSM ja GPS palikat. Moduli perustuu simcomin sim908 palikkaan.  LIevähkö yllätys tuli siinä vaiheessa, kun minulle selvisi, että modulia ohjataan AT käskyillä. Olen tässä vuosien varrella muutamia kertoja törmännyt sivulauseessa kyseisiin komentoihin, mutta edellisen kerran minä niitä varsinaisesti olen käyttänyt viimeksi suunnilleen 90-luvulla, kun leikin modeemilla.  Ensimmäiset muistikuvat AT-käskyistä on jo 80-luvulta. Äidillä oli työ käytössä silloin “tyhmä pääte” ja sen yhteys maatalouden laskentakeskuksen koneeseen avattiin ja lopetettiin AT-käskyillä.  Yritin netistä löytää kuvaa kapistuksesta, mutten kunnollista löytänyt. Ainut kuva missä pääte edes oli, oli historiikki kuva ja siitä ei juuri päätteestä selvää saa.

Tarkoituksena siis tieto kulkemaan molempiin suuntaan moduulista sekä tekstiviestillä, että netin yli.  Alunperin suunnittelin, että moduli itsessään toimisi webbi serverinä, mutta erinäisistä syistä johtuen päädyin käyttämään apuna erillistä webbiserveriä. Suurin syy on se, että pääsen ehkä helpommalla koodauksen kanssa näin. Muita syitä on mm. se että mobiilissa palikan IP numero vaihtelee. Tämä ainakin on siis tällä hetkellä suunnitelma.

Simcom kertoo kyllä kiltisti kaikki AT-käskyt ja vastaukset niihin, mutta kaikistellen ei mitenkään selitä mitä tarvitaan mihinkin. Yllättäviä vaikeuksi aihuetti myöskin se etten heti tajunnut, että AT käskyissä on useampaa versiota ja modulissa on varsinaisia AT-käskyjä että simcomin omia AT-käskyjä. Varsinkin nettipuolen  yhteys oli aluksi sen takia täysin mahdoton idea. Varsinkin nettipuolen toiminnnan kannalta nettisivut olivat todella hyvää luettavaa. Kuten myöskin cooking hackingin sivut auttoivat valtavasti, mutta myös aiheuttivat harmaita hiuksia virheellisen GPS-koordinaattien muunnoksen takia. Heidän koodin mukaisella sijannilla asun Suomenlinnassa.

Katsotaan sitten miten moduli tottelee AT käskyjä. Aloitetaan ihan yleisillä jutuilla ja mennään sitten aluksi tarkemmin tekstiviesteihin ja sen jälkeen netti datasiirtoon.

AT käskyjen yleinen muoto on AT+KÄSKY. Moduli yleisin vastaus OK tai error, lisäksi tulee riipuen käskystä muutakin. Moduli on kytkettävissä suoraan arduinon TX ja RX pinneihin. Kokeilu vaiheessa käytin myöskin USB to TTL muunninta, joka toimi itse asiassa paremmin kuin arduino. Arduinon software serial kirjasto ei minun kokeiluissa toiminut luotettavasti ja muutenkin lienee parempi tehdä homma suoraan hardware TX/RX linjoihin, koska lopullisessa käyttökohteessa moduli tulee nimenomaan hardware serial linjaan kiinni.

Modulin kytkennän ja toiminnan voi varmistaa käskyllä AT, vastauksen pitäis olla OK.

AT+CPIN? Kertoo SIM-kortin PIN koodin tilanteen.  “+CPIN: READY” kertoo, että PIN koodi on ok ja “+CPIN: SIM PIN” taasen, että PIN koodia ei ole annettu. AT+CPIN=1234 lähettään PIN-koodin.

AT+CREG? kertoo, kun moduli on kiinni verkossa.  “+CREG: 0,1” kertoo, että ollaan kiinni kotiverkossa. Jälkimmäinen numero kertoo verkossa kiinni olemisen tilanteen.

0 Not registered, MT is not currently searching a new operator to register to

1 Registered, home network

2 Not registered, but MT is currently searching a new

operator to register to

3 Registration denied

4 Unknown

5 Registered, roaming

AT+CMGF=1 Asettaa modulin teksti moodiin, AT+CMGF=0 asettaa PDU moodin (binääri).  Minä olen käyttänyt teksti moodia.

AT+CMGS=”0401234567″ Lähettää puhelinnumeron modulille ja moduli vastaa “>” merkillä. Sen jälkeen lähetetään itse tekstiviesti ja perään CTRL-Z (eli lopetus koodi) 0x1A heksakoodina.

Ja siinä se! tekstiviesti lähti maailmalle. Modulista löytyy monta IMG_20151021_185729käskyä joilla voidaan tekstiviestejä käsitellä mm. tallentaa odottamaan lähetystä.  Ilmeisesti viesti ei ihan normaali muodossa lähde oletus arvoilla, koska se tulee vähän hassusti puhelimeen. Viesti pitää erikseen tallentaa puhelimessa.

Viestin lukemiseen modulista tarvitaan muutama komento lisää. Moduli laitetaan tekstimoodiin, jos se ei jo siinä ole (AT+CMGF=1)

AT+CPMS=”SM,”SM”,”SM” käskyllä asetetaan muisti. Tarkkaan en ole tutustunut käskyyn, mutta SM tarkoittaa SIM korttia ja käskyssä ensimmäinen SM on muisti joka käsittelee viestien lukemista ja poistamista, toinen SM on kirjoitus ja lähetys ja viimeinen on viestien vastaanotto. Tämä tarvitsee kyllä viellä tutkimista, että mikä on mikäkin.

AT+CMGR=1 Lukee ensimmäisessä muisti paikassa olevan viestin. Toisessa muisti paikassa olevan viestin voin lukea vaihtamalla numeron 1 numeroksi 2

AT+CMGL=”ALL” Käskyllä saadaan listattua kaikki viestit muistista kerralla.

“REC UNREAD” Received unread messages
“REC READ” Received read messages
“STO UNSENT” Stored unsent messages
“STO SENT” Stored sent messages
“ALL” All message
Niin kuin jo aikaisemmin sanoin tekstiviestien käsittelyyn löytyy paljon enemmänkin käskyjä, mutta tässä on nyt aikalailla minini mitä tarvitaan.

Netin kautta yhdistämiseen löytyy useampikin vaihtoehtoinen tapa. Valitettavasti mistään ei selvästi tätä suoraan kerrottu, joten jouduin aika hyvän hetken taistelemaan, että sain yhteyden toimimaan.

Kokeillaans sitten miten saadaan netistä tietoa moduliin päin. Kun AT+CREG? kertoo, että ollaan kiinni verkossa yhteys voidaan aloittaa.

AT+SAPBR=3,1,”Contype”,”GPRS” Asettaa yhteystyypin GPRS moodiin.

AT+SAPBR=3,1,”APN”,”internet” Asettaa APN, tässä tapauksessa saunalahden käyttämä “internet”.  LIsäksi tarvittaessa voidaan asettaa käyttäjätunnus ja salasana. Saunalahden yhteydessä niitä ei tarvita (eikä ilmeisesti muissakaan suurilla Suomalaisilla operaattoreilla)

AT+SAPBR =1,1 Käynnistää yhteyden.

AT+SAPBR=2,1 Kertoo yhteyden tilan mm. modulin IP numeron. Jos yhteydellä on IP numero voimme jatkaa, muuten kokeillaan uudestaan.

AT+HTTPINIT Aloittaa HTTP yhteyden muodostamisen.

AT+HTTPPARA=”CID”,1 Asettaa yhteyden profiilin numeron (bearer profile identifier). CID on yksi niitä juttuja joista ei älyttömästi kerrota mikä se on.

AT+HTTPPARA=”URL”,”http://rahikkala.net/robots.txt”  Asettaa kohde URL:n.

AT+HTTPACTION=0 Aloittaa HTTP GET yhteyden. vastaus “+HTTPACTION:0,200,87 ” kertoo onnistuneen yhteyden.  0 kertoo että käytetään GET metodia, 200 kertoo onnistuneesta yhteydestä, ja 87 kertoo kuinka monta tavua on noudettu.

AT+HTTPREAD hakee serverin vastauksen.

 

Modulista maailmalle päin voidaan dataa saada useammallakin tavalla liikenteeseen. Itse taidan käyttää GET metodia, joka on helpompi. Periaatteessa eroa netistä tiedon hakuun on vain se, että serverillä on sopiva vaikkapa PHP-koodi joka otta vastaan tiedon. GET metodissa tieto on URL:ssä. URL-osoitteessa on “?” merkki jonka jälkeen data tulee.  Cooking hacksin sivuilla on hyvä esimerkki tästä ja sieltä myös löytyy esimerkki sopivasta PHP-koodista.

Tämä on vain pinta raapaisu miten SIM908 voidaan liittää muuhun maailmaan, jätän ihan tarkoituksella monia asioita selittämättä, suurimmaksi osaksi ihan siksi, etten itsekään vielä tiedä. Valmiista laitteesta tulee vielä tarkemmin juttua, mutta se voi hyvinkin mennä tulevalle vuodelle.  SIM908 dokumentaation periaatteessa hyvä, mutta käytännössä se vaatii melkeinpä kokeilemalla kokeilemaan miten mikäkin toimii. Onneksi internetistä löytyy tietoa aika paljonkin. Erillaisia kirjastoja olisi ollut vaikka kuinka paljon valmiiksikin kirjoitettuna, mutta en halunnut käyttää niitä tässä.

 

Ps. Vaikka useimpien lauseiden aikamuodosta voisi päätellä muuta, en ole vielä oikeastaan edes aloittanut koodin kirjoittamista, mutta kaikki mainitut käskyt on kuitenkin testattu ja toimivaksi todettu.

 

R-2R DAC

R 2R digitaali analogi muunnin

Pientä kokeilua. Näin youtubessa seuraavan videon.

Ja päätin rakennella huvin ja viihteen vuoksi samanlaisen. R 2R dacin rakentelin R 2RWikipediasta löytyneen ohjeen mukaan. Vastusten arvolla ei niin isoa merkitystä ole, kunhan ne ovat saman kokoisia.  Minä käytin 10k vastuksia, koska niitä sattui olemaan pussillinen lojumassa laatikossa. Koodina on täsmälleen sama kuin alkuperäisessä videossa.IMG_20150413_185420

Kytkentä on rakennettu reikälevylle ja siinä on kaksi 8-bit muunninta. Koodi tosin käyttää y-akselilla vain 6-bit muunnosta.  Onneksi bitti määrän lyhennys on tässä tapauksessa helppoa. Oskilloskoopista pitää löytyä XY-tila jotta koodi näyttää mitään. Rigol 1054Z skoopista se löytyy. Näytön yläreunassa näkyy signaali normaalissa aika tasossa ja alaosassa XY. Jostain olisi varmaan löytynyt nappi millä näytössä olisi näkynyt pelkästään XY, mutten jaksanut alkaa sitä etsimään.

Laittelin aluksi johdot väärin päin jolloin kytkentä näytti ihan mitä sattuu, koska MSB oli LSB:n paikalla ja vastaavasti kaikki muutkin bitit ristissä.

Miten R 2R-dac sitten toimii?

Toiminta on hyvin yksinkertainen: jokaiselle bitille on oma sisäänmenonsa, jonka kautta ko. inputti vaikuttaa oman osansa ulostulevaan jännitteeseen. MSB(=most significant bit) eli eniten merkitsevä bitti vaikuttaa  \frac{1}{2^1} V_{in} = \frac {1}{2} V_{in} verran ulostulo jännitteeseen. Seuraava bitti vaikuttaa \frac{1}{2^2} V_{in} = \frac {1}{4} V_{in} verran ja 8-bitin tapauksessa LSB(=least significant bit) eli vähiten merkitsevä bitti vaikuttaa \frac{1}{2^8} V_{in} = \frac {1}{256} V_{in} verran.

MSB on lähimpänä ulostuloa ja LSB vastaavasti kauimpana.  Eri sisäänmenojen painoarvot ovat laskettavissa varsin helposti, mutten tässä niitä itse laske vaan linkkaan toisen videon, samalta henkilöltä, jonka videosta sain alunperin idean.

 

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.