8. UART liidese abil andmete vahetamine Arvuti ja Arduino vahel, ASCII tabel
<- eelmine peatükk
järgmine peatükk ->
8.0. seosed eelnenud peatükkidega
Seitsmendas peatükis tutvusime Serial monitori kasutamisega. Selles peatükis tuleb Serial monitori kogemus kasuks: teeme sissejuhatuse arvuti ja Arduino omavahelise side teemasse.
8.1. Eesmärk ja selgitused
Selle peatüki järel õpilane
Maketeerimislauale me midagi ehitama ei pea—saame selle teooriatunni juurde teha illustreerivaid programmi-katsetusi ka sisseehitatud LED-iga. Ent kui on soovi, siis võib ka koostada vooluahela ühe LED-iga. Näeme, et seda on kerge juhtida otse Serial monitori pealt.
8.2. Töövahendid kaheksandaks tunniks
8.3. Tegevused
8.3.1. USART = Universal Synchronous/ Asynchronous Receiver-Transmitter
Kahte tüüpi järjestikside
Meid selle tunni kontekstis huvitava järjestikside (serial communication) alla kuulub kahte tüüpi sidet.
Asünkroonses järjestiksides alustamise ning lõpetamise bittide kasutamise kohta saame joonistada sellise skeemi:
USART on arvuti riistvara osa, mis võimaldab kasutada nii sünkroonset järjestiksidet (synchronous serial communication' —ülal vt A all kirjeldatu) kui ka asünkroonset järjestiksidet (asynchronous serial communication —ülal vt B all kirjeldatu).
USART on osa Arduinost—vajame seda osa selleks, et saaksime lasta toimuda suhtlusel Arduino ning arvuti vahel. (Arduino sidevõimalusi kirjeldavates allikates räägitakse ka UART-ist (Universal Asynchronous Receiver-Transmitter)—st sel juhul ei puudutata sünkroonset sidet.)
NB!
Jätame meelde, et sünkroonse side korral on seadmetel kasutada „ühtne kell“ omavahelise sidetakti hoidmiseks—Common Clock Signal. Jätame meelde, et see võimalus puudub asünkroonse side korral.
Asünkroonse side puhul on samamoodi vajalik side korrastatus, ent see saavutatakse teistsuguste vahenditega: kasutades 1) meile juba praktikast tuttavat baudides mõõdetavat sidekiirust (impulssi sekundis) ning 2) edastatava info algus- ja lõppsignaale. Nii sünkroonse kui ka asünkroonse side puhul peab olema sides osalejate suhtlus korrastatud.
- UART—kasutab ainult asünkroonset—st mitte-sünkroonset infoedastusviisi.
- USART—saab kasutada nii sünkroonset kui ka asünkroonset infoedastusviisi.
Kõigil Arduinodel on vähemalt üks järjestik-port (serial port): kas siis UART või USART. See suhtleb digitaal-viikude rivis tähistusega 0 (RX) ja 1 (TX) märgitud viikude kaudu või USB pistikuga ühendatud USB kaabli kaudu, milles samuti on kasutuses needsamad RX ning TX—ainult et USB-kujul.
NB!
Olulisim praeguse õppematerjali kontekstis meele jätta on see, et Arduino side-viikude 0 (RX) ja 1 (TX) külge ei maksa midagi muud ühendada! Selle õpiku peatükkides küll puudutame RX ja TX otstarvet, ent päris ühendamiseni me ei jõua.
0 (RX) ja 1 (TX) puhul ühendusi ehitades peab kontrollima voolutugevusi—et mitte rikkuda Arduinot või muud projektis vajalikku vahendit. Sellel kursusel me aga midagi ei vastuvõtva 0 (RX) ega ka edastava 1 (TX) viigu peale ei ühenda.1
1 Vt ka https://www.arduino.cc/reference/en/language/functions/communication/serial/
Harjutus A
Vaata oma Arduinot: leia 0 (RX) ja 1 (TX) ja jäta meelde, et antud kursusel me neid kahte kuhugi ei ühenda, sest kasutame neid programmi Arduinole laadides.
Kui laeme järjekordset programmi Arduinole on mõlemad viigud töös.
- Mis annab märku, et mõlemat viiku kasutatakse?
Lae Arduinole mingi programm ning samas jälgi laadimisel Arduino arendusplaadil näha olevat. Millised sisse-ehitatud LED-id hetkeks korraga helendavad? Vaata järgi, mis tähistused neil kahel on.
Serial monitor Serial monitor on Arduinol sisalduv mugav võimalus näiteks mingi anduri pealt loetavaid andmeid eraldi aknas jälgitavaks ning kasutatavaks kuvada.
Rääkisime eespool kellast ja taktist.
Vaadake punasega tähistatud kohta programmis ja reguleerimismenüüd Serial Monitori akna allosas ja leidke baudides reguleeritav sümboliedastus-kiiruse osa. Antud pildil on aknas aktiivne 115200 baudi.
Heitke pilk allolevale pildile.
Serial monitori tööle saamiseks tuleb arvestada, et peame programmis ette ütlema õige sümboliedastus-kiiruse (baud rate): seesama peab aktiivseks klikitult olema näha meie Serial monitori all-servas asuvas valikmenüüs.
NB!
Programmis, mis kasutab Serial Monitori, tuleb ette öelda sümboliedastus-kiirus: baud rate—näiteks Serial.begin(115200) või mõni muu sellest menüüst valitav väärtus. Ent see peab kindlasti olema seesama väärtus nii Teie kirjutatud programmis kui ka Serial monitori all-servas asuval menüüribal. Kui need jätta erinevaks, siis Serial monitoriga töötamine ei ole võimalik. Sel juhul tuleb näiteks Serial monitori peal teha ära korrigeerimine vastavalt programmis toodud kiirusele või korrigeerida programmi ja siis programm uuesti käivitada.
Harjutus B
Meenutame, et seitsmendas peatükis oleme void setup() osas Arduinole andnud käsu Serial.begin(). Sulgudesse lisasime baudides impulsi-kiiruse (baud rate): sageli on eelistatud 9600 ja seda annab meie Arduino IDE ka vaikimisi.
Ent ükskõik kui kiiret sümboliedastust me ka ei vali—valiku teeme olenevalt vajadusest—meie programmis öeldu ja Serial monitorist vastu vaatav peavad olema üks ja seesama infotöötlemise kiirus. Tehke korra proovi—käivitage erinevate väärtustega ja uurige, mis juhtub… Suure tõenäosusega ei pruugi ekraanile tulla mitte midagi või tulevad oodatust erinevad märgid: näiteks mingid kastikesed. Siit teeme järelduse, et alati tuleb probleemide korral järgi vaadata, kas Teie poolt ette antud baudid Teie programmis ning Serial monitori aknas on sama või erineva väärtusega.
Harjutus B--iseseisvaks surfamiseks
Baud—viitab nimele: Emile Baudot, kes leiutas Baudot koodi telegraafi tarvis. Kui varasem sidestandard tugines minutis ülekantavate sõnade arvule, siis ühikuna üks baud vastab ühele impulsile sekundis.
Miks me ei saa kasutada sõna-minutis?
Miks on targem kasutada impulssi sekundis? Surfake sellest peatükist leitavate märksõnadega—vaadake näiteks, mida leiate Emile Baudot kohta ja mida näete netist ITU kohta: https://www.itu.int/en/about/Pages/default.aspx
Otsinguks võite proovida „ITU baud standard 1926“ Uurige selle 1926 aastal kokku lepitud standardi kohta.
7.3.2. ASCII (American Standrad Code of Information Interchange)
Oleme eelmistes programmides kasutanud datatüüpe int ja eelmisel tunnil float. Lisame neile juurde char: see on datatüüp, mis tarvitab 1-baidist mäluhulka selleks, et säilitada mingit tähistusmärki (character—programmeerimiskeeles Arduino IDE-s vastab sellele datatüüp char).
NB!
char kirjutatakse programmi ülakomade abiga näiteks nii: ’A’
Kui paneme kirja rohkem, näiteks „ABC-aabits“ , siis selline pikem järjestus nõuab juba jutumärke „“. Jätame selle meelde, sest pikemaid sõnajärjestusi läheb meil praktikas vaja.
Iga tähemärki, numbrit, või muud sümbolit tähistab mingi numbrikombinatsioon: vaata neid Arduino kodulehelt siit https://www.arduino.cc/en/Reference/ASCIIchart ASCII koodid on ka näiteks reavahetusel. Arduino kodulehel on ASCII tabel toodud tühikutega. Et vaadata kogu tabelit, saad teha internetiotsingu otsisõnadega „complete“, „ASCII“, „table“.
Harjutus C
ASCII tabel Serial monitor abiga: kas tabelis on kõik piisav ja vajalik?
Jooniselt näete, et valides Arduino IDE keskkonnas File-> Examples-> 04. Communications-> ASCII Table saame käivitada programmi. Kompileerime selle, seejärel laeme Arduinole. Antud juhul ei juhtu midagi, ilma et käivitaksime ka Serial monitori. Kui avame Serial monitori, siis prinditakse ASCII sümbolitabeli väärtusi erinevates numbrisüsteemides.
Kas saite oma arvuti ekraanile midagi sellist, mis jookseb tabeli lõpuni ja jääb peatuma selle viimasel sümbolil:
Et tabelit näha, käivitage näidisprogramm ning avage Serial monitor.
Uurige tabelit.
Lühendid tähendavad järgmist:
dec—detsimaalsüsteem ehk kümnendsüsteem, seda kasutame igapäevases matemaatilises suhtluses.
bin—binaar- ehk kahendsüsteem põhineb kahel elektrilisel olekul—pinge on kas olemas või puudub. Nende kahe tunnuse vahel erinevust teadvustades saame hakata loendama numbreid. Süsteem vajalik selleks, et arvutiga üldse midagi peale oleks hakata.
oct—kaheksandsüsteem 2 .
hex—kuueteistkümnendsüsteemi kohta on vaja tähele panna, et 16-süsteemis hakkab meil selle süsteemi baasi loendamiseks vajalikke numbreid nappima alates arvust üheksa: seega võtame appi tähed ja saame 0; 1; 2; 3; 4; 5; 6; 7; 8; 9; A; B; C; D; E; F. Edasi aga liigume nii: 10; 11; 12; 13; 14; 15; 16; 17; 18; 19; 1A; 1B; 1C; 1D; 1E; 1F…
Näiteks 1F detsimaalsüsteemis oleks 31.
2 Teeme siinkohal filoloogilise kõrvalepõike: detsimaalsüsteem—st kümnendsüsteem põhineb sellel, et kunagi kasutas inimene arvutamiseks sõrmi. Huvitav on teada, et sõna „digitaalne“ algallikas on sõrm—loendamise abivahend: digitus—Ladina keeles sõrm. Aga kummalgi käel asuva viie sõrme vahel on neli sõrmevahet, seega on kahel käel kokku kaheksa sõrmevahet—me ei loenda sõrmevaheks seda vahet, mis on tegelikult vahemik kahe käe vahel. Ja saamegi kahe käe sõrmede sõrmevahede loendamisega kaheksandsüsteemi. Kuigi loogilisem tundub loendada arve sõrmedel, siis Californias elanud Yuki keele kõnelejad on kasutanud loendamise alusena kaheksat sõrmevahet—nende igapäevane matemaatika seega pidi olema kaheksandsüsteemis. Kahjuks Yuki keel ei kuulu enam inimsuhtluses aktiivselt kasutatavate keelte hulka. Otsige internetist erinevate arvudesse puutuvate sõnade etümoloogia kohta: vaadake näiteks, mida leiate sõna ’calculus’ kohta.
Harjutus D
Pane kirja, kuidas tähistad detsimaalsüsteemi sajandat arvu heksadetsimaalsüsteemi numbriga.
Pane kirja, kuidas tähistad detsimaalsüsteemi sajandat arvu binaarsüsteemis numbriga.
Kumb numbritest on paremini loetav inimesele kumb arvutile?
Too näiteid: binaarsüsteemi kasutuse kohta, heksadetsimaalsüsteemi kasutuse kohta. Mõtle seejuures arvu 2 astmete peale. Surfa netis.
Harjutus E
Ava oma personaalarvutis kalkulaatoriprogramm ja leia selle menüüst võimalus lülitada arvuti ümber detsimaalsüsteemilt mõnele muule süsteemile. Tee seejärel katseks mõned triviaalsed arvutused. Seejärel konverteeri arvutuse tulemusena saadud arv detsimaalsüsteemi numbriks.
Harjutus F
Vahelduseks teeme harjutuse pistikupesa (inglise keeles power jack) abil. Vaatame võimalust ühendada Arduinole sõltumatu toide ajaks, mil me oleme Arduino oma arvuti küljest lahti ühendanud ent ikka soovime, et Arduino edasi töötaks. Pane kokku eelnenud peatüki põhjal töötav vooluahel ja anna Arduinole ette programm; oota kuni see laeb Arduinole ja hakkab tööle.
Seejärel eemalda USB kaabel. Mis juhtub Arduinoga? Kas on olemas veel järjestik ühendus (serial connection) ning kas on olemas toide?
Nüüd ühenda aga Arduinol asuva musta toitepesaga sobilik DC konverter. Mida märkad? Mõtle, kas saad praegu kasutada oma personaalarvutil Serial monitori? Mis on muutunud?
7.4. Veendume, et meie arvuti ja Arduino omavahelises asünkroonses sides leiab tõesti kasutust ASCII kood
Selleks ühendame kõigepealt USB kaabliga Arduino ja arvuti. Seejärel laeme Arduinole järgneva programmi, mis on kirjutatud selleks, et saata arvutist Serial monitoriga tähemärk Arduinole ning seejärel näha saadetud info „tagasipeegeldust“ Serial monitorisse.
void setup() { Serial.begin (9600); } void loop() { while (Serial.available () == 0); //Arduino ootab while-tsüklis sisendit int SerialMonitoriltSisend = Serial.read(); //sisendi saamisel loeb sisendi väärtuse muutujasse Serial.println(SerialMonitoriltSisend); //saadab loetu Serial monitorisse tagasi delay (5); }
Kui programm Arduinole laetud, siis saame aktiivseks klikkida Serial monitori akna ning asuda selle ülaservas asuvale reale sümboleid sisestama. Võime näiteks sisestada numbri üks ning seejärel Send aktiivseks klikkida.
Mida märkame? Kas vastuseks tuli kokku kolm ASCII-koodi? Vaadake ASCII tabelist järgi, mida need tähendavad. Kui võtta ära ln—println järelt—mis muutub? Mida tähendavad Serial monitori aknasse ilmuvad numbrid?
Harjutus G
Lisage numbritele ka vahe—et Serial monitori aknas oleks numbrid vaadeldavad ühes reas ent vahedega. Proovige erinevate sümbolikombinatsioonidega. Tundke ära, mis ASCII kood vastab millisele märgile.
(Võimalik on muidugi ka saada tagasi-peegeldusena see täht, mille teele panite—ning mitte ASCII koodi tähis. Saame jätta lahenduse leidmise koduseks ülesandeks—näiteks iseseisvaks tööks interneti abiga. )
7.5. Veendume, et saame kasutada Serial monitori ka näiteks LED juhtimiseks
Selle tarvis saad katsetada sisseehitatud LED-iga, ent muidugi on efektsem seda teha vooluahelasse ühendatud LED-iga. Viimasel juhul pead kontrollima, kas konstrueeritud vooluahel vastab ka alljärgnevale programmile. Kui ei vasta, siis tee kõik vajalik ja piisav, et asi toimiks.
Võime laadida Arduinole järgneva programmi.
int LED = LED_BUILTIN; int loeVaartust = 0; void setup() { Serial.begin(9600); pinMode (LED, OUTPUT); } void loop() { if (Serial.available() ) { loeVaartust = Serial.read(); delay(5); if (loeVaartust == 'a') { //digitalWrite (LED, HIGH); // a-ütlemise järel jäb LED särama for (int i = 1; i <= 6; i = i + 1) { digitalWrite(LED, HIGH); delay(400); digitalWrite(LED, LOW); delay(600); } Serial.println ("Kas nägid, et LED_BUILTIN säras 6 korda?"); } if (loeVaartust == '0') { Serial.println ("Vaata Arduinole--LED särab nüüd 2 sekundit."); digitalWrite (LED, HIGH); delay (2000); digitalWrite (LED, LOW); } } }
7.6 Kodutöö
Kuna olete programmis sisalduvaid võtteid juba eelnevates tundides uurinud, siis lihtsalt modifitseerige seda programmi—uurige Serial monitoriga LED juhtimise võimalusi. Kommenteerige tulemusi; eriti hinnatud on kommentaaridega viited sellele, mis vigu juhtusite tegema.