Arduina komunikující na vzdálenost 10 metrů

Mirek

Re:Arduina komunikující na vzdálenost 10 metrů
« Odpověď #15 kdy: 28. 04. 2017, 14:58:41 »
Na 10 metrů bude fungovat normální serial, I2C a 1Wire. SPI na 10 metrů by se muselo vyzkoušet, a asi nastavit raději nižší rychlost. Pozor na rušení a indukci napětí, to RS485 (jak radí kolega výše) by bylo nejrozumnější.
Pokud to má být bez drátů, tak na 10 metrů budou fungovat bezdrátové moduly v ceně malého balíčku žvýkaček na 433 MHz i 2,4 GHz. Oboje může být zarušeno vetřelcem, tak na to pozor.

Urcite nechci bezdrat. Na RS485 akorat budu muset vyresit, ze pokud bezi interakce mezi klavesniciX a ustrednou tak jina klavesnice bude "mlcet".  Spis teda I2C
To nemusíš řešit. Stačí použít MASTER - SLAVE komunikační protokol a mít ústřednu jako master a klávesnice jako slave.


Dejma

Re:Arduina komunikující na vzdálenost 10 metrů
« Odpověď #16 kdy: 29. 04. 2017, 13:34:44 »
já ke spokojenosti používám
bezdrátové modulky NRF24L01
na ebay tak za 20kč

https://www.youtube.com/watch?v=kPJ9wPWJJhY

ale...
drát je drát :))

dustin

Re:Arduina komunikující na vzdálenost 10 metrů
« Odpověď #17 kdy: 29. 04. 2017, 16:58:57 »
... NRF24L01 ...

Na jaké rychlosti ti to běží? Budu potřebovat něco podobného a zatím jsem plánoval dražší HC12. Díky.

Dejma

Re:Arduina komunikující na vzdálenost 10 metrů
« Odpověď #18 kdy: 29. 04. 2017, 19:13:39 »
... NRF24L01 ...

Na jaké rychlosti ti to běží? Budu potřebovat něco podobného a zatím jsem plánoval dražší HC12. Díky.
To nevím, mám to jako domovní zvonek + vrátný + chipové otevírání dveří, aby děcka nemusely mít klíče.
Dělal jsem to podle tohoto
https://arduino-info.wikispaces.com/Nrf24L01-2.4GHz-HowTo
o rychlosti možná bude něco ve specifikaci
http://www.nordicsemi.com/eng/content/download/2730/34105/file/nRF24L01_Product_Specification_v2_0.pdf

Mě se na tom líbí cena poměr/výkon + dostupné informace a knihovna s examples přímo v IDE Arduina.


Pepa3000

Re:Arduina komunikující na vzdálenost 10 metrů
« Odpověď #19 kdy: 02. 05. 2017, 14:39:27 »
Mam skoro hotovo...

Pres i2c dostava klavesnice informace pro zobrazovani na LCD + dalsi stavove informace v CSV formatu.
Narazil sem ovsem na rozdeleni csv do patricnych promennych.

retezec
Kód: [Vybrat]
String retezec="STAVA;STAVB;STAVC";
potrebuji rozdelit pomoci oddelovace ; do promennych

Muze nekdo pomoct?




Roman

Re:Arduina komunikující na vzdálenost 10 metrů
« Odpověď #20 kdy: 02. 05. 2017, 14:47:46 »
Jedine kabel, protoze problemy zacinaji tam, kde konci kabel. Kabel a RS485 - mam odzkouseno v praxi vzdalenost +- 30m a jede kraasne. Podle ruznych clanku to jde i na delsi trasu napr http://www.arduino8.cz/lekce-35-arduino-komunikace-pres-rs485-az-na-vzdalenost-1200m/

dustin

Re:Arduina komunikující na vzdálenost 10 metrů
« Odpověď #21 kdy: 02. 05. 2017, 15:00:29 »
potrebuji rozdelit pomoci oddelovace ; do promennych

Muze nekdo pomoct?

sscanf http://stackoverflow.com/a/35168657

Mirek

Re:Arduina komunikující na vzdálenost 10 metrů
« Odpověď #22 kdy: 02. 05. 2017, 15:28:26 »
Mam skoro hotovo...

Pres i2c dostava klavesnice informace pro zobrazovani na LCD + dalsi stavove informace v CSV formatu.
Narazil sem ovsem na rozdeleni csv do patricnych promennych.

retezec
Kód: [Vybrat]
String retezec="STAVA;STAVB;STAVC";
potrebuji rozdelit pomoci oddelovace ; do promennych

Muze nekdo pomoct?
Takže jsi se nakonec rozhodl pro I2C? Na 10 metrů? A I2C děláš jen přes piny Arduina a nebo používáš nějaký posilovač sběrnice (buffer)? Třeba P82B96?

A k tomu dotazu na parsování řetězce: proč to řešíš takhle složitě? Proč nevyužiješ vlastnosti I2C komunikace a nepošleš STAVA s jednou adresou, STAVB s další adresou a STAVC s úplně jinou adresou? Nemusíš nic parsovat, jen přijatou zprávu uložíš do různých proměnných v závislosti na adrese.

Mirek

Re:Arduina komunikující na vzdálenost 10 metrů
« Odpověď #23 kdy: 02. 05. 2017, 15:30:00 »
potrebuji rozdelit pomoci oddelovace ; do promennych

Muze nekdo pomoct?

sscanf http://stackoverflow.com/a/35168657
Proboha, jen to ne!!! Proč používat na jednočipu pro tak triviální záležitost obludné funkce z rodiny ?printf /?scanf??? To není to samé jako PC nebo server. Je třeba trochu přemýšlet.

Mirek

Re:Arduina komunikující na vzdálenost 10 metrů
« Odpověď #24 kdy: 02. 05. 2017, 15:32:04 »
A ještě k té I2C. Tohle je její stručná charakteristika:

I²C (Inter-Integrated Circuit), pronounced I-squared-C, is a multi-master, multi-slave, packet switched, single-ended, serial computer bus invented by Philips Semiconductor (now NXP Semiconductors). It is typically used for attaching lower-speed peripheral ICs to processors and microcontrollers in short-distance, intra-board communication. Alternatively I²C is spelled I2C (pronounced I-two-C) or IIC (pronounced I-I-C).

Není to úplně to pravé pro daný účel...

Pepa3000

Re:Arduina komunikující na vzdálenost 10 metrů
« Odpověď #25 kdy: 02. 05. 2017, 16:22:30 »
Mam skoro hotovo...

Pres i2c dostava klavesnice informace pro zobrazovani na LCD + dalsi stavove informace v CSV formatu.
Narazil sem ovsem na rozdeleni csv do patricnych promennych.

retezec
Kód: [Vybrat]
String retezec="STAVA;STAVB;STAVC";
potrebuji rozdelit pomoci oddelovace ; do promennych

Muze nekdo pomoct?
Takže jsi se nakonec rozhodl pro I2C? Na 10 metrů? A I2C děláš jen přes piny Arduina a nebo používáš nějaký posilovač sběrnice (buffer)? Třeba P82B96?

A k tomu dotazu na parsování řetězce: proč to řešíš takhle složitě? Proč nevyužiješ vlastnosti I2C komunikace a nepošleš STAVA s jednou adresou, STAVB s další adresou a STAVC s úplně jinou adresou? Nemusíš nic parsovat, jen přijatou zprávu uložíš do různých proměnných v závislosti na adrese.

JJ, pomoci I2C, nekdo tu psal, ze to je na 10M ok. V pripade problemu mam resit snad frekvenci na ktere to pojede.
 
Citace
Proč nevyužiješ vlastnosti I2C komunikace a nepošleš STAVA s jednou adresou, STAVB s další adresou a STAVC s úplně jinou adresou?

Neco takoveho?

+potreboval bych poslat i string ne jenom byte. STAVC je string

Master:

Kód: [Vybrat]
  Wire.beginTransmission(88);
  Wire.write(STAVA);
  Wire.write(STAVB);
  Wire.write(STAVC);


Slave:

void receiveEvent(int howMany) {

   STAVA = Wire.read();   
   STAVB = Wire.read();   
   STAVC = Wire.read();
       
  }





Mirek

Re:Arduina komunikující na vzdálenost 10 metrů
« Odpověď #26 kdy: 02. 05. 2017, 16:57:32 »
Zaprvé, nejdříve kritika:

 - I2C na komunikaci mezi 2 zařízeními (procesorovými jednotkami) na cca 10 m je pěkná zhovadilost. Ano, ono to nakonec nějak bude fungovat, třeba sundáš hodiny jak píšeš. Nejspíš. Většinou. Ale není to na to stavěné. Když už, použít nějaký I2C bus buffer na proudové posílení. Ale nechápu proč do toho jít u úplně nového systému, kde si můžeš vybrat co chceš.

 - Posílat si přes I2C zprávy v řetězcích oddělených středníkem je další blbost. Ne že by to nakonec nešlo, ale je strašná krávovina

 - na embedded zařízeních a speciálně těch s AT Mega a podobně výkonnými procesory nemá funkce sscanf a jí podobné co dělat. A to z více důvodů. Ne že by to nějak nefungovalo, ale žere příliš zdrojů a (podle implementace) může být náročná na paměť na zásobníku. Všechno špatně pro systém s omezenými zdroji.


A teď má doporučení:

1. Komunikace: RS-485 (nemáš peer-2-peer, ale spojuješ více zařízení, takže RS-232 nejde). I2C je pro komunikaci mezi součástkami na jedné desce, případně více deskách, ale v rámci stejného zařízení.

2. Neposílej zprávu, kterou pak musíš složitě parsovat, najednou. Využij nějaký standardní protokol (třeba modbus s otevřenou implementací - www.modbus.org). A pro každý řetězec si zadefinuj zprávu (kód). Takže když budeš posílat data, pošleš v hlavičce adresu zařízení (na který displej to posíláš), za ní kód zprávy (0: Stav A, 1: Stav B, 2: Stav C, ...), a následně řetězec. U Modbusu budeš mít jasně dané mantinely implementací protokolu. Modbus přes RS-485 je ověřené, stabilní a spolehlivé řešení.

3. Nepoužívej sscanf - pro "malé" procesory v embedded systémech je to žrout zdrojů a zabiják výkonu.

Pokud se i přesto rozhodneš zůstat u I2C, najdi si datasheet nějaké součástky, která I2C používá a inspiruj se tím, jak ho používají. Třeba nějaký LED displej kontrolér (např. http://www.ti.com/lit/ds/symlink/tpic2810.pdf - podívej se na Slave address, sub-address, data). A doporučím ti osadi nějaký I2C buffer na těch 10 m. Jaký vlastně máš kabel? UTP? Na jaké vodiče jsi zapojil SDA a SCL? Doufám že ne do jednoho páru.

Mirek

Re:Arduina komunikující na vzdálenost 10 metrů
« Odpověď #27 kdy: 02. 05. 2017, 17:05:25 »
Citace
Proč nevyužiješ vlastnosti I2C komunikace a nepošleš STAVA s jednou adresou, STAVB s další adresou a STAVC s úplně jinou adresou?

Neco takoveho?

+potreboval bych poslat i string ne jenom byte. STAVC je string

Master:

Kód: [Vybrat]
  Wire.beginTransmission(88);
  Wire.write(STAVA);
  Wire.write(STAVB);
  Wire.write(STAVC);


Slave:

void receiveEvent(int howMany) {

   STAVA = Wire.read();   
   STAVB = Wire.read();   
   STAVC = Wire.read();
       
  }

Vůbec nerozumíš tomu, jak I2C funguje.

Kód: [Vybrat]
Wire.beginTransmission(slave_address); // Adresa slave zařízení
Wire.write(subadr);              // Kód zprávy (0 = STAVA, 1 = STAVB, ...) 
Wire.write("Blábol");            // String 
Wire.endTransmission();      // stop transmitting
[/quote]

Ve slavu (klavesnice) si přečteš první byte (0-2) a podle jeho hodnoty potom použiješ přijatá data jako STAVA, STAVB nebo STAVC...

MarSik

Re:Arduina komunikující na vzdálenost 10 metrů
« Odpověď #28 kdy: 02. 05. 2017, 17:16:40 »
Na 485 si musíš napsat sám formát paketů, adresování, řízení slave nodů (aby odpovídal jen ten správný..)..., pokud bude komunikace jednosměrná, tak ti stačí vymyslet pakety s adresou a použít jednodušší RS422. Obojí se dá připojit k UART periferii toho Arduina.

Další možností je pak třeba CAN. ARM Cortex M kontrolery (jako třeba ten v Arduino Due) ho dost často obsahují a stačí jen dodat transceivery a kabeláž. Je to složitější protokol na nastavení než jen sériová linka, ale zase ti už přímo řeší pakety a jejich kolize. Klasické Arduino (Uno) CAN neumí, ale MCP2515 je typicky používaná součástka (existuje dost knihoven), která ho přidá.


Pepa3000

Re:Arduina komunikující na vzdálenost 10 metrů
« Odpověď #29 kdy: 02. 05. 2017, 17:23:19 »
Tak radeji teda Rs485 s modbus