Obsah:

Odesílání číselných dat z jednoho Arduina do druhého: 16 kroků
Odesílání číselných dat z jednoho Arduina do druhého: 16 kroků

Video: Odesílání číselných dat z jednoho Arduina do druhého: 16 kroků

Video: Odesílání číselných dat z jednoho Arduina do druhého: 16 kroků
Video: CS50 2013 - Week 9 2024, Červenec
Anonim
Posílejte číselná data z jednoho Arduina do druhého
Posílejte číselná data z jednoho Arduina do druhého

Úvod

David Palmer, CDIO Tech. na Astonské univerzitě.

Potřebovali jste někdy poslat nějaká čísla z jednoho Arduina do druhého? Tento Instructable ukazuje jak.

Fungování můžete snadno vyzkoušet jednoduše zadáním řetězce čísel, které chcete odeslat na terminál Serial Monitor, a uvidíte, že se čísla objeví na druhém sériovém monitoru připojeném k druhému Arduinu. Můžete dokonce použít odkaz Bluetooth.

Co to dělá

Je třeba vyvinout dva programy Arduino (náčrtky v Arduinu hovoří), jeden Master program pro připojení k hostitelskému počítači se spuštěným sériovým monitorem Arduino, jeden jako Slave pro příjem sériové zprávy od Master, dekódování a odeslání zpět. Slave je volitelně schopen zobrazit čísla, se kterými se zabývá, na druhém sériovém monitoru IDE - jen pro případ, že byste to chtěli použít. Může to pomoci především k tomu, aby věci fungovaly, a pomůže vám, pokud se rozhodnete v programech provést jakékoli změny tak, aby vyhovovaly vašim vlastním požadavkům.

Zařízení

  • 2 Arduino
  • 2 USB kabely
  • propojovací vodiče (podle potřeby)
  • 1 PC/notebook nabitý Arduino IDE (k dispozici ke stažení zdarma z webu Arduino.cc)

Krok 1: Nastavení - Nejprve nastavte hardware

Nastavení - Nejprve nastavte hardware
Nastavení - Nejprve nastavte hardware
Nastavení - Nejprve nastavte hardware
Nastavení - Nejprve nastavte hardware

Připojte 2 Arduino do 2 USB portů na vašem počítači.

Tip, je dobré je označit jako M a S (pán a otrok), abyste se později nedostali do zmatku (jak je znázorněno na dvou fotografiích zde.)

Krok 2: Nastavení - Nastavení obrazovky

Nastavení - Nastavte si obrazovku
Nastavení - Nastavte si obrazovku

Nejlepší je nastavit obrazovku tak, abyste měli

  • IDE načtené programem Master vlevo a
  • že s otrokem vpravo.

Sériové monitory pro Maser a Slave ponechejte také vlevo a vpravo, jak je znázorněno na snímku obrazovky zde.

Krok 3: Nastavte hlavní konec a poté se spojte - část 1

Nastavte hlavní konec a poté se spojte - část 1
Nastavte hlavní konec a poté se spojte - část 1

Když nastavíte svůj Master End Serial Monitor pro odesílání dvou čísel, musíte vždy použít počáteční a koncový znak, oddělovač a znak oddělovače čárky, jak vidíte zde.

Nyní musíte spojit 2 Arduino dohromady přes sériové číslo. To se provádí pomocí dvou propojovacích vodičů.

Použil jsem zelenou a žlutou

  • Nejprve si vezměte žlutou, ta se musí zapojit do D6 v jednom Arduinu a D7 ve druhém
  • Pak opak pro zelený vodič, D7 na prvním a D6 na druhém Arduinu.

Alternativně, pokud máte k dispozici něco jako pár modulů Bluetooth - například HC -05 - budou také fungovat tak, aby vám poskytly přesně stejný účinek jako výše uvedené vodiče.

Krok 4: Nastavte hlavní konec a poté se spojte - část 2

Nastavte hlavní konec a poté se spojte - část 2
Nastavte hlavní konec a poté se spojte - část 2
Nastavte hlavní konec a poté se spojte - část 2
Nastavte hlavní konec a poté se spojte - část 2

Používáme knihovnu Software Serial. Další informace jsou k dispozici na tomto odkazu

Můžete jej vidět vyvolaný na řádku 7 některého z programů. Konfiguruje digitální piny 7 a 6 jako TX a RX (vysílání a příjem). Takto budou data cestovat z Master Arduino zeleným vodičem do Slave, a když program Slave v druhém Arduinu dokončí svou práci, zpět žlutým vodičem. Ve spodní části stejného obrázku (v okně Serial Monitor) můžete vidět, že data, která jsme přenesli, nyní úspěšně prošla kolem zde popsané smyčky a vrátí se zpět do počítače, protože dvojice celých čísel je pěkně oddělena.

Krok 5: Přehled náčrtů / programů - struktura programu

Přehled náčrtů / programů - struktura programu
Přehled náčrtů / programů - struktura programu
Přehled náčrtů / programů - struktura programu
Přehled náčrtů / programů - struktura programu

Rozložení Jako ve všech skicách Arduina existují 3 základní části:

  • Prohlášení
  • Nastavení
  • Hlavní smyčka

Jak se často stává, využili jsme zde 4. sekci, která je přidáním „funkcí“. Pokud nejste obeznámeni s používáním funkcí, můžete Google vyhledat „funkce Arduino“a v tomto odkazu najdete stránky s vysvětlením, jako je příklad: www.tutorialspoint.com/arduino/arduino_functions…..

Rovněž jsme použili karty k oddělení programu do lépe ovladatelných bloků.

Tři bloky, které jsme použili, lze vidět v horní části každé ilustrace oken IDE výše:

  • simpleRxTx0330Master
  • běžný
  • poznámky

Ve skutečnosti jde o samostatné soubory ve složce programu, jak můžete vidět v tomto zobrazení Průzkumníka Windows na soubory programu Slave.

Existuje velmi dobrý důvod, proč jsme to udělali.

  • Když jsme vytvářeli program, zjistili jsme, že většina programu pro Mistra byla stejná jako pro Otroka.
  • Nakonec jsme stáhli všechny běžné části do záložky, kterou jsme proto pojmenovali „společná“, a potom pokaždé, když jsme část ladili (testovali a byli jsme spokojeni, že funguje dobře), celou tuto záložku jsme pouze zkopírovali a vložili napříč od mistra po otroka, nebo naopak.
  • Karty poznámek jsou shodné, protože design je obecný.

Žádná z funkcí není volána z instalace, všechny jsou volány ze smyčky, takže jsme je vytvořili po nastavení, ale před smyčkou.

Krok 6: Design shora dolů

Je dobré navrhnout skicu počínaje definicí toho, co chcete dělat.

Jakmile to budete mít, můžete začít dělat skicu dělat ty věci. Obecně platí, že pokud existuje detail, který ještě nevíte, jak to udělat, udělejte z něj funkci a vytváření funkce nechte na později.

Navazuje na filozofii dobrého designu, vyučovanou na mnoha univerzitách, nazývanou CDIO (Pokud ji ještě neznáte, můžete si ji vyhledat na Googlu a najít stránky, které to vysvětlí takto: https://www.cdio.org/s.) To v podstatě říká: Nezačínejte s designem, dokud nebudete mít koncept jasný. Nezačínejte s implementací, dokud nebudete mít jasný design. Nečekejte, že bude fungovat, dokud nebudete mít implementaci jasnou. Nejprve C, potom D, I a O. V každé další fázi iterujete (vraťte se kolem smyčky), takže jakmile budete spokojeni se svou počáteční smyčkou návrhu, zkontrolujte, zda stále splňuje koncept, a aktualizujte C, pokud potřebujete. A tak dále, takže i když jste se dostali do Operace, vraťte se úplně nahoru a znovu se podívejte, jak teď vypadá C, pak D a I, vytvořte a zkontrolujte vše mění se podle potřeby. S programovacími skicami to funguje úplně stejně, když navrhujete Top-Down.

Krok 7: Koncept a design - část 1

Koncept a design - část 1
Koncept a design - část 1
Koncept a design - část 1
Koncept a design - část 1

Zde koncept vypadá jako požadavky na osnovu uvedené v záložce 'poznámky'. '

Design by mohl vypadat jako raná verze smyčky, která odpovídá kartě s poznámkami a mohla by vypadat jako na tomto obrázku

Podívejte se, jak rád začínám tím, že CTRL-C nejprve zkopíruji komentáře do hlavy smyčky a poté začnu vyplňovat mezery příkazy, které tyto věci provedou.

To ve skutečnosti kompiluje OK, jak můžete vidět v dolní části obrazovky na obrázku. To sahá od stadia CDIO D po I, a jak vyvíjíme kód, je dobré tuto smyčku D-I neustále obcházet.

Nyní je čas přejít do další fáze, tam je komentář, který říká, že budeme: // přijímat něco z hardwarového USB, pak to přeneseme na softwarový sériový kanál. Tento kód napíšeme, aby se to stalo - řádky 133 až 138 jsou zde znázorněny žlutým zvýrazňovačem

Krok 8: Koncept a design - část 2

Koncept a design - část 2
Koncept a design - část 2
Koncept a design - část 2
Koncept a design - část 2

Dvě první dvě funkce, které zde uvádíme, jsou (recv () a tran (), které mají přijímat z hardwarového portu a vysílat do softwarového portu - proto je voláme se zobrazenými parametry 'hw' nebo 'sw'.

Kromě nich jsme přidali test na globální proměnnou s názvem newData. Toto je příznak, který nastavíme uvnitř funkce „void recv ();“. Po přijetí zprávy je tato proměnná označena od false do true. Děláme to tak, že zprávu vysíláme pouze tehdy, pokud byla přijata (příznak == true) na řádku 134. A jakmile jsme naši zprávu přenesli, je „práce odvedena“, takže v řádku 137 znovu zrušíme příznak zpět na hodnotu false.

Znovu můžeme zkontrolovat kompilaci (D až I) a tentokrát máme chybovou zprávu „není deklarováno“(zobrazeno). To nám říká, že jsme nenahlásili recv (); funkce. Máme v plánu to udělat později, takže prozatím, abychom mohli získat čistý kompilát, musíme vytvořit figurínu nebo zástupný znak, jak je ukázáno dále.

Znovu můžeme zkontrolovat kompilaci (D až I) a tentokrát máme další chybové hlášení „není deklarováno“pro tran (); funkce. To vyžaduje vytvoření podobného pahýlu. Znovu můžeme zkontrolovat kompilaci (D až I) a tentokrát zjistíme, že to funguje perfektně; zatím je vše dobré.

Krok 9: Dokončete hlavní smyčku: A) Příjem z USB, B) Příjem ze Slave Arduino

Dokončete hlavní smyčku: A) Příjem z USB, B) Příjem ze Slave Arduino
Dokončete hlavní smyčku: A) Příjem z USB, B) Příjem ze Slave Arduino
Dokončete hlavní smyčku: A) Příjem z USB, B) Příjem ze Slave Arduino
Dokončete hlavní smyčku: A) Příjem z USB, B) Příjem ze Slave Arduino

K dokončení této části jsme přidali jeden poslední kus, kterým je přidání kódu pro ladění.

Existuje další instruktáž o ladění skic, na kterou lze odkazovat, abychom pochopili, co jsme zde udělali a proč. Viz instrukce „Jak vytvářet a testovat skici Arduina, dokud nebudou fungovat“

Takže tyto ladicí řádky [zobrazeno 136-139] jsou přidány jako další v hlavní smyčce a hle a hle, můžete je otestovat na konci Master tak, že proměnnou ladění nastavíte na true a Compiling (I), pak pokud připojíte Arduino, můžete nahrát, otevřít sériový monitor a zjistit, zda to, co se vrací do sériového monitoru, je zde zobrazeno (vidíte zprávu „DEBUG MODE“?)

Krok 10: Příjem a zpracování dat v Slave Arduino

Příjem a zpracování dat v Slave Arduino
Příjem a zpracování dat v Slave Arduino
Příjem a zpracování dat v Slave Arduino
Příjem a zpracování dat v Slave Arduino

Příjem od Slave Arduino

Přidejte potřebný kód pro druhý kanál do hlavní smyčky, softwarový sériový přijímač, jak je znázorněno - řádky 149 až 155.

Vidíte, že struktura je volně založená na tom, co jsme napsali výše pro případ Master?

Také uvidíte, že se nám zobrazí chyba kompilátoru, další nehlášená funkce - tentokrát parseData (); - takže i pro toto musíme udělat útržek, než budeme moci spustit bezchybný testovací kompilaci.

Zpracování dat v Slave Arduino

Přidejte kód hlavní smyčky požadovaný pro Arduino, pokud je nakonfigurováno jako podřízené zařízení, jak je uvedeno - řádky 163 až 174. Vidíte, že jeho struktura je velmi podobná struktuře prvního kanálu?

A tentokrát byste měli zjistit, že kompilace je naprosto v pořádku.

Krok 11: Napište funkci příjmu

Napište funkci příjmu
Napište funkci příjmu

Funkce Receive - void recv (char from) {} - má dvě hlavní úlohy.

1 pro příjem řetězce znaků z USB kanálu a

2 pro příjem jednoho z kanálu Arduino do Arduino.

Pro první budeme muset použít, protože používá vestavěný hardwarový UART Arduina, a pro druhé pomocí standardní knihovny Arduino: software UART.

Když začneme přidávat kód k funkci - abychom vytvořili funkci, která něco dělá, místo pouhého stubu - musíme si pamatovat, že odstraníme nebo okomentujeme pahýl, který nahrazuje. V opačném případě dostaneme chybu kompilace: znovu definice 'void lrec (char)'.

Zkuste chybu získat a poté se pokuste odstranit některým z výše uvedených způsobů.

Začněte funkcí, která vypadá jako ta, kterou zde zobrazujeme na řádcích 75 až 88 žlutě.

Nyní už víte, že s kódem budete muset vyzkoušet operaci kompilace. Získá vám chybu, jako ty, které jsme měli dříve, typu: název funkce není v tomto rozsahu deklarován. Zpočátku budeme potřebovat další útržek, který nám umožní kompilovat tuto chybu, takže ji přidejte jako dříve a ujistěte se, že nyní můžete získat kompilaci bez chyb.

Nyní se podívejme na kód, který jsme napsali pro funkci recv ().

Je to docela čisté, můžete vidět použití podmínky 'if' k vytvoření dvou částí výše uvedené funkce.

Kód uvnitř části „sw“a „hw“má stejnou formu a já ji zde popíši.

První z dvojice řádků je v každém případě začátek cyklu while. Pokud nejste obeznámeni s dobou, můžete si to vyhledat a vysvětlit na webu Arduino.cc/Reference. Zde čekáme „zatímco“vestavěná funkce „Serial“neobdržela žádné znaky a protože proměnná newData byla vypnuta (tj. Platí podmínka newData == false). Jakmile je přijat znak - nebo více než jeden znak -, okamžik „klesne“na druhý řádek v této dvojici. To pak zavolá recAstringChar (char); funkce pro zpracování aktuálního znaku. Tato dvojice řádků se pak bude střídat, zatímco (nebo tak dlouho, dokud) budou ještě nějaké znaky vyžadovat přijetí. Jakmile jsou všechny hotové, stav while skončí, což dovolí, aby if nebo else další úroveň až do konce, a naopak povolení rec (char); funkci ukončit. Včelka tedy nyní obdržela úplnou zprávu.

Krok 12: Napište dílčí funkci Příjem - část 1

Napište dílčí funkci Přijmout - část 1
Napište dílčí funkci Přijmout - část 1
Napište dílčí funkci Přijmout - část 1
Napište dílčí funkci Přijmout - část 1

Nyní potřebujeme napsat funkci nazvanou recAstringChar (char);. Z komentáře na řádek 50 zde nahoře vidíte, že jeho úkolem je aktualizovat dvě vyrovnávací paměti kopiemi příchozí sériové zprávy. [Ukázalo se, že když jsem se snažil, aby to všechno fungovalo, jedna věc, kterou jsem se dozvěděl, byla, že jsem potřeboval dva různé nárazníky - nebo alespoň to byl nejjednodušší způsob, jak vyřešit některé problémy, a proto se to tak nějak vyvinulo, že to potřebovalo 2 vyrovnávací paměti, takže Právě jsem je vytvořil.] Zavolal jsem jeden buffer: receiveData a druhý: receiveChars.

Vyrovnávací paměti jsou globální proměnné, takže jsou deklarovány na úrovni modulu, viz řádky 9 a 10 společné karty. Uvnitř této funkce jsou deklarovány další proměnné, které proto mají lokální rozsah- zde uvedené v řádcích 51–54. Na tomto místě nelze vysvětlovat rozdíly mezi globály a místními, ale více informací o tom najdete na stránce https://www.arduino.cc/glossary/en/ v části Místní a globální.

Můžete také zjistit vše o datových typech a modifikátorech typů: static, boolean, byte, const, char v https://www.arduino.cc/reference/en/#variables, uvedených zde.

Hlavní tok programu v této funkci je řízen if na řádku 56 zde a jeho odpovídající else na řádku 74. To se zabývá dvěma scénáři

a) [od řádku 74 zapnuto], když začíná přijímaná zpráva. K tomu dochází, když je spatřen startMarker - toto bylo definováno jako znak '<', a proto kdykoli testujeme skicu, vždy začínáme řetězec tímto znakem. Pokud tak neučiníme, nic nebude zpracováno jako přijaté, bude vše ignorováno, jako kdybychom na výzvu klávesnice „Serial Monitor“psali nesmysly.

b) [řádky 56 až 73], které přijímá všechny ostatní znaky, ať jsou jakékoli, ale zabývají se znaky pouze poté, co došlo k platnému začátku (a '>' bylo přijato jako v a) výše.)

Do těchto řádků (od 74 do 78) jsme vložili přijaté <do jednoho z vyrovnávacích pamětí (receiveData [0]), ale ne do druhého. Ukazatel vyrovnávací paměti (proměnná: char ndx) upravíme tak, aby ukazoval na další volnou pozici vyrovnávací paměti (receiveData [1]) pomocí příkazu post-increment (++) v řádku ndx ++;, a nastavíme příznak průběhu na hodnotu true.

Tok programu v této části funkce je řízen if na řádku 57 zde a jeho odpovídajícími dalšími na řádku 65. Toto se zabývá dvěma scénáři

a) [od řádku 65 zapnuto], když je přijatá zpráva ukončena. K tomu dochází, když je označen endMarker - definován jako>, a proto kdykoli testujeme naši skicu, vždy ukončíme řetězec tímto znakem. Jedna z věcí, která se stane, když je koncový znak přijat, je, že globální příznak (technicky proměnný) newData je nastaven na true, stejně jako funkce končí, takže funkce, která volala naši podfunkci (volající funkce: recv (char);) může „vědět“, že platná nová data byla přijata jako úplná.

b) [řádky 57 až 64], který přijímá všechny ostatní znaky, ať jsou jakékoli. Jen je rušně parkuje úhledně do řad v obou náraznících.

Krok 13: Napište dílčí funkci Příjem - část 2

Napište dílčí funkci Příjem - část 2
Napište dílčí funkci Příjem - část 2
Napište dílčí funkci Příjem - část 2
Napište dílčí funkci Příjem - část 2

Může pomoci uvést příklad toho, jak vypadají 2 vyrovnávací paměti, když byly naplněny. Pokud bychom zadali klávesu Enter, vyrovnávací paměti by obsahovaly znaky:

Nyní tedy vidíte, že máme jednu vyrovnávací paměť, což jsou přesně stejné znaky, jako jsme poprvé zadali, a jednu vyrovnávací paměť, která má pouze dvě hodnoty a oddělující čárku. Nyní máme nějaký kód, který může přijímat znaky, které zadáváme na klávesnici Serial Monitor, můžeme přejít z fáze I CDIO do O, zadat některé řetězce a sledovat, co se stane. Nahrajte kód do Master Arduino, otevřete Serial Monitor a zkuste zadat něco platného, například Enter. Zobrazuje se vám ozvěna na obrazovce sériového monitoru, jako je zde zobrazena?

Krok 14: Napište funkce přenosu a analýzy

Napište funkce přenosu a analýzy
Napište funkce přenosu a analýzy
Napište funkce přenosu a analýzy
Napište funkce přenosu a analýzy

Nejprve pro Transmit

Nyní jsme tedy obdrželi řetězec, můžeme zapsat přenosovou funkci: tran (char); nahradit jeho útržek. To nám umožní odeslat řetězec z Master do Slave Arduino, proto se ujistěte, že jsou obě zařízení zapojená a propojená, abyste mohli otestovat tuto novou funkci.

Zadejte tuto funkci, jak je zde ukázáno na řádcích 117 až 133. Jak poznáte, má dvě části, jednu pro přenos na USB kanál (hardwarový UART) a jednu pro přenos do druhého Arduina (softwarový UART.) To by mělo kompilovat chybu -zdarma a můžete okamžitě nahrát skicu a zjistit, co se stane. Tentokrát pošlu. Zobrazuje se vám výsledek?

Snímek obrazovky je zajímavý, protože přijatý řetězec … by měl vypadat správně jako dříve a přenášený řetězec … by nyní měl vypadat správně. Všimněte si však, že převod na celé číslo nefungoval. Aby to fungovalo, je třeba přidat ještě trochu kódu.

Krok 15: Napište funkce přenosu a analýzy

Napište funkce přenosu a analýzy
Napište funkce přenosu a analýzy
Napište funkce přenosu a analýzy
Napište funkce přenosu a analýzy

Pak pro Parse

Toto je část kódu, která analyzuje přijatý řetězec k načtení číselných dílčích řetězců a převede je na celočíselné hodnoty. Je to neplatná parseData (); funkce hlavní smyčky

Nahraďte útržek analýzy kódem zobrazeným v řádcích 98 - 113. Nahrajte jej a podívejme se, zda je problém, který jsme měli s 2 celočíselnými hodnotami, nyní vyřešen. Zkusme to.

Ano, funguje to, jak je ukázáno, nalezená celá čísla jsou 49 a 98.

Krok 16: Finále

Finále!
Finále!

Tato data prošla kolem smyčky z PC přes Master přes slave a zpět přes Master znovu do PC. Když je hotová verze společného nahraná na hlavní i podřízený konec a nyní je vypnutý režim ladění, uvidíme data správně přijatá na obou koncích, jak je znázorněno zde.

Doporučuje: