Harjoitustyö 2025. Salaiset viestit¶
Huom! Materiaali päivittyy kurssin aikana lisäten selvennyksiä sisältöön Myös kurssin edetessä lisäämme vinkkejä ongelmakohtiin ja muuta tietoa. Joten tarkistakaa sivun sisältö aika ajoin!
Viimeksi päivitetty: 28.10.2025
- Päivitetty projektin lopullinen määräaika.
- Arviointia on hieman säädetty. Nyt Taso 2 on 11 pistettä ja Taso 3 on 3 pistettä.
Edellinen versio:
- 1.10.2025:
- Ensimmäinen versio julkaistu
- 21.10.2025
- Päivitetty projektin lopullinen määräaika.
- Arviointia on hieman säädetty. Nyt Taso 2 on 11 pistettä ja Taso 3 on 3 pistettä.
Johdanto¶
Opiskelijat työskentelevät hallituksen tiedusteluvirastolle. Tehtävänänne on kehittää viestintälaite, jonka avulla agentit voivat lähettää viestejä toisilleen käyttäen omaa järjestelmäämme. Tässä projektissa Raspberry Pi Pico yhdessä JTKJ Hat:in kanssa toimii viestintävälineenä.
Jos sinulla on kysyttävää tästä materiaalista, olemme valmistelleet laajan UKK-osion. Käy tutustumassa siihen – vastauksesi saattaa löytyä sieltä. Voit myös tarkistaa Discordin. Jos et löydä vastausta mistään, älä epäröi ottaa meihin yhteyttä.
Oppimistavoitteet¶
Tässä projektissa opiskelijat oppivat käyttämään Raspberry Pi Picoon liitettyjä oheislaitteita FreeRTOS-käyttöjärjestelmää hyödyntäen.
Perustasolla opiskelijat osaavat tunnistaa laitteen tiettyjä asentoja IMU-anturin avulla ja lähettää näiden asentojen perusteella merkin ulkoiseen laitteeseen sarjaviestinnän kautta.
Edistyneemmillä tasoilla opiskelijat oppivat käyttämään erilaisia antureita ja toimilaitteita paremman käyttökokemuksen tuottamiseksi.
Palautettavat tehtävät¶
- Projektisuunnitelma. Palautus: 2025-10-24 23:59. Projektisuunnitelma tiivistää, mitä opiskelijat aikovat toteuttaa.
- Loppuprojekti. Palautus: 2025-11-23 23:59. Sisältää toteutetun ohjelmakoodin sekä mahdollisesti videon esityksenä.
- Päiväkirja. Vähintään yksi merkintä viikossa. Palautus: 2025-11-23 23:59. Jokaiselta opiskelijalta vaaditaan oma päiväkirja.
- Moduuli 2 -tentti. Päivämäärät saatavilla kohdasta Deadlines section. Valvottu tentti.
- Arviointitapaaminen. Ajankohdat viikoilla 48–51.
Arviointikriteerit¶
Yleiset arviointikriteerit on määritelty kohdassa Arviointi-osio.
Kullakin tason palautuksella on omat erityiset arviointikriteerinsä, jotka ovat nähtävissä palautuslaatikosta:
Projektin vaatimukset¶
Salaiset viestit¶
Harjoitustyössä sinun ja ryhmäsi tehtävänä on toteuttaa Morse-koodiin perustuva viestintäohjelma. Morseaakkoset ovat osa Samuel Morsen vuonna 1838 kehittämää viestintäjärjestelmää, jota aikanaan käytettiin viestien lähettämiseen lennättimen avulla sähköttämällä.
Nykyään morseaakkosia ja sähkötystä käytetään enää vain vähän, mutta esimerkiksi Suomen Puolustusvoimien sissiradistit ja radioamatöörit opettelevat ja harjoittavat tätä taitoa.
Nykyään morseaakkosia ja sähkötystä käytetään enää vain vähän, mutta esimerkiksi Suomen Puolustusvoimien sissiradistit ja radioamatöörit opettelevat ja harjoittavat tätä taitoa.
Harjoitustyönä toteutettava ohjelma tunnistaa morseaakkosviestien muodostamiseen tarvittavat pisteet, viivat ja välilyönnit laitteen IMU:sta saadun datan tai esimerkiksi napin painallusten perusteella. Tuotetut viestit siirretään sitten työasemalla toimivaan ohjelmaan, jossa ne muunnetaan takaisin tekstiksi.
Joissakin tilanteissa kurssin laitteelle toteutetun ohjelman tulisi myös pystyä toistamaan vastaanottamansa morseaakkosviesti.
Joissakin tilanteissa kurssin laitteelle toteutetun ohjelman tulisi myös pystyä toistamaan vastaanottamansa morseaakkosviesti.
- HUOM: Perustason projektissa sovelluksen ei tarvitse suorittaa morsekoodin ja kirjainten välistä muunnosta kumpaankaan suuntaan.
Viestiprotokolla¶
Laitteen ja työaseman välillä tapahtuva kommunikaatio noudattaa kansainvälistä morseaakkosjärjestelmää tietyin poikkeuksin ja sovelluskohtaisin tarkennuksin. Nämä poikkeukset on listattu alla.
- Jokainen Morse-aakkosiksi koodattu merkki lähetetään peräkkäisenä sarjana viivoja "-" ja pisteitä "."
- Jokaisen Morse-koodatun merkin (esim "a" => ".-") välillä on yksi välilyönti " "
- Sanojen välillä on kaksi välilyöntiä
- Viesti päättyy kahteen välilyöntiin ja rivinvaihtomerkkiin (\n)
Esimerkki¶
Jotta yllä mainitut pelisäännöt tulisivat mahdollisimman selkeiksi kaikille, ohessa on esimerkki protokollan käytöstä.
Lähetettävä sana: aasi
Muunnetaan sana sarjaksi Morse-koodattuja kirjaimia, jokaisen kirjaimen väliin yksi välilyönti:
aasi => . - ␣ . - ␣ . . . ␣ . . ␣ ␣ - - - ␣ - . ␣ ␣ ␊
(␣ = välilyönti). Välilyöntejä on lisätty, jotta symbolit näkyisivät selkeämmin.
The final message to be sent: .-␣.-␣...␣..␣␣---␣-.␣␣␊
Huomaa, että viesti päättyy kahteen välilyöntiin ja rivinvaihtomerkkiin (\n).
Työasemaohjelma¶
Kurssin virtuaalikoneeseen on jo valmiiksi asennettu USBin kautta Morse-muodossa viestejä lähettävä ja vastaanottava ohjelma. Saat sen käynnistettyä joko työpöydällä olevan "Serial Client"-pikakuvakkeen avulla. Mikäli tämä ei toimi, voit käyttää virtuaalikoneen terminaalia ja ensiksi navigoida ohjelman kansioon komennolla
cd ~/utils/serial_client, jonka jälkeen saat ohjelman käynnistettyä komennolla python3 src/main.py.Käynnistyessään ohjelma lukee samassa kansiossa sijaitsevan tiedoston
config.json, joka sisältää tarvittavat konfiguraatiot eri kehitysalustojen käyttöön. Nyt konfiguraatiotiedostossa on jo valmiina asetukset tämän kurssin laitteille (Pico W), mutta sinne olisi myös mahdollista sisällyttää muitakin laitteita. Jos asetusten lukeminen onnistuu, ohjelma tulostaa näytölle Config loaded with 3 known devices, jonka jälkeen se siirtyy odottamaan tunnetun laitteen yhdistämistä.Kun tunnettu laite liitetään työasemaan, se siirtyy viestintätilaan. Tässä tilassa terminaaliin kirjoitetut viestit (ohjelmakomentoja lukuun ottamatta) lähetetään liitettyyn laitteeseen morsekoodina USB-sarjaviestinnän kautta. Laitteelta vastaanotettu Morse-muotoinen data tulostetaan terminaaliin, ja kun siitä havaitaan kaksi välilyöntiä, joita seuraa rivinvaihtomerkki, viesti itsessään muunnetaan tekstiksi ja tulostetaan ikkunaan. Näin voit nähdä lähetetyn viestin, mutta myös viestin muodostavat merkit, mikä voi helpottaa ohjelman debuggaamista.
Komennot¶
Kuten aiemmin mainittiin, kaikki viestit, jotka sisältävät vain sallittuja merkkejä, lähetetään laitteelle USB:n kautta Morse-koodattuna, poikkeuksena ohjelmakomennot. Lisäksi kaikki teksti, joka on __-merkkien välissä, ei tulkita Morse-koodina, joten voit lisätä debug-viestejä Morse-koodin sekaan aloittamalla ja lopettamalla viestin __-merkeillä.
Seuraavia komentoja voidaan käyttää ohjelman ohjaamiseen.
.cleartyhjentää terminaalin näytön.exitlopettaa ohjelman suorituksen
Asennus omalle tietokoneelle¶
Lähdekoodi ja ohjeet ohjelman asentamiseen ja suorittamiseen opiskelijan tietokoneella löytyvät osoitteesta serial-client GitLab -projekti.
Tasot ja vaatimukset¶
Palautettavat tehtävät on jaettu kolmeen tasoon. Perustason (Taso 1) suorittaminen vaaditaan kurssin läpäisemiseksi. Kaksi muuta tasoa ovat vapaaehtoisia, ja niiden suorittaminen voi parantaa arvosanaa.
Taso 1: Perustoiminnallisuus (6 pistettä)¶
- Kaikkien ryhmän jäsenten on osallistuttava ohjelman kehittämiseen. Pelkkä testaaminen tai suunnittelu ei riitä.
- Opiskelijoiden on käytettävä Raspberry Pi Pico W:tä yhdessä kurssilla annetun JTKJ Hat -lisäosan kanssa.
- Ohjelma on kirjoitettava C-kielellä.
- Ohjelma on toteutettava käyttäen FreeRTOS:ia ja siinä on oltava vähintään kaksi tehtävää.
- Koodin on käännyttävä onnistuneesti ja sen on oltava siirrettävissä laitteelle.
- Koodissa on oltava kommentteja, jotka selittävät ohjelman rakenteen ja eri osien toiminnan.
- Ohjelman on noudatettava kurssilla esitettyjä koodausohjeita. Muuttujien ja funktioiden nimien on oltava merkityksellisiä.
- Ohjelman on käytettävä pakollisissa harjoituksissa esitettyä kansiorakennetta.
- Opiskelijoiden on tallennettava video, jossa esitellään ohjelman toiminnallisuus. Videon vaatimukset on kuvattu alla.
TOIMINNALLISET VAATIMUKSET
- Ohjelman on tunnistettava laitteen asentoja morsemerkkien muodostamiseksi. Vähintään kaksi asentoa on tunnistettava. Esimerkiksi laitteen jättäminen pöydälle voi vastata pistettä (.), kun taas sen kääntäminen 90 astetta voi vastata viivaa (-). Painikkeita voidaan käyttää välilyönnin lähettämiseen, asennon vahvistamiseen tai koko viestin lähettämisen käynnistämiseen.
2. Ohjelman on pystyttävä lähettämään symbolit (piste, viiva ja välilyönti) työasemalle USB-sarjaviestinnän kautta.
Videon vaatimukset¶
- Video on tallennettava englanniksi tai suomeksi, mieluiten tekstityksillä.
- Videon kesto on oltava 1–3 minuuttia.
- Jos video ladataan Lovelaceen, sen koko ei saa ylittää 50 Mt. Jos se ladataan muulle verkkoalustalle, kokorajoitusta ei ole.
- Jos video ladataan verkkoalustalle, linkki on jaettava palautuslaatikossa. Varmista, ettei video ole yksityinen — kurssin henkilökunnan on päästävä siihen käsiksi.
- Kaikkien ryhmän jäsenten on esiinnyttävä videolla.
- Videon demossa on näytettävä seuraavat vaiheet:
- Koodi kääntyy ja voidaan siirtää laitteelle.
- Laitteen asentoa muuttamalla eri symboleja lähetetään työasemalle.
- Miten signaali vastaanotetaan työasemalla ja miten viesti puretaan tekstiksi. Sekä laite että työaseman terminaali on oltava näkyvissä yhtä aikaa samassa kuvassa (ei erillisissä ikkunoissa).
- Opiskelijoiden on keskusteltava seuraavista asioista:
- Kuinka monta tehtävää on käytössä ja mikä on kunkin tehtävän toiminnallisuus?
- Kuinka monta keskeytystä on käytössä. Kullekin keskeytykselle on määriteltävä: lähde, keskeytyskäsittelijä ja lyhyt kuvaus sen toiminnasta.
- Kuinka monta globaalia muuttujaa on käytössä. Mihin niitä käytetään? Mikä on kunkin globaalin muuttujan tietotyyppi? Miksi kyseinen tyyppi on valittu?
- Onko tehtävien välillä käytössä synkronointimekanismeja? Mitkä ja miksi?
- Miten asennot tunnistetaan? Käytetäänkö suodatusta tai datankäsittelyä? Mitä anturidataa käytetään? Mitkä kynnysarvot on asetettu asentojen tunnistamiseen?
- Miten data lähetetään työasemalle? Mitä sarjaviestintäprotokollaa käytetään? Miten data on jäsennelty?
- Selitä kunkin ryhmän jäsenen panos projektiin.
Arviointi¶
Projekti arvioidaan hyväksytty/hylätty -periaatteella. Vaatimusten täyttäminen antaa 6 pistettä.
Taso 2: Full-duplex -viestintä ja käyttöliittymä (Max. 11 pistettä)¶
- Kaikki Tason 1 vaatimukset on täytettävä.Videota ei vaadita
Vähimmäisvaatimukset¶
- Ohjelman toteutuksessa on käytettävä yhtä tai useampaa tilakonetta.
- Symbolien lähettämisen lisäksi ohjelman on myös pystyttävä vastaanottamaan viestejä työasemalta. Vastaanotetut symbolit on näytettävä LCD-näytöllä ja esitettävä myös jonkin muun toimilaitteen avulla (esim. summeri tai LED).
- Ohjelman on annettava palaute, kun viesti on lähetetty onnistuneesti.
- KAIKKIEN ryhmän jäsenten on osallistuttava loppupalaveriin (ks. alla).
HUOM: Sovelluksen ei tarvitse osata muuntaa morsekoodeja kirjaimiksi tai päinvastoin.
Lisätoiminnallisuudet¶
- Symboleja voidaan tuottaa käyttämällä:
- Valoanturia
- Mikrofonia
- IMU:ta (tunnistamalla 2–3 erilaista liikettä asentojen sijaan)
- Toteutus vaatii datankeruuta ja analyysiä. Katso lisätietoja alla.
- Yhdistelmää edellä mainituista
Tässä tapauksessa IMU:n toteutus antaa enemmän pisteitä kuin mikrofonin käyttö, joka puolestaan antaa enemmän pisteitä kuin valoanturin käyttö. Vahva ja luotettava IMU-tunnistusalgoritmi antaa eniten pisteitä.
2. Yksi seuraavista mahdollisista lisäyksistä:
- Valikko käyttöliittymässä, jossa käytetään painikkeiden, äänten, LEDien ja näytön yhdistelmää.
- Summerilla soitettu musiikki jossakin ohjelman vaiheessa.
- Yksityiskohtainen datankeruu ja analyysi IMU-toteutusta varten.
- Morsekoodisymbolien muuntaminen kirjaimiksi.
- Kehittyneiden synkronointimekanismien käyttö, kuten muteksisemufoorit ja/tai tehtävien välinen viestintä jonoilla tai sanomilla.
- Mikä tahansa muu lisätyö, jota ei ole sisällytetty Tasoon 3.
Loppupalaveri¶
- Palaveri voidaan pitää englanniksi, suomeksi tai näiden sekoituksena (“Finglish”).
- Loppupalaverissa kaikkien ryhmän jäsenten on oltava paikalla. Poissa oleva(t) jäsen(et) eivät saa arvosanaa ennen kuin he ovat selventäneet oman panoksensa työhön.
- Jokaisen ryhmän jäsenen on pystyttävä vastaamaan kysymyksiin ohjelman toteutuksesta sekä teorian ja käytännön välisestä yhteydestä. JOS ET PYSTY VASTAAMAAN PERUSKYSYMYKSIIN, KOKO PROJEKTIN ARVOSANAKSI TULEE 0.
- Jokaisen ryhmän jäsenen on pystyttävä selittämään oma henkilökohtainen panoksensa projektiin.
- Opiskelijoiden on esitettävä ohjelman demo, jossa näytetään toteutetut toiminnallisuudet. Demo siirretään laitteelle opettajan tietokoneelta ja sarjaviestintäohjelma ajetaan myös opettajan tietokoneelta.
- Palaverin lopuksi opiskelijoiden on palautettava laite.
Arviointi¶
Katso tarkemmat arviointikriteerit Taso 2:n palautuslaatikosta.
Taso 3: Projektien välinen viestintä / Kirjaston kehitys (Max. 3 pistettä)¶
- Kaikki Tason 2 vähimmäisvaatimukset on täytettävä.
- VAIHTOEHTO 1: Ohjelman on pystyttävä viestimään (morsekoodilla) toisen kurssiryhmän laitteen kanssa.
- Viestintäkanavan päättävät ryhmät itse:
- Wi-Fi
- UART
- Valo (LED + valoanturi)
- Ääni (mikrofoni + summeri)
- VAIHTOEHTO 2: Kehitä jokin osa TKJHAT SDK kirjastoa.
- Integroi anturien keskeytykset, eli ota käyttöön ja hyödynnä keskeytyksiä antureissa.
- Lisää kirjastoon erilaisia apufunktioita.
- Paranna olemassa olevan kirjaston tehokkuutta.
- Keskustele kurssihenkilökunnan kanssa varmistaaksesi, että ideasi on toteuttamiskelpoinen ja järkevä.
Loppupalaveri¶
Katso tiedot Tason 2 kohdasta.
Lisäksi kahden yhteistyötä tekevän ryhmän jäsenten on varattava peräkkäiset palaveriajat, jotta molemmat voivat tehdä loppudemonsa samanaikaisesti. Muu työ esitetään kuitenkin erikseen.
Lisäksi kahden yhteistyötä tekevän ryhmän jäsenten on varattava peräkkäiset palaveriajat, jotta molemmat voivat tehdä loppudemonsa samanaikaisesti. Muu työ esitetään kuitenkin erikseen.
Arviointi¶
Katso tarkemmat arviointikriteerit Taso 3:n palautuslaatikosta.
Lisätuki¶
Liikkeen tunnistaminen¶
Tämä osio voi olla sinulle hyödyllinen, jos päätät tunnistaa liikettä IMU-anturin avulla.
Ohjauskomentojen toteutus laitteen liikkeenä, sitä kädessä pitäen, on ryhmän itsensä vapaasti päätettävissä. Mahdollisia vaihtoehtoisia toteutustapoja ovat ainakin seuraavat:
- Laitteen liu'utus pöydänpintaa pitkin
- Laitteen kallistus ja/tai liike
- Laitteen hyppyytys (=käy välillä ilmassa) pöydänpintaa pitkin
- Laitteen liikuttelu ilman tukea "3D:nä" ilmassa.
Yleisiä ohjeita ohjauskomennon tulkitsemiseen:
- Kannattaa määrittää kuinka voimakkaasti ja kuinka pitkä ajallisesti yksi komento on.
- Esimerkiksi onko liike pieni nykäisy vai yhden sekunnin mittainen, hidas liike pöydän pinnalla valittuun suuntaan?
- Anturidatan keräystaskissa aikaväli, ts. kuinka usein anturilta kysytään dataa.
- Esimerkki: kerran sekunnissa ehkä liian hidas aikaväli laitteen liikkeelle, mutta entäpä jos dataa ottaa talteen 5 tai 10 kertaa sekunnissa?
- Ohjauskomennon tulkitsemiseen ei tarvitse toteuttaa kovinkaan hienostunutta algoritmia. Riittää, kun analysoi esimerkiksi kiihtyvyysarvojen muutoksia ajan funktiona. Kts esimerkkidata alla.
- Harjoitustyö ei edellytä lukiotasoa syvällisempää matematiikan osaamista, joten ohjauskomentojen tunnistusalgoritmin laatua ei arvostella. Tietysti saa toteutuksen tehdä itse niin hienoksi kun haluaa.
- Ohjelman tulee kuitenkin reaalimaailman testitilanteessa tunnistaa liikekomennot.
- Ohjauskomentojen ketjuttaminen on ok, eli jatkuvasta/pitkäkestoisesta liikkeestä voi tulkita useammankin komennon.
Komennon tulkitseminen¶
1. Työ kannattaa aloittaa siten, että kerää IMU-anturilla oman datasetin aikasarjana talteen, samalla kun käsin liikuttaa laitetta. Keräys kannattaa toteuttaa niin, että tekee vain yhden liikkeen kerrallaan ja tallentaa sen omaan tiedostoonsa.
- Mittaustuloksiin on syytä liittää aikaleima mukaan, jotta pystyy laskemaan ajallista kestoa.
- Anturi antaa kurssikirjastomme avulla kuusi eri mittausarvoa per datan kysely, jotka ovat:
- Kiihtyvyys (acceleration) x-, y- ja z-akselit, yksikkönä painovoima g
- Asentomuutos (gyroscope) x-, y- ja z-akseleilla, yksikkönä kulmanopeus
Kun dataa kerätään taulukkoon, saadaan lopputuloksena 7-ulotteinen taulukko. Taulukossa data saattaa näyttää esimerkiksi seuraavalta:
aika, acc_x, acc_y, acc_z, gyro_x, gyro_y, gyro_z
0, 0.0029, -0.0063, -1.0115, 1.1215, -0.4578, 0.3204
11, 0.0133, 0.0291, -0.9753, 0.0229, -0.0458, -0.2060
19, 0.0028, 0.0964, -1.0406, 5.2948, -14.09, 19.0735
30, -0.085, 0.2474, -1.8069, -1.833, 0.0992, 15.4953
41, -0.20, 0.3864, -2.2000, -6.180, 29.9924, 70.5643
Huomaa, että luvut on normalisoitu painovoiman mukaan. Siten 1 tarkoittaa 9,8 m/s².
2. Tuloksena kerätystä datasta voidaan visualisoida eri akselien suhteen mitä datassa tapahtui minkäkin liikkeen / komennon suorituksen aikana, ja tätä kautta hahmottaa miten tunnistus kannattaisi tehdä ohjelmallisesti.
Visualisoimalla nähdään helposti siis millaista anturidata on komennon eri vaiheissa, kun laite liikkuu:
- Riittääkö pelkkä liike ja sen keston mittaaminen? Miten liike näkyy datassa?
- Pitääkö komennossa lähteä ja päätyä johonkin asentoon?
- Minkä verran "virhettä" (esim. liikettä muiden akselien suuntaan) komennon suorituksessa sallitaan?
- jne..
3. Datasetin keräämisen ja visualisoinnin jälkeen ohjauskomento voidaan tunnistaa datasta hyvinkin yksinkertaisesti:
- Liikkeen kesto eri akselien suhteen
- Valitun kynnysarvon ylitys/alitus jonkin akselin suhteen
- Aikasarjalle voidaan laskea erilaisia piirteitä kuten keskiarvo, varianssi, keskihajonta, ym, joilla voidaan erottaa komentoja toisistaan (ja halutessa hienosäätää komennon tunnistusta).
- Tästä voi olla myös hyötyä, jos haluaa ketjuttaa komentoja tai toteuttaa monimutkaisempia komentoja (niitä lisäpisteitä?)
- Koska anturidataa saadaan kolmella akselilla (x, y ja z), sitä voi myös käsitellä 2- tai 3-ulotteisena vektorina, jolla on esimerkiksi suunta ja pituus..
- Ihan mitä vaan matikankirjasta / netistä löytyy / tekoälykurssilla kerrotaan.
- Muistakaa mainita koodissa lähteet.
Valmista testidataa¶
Kurssihenkilökunta on etukäteen kerännyt pienen testidatan joukon erilaisista liikkeistä, jotka on tehty kädessä pidettävällä vastaavalla laitteella.
, jota työssä voi käyttää alustavaan komennon tunnistamiseen. Tässä mainitut tavat liikuttaa laitetta eivät välttämättä ole se ainut, helpoin, saati paras tapa toteuttaa komentoja kurssin laitteella.
, jota työssä voi käyttää alustavaan komennon tunnistamiseen. Tässä mainitut tavat liikuttaa laitetta eivät välttämättä ole se ainut, helpoin, saati paras tapa toteuttaa komentoja kurssin laitteella.
Testidata on kerätty SensorTagin kiihtyvyysanturilla MPU9250. Tiedostoissa datan formaatti on
[aikaleima, acc_x, acc_y, acc_z, gyro_x, gyro_y, gyro_z]. Data on mitattu siten, että laite on ollut liikkumatta paikallaan mittauksen alussa ja sitten on tehty liike ylös kahdella eri tavalla. Kuvissa data visualisoitu x, y, ja z-akseleille (eri väreillä) ajan suhteen sekä kiihtyvyys- (g) että asentoanturilla (kulmanopeus). 1. Anturidata laitteen ollessa liikkumatta paikallaan:
2. Anturidata, kun laitetta nopeasti nykäistään pöydällä suuntaan ylös kaksi kertaa:
3. Anturidata, kun laite nostetaan irti pöydältä ja siirretään suuntaan ylös:
Omaa testidataa¶
Omatoiminen testidatan keräys onnistuu helpoiten niin, että toteutatte laitteeseen ihan aluksi erillisen datankeräystaskin erillisenä ohjelmana tai taskina, joka ihan vaan kerää liikeanturin dataa taulukkoon valituin aikavälein. Lopuksi ohjelma tulostaa taulukon rivi riviltä kehitysympäristöön, josta se on helppo copy & pasteta editoriin ja/tai tiedostoon. Datan voi visualisoida vaikkapa jollain Python-kirjastolla (köh köh matplotlib) tai ohjelmalla kuten gnuplot:lla tai M$ Excelillä.
Tärkeää omaa testidataa kerätessä on tehdä liike aina samalla tavalla, eli käyttäjä ja anturi samassa asennossa, jne, ja ehdottomasti vain yksi liike kerrallaan. Tämä sen takia että visualisoinnissa näkee selvästi miten datassa tapahtui. Lisäksi eri mittauksissa kerätty data on tällöin keskenään vertailukelpoista eri mittauksien välillä. Ja huomataan, että eri ihmisten kädenliike on yleensä niin erilainen, että esimerkiksi yo. testidata ei suoraan teidän omaan komennon tunnistukseen. Anturi on niin tarkka että pienetkin eroavaisuudet saadaan kiinni.
Vinkkejä harjoitustyöhön¶
Yllättäen moni asia on jo kerrottu ja kysymyksiin vastattu luentomateriaalissa. Materiaaliin kannattaa siis perehtyä kunnolla..
Harjoitustyön toteutusta kannattaa lähteä purkamaan tkj-lisämateriaali-rakenteellinen-ohjelmointi-lisämateriaalin avulla. Näin saadaan isokin ongelma palasteltua helpommin toteuttaviin osasiin.
- Hyvin suunniteltu on 90% tehty!
- Isohko virhe mitä voi tehdä on jättää asiat viimetinkaan ..aloittelija ei varmasti saa työtä viikossa tehdyksi!
- Kannattaa vilkaista mitä kaikkea toiminnallisuutta C-kielen standardikirjastot ja RTOS:n eri kirjastot tarjoavat valmiiksi. Valmiit kirjastot kun helpottavat ohjelmointia suuresti, liittyen esimerkiksi merkkijonojen käsittelyyn..
- Koodatessa voi olla hyödyllistä koodata vaikeat kohdat ensin pc:llä. Myös liikkeentunnistus-algoritmien tms testaaminen PC:ssä on kertaluokkaa helpompaa. Sitten kun koodi on toimivaa, sitten vasta toteutuksen voi siirtää laitteelle ja testata siinä.
- Kannattaa käyttää toistorakenteissa, ehtolauseissa, yms, välitulostuksia, joissa tulostaa konsoli-ikkunalle (System_printf(..) + System_flush(..) tai printf(..)) muuttujien arvoja tms oleellista tietoa ohjelman etenemisestä. Tämä nopeuttaa merkittävästi virheiden metsästystä ohjelmasta.
- Tyyppiesimerkki ongelmasta, joka selviää nätisti välitulostuksilla on silmukkarakenteet, joissa tulostatte konsoli-ikkunaan joka iteraatiossa eri muuttujien arvot. Töissäkään pomo tuskin arvostaa, jos käytätte asioiden pähkäilyyn paljon aikaa, kun ne selviäisi hetkessä lisäämällä koodiin debuggitietoa..
- Tärkeää on muistaa, että jos jäätte jumiin, kysykää!! Kurssihenkilökuntahan on palkattu teidän avuksi..
Työkohtaisia vinkkejä¶
Päivitämme tänne vinkkejä sitä mukaan kun harjoitustyön toteutus etenee ja tiedämme lisää..
- Ohjelma on syytä jakaa taskeihin niin, että yhdessä on viestintä, toisessa äänien toistamiseen, kolmannessa sensoridatan lukeminen, jne.
- Käyttöliittymään kannattaa toteuttaa Komennon tunnistus päälle/pois-toiminto.
- Esimerkki MPU9250-anturin käytöstä löytyy Git-varastosta.
- Sensoridataa kannattaa tietysti kerätä taulukkoon, josta sitä on helppo käsitellä aikasarjana.
- Huomioikaa tässä taulukon koko tavuina mihin olette keräämässä dataa, jotta se mahtuu laitteen muistiin! Käytössä on noin 20kB muistia, jonne siis pitää kaiken muunkin tavaran mahtua.
- Anturidataa voi tarvittaessa siistiä (esimerkiksi poistaa kohinaa) vaikkapa laskemalla liukuvaa keskiarvoa tai muuta menetelmää käyttäen. Se harjoitustehtävä..
- Testidataan mittausajanhetken saa kysyttyä FreeRTOS:n funktiolla
xTaskGetTickCount() - Laitteen komponenttien alustuksia ei pidä laittaa
main-funktioon vaan taskien alkuun. Tämä mm. siitä syystä, että työssä halutaan tehtäväpohjainen toteutus ja osa komponenteista tarvitsee RTOS:n toiminnallisuutta joka käynnistyy vasta main:n lopussa. - Luentomateriaalissa on esimerkki tilakoneesta, jota kannattaa soveltaa harjoitustyössä.. suora copy & paste SensorTagiin ei tietenkään toimi.
- Jos aiot käyttää HATia akun varassa (ilman USB-kaapelia), akku tyhjenee lopulta — erityisesti, jos laite jää vahingossa päälle. Toteuta virtapainike koodissa. Huomaa, että akkujen käyttö laitteen kanssa ei ole vielä testattu.
FAQ¶
- Voiko työn tehdä itsekseen?
- Yleinen vastaus on EI. Jos sinulla on perusteltuja syitä työskennellä yksin, ota yhteyttä opettajaan. Saatat joutua hankkimaan oman laitteiston.
- Voiko työn tehdä isommassa ryhmässä kuin pari?
- Työn voi tehdä 2-3 hengen ryhmässä. Aiempina vuosina kolmen hengen ryhmien piti tehdä lisätehtäviä, mutta syksyllä 2025 tämä käytäntö ei ole voimassa. Neljän hengen ryhmät eivät ole sallittuja.
- Koodi toimi kotona, mutta ei harjoitustyön arvostelun aikana. Voinko kokeilla omalla tietokoneellani? Voinko näyttää sen etänä kotoa?
- Ei. Tarkista, että koodi toimii kurssin virtuaalikoneille asennetussa kehitysympäristössä ennen palauttamista.
- Saako työstä jutella kaverin kanssa?
- Saa tietenkin keskustella harjoituksissa, illanistujaisissa, jne, mutta joskun kaksi ryhmää palauttaa saman koodin, saatatte syyllistyä plagiointiin. Tästä syystä yhteistyötä tehneet ryhmät tulee ilmoittaa koodin kommenteissa tms.
- Raja menee siinä, että tehtävästä saa keskustella, mutta koodi pitää kuitenkin itse tehdä!
- Voiko työn palauttaa myöhässä?
- Ei.
- Saako jonkun muun (tai netistä löytynyttä) koodia käyttää?
- Samalle kurssille osallistuvien koodia ei saa käyttää, vaikka ilmoittaisi lähteenkin. Ts. toisten lopputyöstä koodia ei saa kopioida omaan työhön.
- Muutoin saa, kunhan ilmoittaa mistä koodi on haettu (www-sivu tms), ettette syyllisty plagiointiin.
- Voinko käyttää tekoälyä?
- Kyllä, kunhan kerrot koodissasi, mitä tekoälyä olet käyttänyt, mitä kehotteita ('prompt') olet käyttänyt ja miten olet muokannut koodia tekoälyn antaman vastauksen perusteella.
- Mites plagiointi?
- Yliopistolla on ohjeistus miten plagioinnin kanssa menetellään. Noudatamme niitä.
Väliaikainen koodin jakopaikka¶
Voit käyttää tätä palautuslaatikkoa koodin jakamiseen tiimin jäsenten kesken. ÄLÄ KÄYTÄ TÄTÄ PALAUTUSLAATIKKOA VALMIIN HARJOITUSTYÖN PALAUTUKSEEN. TÄSSÄ PALAUTUSLAATIKOSSA OLEVAA KOODIA EI ARVIOIDA