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

MarSik

Re:Arduina komunikující na vzdálenost 10 metrů
« Odpověď #30 kdy: 02. 05. 2017, 17:41:05 »
Ale jinak co se týká zarušení útočníkem.. DoS znamená, že se nikdo nedostane dovnitř příp. neodblokuje alarm že? Možná by mohlo být zajímavé přemýšlet i o tom co se stane, když do klávesnice chrstne vodu. Je to totiž mnohem levnější a blbější typ 'útoku' :)

Se zarušeným SPI (zařízení byl vzdáleně řízený tuner pro anténu, takže pekelné prostředí..) mám zkušenost na vzdálenost víc jak 30m, ale chtělo to nižší rychlost a diferenciální páry. Nová verze téhož bude používat CAN (protože senzory s asynchronním posíláním zpráv). I2C je v tomhle nechutné kvůli clock stretching (ty oficiální budiče jsou celkem drahé). RS485 je super, stačí málo drátů, ale chce to dobře napsat software.

A musím souhlasit s Mirkem. Mikrokontroléry o téhle velikosti komunikují textově maximálně s uživatelem. Mezi sebou jedině binárně!

S Modbusem přes RS485 mám osobně dva problémy:
- pořád neřeší linkovou vrstvu (tj multi master kolize), což jde pokud ty zprávy nejsou asynchronní a řídící jednotka se na všechno doptává (pak doporučuju mít jeden drát/pár v pull-up open collector konfiguraci na signalizaci přerušení)
- implementace zabírá místo a někdo ji musí udělat (knihovny asi jsou), což je nevýhoda oproti CANu, který v těch mikrokontrolerech už často je zabudovaný

A obecně alarm, dvě klávesnice a pár senzorů (a RFID/NFC?) je pořád dost vágní. I jako hračka by to asi nemělo být úplně snadno obejitelné obzvláště pokud to bude u vstupu do domu... Bacha třeba na replay attack (odposlechnutí a pozdější zopakování komunikace).


Pepa3000

Re:Arduina komunikující na vzdálenost 10 metrů
« Odpověď #31 kdy: 02. 05. 2017, 18:18:37 »
Zkousim to ted cvicne pomoci RS485  vlastnim protokolem.

Mam gsm modul a pro seriovy port smerem ke klavesnicim pouzivam SoftwareSerial.

Mam, ale situaci kdy mi muze master uvaznout.
Na zacatku odesilani stavu ustredny a doptavani se na heslo zadane na klavesnici je klavesnice prvne adresovana a ceka se jestli je dostupna.
Odzabezpecit tak zonu v pripade mrtve klavesnice by neslo ani prostrednictvim druhe.

Pokud v ten moment nic neprijde, master uvazne. U SoftwareSerial sem nenasel nic pro timeout.


Pepa3000

Re:Arduina komunikující na vzdálenost 10 metrů
« Odpověď #32 kdy: 02. 05. 2017, 18:22:05 »
mozna funkce portOne.available()?

dustin

Re:Arduina komunikující na vzdálenost 10 metrů
« Odpověď #33 kdy: 02. 05. 2017, 18:35:29 »
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.
[/quote]

Máš nějaké linky ohledně vyšší výpočetní náročnosti oproti jiným řešením? Nic se mi najít nepodařilo.

Mirek

Re:Arduina komunikující na vzdálenost 10 metrů
« Odpověď #34 kdy: 02. 05. 2017, 20:03:59 »
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á.
Nechci rejpat, ale už jsi někdy opravdu programoval něco multislave s RS485? Ve skutečnosti je to strašně jednoduché a vůbec bych to nesrovnával s CAN.

RS485 je, dá se říct, složitostí v podstatě na úrovni I2C implementace ve Wiring.


Mirek

Re:Arduina komunikující na vzdálenost 10 metrů
« Odpověď #35 kdy: 02. 05. 2017, 20:08:44 »
S Modbusem přes RS485 mám osobně dva problémy:
- pořád neřeší linkovou vrstvu (tj multi master kolize), což jde pokud ty zprávy nejsou asynchronní a řídící jednotka se na všechno doptává (pak doporučuju mít jeden drát/pár v pull-up open collector konfiguraci na signalizaci přerušení)
- implementace zabírá místo a někdo ji musí udělat (knihovny asi jsou), což je nevýhoda oproti CANu, který v těch mikrokontrolerech už často je zabudovaný
Ale podle mne tazatel nepotřebuje Multi-master. Má řídicí jednotku (master) a několik klávesnic (slave). Nevidím v tom naprosto žádný problém.

Implementace Modbusu pro mikrokontroléry je tady: https://sourceforge.net/projects/freemodbus.berlios/

Spousta free nástrojů zde: http://www.modbus.org/tech.php

Mirek

Re:Arduina komunikující na vzdálenost 10 metrů
« Odpověď #36 kdy: 02. 05. 2017, 20:16:55 »
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.

Máš nějaké linky ohledně vyšší výpočetní náročnosti oproti jiným řešením? Nic se mi najít nepodařilo.
[/quote]
Opravdu se ptáš na porovnání náročnosti sscanf() a jednoduché fce, která kopíruje znaky do prvního stringu, když narazí na ";" začne do druhého a po dalším ";" do třetího a skončí?

Napiš si krátký prográmek s implementací obojího a změř si čas + paměťovou náročnost.

printf/scanf knihovny mívají i pár kB kódu - podle rozsahu implementace. Opravdu má smysl plýtvat pamětí? Je běžné, že libc mívá 2 verze - základní bez printf/scanf, a rozšířenou s jejich podporou.

MarSik

Re:Arduina komunikující na vzdálenost 10 metrů
« Odpověď #37 kdy: 02. 05. 2017, 23:08:30 »
Citace
Nechci rejpat, ale už jsi někdy opravdu programoval něco multislave s RS485? Ve skutečnosti je to strašně jednoduché a vůbec bych to nesrovnával s CAN.

Multi-slave ano, to je dost primitivní. Hodně se snažím minimalizovat spotřebu a tam navíc pomůže mít ten interrupt signál.

V tom úplně původním dotazu byly zmíněné senzory / RFID, a proto jsem nabyl dojmu, že by to mohl chtít rozšířit o čtečku karet, pohybové čidlo a podobně (když ne hned, tak hned potom). A tam už multi master může mít svoje opodstatnění (alarm funkční i bez hlavní jednotky...).

Samozřejmě souhlasím, že CAN implementace je složitá, když si ji člověk musí napsat sám. Jenže proč bych to dělal, když už to dneska má kde co jako zabudovanou periferii.. 8 bit Arduino už totiž nepatří mezi moje platformy první volby, za stejnou (nebo spíš nižší - $13) cenu mám třeba Tiva C Launchpad, která se dá programovat úplně stejně (mno 99%) jako to Arduino (pomocí Enerigia IDE).

Nemá cenu diktovat Pepovi co má použít. Ale má cenu mu ukázat, že se to dá lepit i jinak. Jen musí vědět co chce vlastně vytvořit a jak spolehlivé to má být. Přístup typu "jediný můj nástroj je kladivo, tak se budu tvářit, že všechno je hřebík" totiž není zrovna ideální.

Mirek

Re:Arduina komunikující na vzdálenost 10 metrů
« Odpověď #38 kdy: 02. 05. 2017, 23:30:45 »
Citace
Nechci rejpat, ale už jsi někdy opravdu programoval něco multislave s RS485? Ve skutečnosti je to strašně jednoduché a vůbec bych to nesrovnával s CAN.

Multi-slave ano, to je dost primitivní. Hodně se snažím minimalizovat spotřebu a tam navíc pomůže mít ten interrupt signál.

V tom úplně původním dotazu byly zmíněné senzory / RFID, a proto jsem nabyl dojmu, že by to mohl chtít rozšířit o čtečku karet, pohybové čidlo a podobně (když ne hned, tak hned potom). A tam už multi master může mít svoje opodstatnění (alarm funkční i bez hlavní jednotky...).

Samozřejmě souhlasím, že CAN implementace je složitá, když si ji člověk musí napsat sám. Jenže proč bych to dělal, když už to dneska má kde co jako zabudovanou periferii.. 8 bit Arduino už totiž nepatří mezi moje platformy první volby, za stejnou (nebo spíš nižší - $13) cenu mám třeba Tiva C Launchpad, která se dá programovat úplně stejně (mno 99%) jako to Arduino (pomocí Enerigia IDE).

Nemá cenu diktovat Pepovi co má použít. Ale má cenu mu ukázat, že se to dá lepit i jinak. Jen musí vědět co chce vlastně vytvořit a jak spolehlivé to má být. Přístup typu "jediný můj nástroj je kladivo, tak se budu tvářit, že všechno je hřebík" totiž není zrovna ideální.
Chápu tě. Já jsem z Pepových dotazů pochopil jedno - potřebuje jednoduché a srozumitelné řešení. V komunikacích a v embedded je nováček a jeho hlavní požadavek na ten alarm je aby se na něčem praktickém naučil dělat s Arduinem i trochu složitější věci a měl nakonec radost že to funguje. Komplikovanější věci až na dalších projektech... To je alespoň můj názor.

dustin

Re:Arduina komunikující na vzdálenost 10 metrů
« Odpověď #39 kdy: 02. 05. 2017, 23:35:30 »
Nejlevnější arduino (klon, mega328, ale zatím mi vždy fungovalo na 100%) vyjde na 40 Kč s dopravou https://www.aliexpress.com/item/Free-shipping-2pcs-lot-New-pro-mini-electronic-building-blocks-Interactive-Media-ATMEGA328P-5V-16M-for/1982267942.html

ehmmm

Re:Arduina komunikující na vzdálenost 10 metrů
« Odpověď #40 kdy: 03. 05. 2017, 00:04:21 »
Chapu nadseni vsech pro rs485. I kdyz jeste pred tim bych se zamyslel, jestli mu na 10 metru nestaci obycejny ttl uart. Jestli ma tech vysilaci nebo prijemcu jenom par, tak by to mozna stacilo pres nejake odpory nebo diody proste zapojit do sebe, ale asi by to byla prasecina, rs485 je spravnejsi reseni.

Co se tyka protokolu, tak nez resit, odkud opsat dobre udelanej modbus, tak bych se vubec nebal si znovu vymyslet vlastni kolo a na modbus bych se vykaslal. Preci jenom zrovna na Arduinu mi vadi, ze nektere knihovny na netu jsou dost amaterske a zrovna tohle je fakt trivialni uloha, kde hledani spravne knihovny muze zabrat zbytecne moc casu.
Za jeden vecer to vymysli, za druhy vecer naprogramuje a za treti vecer odladi. To uz jsme tady prodiskutovali mnohem vic casu.

Re:Arduina komunikující na vzdálenost 10 metrů
« Odpověď #41 kdy: 03. 05. 2017, 00:56:53 »
Jen poznámka na okraj: na rozsekání podle středníků bych použil strtok (všichni zkritizovali sscanf, ale rozumnou náhradu nikdo nezmínil).

char *prvni = strtok(zprava, ";");
char *druhy = strtok(NULL, ";");
char *treti = strtok(NULL, ";");

ehmmm

Re:Arduina komunikující na vzdálenost 10 metrů
« Odpověď #42 kdy: 03. 05. 2017, 06:23:49 »
Nahradu tady nekdo zminil - neposilat stredniky.

Mirek

Re:Arduina komunikující na vzdálenost 10 metrů
« Odpověď #43 kdy: 03. 05. 2017, 07:22:24 »
Chapu nadseni vsech pro rs485. I kdyz jeste pred tim bych se zamyslel, jestli mu na 10 metru nestaci obycejny ttl uart. Jestli ma tech vysilaci nebo prijemcu jenom par, tak by to mozna stacilo pres nejake odpory nebo diody proste zapojit do sebe, ale asi by to byla prasecina, rs485 je spravnejsi reseni.
Prosím, postni sem schéma jak si to přesně představuješ + vysvětlení toho, co Pepa3000 přesně získá tím, že nepoužije standardní RS485 v katalogovém zapojení (1 malý IC), ale nějaký bastl ve kterém bude RS232 budič (1 IC) + blíže nespecifikované množství dalších součástek s pochybnou šancí na úspěch.

Co se tyka protokolu, tak nez resit, odkud opsat dobre udelanej modbus, tak bych se vubec nebal si znovu vymyslet vlastni kolo a na modbus bych se vykaslal. Preci jenom zrovna na Arduinu mi vadi, ze nektere knihovny na netu jsou dost amaterske a zrovna tohle je fakt trivialni uloha, kde hledani spravne knihovny muze zabrat zbytecne moc casu.
Za jeden vecer to vymysli, za druhy vecer naprogramuje a za treti vecer odladi. To uz jsme tady prodiskutovali mnohem vic casu.
Chápu tvé nadšení. Ale znovu si projdi Pepovy dotazy. Možná se pletu, ale myslím že tohle by pro něj představovalo opravdu hodně práce s relativně malou šancí na úspěch. Já bych mu doporučil jít cestou implementace standardního, ověřeného řešení. Pokud si bude chtít pohrát s programováním, ať vezme Modbus ASCII protokol a podle specifikace ho naprogramuje sám. Je to poměrně jednoduché.

Mirek

Re:Arduina komunikující na vzdálenost 10 metrů
« Odpověď #44 kdy: 03. 05. 2017, 07:23:45 »
Jen poznámka na okraj: na rozsekání podle středníků bych použil strtok (všichni zkritizovali sscanf, ale rozumnou náhradu nikdo nezmínil).

char *prvni = strtok(zprava, ";");
char *druhy = strtok(NULL, ";");
char *treti = strtok(NULL, ";");
Rozumnou náhradu nikdo nezmínil?

Citace
"Opravdu se ptáš na porovnání náročnosti sscanf() a jednoduché fce, která kopíruje znaky do prvního stringu, když narazí na ";" začne do druhého a po dalším ";" do třetího a skončí?"