Laboratorioharjoitus¶
Tässä harjoituksessa opiskelijat tutustuvat SensorTag:n ohjelmointiin CCS Cloud-ohjelmointiympäristössä.
Tavoite: Osataan käyttää SensorTag:n eri oheislaitteita:
- Painonappeja ja ledejä
PIN
-kirjaston avulla - Saadaan laitteen näytölle tekstiä
Display
-kirjaston avulla - Luetaan sensorien dataa
i2c
-protokollaa käyttäen - Kommunikoidaan yksinkertaisilla viesteillä langattomasti
comm_lib
-kirjastoa käyttäen
Lisäksi opiskelijat saavat laitteen kotilainaan lopputyötä varten, kunhan harjoitus on hyväksytysti suoritettu.
Esitehtävät ja valmistelut¶
Harjoitukselle on varattu aikaa kolme tuntia, joka tulisi pääosin käyttää laitteen ohjelmoinnin opetteluun!
Ohjelmistojen asennus¶
Tehkää nämä ohjelmistojen asennukset mahdollisuuksien mukaan ennen harjoitusta!
Asennus opiskelijoiden tiedostonjaosta, josta löytyy:
- Windows-asennustiedostot (muut käyttöjärjestelmät kts. alla)
CCS6.1.3.00034_win32.zip
- Projekti-aihio laboratorioharjoitusta ja harjoitustyötä varten
- Esimerkkikoodia SensorTagin oheislaitteiden käyttöön harjoitustyössä
Vaihe 1 - kääntäjäympäristön asennus¶
Harjoituksen voi tehdä..
- Työasemille asennetussa virtuaalikoneessa TKJ_harjoitukset. CCS Cloud-ympäristö on valmiiksi asennettu.
- Etsi virtuaalikone Start-menusta kohdasta "VM Images" tai alareunan hakuikkunasta.
- Käytä Firefox-selainta.
- Luo oma käyttäjätunnus pilvipalveluun. Valitse CCS Cloud ja vasemmassa yläkulmassa login / register.
- Siirry vaiheeseen kaksi (alempana).
- Oma läppärillä: Windows
- CCS Cloud: Testattu Firefox & Chrome
- Luo oma käyttäjätunnus pilvipalveluun Valitse CCS Cloud ja vasemmassa yläkulmassa sign-in.
- Siirry vaiheeseen kaksi (alempana).
- CCS IDE: versio 6.1.3 ja TI RTOS 2.20.00.06
- Windows asennustiedostot
- Ensin CCS IDE
ccs_setup_6.1.3.00034.exe
. - Sitten RTOS
tirtos_cc13xx_cc26xx_setupwin32_2_20_00_06.exe
. - Asennuksessa valitaan
Simplelink Wireless MCUs
. Muihin asennusoptioihin ei tarvitse koskea. - Laitteen USB-ajurit tulevat asennuksessa mukana.
- Siiry vaiheeseen 2.
- Oma läppäri: MacOS tai linux
- ohjelmat valmistajan sivuilla.
- Huomatkaa CCS versio 6.1.3 ja TI RTOS 2.20.00.06.
- Asennus samoin kuin Windowsille yllä.
Vaihe 2 - ohjema-aihion asennus¶
Asentakaa valmiiksi kehitysympäristöön SensorTag:n ohjelma-aihio
JTKJ_labra_2019.zip
täältä. - Asennusohjeet täällä.
- Salasana zipin avaamiseen on jtkj2019labra.
- Ensimmäistä kertaa ohjelmaa kääntäessä ja ajaessa CCS Cloud pyytää asentamaan ajurit ja selainlaajennuksen. Kts käännösprosessi alla.
- HUOM! Asenna ajurit normaalissa käyttäjätilassa, ei admin-tunnuksilla! (Tässä on TI:llä ongelmia..)
Jos ohjelmistojen asennuksessa on ongelmia, kysykää ohjatuissa harjoituksissa / edellisen harjoituksen apuja.
Kerrattavia asioita¶
Sujuvan suorituksen varmistamiseksi kerratkaa luentomateriaalia C-kielen ja sulautettujen osalta. Oleellisia luentokappaleita ovat:
- Luentokappale 15: Input / Output
- Miten pinnit alustetaan ja otetaan käyttöön ohjelmassa?
- Luentokappale 17: Pinnikeskeytykset
- Miten laaditaan pinnille keskeytyksen käsittelijä?
- Luentokappale 16: Sensoridatan lukeminen
- Miten laaditaan i2c-viesti ja miten se lähetetään ja vastaanotetaan?
- Luentokappale 18: Oheislaitteet
- Miten tulkitaan sensoridata rekistereistä?
- Miten saadaan näytölle muotoiltua tekstiä?
- Luentokappale 20: Langaton tiedonsiirto
- Miten lähetetään ja vastaanotetaan viestejä?
CCS:n kehitysympäristöön tutustuminen¶
Harjoituksen aluksi tutustumme
CCS Cloud
-pilvipalvelun käyttöön henkilökunnan opastuksella. Toki sama ohjeistus pätee pitkälti yksi yhteen myös CCS IDE
:n käytössä, kun ohjelmistojen käyttöliittymät ovat hyvin samankaltaisia.1. Ympäristön käynnistys¶
Avataan kehitysympäristö pilvipalvelussa dev.ti.com.
- Kirjaudutaan sivuille ensin sisään omilla tunnuksilla yläreunasta
Sign-in
. - Ottakaa täppä
Remember me
pois jos teette harjoitusta lainaläppäreillä, muuten selain haluaa väkisin muistaa teidät ja salasananne! - Käynnistetään kehitysmpäristö linkistä
CCS Cloud
.
2. Pikaopas ympäristön käyttöön¶
Ihan ensiksi meidän tulee tietysti kytkeä laite USB 3.0 (sinen portti työasemissa) -porttiin! Tässä on oleellista, että laite on tosiaan USB 3.0.-portissa, USB 2.0-portti on työasemalla tooooooooooooooodella hidas. Läppäreissä USB 2.0-portti voi toimia ok.
Käydään sillävälin läpi kehitysympäristön käyttöliittymää. Punaisilla ympyröillä on merkitty meitä kiinnostavia asioita.
Yleisiä toimintoja:
File
-menu: projektien hallinta, ymsProject
-menu: valmistajan esimerkkiprojekteja, oman projektin siirtäminen ulos pilvipalvelustaWorkspace
: hakemistorakenne projekteille- Koodi-ikkuna:
main.c
- Alareuna
Output
-tabista näemme miten käännös onnistui, tänne tulee virheilmoitukset, ymsDebug
-tabiin: tulee tietoa ohjelman suorituksesta ja myös konsoli-ikkunaan voimme koodissa kirjoittaa viestejä (esim. tässä Hello World!).- Hiiren oikealla napilla kontekstimenussa on myös toiminnallisuutta.
Ohjelman kääntäminen ja käynnistäminen laitteessa:
Debug
: Tällä käännetään ja ladataan projektimme laitteelle- Debug-ikoni muuttuu
Stop
-ikoniksi kun ohjelma on käynnissä laitteessa, josta voidaan ohjelman ajo keskeyttää. - Kun ohjelma on ajettavissa, oikean reunan
Play
-ikoni muuttuu vihreäksi. Tämä käynnistää varsinaisen ohjelman ajon laitteessa.
3. Oma projekti¶
1. Tutustutaan hetki työtilaan ladattuun projekti-aihioon:
- pääohjelma sijaitsee tiedostossa
main.c
- Kirjastot sensorien käyttöön löytyvät hakemistosta
sensors
. Jokaisen sensorin käyttöön on tehty valmiiksi otsikko- ja kooditiedostot. - Kooditiedostoista puuttuu i2c-operaatioita ja bittioperaatioita sensorien käsittelyyn, jotka opiskelijoiden pitää itse koodata. Tässä aiempien tehtävien koodista on hyötyä..
- Langattoman tiedonsiirron kirjasto on hakemistossa
wireless
, josta meitä kiinnostavat funktiot oncomm_lib.h
-tiedostossa.
2. Seuraavaksi, käännetään ja ajetaan esimerkkiprojekti laitteessamme
debug-toiminnolla
. - Tässä vaiheessa ohjelmointiympäristö saattaa ilmoittaa että Firmware update needed, joka tarkoittaa sitä että laitteessa on vielä vanha firmis. Päivitämme laitteeseen uuden firmiksen
Update
-napista. Update-prosessin aikana saattaa tulla konsoli-ikkunaan mystisiä virheilmoituksia, mutta niistä emme välitä. Kun päivitys loppuu, tehdään uudelleen käännösprosessi joka nyt toimii.. jos ei, niin poistakaa laite USB-portista ja laittakaa takaisin.
3. Huomataan, että käännöksessä tulee virhe. Tämä virhe tulee tarkoituksella siitä, ettei laitteelle ole määritetty etukäteen "nettiosoitetta" otsikkotiedostossa
wireless/address.h
. - Asetetaan tämä osoite, joka on sama kuin pakettimme ja laitteen kyljessä oleva numero. Tämä asetetaan vakiolle
IEEE80154_MY_ADDR
heksalukuna siten, että jos paketin numero on 29, annetaan osoitteeksi0x0029
virheellisen määrittelyn 0xnnnn tilalle.
4. Käännetään projekti uusiksi, käynnistetään ohjelma ja huomaamme, että laitteen ruudulle tulee tekstiä ja konsoli-ikkunaan ilmestyy teksti "Hello, world!". Voila! (Hox! teksti ei tule ei siis laitteen ruudulle..).
Harjoituksen tehtävät¶
Tästä eteenpäin harjoitusta jatketaan omatoimisesti.
Harjoituksessa tehdään koodia ja muutoksia seuraaviin tiedostoihin:
wireless/address.h
(se oman laitteen osoite)main.c
sensors/bmp208.c
Ohjelma-aihioon on merkitty tunnisteella JTKJ kohtia joihin harjoituksessa tulee omaa koodia.
- Projektissa on paljon sinne valmiiksi ohjelmointiympäristön luomaa RTOS:n tarvitsemaa alustuskoodia yms, johon meidän ei tarvitse koskea!
- Tämä koodi toimii harjoitustyönne aihiona, joten suhtautukaa siihen vakavasti.
HOX! Muistakaa aina välillä tallentaa koodinne! Projektista on hyvä idea (ts. näin pitää tehdä) ottaa copy&paste-kopiota välillä kääntäjäympäristössä, siis koko projektista. Varsinkin, kun saatte jotain isompaa toimivaa aikaiseksi.
Noniin, aloitetaanpas laitteeseen tutustuminen ihan perusasioista..
1. Painonapit ja ledit¶
Laitteen punaisessa kumisuojuksessa on painonappien paikat merkitty ylä- ja ''alareunaan'. (Ilman suojusta tulee mustassa muovikotelossa tulee varovasti painaa irtonaista "liparetta", josta kuuluu heikko napsaus.)
Punainen ledi jota tehtävässä käsitellään on laitteen pohjassa! Hox! Laitteen sisällä keskellä näkyy myös eri värisiä ledejä, mutta nämä ovat debuggerin omia, ja niitä emme pääse käsittelemään.
Ensimmäinen asia onkin opetella käyttämään RTOS:n
PIN
-kirjaston valmiita funktiota. Tehtävänä siis laatia 'yläpuolen painonapille Board_BUTTON0
sen toiminta niin, että punainen ledi Board_LED1
vaihtaa tilaansa päälle ja pois kun nappia painetaan.Tätä varten meidän tarvitsee:
- Esitellä RTOS:n muuttujat molemmille pinneille ja konfiguroida pinnit oikein: painonappi inputiksi ja aiheuttamaan keskeytys sekä ledi outputiksi.
- Ottaa pinnit käyttöön ohjelmassamme
- Esitellä painonapille sen oma keskeytyksen käsittelijä, johon toteutamme toiminnallisuuden
- Kirjoittaa käsittelijäfunktio tiedostoon. Tehtävässä käsittelijän tarvitsee vain vilkuttaa lediä. Oiskohan tähän esimerkkikoodia jossain..
Pinneihin liittyvät asiat on käsitelty luentomateriaalissa Input / Output, ja nyt erityisesti kiinnostaa mitä esimerkkikoodeissa on tehty.
2. Tekstiä näytölle¶
Seuraavaksi tulostetaan näytölle omaa tekstiä. No tämä on helppo homma
Display
-kirjaston funktioilla Display_print0
, kuten luentomateriaalissa Oheislaitteista on kerrottu. Tehtävässä tulostammekin ruudulle laitteemme nettiosoitteen, siis sen vakion IEEE80154_MY_ADDR
, jonka juuri asetimme. Tässä meille on apuna luentomateriaalissa Syöte ja tulostus esitelty
sprintf
-funktio. Homma on kaksivaiheinen. Ensin tarvitsemme merkkijonomuuttujan, johon tulostamme osoitteen merkkimuotoisena talteen. Sen jälkeen tulostamme tämän merkkijonon laitteen näytölle Display_print0
-funktiolla.main.c:n
labTaskFxn
-taskifunktiossa on valmista koodia, joka asettaa näytön päälle funktiolla Display_open
jo valmiiksi. Joten näiden alustusten jälkeen voisi olla hyvä paikka vaikka tulostella osoite ruudulle.. 3. Langaton tiedonsiirto¶
Tässä opettelemme käyttämään
wireless
-hakemistosta comm_lib
-kirjastoa. Katso kirjaston toiminta luentomateriaalin kappaleesta Langaton viestintä.Harjoitellaan tiedonsiirtoa kirjaston funktioiden avulla:
- Muista alustaa kirjasto
Init6LoWPAN
-funktiolla ohjelmasi main-funktiossa. (Noh, se on jo nätisti siellä valmiina). - Lähetä viesti henkilökunnan laitteelle yllä laatimastasi painonapin keskeytyksen käsittelijäfunktiosta aina kun nappia painetaan. Viesti lähetetään funktiolla
Send6LoWPAN
, osoite0x1234
asetetaan vakioonIEEE80154_SERVER_ADDR
tiedostossawireless/address.h
. - Katso luentomateriaalista, miten funktiota käytetään ja mitkä ovat sen parametrit. Älkää lähettäkö 8 merkkiä pitempia merkkijonoja, koska harjoituksessa haluamme testata asiat toimiviksi (Myöhemmin on sitten aikaa lähettää enemmän tavaraa..).
- Lähetetty viesti pitäisi näkyä luokan screenillä. Tunnistatte oman viestinne lähettäjän laiteosoitteesta.
- Viestinlähetyksen jälkeen radio asetetaan takaisin vastaanotto-tilaan funktiokutsulla
StartReceive6LoWPAN
. - Pääohjelmassa tiedonsiirtoon on laadittu oma taski nimeltä
commTask
. Tämä taski on tarkoitettu viestien vastaanottoon. - Katso luentomateriaalista miten taskissa vastaanotetaan viestejä funktioilla
GetRXFlag
jaReceive6LoWPAN
- Kokeile (ei ole pakollista) saada serveriltä tuleva vastausviesti vastaanotetuksi ja tulostetuksi vaikkapa konsoli-ikkunaan!
Yleisesti, viestin lähettämisessä ja vastaanotossa string.h-kirjaston valmiit funktiot merkkijonojen käsittelyyn ovat suureksi avuksi. Myös
stdio.h
-kirjaston funktiot atoi
ja atof
voivat olla hyödyksi.4. Sensoridatan lukeminen¶
Seuraavaksi opetellaan kysymään ilmanpaine-sensorilta
BMP280
dataa kerran sekunnissa i2c-protokollaa käyttäen. Tähän oli apuja luentomateriaalissa Sarjaliikenne. Materiaali kannattaa lukea kunnolla, muuten tämä taski voi olla työläs juttu..Hox! Sensorille löytyy ohjelma-aihion
sensors
-hakemistosta kirjasto bmp280.h
ja kooditiedosto bmp280.c
. Tässä tehtävässä muokkauksia tulee kahteen kooditiedostoon eli main.c ja bmp280.c. Käytämme harjoituksessa kirjaston kahta funktiota
bmp280_setup
ja bmp280_get_data
. - Huomataan, että taskiin
labTaskFxn
, on jo valmiiksi alustettu i2-cyhteydet kahvallai2c
, joten alustuksia ei tarvitse tehdä. - Sensori alustetaan käyttöön taskissa funktiokutsulla
bmp280_setup
, jolle parametriksi luotu i2c-yhteyden kahva. - labTaskissa kysytään
while
-loopissa sensorilta dataa kerran sekunnissa funktiokutsullabmp280_get_data
. Noh, funktio ei vielä toimi.. eli siirrytään editoimaan tiedostoabmp280.c
.. - Seuraavaksi laatditaan i2c-viestirakenne
sensors/bmp280.c
-tiedoston funktioonbmp280_get_data
. - Rakenteen jäseniin asetamme sensorille materiaalissa Oheislaitteet tälle sensorille annetut arvot: 1) laitteen osoite, 2) rekisteriosoite, 3) lähetettävien tavujen määrä, 4) vastaanotettavien tavujen määrä. Tarvitaan myös viestipuskurimuuttujat
rxBuffer
jatxBuffer
. Nämä muuttujat pitää luoda itse sen kokoisiksi, kuin viestit tälle BMP280-sensorille luentomateriaalissa Oheislaitteet on kerrottu.
/* FILL OUT THIS DATA STRUCTURE uint8_t txBuffer[ ?? ]; uint8_t rxBuffer[ ?? ]; txBuffer[0] = ... i2cTransaction.slaveAddress = ... i2cTransaction.writeBuf = ... i2cTransaction.writeCount = ... i2cTransaction.readBuf = ... i2cTransaction.readCount = ... */
- Sitten käytämme i2c-kirjaston funktiota
I2C_transfer
lähettämään viesti sensorille. Jos viesti onnistui, voimme lukea rekisterien arvotrxbuffer
-taulukosta. - Tämän jälkeen muunnetaan rekisteriarvot seuraavasti lämpötila- ja ilmanpaine-arvoiksi.
- Ensiksi muodostetaan rekisterien arvoista omat 20-bittiset luvut molemmille ilmanpaineelle että lämpötilalle. Tätähän tehtiin aiemmassa Funktiot-luentomateriaalissa olevassa harjoitustehtävässä.
- Sitten lasketaan ensin lämpötila-arvon kutsumalla funktiota
bmp280_bmp280_temp_compensation
, jolle argumenttina yllä saatu 20-bittinen lämpötila-arvo. Tämä funktio tekee samalla lämpötilakompensaation ilmanpaineen laskemista varten, joten sitä on syytä kutsua ensin. Funktio palauttaa lämpötilan Fahrenheit-asteikolla. Tässä voi vielä muunnos Celcius-asteisiin olla paikallaan.. - Sitten kutsutaan ilmanpaineen laskentafunktiota
bmp280_convert_pres
, jolle argumentiksi yllä saatu 20-bittinen ilmanpaine-arvo. Funktio palauttaa ilmanpaineen yksikössäpascal
, mutta yleensä ilmanpaine ilmaistaan tutumminhehtopascaleina
, joten tässäkin voi halutessaan tehdä muunnoksen. - Lopuksi voisi olla taas paikallaan tulostaa sensorin senhetkinen mittausarvo näytölle
Display_print0
tai konsoli-ikkunaanSystem_printf
, vaikkapa sen jälkeen kun ne luettu sensorilta. Taas kerran, meidän täytyy ensin kirjoittaa numeroarvot merkkijonoon, joka sitten tulostetaan ruudulle ym. funktioilla. Task_sleep
-funktiolla taski odottelee noin sekunnin ajan. Kts. luentomateriaali Reaaliaikakäyttöjärjestelmä.
5. Grafiikkaa ruudulle¶
Jos aikaa jää, voit koristella ilmanpaine-mittarisi ruutua vaikka pikseligrafiikalla. Tähän apuja löytyy Oheislaitteet-materiaalista.
Lopuksi¶
Onnittelut, olet saanut oikean ohjelman aikaiseksi sulautetulla laitteella!
Harjoitustyöä varten SensorTagin käyttöönottoon patterin kanssa on huomioitava seuraavat ohjeet.
Anna palautetta
Kommentteja materiaalista?