Sisukord:

Numbriliste andmete saatmine ühelt Arduino -lt teisele: 16 sammu
Numbriliste andmete saatmine ühelt Arduino -lt teisele: 16 sammu

Video: Numbriliste andmete saatmine ühelt Arduino -lt teisele: 16 sammu

Video: Numbriliste andmete saatmine ühelt Arduino -lt teisele: 16 sammu
Video: Сообщения в чате с использованием Firebase Firestore - приложение Flutter Chat Firebase # 6 2024, Juuli
Anonim
Saatke arvandmeid ühelt Arduino -lt teisele
Saatke arvandmeid ühelt Arduino -lt teisele

Sissejuhatus

autor David Palmer, CDIO Tech. Astoni ülikoolis.

Kas teil oli kunagi vaja saata mõned numbrid ühelt Arduino -lt teisele? See juhend näitab, kuidas.

Saate selle toimimist hõlpsalt testida, tippides lihtsalt jadamonitori terminali saatmiseks numbrite rea ja vaadake, kuidas numbrid tulevad tagasi teise Arduinoga ühendatud jadamonitori korral. Võite kasutada isegi Bluetooth -linki.

Mida see teeb

Kaks Arduino programmi (eskiisid Arduino keeles räägivad) vajavad väljatöötamist, üks põhiprogramm, et ühendada Arduino jadamonitori käivitav arvuti, teine toimida orjana, et saada meistrilt jadateade, see dekodeerida ja tagasi saata. Alam on valikuliselt võimeline kuvama numbreid, millega ta tegeleb, teisele IDE seeriamonitorile - igaks juhuks, kui soovite seda kasutada. See võib aidata esmalt asjade toimimist ja aitab teid, kui otsustate programme vastavalt oma vajadustele muuta.

Varustus

  • 2 Arduino oma
  • 2 USB juhet
  • patch juhtmed (vastavalt vajadusele)
  • 1 arvuti/sülearvuti, millel on Arduino IDE (saadaval tasuta allalaadimiseks veebisaidilt Arduino.cc)

Samm: seadistamine - seadistage kõigepealt riistvara

Seadistamine - seadistage kõigepealt riistvara
Seadistamine - seadistage kõigepealt riistvara
Seadistamine - seadistage kõigepealt riistvara
Seadistamine - seadistage kõigepealt riistvara

Ühendage 2 Arduinot arvuti 2 USB -porti.

Näpunäide: hea mõte on need tähistada tähtedega M ja S (peremees ja ori), et mitte hiljem segadusse sattuda (nagu on näidatud kahel fotol).

2. samm: seadistamine - ekraani seadistamine

Seadistamine - seadistage oma ekraan
Seadistamine - seadistage oma ekraan

Parim on seadistada ekraan nii, et see oleks olemas

  • IDE on laaditud Master programmiga vasakul ja
  • et orjaga paremal.

Hoidke Maseri ja Slave seeriamonitorid ka vasakul ja paremal, nagu siin ekraanipildil näidatud.

3. toiming: seadistage põhiosa ja seejärel ühendage - 1. osa

Seadistage põhiosa, seejärel ühendage - 1. osa
Seadistage põhiosa, seejärel ühendage - 1. osa

Kui seadistate oma Master End Serial Monitori kahe numbri saatmiseks, peate alati kasutama alguse, lõpu ja eraldaja märke ning komaeraldajat, nagu näete siin.

Nüüd peate ühendama 2 Arduino jadaühendusega. Seda tehakse kahe patch -juhtmega.

Kasutasin rohelist ja kollast

  • Võtke kõigepealt kollane, see peab ühenduma D6 -ga ühes Arduino ja D7 teises
  • Siis vastupidine rohelisele juhtmele, D7 esimesel ja D6 teisel Arduino'l.

Teise võimalusena, kui teil on midagi saadaval, näiteks paar Bluetooth -moodulit, näiteks HC -05, töötavad need ka täpselt nii, nagu ülaltoodud juhtmed.

Samm 4: seadistage põhiosa, seejärel ühendage - 2. osa

Seadistage põhiosa, seejärel ühendage - 2. osa
Seadistage põhiosa, seejärel ühendage - 2. osa
Seadistage põhiosa, seejärel ühendage - 2. osa
Seadistage põhiosa, seejärel ühendage - 2. osa

Kasutame tarkvara jadateeki. Lisateavet leiate sellelt lingilt

Seda näete kummagi programmi real 7. See konfigureerib tihvtid digitaalsed 7 ja 6 TX ja RX (saatmiseks ja vastuvõtmiseks). Nii liiguvad andmed Master Arduino kaudu rohelise traadi kaudu orja ja kui teise Arduino orjaprogramm on oma töö lõpetanud, kollase traadi kaudu tagasi. Sama illustratsiooni allservas (aknas Seeriamonitor) näete, et meie edastatud andmed on nüüd edukalt siin kirjeldatud ringi läbinud ja naasnud arvutisse, kui täisarvude paar on kenasti eraldatud.

5. samm: ülevaade visanditest / programmidest - programmi struktuur

Ülevaade visanditest / programmidest - programmi struktuur
Ülevaade visanditest / programmidest - programmi struktuur
Ülevaade visanditest / programmidest - programmi struktuur
Ülevaade visanditest / programmidest - programmi struktuur

Paigutus Nagu kõigis Arduino visandites, on ka kolm põhiosa:

  • Deklaratsioonid
  • Seadistus
  • Peamine silmus

Nagu sageli juhtub, oleme siin kasutanud neljandat jaotist, millele on lisatud funktsioonid. Kui te pole funktsioonide kasutamisega tuttav, võite Google'is otsida "Arduino funktsioone" ja leiate seletussaidid, nagu näiteks sellel lingil: www.tutorialspoint.com/arduino/arduino_functions…..

Samuti oleme kasutanud vahekaarte, et eraldada programm paremini hallatavateks plokkideks.

Meie kasutatud kolme plokki on näha ülaltoodud IDE akende iga illustratsiooni ülaosas:

  • simpleRxTx0330Master
  • levinud
  • märgib

Need on tegelikult programmi kaustas olevad eraldi failid, nagu näete selles Slave programmi failide Windows Exploreri vaates.

Sellel on väga hea põhjus.

  • Programmi koostades saime aru, et suurem osa meistri programmist oli sama, mis orja jaoks.
  • Lõppkokkuvõttes tõmbasime kõik tavalised osad vahelehele, mida me seetõttu nimetasime "tavaliseks", ja siis iga kord, kui olime osa silunud (testinud ja veendunud, et see töötab hästi), kopeerisime ja kleepisime selle terve vahelehe meistrilt orjale või viisa.
  • Märkmete vahelehed on ka identsed, kuna disain on üldine.

Ühtegi funktsiooni ei kutsuta seadistusest, neid kõiki kutsutakse tsüklist, seega oleme need loonud pärast seadistamist, kuid enne tsüklit.

6. samm: ülalt alla kujundamine

Hea idee on kavandada oma visand, alustades määratlusest, mida soovite teha.

Kui see on tehtud, võite hakata visandit tegema neid asju. Üldiselt, kui on mõni detail, mida te veel ei tea, tehke see funktsiooniks ja jätke funktsiooni loomine hilisemaks.

See järgib head disainifilosoofiat, mida õpetatakse paljudes ülikoolides ja mida nimetatakse CDIO -ks (kui te seda veel ei tea, saate selle googeldada ja leida selle selgitamiseks saite, näiteks: https://www.cdio.org/s.) See ütleb põhimõtteliselt: ärge alustage disaini enne, kui olete kontseptsiooni selgeks saanud. Ärge alustage rakendamist enne, kui kujundus on selge. Ärge oodake, et see toimiks enne, kui rakendus on selge. Esmalt C, siis D, I ja O. Igas järgmises etapis te kordate (minge ahela (de) ringi tagasi, nii et kui olete oma esialgse disainiahelaga rahul ja kontrollige, kas see ikka vastab kontseptsioonile), ja värskendage C, kui vaja. Ja nii edasi, nii et isegi kui olete jõudnud operatsioonile, minge tagasi üles ja vaadake uuesti, kuidas C praegu välja näeb, siis D ja mina ning tehke ja kontrollige kõiki Programmeerimisjoonistega töötab see sama, kui kujundate ülalt alla.

7. samm: kontseptsioon ja disain - 1. osa

Kontseptsioon ja disain - 1. osa
Kontseptsioon ja disain - 1. osa
Kontseptsioon ja disain - 1. osa
Kontseptsioon ja disain - 1. osa

Siinne kontseptsioon näeb välja nagu vahekaardil „Märkused” esitatud ülevaade.”

Kujundus võib tunduda silmuse varajase versioonina, mis sobib märkmete vahekaardiga ja võib välja näha umbes selline, nagu näete sellel joonisel

Vaadake, kuidas mulle meeldib kõigepealt CTRL-C, kopeerides kommentaarid esmalt silmuse pähe, ja seejärel hakake tühikuid täitma käskudega, mis neid asju teevad.

See kompileerib tegelikult OK, nagu näete joonisel ekraani allosas. See ulatub CDIO etapist D I-ni ja koodi väljatöötamisel on hea mõte sellel D-I-ringil ringi liikuda.

Nüüd on aeg minna järgmisele etapile, seal on kommentaar, mis ütleb, et me hakkame: // riistvara USB -lt midagi vastu võtma, siis edastame selle tarkvara jadakanalile. Selle kirjutamiseks kirjutame selle koodi - read 133–138 on siin näidatud kollase esiletõstjaga

8. samm: kontseptsioon ja disain - 2. osa

Kontseptsioon ja disain - 2. osa
Kontseptsioon ja disain - 2. osa
Kontseptsioon ja disain - 2. osa
Kontseptsioon ja disain - 2. osa

Kaks esimest funktsiooni, mida me siin tutvustame, on (recv () ja tran () riistvaraportist vastuvõtmise ja tarkvaraporti edastamise tegemiseks - seega helistades neile näidatud parameetritega „hw” või „sw”.

Lisaks neile oleme lisanud testi globaalsele muutujale nimega newData. See on lipp, mille paneme funktsiooni "void recv ();" sisse. Kui sõnum on vastu võetud, märgitakse see muutuja väärtusest väär tõele. Me teeme seda nii, et edastame sõnumi ainult siis, kui see on real 134 vastu võetud (lipp == tõene). Kui oleme oma sõnumi edastanud, on see „töö tehtud”, nii et tühistame lipu uuesti reale 137.

Jällegi saame kontrollida kompileerimist (D kuni I) ja seekord on meil veateade „pole deklareeritud” (näidatud). See ütleb meile, et me pole deklareerinud recv (); funktsiooni. Plaanime seda teha hiljem, nii et selleks korraks, et saaksime saada puhta kompile, peame looma näiv- või kohatäitefunktsiooni, nagu allpool näidatud.

Jällegi saame kontrollida kompileerimist (D kuni I) ja seekord on meil tran () jaoks veel üks "deklareerimata" veateade; funktsiooni. See nõuab sarnast tüve loomist. Jällegi saame kontrollida kompileerimist (D kuni I) ja seekord leiame, et see töötab ideaalselt; siiamaani on kõik korras.

9. samm: lõpetage põhisilmus: A) USB -lt vastuvõtmine, B) orjast Arduino vastuvõtmine

Lõpetage põhisilmus: A) USB -lt vastuvõtmine, B) orjast Arduino vastuvõtmine
Lõpetage põhisilmus: A) USB -lt vastuvõtmine, B) orjast Arduino vastuvõtmine
Lõpetage põhisilmus: A) USB -lt vastuvõtmine, B) orjast Arduino vastuvõtmine
Lõpetage põhisilmus: A) USB -lt vastuvõtmine, B) orjast Arduino vastuvõtmine

Selle osa lõpetamiseks oleme lisanud veel ühe lõigu, milleks on silumiskoodi lisamine.

Visandite silumisel on veel üks juhend, millele võib viidata, et mõista, mida oleme siin teinud ja miks. Vaadake juhendit "Kuidas Arduino visandeid ehitada ja testida, kuni need töötavad"

Nii et need silumisliinid [näidatud 136-139] lisatakse põhisilmus järgmisena ja näete, et saate neid testida põhilõigus, muutes silumismuutuja tõeseks ja kompileerimiseks (I), siis kui Kui ühendate Arduino üles, saate selle üles laadida, avada seeriamonitori ja vaadata, kas jadamonitori sisu on selline, nagu siin näidatud (kas näete sõnumit "DEBUG MODE"?)

10. samm: andmete vastuvõtmine ja käitlemine orjus Arduinos

Andmete vastuvõtmine ja käitlemine Arduino orjas
Andmete vastuvõtmine ja käitlemine Arduino orjas
Andmete vastuvõtmine ja käitlemine Arduino orjas
Andmete vastuvõtmine ja käitlemine Arduino orjas

Saamine orjast Arduino

Lisage teise kanali jaoks vajalik kood põhiahelasse, tarkvara jadovastuvõtja, nagu näidatud - read 149 kuni 155.

Kas näete, et struktuur põhineb lõdvalt sellel, mille me ülalkirjeldatud juhtumi jaoks kirjutasime?

Samuti näete, et saame kompilaatori vea, teise deklareerimata funktsiooni - seekord parseData (); - seega peame ka selle jaoks tühiku tegema, enne kui saame käivitada vigadeta testkompile.

Andmete käitlemine orjus Arduino

Lisage Arduino jaoks vajalik põhiahela kood, kui see on konfigureeritud alamseadmeks, nagu näidatud - read 163 kuni 174. Kas näete, et selle struktuur on väga sarnane esimese kanali omaga?

Ja peaksite leidma, et seekord on see kompileeritud täiesti hästi.

Samm: kirjutage vastuvõtufunktsioon

Kirjutage vastuvõtufunktsioon
Kirjutage vastuvõtufunktsioon

Funktsioonil Vastuvõtt - void recv (char from) {} - on kaks põhitööd.

1, et saada USB -kanalilt tähemärkide jada

2, et saada üks kanalilt Arduino kuni Arduino.

Esiteks peame kasutama, kuna see kasutab Arduino sisseehitatud riistvara UART, ja teiseks, kasutades standardset Arduino raamatukogu: tarkvara UART.

Kui hakkame funktsioonile koodi lisama - selleks, et luua funktsioon, mis teeb midagi, mitte ainult tüve -, peame meeles pidama selle asendamise eemaldamist või kommenteerimist. Vastasel juhul saame kompileerimisvea: 'void lrec (char)' uuesti määratlemine.

Proovige viga saada ja proovige seejärel sellest vabanemiseks ühte ülaltoodud viisidest.

Alustage funktsiooniga, mis näeb välja nagu see, mida me siin kollaste ridadega 75 kuni 88 näitame.

Nüüdseks teate, et koodi omamisega peate proovima kompileerimise toimingut. See annab teile vea, nagu meil oli varem, tüüpi: funktsiooni nimi selles ulatuses deklareerimata. Meil on esialgu vaja teist tüki, et saaksime sellest veast mööda kompileerida, nii et lisage üks sarnaselt varem ja veenduge, et saate nüüd kompile ilma vigadeta.

Nüüd vaatame funktsiooni recv () jaoks kirjutatud koodi.

See on üsna puhas, näete „if” tingimuse kasutamist ülalnimetatud funktsiooni kahe osa tootmiseks.

Osa "sw" ja "hw" sees olev kood on samas vormis ja ma kirjeldan seda siin.

Ridapaari esimene on igal juhul mõne aja tsükli algus. Kui te pole aegadega tuttav, saate selle selgituse ja näidete saamiseks otsida saidilt Arduino.cc/Reference. Siin ootame, kuni sisseehitatud funktsioon Serial ei ole ühtegi märki saanud ja kuna muutuja newData on välja lülitatud (st tingimus newData == false on tõene). Niipea kui tegelane - või mitu tegelast - on vastu võetud, langeb see aeg selle paari teisele reale. See kutsub seejärel recAstringChar (char); funktsioon praeguse märgi haldamiseks. See ridade paar vaheldub siis, kui (või nii kaua) on veel märke, mis vajavad vastuvõtmist. Kui kõik on tehtud, siis olek lõpeb, võimaldades järgmise või järgmise taseme lõppu ja lubades omakorda rec (char); funktsioon lõpetada. Seega on nüüd täielik sõnum vastu võetud.

12. samm: kirjutage vastuvõtu alamfunktsioon - 1. osa

Kirjutage vastuvõtu alamfunktsioon - 1. osa
Kirjutage vastuvõtu alamfunktsioon - 1. osa
Kirjutage vastuvõtu alamfunktsioon - 1. osa
Kirjutage vastuvõtu alamfunktsioon - 1. osa

Nüüd peame kirjutama funktsiooni nimega recAstringChar (char);. Kommentaarist kuni rea 50 ülaossa näete, et selle ülesanne on värskendada kahte puhvrit sissetuleva jadateate koopiatega. [Selgus, et kui ma seda kõike üritasin teha, sain teada, et üks asi, mida ma õppisin, oli see, et mul on vaja kahte erinevat puhvrit - või vähemalt see oli lihtsaim viis probleemide lahendamiseks, nii et sellest kujunes välja 2 puhvrit. Ma just tegin need.] Ühe puhvri olen kutsunud: ReceiveData ja teise: ReceiveChars.

Puhvrid on globaalsed muutujad, seega on need deklareeritud mooduli tasemel, vt ühise vahekaardi read 9 ja 10. Selle funktsiooni sees on deklareeritud ka teisi muutujaid, millel on seega kohalik ulatus- näidatud siin ridadel 51-54. See pole koht, kus selgitada erinevusi globaalsete ja kohalike elanike vahel, kuid selle kohta leiate lisateavet https://www.arduino.cc/glossary/en/ jaotises Local and Global.

Siit leiate ka teavet andmetüüpide ja tüübi muutjate kohta: staatiline, boolean, bait, const, char

Selle funktsiooni põhiprogrammi voogu juhib siin rida 56 ja vastavat muud rida 74. See käsitleb kahte stsenaariumi

a) [alates reast 74 edasi], kui vastuvõetud sõnum algab. See juhtub siis, kui startMarkerit märgatakse - see on defineeritud kui märk <, mistõttu alustame sketši testimisel alati oma stringi selle märgiga. Kui me seda ei tee, siis ei töödelda midagi vastuvõetuna, ignoreeritakse seda kõike, justkui kirjutaksime jadamälu "Serial Monitor" klaviatuuri viipal.

b) [read 56 kuni 73], mis võtab vastu kõik teised märgid, olenemata sellest, mis need on, kuid tegelevad tähemärkidega alles pärast kehtiva alguse saamist (a '>' on saadud nagu eespool punktis a).

Nendele ridadele (74 kuni 78) panime vastuvõetud <ühte puhvritesse (ReceiveData [0]), kuid mitte teise. Reguleerime puhverkursorit (muutuja: char ndx), et osutada järgmisele puhverpuhvri varupositsioonile (ReceiveData [1]), kasutades rea ndx ++ juurdekasvu järgset käsku (++); ja seadsime käimasoleva lipu väärtuseks tõene.

Programmi voogu selles funktsiooni osas juhib siin rida 57, kui seda reas 57, ja seda vastavat muud reas 65. See käsitleb kahte stsenaariumi

a) [alates 65. reast], kui vastuvõetud sõnum on lõppenud. See juhtub siis, kui endMarker on märgatud - määratletud kui>, mistõttu lõpetame oma visandi testimisel alati selle tähemärgiga. Üks asi, mis juhtub lõppmärgi saamisel, on see, et globaalne lipp (tehniliselt muutuv) newData seatakse tõeks just siis, kui funktsioon lõpeb, nii et funktsioon, mis kutsus meie alamfunktsiooni (kutsuv funktsioon: recv (char);) saab "teada", et kehtivad uued andmed on täielikud.

b) [read 57 kuni 64], mis võtab vastu kõik teised märgid, olenemata sellest, mis need on. See lihtsalt pargib need korralikult mõlemas puhvris ridamisi.

Samm 13: kirjutage vastuvõtu alamfunktsioon - 2. osa

Kirjutage vastuvõtu alamfunktsioon - 2. osa
Kirjutage vastuvõtu alamfunktsioon - 2. osa
Kirjutage vastuvõtu alamfunktsioon - 2. osa
Kirjutage vastuvõtu alamfunktsioon - 2. osa

See võib aidata tuua näite selle kohta, kuidas need kaks puhvrit välja näevad, kui need on täidetud. Kui me peaksime sisestama sisestusklahvi, oleksid puhvrites näidatud märgid:

Nüüd näete, et meil on üks puhver, mis on täpselt samad märgid, nagu me esimest korda sisestasime, ja üks puhver, millel on lihtsalt kaks väärtust ja eraldav koma. Nüüd on meil kood, mis saab vastu võtta seeriamonitori klaviatuuril sisestatud tähemärke, saame liikuda CDIO faasist I etappi O, sisestades mõned stringid ja vaadates, mis juhtub. Laadige kood Master Arduinole, avage jadamonitor ja proovige sisestada midagi kehtivat, näiteks sisestusklahvi. Kas saate seriaalimonitori ekraanilt kaja, nagu siin näidatud?

14. samm: kirjutage edastus- ja parsimisfunktsioonid

Kirjutage edastus- ja parsimisfunktsioonid
Kirjutage edastus- ja parsimisfunktsioonid
Kirjutage edastus- ja parsimisfunktsioonid
Kirjutage edastus- ja parsimisfunktsioonid

Esiteks ülekande jaoks

Nii et nüüd oleme saanud stringi, saame kirjutada edastusfunktsiooni: tran (char); selle tüvi asendamiseks. See võimaldab meil saata stringi kaptenilt orjale Arduino, nii et selle uue funktsionaalsuse testimiseks veenduge, et mõlemad seadmed on ühendatud ja ühendatud.

Sisestage see funktsioon, nagu on näidatud siin ridadel 117 kuni 133. Nagu te mõistate, on sellel kaks osa, millest üks edastatakse USB -kanalile (riistvara UART) ja teine edastatakse teisele Arduino (tarkvara UART.) See peaks koostama vea -tasuta ja saate kohe visandi üles laadida ja vaadata, mis juhtub. Seekord saadan. Kas näete tulemust?

Ekraanipilt on huvitav, sest saadud string… peaks välja nägema õige nagu varem ja edastatud string… peaks nüüd välja nägema õige. Pange tähele, et täisarvu teisendamine ei ole toiminud. Selle toimimiseks on veel natuke koodi lisada.

Samm: kirjutage edastus- ja sõelumisfunktsioonid

Kirjutage edastus- ja parsimisfunktsioonid
Kirjutage edastus- ja parsimisfunktsioonid
Kirjutage edastus- ja parsimisfunktsioonid
Kirjutage edastus- ja parsimisfunktsioonid

Siis Parse jaoks

See on kooditükk, mis parsib numbriliste osaliste stringide toomiseks saadud stringi ja teisendab need täisarvuväärtusteks. See on tühine parseData (); põhiahela funktsioon

Asendage sõelumisnupp koodidega, mis on näidatud ridadel 98 - 113. Laadige see üles ja vaatame, kas kahe täisarvu väärtusega tekkinud probleem on nüüd lahendatud. Proovime.

Jah, see töötab, nagu näidatud, leitud täisarvud on 49 ja 98.

16. samm: lõpp

Finaal!
Finaal!

Need andmed on liikunud otse ringi PC -st läbi Masteri läbi alam ja tagasi Masteri kaudu uuesti PC -sse. Kui tavalise versiooni on üles laaditud nii ülem- kui ka alamotsadesse ning silumisrežiim on nüüd välja lülitatud, näeme mõlemas otsas õigesti saadud andmeid, nagu siin näidatud.

Soovitan: