Avainsana-arkisto: atmega328

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.

 

Psykrometri

IMG_20150227_202544
Omatekoinen psykrometri, huomaa lattialla oleva “ylivuoto astia”

Alkoi kiinnostaa mikä on kastepiste täällä kämpässä. Hetkisen googlauksen jälkeen selvisi, että helpoin tapa määrittää kyseinen arvo käsillä olevilla tarvikkeilla on laite, joka kulkee nimellä psykrometri samalla selviää myöskin suhteellinen ilmankosteus.

Psykrometri on yksinkertaisesti laite, jossa on kaksi lämpömittaria. Toinen lämpömittari on siltään jolla mitataan ns.  kuiva lämpötila  (dry-bulb temperature, DBT) ja toinen on kääritty märkään kankaaseen ja jolla mitataan ns. märkä lämpötila (wet-bulb temperature WBT). Näiden kahden lämpötilan eron perusteella lasketaan (tai katsotaan taulukosta) arvo kastepisteelle. Lämpötiloista saadaan monta muutakin arvoa haluttaessa.

Kastepiste on lämpötila, jossa kyseessä olevasta ilmamassasta jäähdytettäessä  alkaa vesi tiivistyä. Lämpimaan ilmaan “mahtuu” enemmän vettä kuin kylmään, jolloin vaikka absoluuttinen vesi määrä pysyykin samana ilman jäähtyessä, suhteellinen kosteus alkaa nousta. Suhteellisen kosteuden noustessa 100% ollaan kastepisteessä ja vesi alkaa tiivistyä.

Lämpömittarina on käytössä omatekoinen mittari, jonka antureina on kaksi DS18B20 anturia ja “aivoina” ATMEGA328p mikrokontrolleri. Pitänee jossain vaiheessa kirjoittaa aiheesta oma juttu.

Märkä mittari jäähtyy, koska kankaasta haihtuva kosteus vie mukanaan lämpöenergiaa. Märkä lämpötila ei ole koskaan isompi kuin kuiva, se voi olla sama kuin kuiva, mutta yleensä se on alempi kuin kuiva. Mittareissa on sama lämpötila suhteellisen kosteuden ollessa 100%. Märän mittarin lämpötila riippuu vahvasti ilmankosteudesta sekä myös jossain määrin ilmanpaineesta. Esimerkiksi suora auringonpaiste ja kova ilmavirta vääristävät tulosta.

Käytin kankaana sukkaa. En tiedä kuinka märäksi kangas olisi pitänyt kastella, joten kastelin sen niin märäksi, että siitä tippui vettä.

Laskenta kaava näytti sen verran monimutkaiselta, että päätin käyttää jotain laskinta netissä, spesifisen laskurin lisäksi wolframalpha osasi laskea tämänkin 🙂

Ensimmäinen mittaus antoi tulokseksi DBT 26°C ja WBT 19°C olettaisin, että kuiva lämpötila on aavistuksen liian korkea, koska mittari on tietokoneen vieressä, mutta laskin silti tuloksen sen mukaan.  Tulokseksi tuli noin 15°C ja 51%. Hetkisen tehokkaan tuuletuksen jälkeen DBT oli 25°C ja WBT oli 17°C ja laskurista tulokset 12°C ja 44%. Jos kuivana lämpötilana käyttää pienempää arvoa molemman lasketut arvot nousevat hieman. Ulkoilman suhteellinen kuivuus oli selkeästi nähtävissä ja sen vaikutus oli yllättävän nopeasti näkyvissä mittauksessa.

Ilmatieteenlaitoksen sivuilla on taulukko, josta näkee miten helle ja ilman suhteellinen kosteus vaikuttavat helteen tukaluuteen ja wikipediasta löytyy tieto miten kastepistelämpötila vaikuttaa ihmisen oloon. Näiden testien perusteella kuitenkin tähän hetkeen ihan hyvät arvot ja ei pitäisi olla ilmankosteuden kannalta mitään ongelmaa.

Kastepisteeseen liittyvää projektia saattaa olla viellä lisääkin tulossa.

Löysin myöskin netistä C-kirjaston, jonka avulla voi itse laskea arvoja. Saattaa joutua jossain vaiheessa kirjoittamaan tuohon lämpömittariin ohjelman joka laskee kastepisteen ja suhteellisen kosteuden itsekseen. Ilmanpaineella ei valtavan isoa merkiystä asiassa ole, mutta ehkä voisi silti anturin sitäkin varten harjoituksen vuoksi laitella tuohon.

 

 

Nasakin on asiasta kirjoittanut aika pitkän pätkän kaavoja, pitänee tutustua joskus ajan kanssa.

http://www.nasa.gov/centers/dryden/pdf/87878main_H-937.pdf

 

http://www.ce.utexas.edu/prof/Novoselac/classes/ARE383/Handouts/F01_06SI.pdf

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.