Sériový přenos dat

Odpovědět
daton
Příspěvky: 664
Registrován: 16 bře 2013, 16:12

Sériový přenos dat

Příspěvek od daton »

Dobrý den
potřeboval bych po jednom či dvou drátech přenášet data. Jedná se o přenos z 20 vstupů a to pouze stavu 1 nebo 0. Jejich frekvence může být tak jednou za sekundu tedy nijak rychlé. Jde ale o to že to musí být přeneseno po jednom či dvou drátech na vzdálenost cca 10m avšak s co nejmenší chybovostí. Chtěl jsem se zeptat zda by mi mohl někdo napsat příkladový kod kterým bych mohl pomocí jednoho arduina vysílat opakovaně dvacet znaků a druhým arduinem je přijímat. Předpokládám že by bylo možno kod vložit do obou arduin a tedy střídavě přenášet data na jedno či druhé arduino. Pokud by to bylo možné dávám přednost co nejjednoduššímu řešení, které by se potom mohlo vylepšovat či modifikovat.
Prosím mohl by jste mi někdo napsat kus takovéhoto kodu?
Uživatelský avatar
fulda
Příspěvky: 1367
Registrován: 04 led 2016, 17:18

Re: Sériový přenos dat

Příspěvek od fulda »

Přenos po jednom drátu je v plánu na příští sobotu na robodoupě.
Po dvou drátech je normální sériovka?
Za pravopisné chyby v této zprávě může moje učitelka češtiny.
daton
Příspěvky: 664
Registrován: 16 bře 2013, 16:12

Re: Sériový přenos dat

Příspěvek od daton »

Jo to chápu, jen jsem chtěl, zda by sem nemohl někdo hodit funkční kod dok vysílaci a přijimací strany tedy praktickou část, teorii bych si poslechl na přednášce tam se funkčni kod rozdávat asi nebude. Je mi jedno zda to bude po jednom či dvou drátech ale vzhledem k délce asi i2c požitelná nebude.
DavidO
Příspěvky: 1138
Registrován: 01 kvě 2013, 21:27

Re: Sériový přenos dat

Příspěvek od DavidO »

i2c rozhodně na 10m drátem ne. Tedy ne že by to bylo vyloučeno, ale na to i2c není, asi tak jako že Trabantem se taky dá projet svět dokola, ale pro nás normální lidi to není. Na Robodoupěti se ale bude mluvit i o jiných možnostech, třeba OneWire a když na to přijde, i o čemkoli jiném.
Nicméně i tak si myslím, že natáhnout 10m drátu mezi dvěma Arduiny přímo není dobré, že by to chtělo nějaký linkový budič, který by se ti už mohl postarat o odolnost jak proti šumům tak proti Rakušákům a tím pádem by i ty programy byly něco triviálního typu na jedná straně Serial.print(něco); a na druhé while(Serial.available()) {c=Serial.read();Raketa.vystřel(c);}. Jinak bude velmi záležet na konkrétních podmínkách, na takovém drátě se ti může i v paneláku nachytat neskutečné elektrické smetí a odpálit ti Arduino ani nemrkneš. Transceivery třeba na RS-485 jsou za pár kaček a ušetříš si spoustu starostí.
(tedy úplně celkově, ono ani použít na tohle Arduino není tak úplně OK, Arduino je na první učení a na blbůstky na stole, kde nevadí, že to občas nefunguje)
Nikoho plánovaně neurážím. Jestli se Vám nelíbí co píšu, tak to nečtěte. A ostatně, třeba za to nemůžu - Researchers believe that dark humor can be a significant symptom of dementia.
daton
Příspěvky: 664
Registrován: 16 bře 2013, 16:12

Re: Sériový přenos dat

Příspěvek od daton »

Zdravím
Díky za odpověd, já samozřejmě chápu, že arduino je jen učební pomůcka a popravdě před čtyřmi roky jsem životaschopnosti nevěřil téměř vůbec, ale potom jsem jednoduchým programováním napsal (s pomocí několika dobrodějů) server který monitoruje solární systém a generuje to na vnitřní wifi domu přes W5100 a router. I když program od té doby stále doladuji mohu říci že dokáže běžet přes 100 dní bez problémů, záseku atp a stále měří asi 20 veličin včetně částečného řízení systému v reálné čase. Program zabírá skoro celou pamět arduina nano ale je neskutečně stabilní. Tyto zkušenosti posílili moji důvěru k této platformě a rozhodl jsem se domácí systém obohatit o sběr dat z pir a dalších senzorů ale potřebuji tyto informace dostat z místnosti v přízemí do patra cca 10m pomocí max jednoho páru kroucené dvojlinky. Že využiji nějaké proudové moduly typu RS485 jsem bral jako hotovou věc mám je i připravené ale potřebuji právě nějaký jednoduchý kod tak jak to je nastřeleno zde
tím pádem by i ty programy byly něco triviálního typu na jedná straně Serial.print(něco); a na druhé while(Serial.available()) {c=Serial.read();Raketa.vystřel(c);}.
ale pokud možno více rozepsané abych to mohl vložit do programu a pokusně si odzkoušet na stole. Ještě nikdy jsem s přenosem dat takto neexperimentoval a proto bych potřeboval příklad funkčního kodu jak vysílacího tak přijímacího. Na netu jsem toho mnoho funkčního a jednoduchého nenašel. Trochu jsem si pohrával s myšlenkou že to zkusím seriovým přenosem z knihovny pro MAX7219 přičemž ten max by sloužil jako přijímač ale to bymi obsdilo mnoho digitálních pinu horního arduina. Lepe by bylo dekodovat to v arduinu. Moc díky za pomoc.
Uživatelský avatar
fulda
Příspěvky: 1367
Registrován: 04 led 2016, 17:18

Re: Sériový přenos dat

Příspěvek od fulda »

Jestli ti mohu radit, tak se nejprve podívej, jak jsou postavené vrstvy komunikačních protokolů.
Začni tím, že si definuješ nějakou fyzickou vrstvu - tam se zdá, že už jsi začal - jeden pár UTP. Že se tak ptám, co je v těch ostatních párech? A je v ceně společná zem? A ještě - jak je to s napájením? Je definováno jinde?
Pak nějakou linkovou vrstvu. Pokud je společný potenciál definovaný jinde, tak je docela triviální použít něco jako RS485, pokud společný potenciál není jinde, tak bude potřeba použít něco, co ho nepotřebuje. Podle toho se také rozhoduje způsob kódování dat? Jestli použít běžnou sériovku, nebo třeba nějaký NRZI nebo tak něco. Asi bych se soustředil na komunikaci v základním pásmu, dělat nějaké modemy do přeneseného pásma je asi blbost.
Za pravopisné chyby v této zprávě může moje učitelka češtiny.
daton
Příspěvky: 664
Registrován: 16 bře 2013, 16:12

Re: Sériový přenos dat

Příspěvek od daton »

No tomu jsem se chtěl pravě vyhnout. zatim mi to funguje analogově co senzor to jeden drat, napjeni společné, vše stejny potencial. Přestává se mi ale dostávat vodičů proto potřebuji přenášet vice dat po méně drátech. jde jen o stav jedna nebo nula tedy seriově jen 20 bitů. Myslel jsem že bych mohl od vas získat jednoduchý kod pro vysílání i příjem.
Uživatelský avatar
Dex
Administrátor
Příspěvky: 1526
Registrován: 16 úno 2013, 14:26

Re: Sériový přenos dat

Příspěvek od Dex »

Já to nějak nechápu :) Prostě se na jedné straně pošle bajt (dva, tři - podle potřeby) a na druhé straně se načtou. Přímo v dokumentaci k Arduino je popsáno jak poslat respektive přijmout bajt(y). Nic na tom není, stačí to použít ;)

A co použít rovnou ethernet když už s ním jsou zkušenosti z předchozích pokusů? Ten je rozhodně dostatečně robustní. Také to jde zkusit bez drátů. Na 10m WiFi nebude problém a stejně v tom objektu (předpokládám) už je.

Jinak pro propojení jen dvou Arduin stačí i klasická RS-232. I2C rozhodně ne! ;)
"all your robots are belong to us"
robodoupe.cz
Uživatelský avatar
jrt
Příspěvky: 1921
Registrován: 17 úno 2013, 17:13

Re: Sériový přenos dat

Příspěvek od jrt »

http://uart.cz/139/arduino-a-seriova-komunikace/
https://arduino.cz/seriova-komunikace-a-cykly/
http://www.hwkitchen.com/news/a11-propo ... arizenimi/
http://robotika.vosrk.cz/guide/arduino/lesson07/cs
http://www.arduino8.cz/lekce-35-arduino ... ost-1200m/

V těch článcích je opravdu vše (včetně vzorových kódů), co k vyřešení problému se sériovou komunikací potřebuješ.
Pokud přijedeš na únorové RD, vezmi sebou dvě arduina, kus drátu a můžeme zkoušet.
jrt
daton
Příspěvky: 664
Registrován: 16 bře 2013, 16:12

Re: Sériový přenos dat

Příspěvek od daton »

Diky Jirko
prostuduji tebou doporučené články a vyzkouším to když tak to doladíme na srazu díky. :D
Odpovědět