Obsah:

Posielať číselné údaje z jedného Arduina na druhé: 16 krokov
Posielať číselné údaje z jedného Arduina na druhé: 16 krokov

Video: Posielať číselné údaje z jedného Arduina na druhé: 16 krokov

Video: Posielať číselné údaje z jedného Arduina na druhé: 16 krokov
Video: Proyecto de heliostato Templastat / Templastat Heliostat Project: improvements, updates and test 2024, November
Anonim
Posielajte číselné údaje z jedného Arduina do druhého
Posielajte číselné údaje z jedného Arduina do druhého

Úvod

David Palmer, CDIO Tech. na Astonskej univerzite.

Potrebovali ste niekedy poslať niekoľko čísel z jedného Arduina do druhého? Tento návod ukazuje, ako na to.

Môžete jednoducho otestovať, či funguje, jednoduchým zadaním reťazca čísel, ktoré chcete odoslať na terminál sériového monitora, a uvidíte, že sa čísla vrátia na druhom sériovom monitore pripojenom k druhému Arduinu. Môžete dokonca použiť odkaz Bluetooth.

Čo to robí

Je potrebné vyvinúť dva programy Arduino (náčrty v programe Arduino speak), jeden program Master na pripojenie k hostiteľskému počítaču so sériovým monitorom Arduino, pričom jeden bude fungovať ako podriadený a bude od majstra prijímať sériovú správu, dekódovať ju a odosielať späť. Otrok je voliteľne schopný zobrazovať čísla, s ktorými sa stretáva, na druhom sériovom monitore IDE - len v prípade, že to chcete použiť. V prvom rade to môže pomôcť k tomu, aby veci fungovali, a pomôže vám, ak sa rozhodnete vykonať v programoch akékoľvek zmeny, aby vyhovovali vašim vlastným požiadavkám.

Zariadenie

  • 2 Arduino
  • 2 USB káble
  • prepojovacie vodiče (podľa potreby)
  • 1 počítač/prenosný počítač s rozhraním Arduino IDE (k dispozícii na bezplatné stiahnutie z webovej stránky Arduino.cc)

Krok 1: Nastavenie - Najprv nastavte hardvér

Nastavenie - Najprv nastavte hardvér
Nastavenie - Najprv nastavte hardvér
Nastavenie - Najprv nastavte hardvér
Nastavenie - Najprv nastavte hardvér

Pripojte 2 Arduino k 2 portom USB na počítači.

Tip, je dobré ich označiť ako M a S (pán a otrok), aby ste sa neskôr nedostali do zmätku (ako je znázornené na dvoch fotografiách tu.)

Krok 2: Nastavenie - nastavte si obrazovku

Nastavenie - nastavte si obrazovku
Nastavenie - nastavte si obrazovku

Najlepšie je nastaviť obrazovku tak, aby mala

  • IDE načítané programom Master vľavo a
  • že so Slave napravo.

Sériové monitory pre Maser a Slave ponechajte tiež vľavo a vpravo, ako je znázornené na obrázku tu.

Krok 3: Nastavte hlavný koniec a potom sa spojte - časť 1

Nastavte hlavný koniec a potom sa spojte - časť 1
Nastavte hlavný koniec a potom sa spojte - časť 1

Keď nastavujete hlavný sériový monitor Master na odosielanie dvoch čísel, musíte vždy použiť znaky začiatku a konca, oddeľovače a znak oddeľovača čiar.

Teraz musíte prepojiť 2 Arduino cez sériové číslo. To sa vykonáva pomocou dvoch prepojovacích káblov.

Použil som zelenú a žltú

  • Najprv vezmite žltú, tá sa musí zapojiť do D6 v jednom Arduine a D7 v druhom
  • Potom naopak pre zelený drôt, D7 na prvom a D6 na druhom Arduine.

Alternatívne, ak máte k dispozícii niečo ako pár modulov Bluetooth - napríklad HC -05 - tieto budú fungovať aj tak, aby vám poskytli presne ten istý efekt ako vyššie uvedené vodiče.

Krok 4: Nastavte hlavný koniec a potom sa spojte - časť 2

Nastavte hlavný koniec a potom sa spojte - časť 2
Nastavte hlavný koniec a potom sa spojte - časť 2
Nastavte hlavný koniec a potom sa spojte - časť 2
Nastavte hlavný koniec a potom sa spojte - časť 2

Využívame sériovú knižnicu softvéru. Ďalšie informácie sú k dispozícii pomocou tohto odkazu

Môžete to vidieť vyvolané na riadku 7 jedného z programov. Konfiguruje digitálne piny 7 a 6 ako TX a RX (vysielanie a príjem). Takto budú dáta cestovať von z Master Arduino zeleným vodičom do Slave, a keď program Slave v druhom Arduine skončí svoju prácu, späť cez žltý vodič. V spodnej časti tej istej ilustrácie (v okne Sériový monitor) vidíte, že údaje, ktoré sme prenášali, teraz úspešne prešli okolo tu opísanej slučky a vrátili sa do počítača, pretože dvojica celých čísel je pekne oddelená.

Krok 5: Prehľad náčrtov / programov - štruktúra programu

Prehľad náčrtov / programov - štruktúra programu
Prehľad náčrtov / programov - štruktúra programu
Prehľad náčrtov / programov - štruktúra programu
Prehľad náčrtov / programov - štruktúra programu

Rozloženie Rovnako ako vo všetkých náčrtoch Arduina existujú 3 základné časti:

  • Vyhlásenia
  • Nastavenie
  • Hlavná slučka

Ako sa často stáva, využili sme tu 4. časť, ktorá je doplnením „funkcií“. Ak nie ste oboznámení s používaním funkcií, môžete vyhľadať „funkcie Arduino“pomocou Googlu a v tomto odkaze nájdete stránky s vysvetlením, ako je príklad: www.tutorialspoint.com/arduino/arduino_functions…..

Tiež sme použili karty na rozdelenie programu na lepšie ovládateľné bloky.

Tri bloky, ktoré sme použili, je možné vidieť v hornej časti každej ilustrácie okien IDE vyššie:

  • simpleRxTx0330Master
  • spoločný
  • poznámky

V skutočnosti ide o samostatné súbory v priečinku programu, ako môžete vidieť v tomto zobrazení programu Windows Explorer na súbory programu Slave.

Existuje veľmi dobrý dôvod, prečo sme to urobili.

  • Keď sme zostavovali program, prišli sme na to, že väčšina programu pre Majstra bola rovnaká ako pre Otroka.
  • Nakoniec sme všetky spoločné časti natiahli na záložku, ktorú sme preto pomenovali „spoločná“, a potom zakaždým, keď sme časť ladili (testovali sme a boli spokojní, že funguje dobre), skopírovali sme a prilepili celú kartu. naprieč od majstra po otroka alebo naopak.
  • Karty poznámok sú zhodne identické, pretože dizajn je všeobecný.

Žiadna z funkcií nie je volaná z nastavenia, všetky sa volajú zo slučky, takže sme ich vytvorili po inštalácii, ale pred slučkou.

Krok 6: Dizajn zhora nadol

Je vhodné navrhnúť svoju skicu na začiatku s definíciou toho, čo chcete robiť.

Akonáhle to budete mať, môžete začať robiť skicu, aby tieto veci robila. Spravidla, ak existuje detail, ktorý ešte neviete, ako to urobiť, urobte z neho funkciu a vytváranie funkcie nechajte na neskôr.

Nasleduje filozofiu dobrého dizajnu, vyučovanú na mnohých univerzitách, nazývanú CDIO (Ak ju ešte nepoznáte, môžete ju vyhľadať na Googli a nájsť stránky, ktoré to vysvetlia takto: https://www.cdio.org/s.) To v zásade hovorí: Nezačínajte s dizajnom, kým nebudete mať koncept jasný. Nezačínajte s implementáciou, kým nebudete mať jasný návrh. Nečakajte, že bude fungovať, kým nebudete mať implementáciu jasnú. Najprv C, potom D, I a O. V každej ďalšej fáze opakujete (vráťte sa okolo cyklu), takže akonáhle budete spokojní s počiatočnou slučkou návrhu, skontrolujte, či stále spĺňa koncept, a aktualizujte C, ak potrebujete. A tak ďalej, takže aj keď ste sa dostali do Operácie, vráťte sa úplne hore a znova sa pozrite, ako teraz vyzerá C, potom D a I, urobte a skontrolujte všetky zmeny podľa potreby. S programovacími skicami to funguje rovnako, ak navrhujete zhora nadol.

Krok 7: Koncept a dizajn - časť 1

Koncept a dizajn - časť 1
Koncept a dizajn - časť 1
Koncept a dizajn - časť 1
Koncept a dizajn - časť 1

Koncept tu vyzerá ako požiadavky na osnovu uvedené v záložke „Poznámky“. “

Dizajn by mohol vyzerať ako raná verzia slučky, ktorá sa zhoduje s kartou poznámok a mohla by vyzerať podobne ako na tomto obrázku

Pozrite sa, ako sa mi páči začať tým, že v skutočnosti CTRL-C skopírujem komentáre do hlavy cyklu a potom začnem vypĺňať medzery príkazmi, ktoré tieto veci urobia.

V skutočnosti je to v poriadku, ako vidíte v spodnej časti obrazovky na obrázku. To siaha od štádia CDIO D po I a pri vývoji kódu je dobré pokračovať v tejto slučke D-I.

Teraz je čas prejsť na ďalšiu fázu, tam je komentár, ktorý hovorí, že budeme: // prijímať niečo z hardvérového USB, potom to prenesieme na softvérový sériový kanál. Tento kód píšeme, aby sa to stalo - riadky 133 až 138 tu sú zobrazené žltým zvýrazňovačom

Krok 8: Koncept a dizajn - časť 2

Koncept a dizajn - časť 2
Koncept a dizajn - časť 2
Koncept a dizajn - časť 2
Koncept a dizajn - časť 2

Dve prvé dve funkcie, ktoré tu uvádzame, sú (recv () a tran () na prijímanie z hardvérového portu a prenos na softvérový port - preto ich volajú so zobrazenými parametrami „hw“alebo „sw“.

Okrem nich sme pridali test na globálnu premennú s názvom newData. Toto je príznak, ktorý nastavíme vo funkcii „void recv ();“. Keď je prijatá správa, táto premenná je označená od false do true. Robíme to tak, aby sme správu odoslali iba vtedy, ak bola prijatá (príznak == true) v riadku 134. A keď sme správu odoslali, „práca je hotová“, v riadku 137 príznak znova zrušíme na hodnotu false.

Opäť môžeme skontrolovať kompiláciu (D až I) a tentokrát máme chybové hlásenie „nie je deklarované“(zobrazené). To nám hovorí, že sme nenahlásili príkaz recv (); funkciu. Plánujeme to urobiť neskôr, takže zatiaľ, aby sme mohli získať čistý kompilát, musíme vytvoriť atrapu alebo zástupnú funkciu, ako je znázornené ďalej.

Opäť môžeme skontrolovať kompiláciu (D až I) a tentokrát máme ďalšie chybové hlásenie „nie je deklarované“pre tran (); funkciu. Na to je potrebné vytvoriť podobný pahýľ. Opäť môžeme skontrolovať kompiláciu (D až I) a tentokrát zistíme, že to funguje perfektne; zatiaľ je všetko dobré.

Krok 9: Dokončite hlavnú slučku: A) Príjem z USB, B) Príjem zo Slave Arduino

Dokončite hlavnú slučku: A) Príjem z USB, B) Príjem zo Slave Arduino
Dokončite hlavnú slučku: A) Príjem z USB, B) Príjem zo Slave Arduino
Dokončite hlavnú slučku: A) Príjem z USB, B) Príjem zo Slave Arduino
Dokončite hlavnú slučku: A) Príjem z USB, B) Príjem zo Slave Arduino

Existuje jedna posledná časť, ktorú sme pridali na dokončenie tejto časti, ktorou je pridanie kódu na ladenie.

Existuje ďalší návod na ladenie skíc, na ktorý možno odkazovať, aby sme pochopili, čo sme tu urobili a prečo. Pozrite si návod „Ako stavať a testovať náčrty Arduino, kým nebudú fungovať“

Takže tieto ladiace riadky [zobrazené 136-139] sú pridané ďalej do hlavnej slučky a hľa, môžete ich otestovať na konci Master tak, že premennú ladenia nastavíte na pravdivú a kompilujete (I), potom ak keď pripojíte Arduino, môžete nahrať, otvoriť sériový monitor a zistiť, či to, čo sa vráti do sériového monitora, je tu znázornené (zobrazuje sa hlásenie „REŽIM DEBUG“?)

Krok 10: Príjem a spracovanie údajov v Slave Arduino

Prijímanie a manipulácia s dátami v Slave Arduino
Prijímanie a manipulácia s dátami v Slave Arduino
Prijímanie a manipulácia s dátami v Slave Arduino
Prijímanie a manipulácia s dátami v Slave Arduino

Príjem od Slave Arduino

Pridajte potrebný kód pre druhý kanál do hlavnej slučky, softvérového sériového prijímača, ako je znázornené - riadky 149 až 155.

Vidíte, že štruktúra je voľne založená na tom, čo sme napísali vyššie pre prípad Master?

Tiež uvidíte, že dostaneme chybu kompilátora, ďalšiu nehlásenú funkciu - tentokrát parseData (); - takže aj pre to musíme urobiť zárobok, než budeme môcť spustiť bezchybný testovací kompilát.

Manipulácia s dátami v Slave Arduino

Pridajte kód hlavnej slučky požadovaný pre Arduino, ak je nakonfigurovaný ako podradené zariadenie, ako je znázornené - riadky 163 až 174. Vidíte, že jeho štruktúra je veľmi podobná štruktúre prvého kanála?

A tentoraz by ste mali zostaviť úplne v poriadku.

Krok 11: Napíšte funkciu príjmu

Napíšte funkciu príjmu
Napíšte funkciu príjmu

Funkcia Prijať - neplatný príjem (znak od) {} - má dve hlavné úlohy.

1 na prijatie reťazca znakov z kanála USB a

2, aby ste dostali jeden z kanála Arduino na Arduino.

Na prvé budeme musieť použiť, pretože používa vstavaný hardvér UART Arduina, a na druhé pomocou štandardnej knižnice Arduino: softvér UART.

Keď začneme pridávať kód k funkcii - aby sme vytvorili funkciu, ktorá niečo robí, a nie iba útržok - musíme pamätať na to, aby sme odstránili alebo komentovali pahýľ, ktorý nahrádza. V opačnom prípade dostaneme chybu kompilácie: opätovné definovanie 'void lrec (char)'.

Pokúste sa dostať k chybe a potom sa ho pokúste zbaviť jedným z vyššie uvedených spôsobov.

Začnite s funkciou, ktorá vyzerá ako tá, ktorú tu zobrazujeme na riadkoch 75 až 88 žltou farbou.

Teraz už viete, že s kódom budete musieť vyskúšať operáciu kompilácie. Zobrazí sa vám chyba, ako tie, ktoré sme mali predtým, typu: názov funkcie, ktorý nie je v tomto rozsahu deklarovaný. Na začiatku budeme potrebovať ďalší úber, ktorý nám umožní kompilovať túto chybu, takže ho pridajte ako predtým a uistite sa, že teraz môžete získať kompiláciu bez chýb.

Teraz sa pozrime na kód, ktorý sme napísali pre funkciu recv ().

Je celkom čistý, môžete vidieť použitie podmienky „ak“na výrobu dvoch častí vyššie uvedenej funkcie.

Kód v časti „sw“a v časti „hw“má rovnakú formu a opíšem to tu.

Prvý z dvojice riadkov je v každom prípade začiatok cyklu while. Ak nie ste oboznámení s chvíľami, môžete si to vysvetliť a príklady nájsť na stránke Arduino.cc/Reference. Tu počkáme „kým“zabudovaná funkcia „sériová“nedostane žiadne znaky a pretože premenná newData bola vypnutá (t. J. Platí, že podmienka newData == false je pravdivá). Hneď ako je prijatý znak - alebo viac ako jeden znak -, chvíľka „klesne“do druhého riadka v tejto dvojici. Potom sa zavolá recAstringChar (char); funkcia na spracovanie aktuálneho znaku. Tento pár riadkov sa potom bude striedať, kým (alebo tak dlho) ešte existujú znaky, ktoré je potrebné prijať. Akonáhle sú všetky hotové, kým sa stav skončí, povolí sa, aby if alebo else ďalšej úrovne až do konca, a následne umožní rec (char); funkciu ukončiť. Včela tak teraz dostala úplnú správu.

Krok 12: Napíšte podfunkciu príjmu - časť 1

Napíšte podfunkciu príjmu - časť 1
Napíšte podfunkciu príjmu - časť 1
Napíšte podfunkciu príjmu - časť 1
Napíšte podfunkciu príjmu - časť 1

Teraz musíme napísať funkciu s názvom recAstringChar (char);. Z komentára k riadku 50 tu v jeho hornej časti vidíte, že jeho úlohou je aktualizovať dve vyrovnávacie pamäte pomocou kópií prichádzajúcej sériovej správy. [Ukázalo sa, že keď som sa snažil, aby to všetko fungovalo, jedna vec, ktorú som sa naučil, bola, že som potreboval dva rôzne nárazníky - alebo to bol prinajmenšom najľahší spôsob, ako vyriešiť niektoré problémy, a preto sa to trochu vyvinulo tak, že potrebovali 2 nárazníky, takže Práve som ich vyrobil.] Volal som jeden buffer: receiveData a druhý: receiveChars.

Vyrovnávacie pamäte sú globálne premenné, takže sú deklarované na úrovni modulu, pozri riadky 9 a 10 spoločnej karty. V rámci tejto funkcie sú deklarované ďalšie premenné, ktoré majú preto miestny rozsah- uvedené v riadkoch 51- 54 tu. Na tomto mieste nie je možné vysvetľovať rozdiely medzi globálnymi a miestnymi obyvateľmi, ale o tom je viac informácií na https://www.arduino.cc/glossary/en/ v časti Miestne a globálne.

Tiež sa môžete dozvedieť všetko o dátových typoch a modifikátoroch typov: statické, booleovské, bajtové, konštantné, char na https://www.arduino.cc/reference/en/#variables, ktoré sú uvedené tu.

Hlavný tok programu v tejto funkcii je riadený príkazom if na riadku 56 a jeho zodpovedajúcim iným na riadku 74. Toto sa zaoberá dvoma scenármi

a) [od riadka 74 ďalej], keď začína prijatá správa. Stáva sa to, keď je rozpoznaný znak startMarker - bol definovaný ako znak '<', a preto vždy, keď testujeme skicu, vždy začíname reťazec týmto znakom. Ak to neurobíme, nič nebude spracované ako prijaté, bude to všetko ignorované, ako keby sme na výzvu klávesnice „Sériový monitor“písali nezmysly.

b) [riadky 56 až 73], ktoré prijímajú všetky ostatné znaky, nech sú akékoľvek, ale zaoberajú sa znakmi len vtedy, keď došlo k platnému začiatku (a '>' bolo prijaté ako v písmene a) vyššie.)

Do týchto riadkov (od 74 do 78) vložíme prijaté do jedného z vyrovnávacích pamätí (prijatých dát [0]), ale nie do druhého. Ukazovateľ vyrovnávacej pamäte (premenná: char ndx) upravíme tak, aby smeroval na nasledujúcu rezervnú pozíciu vyrovnávacej pamäte (receiveData [1]) pomocou príkazu post-increment (++) v riadku ndx ++;, a nastavíme príznak priebehu na hodnotu true.

Tok programu v tejto časti funkcie je riadený príkazom if na riadku 57 a jemu zodpovedajúcim iným na riadku 65. Toto sa zaoberá dvoma scenármi

a) [od riadka 65 ďalej], keď sa prijatá správa skončí. Stáva sa to vtedy, keď je označený endMarker - definovaný ako>, a preto vždy, keď testujeme náš náčrt, vždy ukončíme reťazec týmto znakom. Jedna z vecí, ktorá sa stane, keď je prijatý koncový znak, je, že globálny príznak (technicky variabilný) newData je nastavený na hodnotu true rovnako ako funkcia končí, takže funkcia, ktorá volala našu podfunkciu (volajúca funkcia: recv (char);) môže „vedieť“, že platné nové údaje boli prijaté ako úplné.

b) [riadky 57 až 64], ktorý prijíma všetky ostatné znaky, nech sú akékoľvek. Len ich rušne zaparkuje do radov v oboch nárazníkoch.

Krok 13: Napíšte podfunkciu príjmu - časť 2

Napíšte podfunkciu príjmu - časť 2
Napíšte podfunkciu príjmu - časť 2
Napíšte podfunkciu príjmu - časť 2
Napíšte podfunkciu príjmu - časť 2

Mohlo by pomôcť uviesť príklad toho, ako tieto 2 vyrovnávacie pamäte vyzerajú, keď sú vyplnené. Ak by sme mali zadať Enter, vyrovnávacie pamäte by mali v sebe zobrazené znaky:

Takže teraz môžete vidieť, že máme jednu vyrovnávaciu pamäť, ktorá je rovnaká ako všetky znaky, ktoré sme prvýkrát zadali, a jednu medzipamäť, ktorá má iba dve hodnoty a oddeľujúcu čiarku. Teraz máme nejaký kód, ktorý môže prijímať znaky, ktoré zadávame na klávesnici Serial Monitor, môžeme sa presunúť z fázy CDIO I do O, zadať niektoré reťazce a zistiť, čo sa stane. Nahrajte kód do Master Arduino, otvorte sériový monitor a skúste zadať niečo platné, napríklad Enter. Dostanete ozvenu na obrazovku sériového monitora, ako je tu zobrazené?

Krok 14: Napíšte funkcie prenosu a analýzy

Napíšte funkcie prenosu a analýzy
Napíšte funkcie prenosu a analýzy
Napíšte funkcie prenosu a analýzy
Napíšte funkcie prenosu a analýzy

Najprv k prenosu

Teraz sme teda dostali reťazec, môžeme napísať funkciu prenosu: tran (char); aby nahradil jeho úchyt. To nám umožní odoslať reťazec z Master do Slave Arduino, preto sa uistite, že sú obe zariadenia zapojené a prepojené, aby ste mohli otestovať túto novú funkciu.

Zadajte túto funkciu, ako je tu znázornené na riadkoch 117 až 133. Ako poznáte, má dve časti, jednu na prenos na USB kanál (hardvér UART) a jednu na prenos do druhého Arduina (softvér UART.) Tým by sa mala skompilovať chyba -zadarmo, a môžete ihneď nahrať náčrt a zistiť, čo sa stane. Tentokrát pošlem. Zobrazuje sa vám výsledok?

Snímka obrazovky je zaujímavá, pretože prijatý reťazec … by mal vyzerať správne ako predtým a odoslaný reťazec … by teraz mal vyzerať správne. Upozorňujeme však, že celočíselná konverzia nefungovala. Aby to fungovalo, je ešte potrebné pridať trochu viac kódu.

Krok 15: Napíšte funkcie prenosu a analýzy

Napíšte funkcie prenosu a analýzy
Napíšte funkcie prenosu a analýzy
Napíšte funkcie prenosu a analýzy
Napíšte funkcie prenosu a analýzy

Potom pre Parse

Toto je kúsok kódu, ktorý analyzuje prijatý reťazec na načítanie číselných čiastkových reťazcov a prevádza ich na celočíselné hodnoty. Je to prázdna parseData (); funkcia hlavnej slučky

Nahraďte útržok syntaktickej analýzy kódom zobrazeným v riadkoch 98 - 113. Nahrajte ho a uvidíme, či problém, ktorý sme mali s 2 celočíselnými hodnotami, je teraz vyriešený. Vyskúšajme.

Áno, funguje to, ako je ukázané, nájdené celé čísla sú 49 a 98.

Krok 16: Finále

Finále!
Finále!

Tieto údaje prešli okolo cyklu z PC cez Master cez slave a späť cez Master opäť do PC. Keď je hotová verzia spoločného nahraná na hlavný aj podradený koniec a keď je režim ladenia vypnutý, vidíme údaje správne prijaté na oboch koncoch, ako je tu uvedené.

Odporúča: