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

Mirek

Re:Arduina komunikující na vzdálenost 10 metrů
« Odpověď #45 kdy: 03. 05. 2017, 07:24:58 »
Nahradu tady nekdo zminil - neposilat stredniky.
Přesně tak. Pro danou platformu je řešením navrhnout lépe komunikační protokol a odstranit nutnost parsovat string.


Mirek

Re:Arduina komunikující na vzdálenost 10 metrů
« Odpověď #46 kdy: 03. 05. 2017, 08:33:38 »
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...).

V informacích od Pepik3000 je, že dříve dělal se senzory, RFID, ... a teď chce udělat něco složitějšího.

Citace
"Je to jen na hrani. Od rozblikane ledky, teplomeru, ctecek RFID chci trosku pokrocit. Tohle mi prijde zajimave. "

Za mně je to poměrně jednoduché - ústředna jako master a v pravidelných intervalech (třeba 100 ms) "oblizuje" všechny slave, jestli pro ni nemají něco nového. Pokud ano, přečte si to a zareaguje. Následně do všech slave odešle příslušné výsledky (zprávy na display, ...) a jede se dál. Prostě klasika.

A navíc, i s těmi senzory to stále jde realizovat se single master. Netvrdím že Modbus je optimální, ale je jednoduchý na pochopení a implementace jsou normálně k dispozici.

ehmmm

Re:Arduina komunikující na vzdálenost 10 metrů
« Odpověď #47 kdy: 03. 05. 2017, 08:54:15 »
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.

No, jak rikam, byla by to prasecina, ale vubec bych se nedelal s urovnema rs232. Proste master by mel Tx rozvedeny primo na Rx vsech slavu. Snad by to ubudil. (Kdyby neubudil, tak pres tranzistor a odpor.) A druhym smerem bych se inspiroval ve schematu pro Arduino Nano. Uvidis tam 1k odpor z USB prevodniku do Rx ATmegy. Podle me to je z toho duvodu, ze autori predpokladaji, ze nekdo nebude chtit komunikovat pres USB, ale primo (respektive pres svuj spravne velky odpor) na Rx. Jednou jsem to zkousel (ovsem na vzdalenost 10 cm) a fungovalo to. Ale spis bych dal ke kazdemu slavu k jeho Tx diodu v zavernem smeru a master beztak uz ma na Rx uvnit atmegy zapnuty pullup.

Doufam, ze jsem alespon pobavil, a ted hrrr do me...  :)

Pepa3000

Re:Arduina komunikující na vzdálenost 10 metrů
« Odpověď #48 kdy: 03. 05. 2017, 12:13:08 »
Mam nasledujici test:

Slave:

Kód: [Vybrat]

    called=mySerial.read();
       
    if (called==ID){   
      mySerial.write(123);
      armState = mySerial.read(); 
    }
     
Serial.println(armState);



Master:

Kód: [Vybrat]
void loop() { // run over and over


    mySerial.write(88);
 
    while (mySerial.available() > 0){
     inByte = mySerial.read();
     Serial.println(inByte);
    }
   
  mySerial.write(armState); // posila pouze jeden byte
   

}

Na vystupu slave, ale dostavam:


Kód: [Vybrat]
5
5
5
5
-1
-1
-1
5
5
5
5

Nevim proc tam skace ta -1. Je to nejakym zpozdenim?



ehmmm

Re:Arduina komunikující na vzdálenost 10 metrů
« Odpověď #49 kdy: 03. 05. 2017, 12:43:15 »
Jenom prvni napad: nemuze slave ten armState zkouset precist driv, nez ho master zapise?


Mirek

Re:Arduina komunikující na vzdálenost 10 metrů
« Odpověď #50 kdy: 03. 05. 2017, 12:46:53 »
Chlape, čti dokumentaci než se budeš ptát:

"Returns: the first byte of incoming serial data available (or -1 if no data is available) - int"

Zdroj: https://www.arduino.cc/en/Serial/read

Mirek

Re:Arduina komunikující na vzdálenost 10 metrů
« Odpověď #51 kdy: 03. 05. 2017, 12:54:37 »
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.

No, jak rikam, byla by to prasecina, ale vubec bych se nedelal s urovnema rs232. Proste master by mel Tx rozvedeny primo na Rx vsech slavu. Snad by to ubudil. (Kdyby neubudil, tak pres tranzistor a odpor.) A druhym smerem bych se inspiroval ve schematu pro Arduino Nano. Uvidis tam 1k odpor z USB prevodniku do Rx ATmegy. Podle me to je z toho duvodu, ze autori predpokladaji, ze nekdo nebude chtit komunikovat pres USB, ale primo (respektive pres svuj spravne velky odpor) na Rx. Jednou jsem to zkousel (ovsem na vzdalenost 10 cm) a fungovalo to. Ale spis bych dal ke kazdemu slavu k jeho Tx diodu v zavernem smeru a master beztak uz ma na Rx uvnit atmegy zapnuty pullup.

Doufam, ze jsem alespon pobavil, a ted hrrr do me...  :)
Pobavil, nepobavil. To je jedno. Zajímá mně jediná věc: proč bys to dělal? Co ti to přinese? Ve skutečnosti to jde udělat i snáz (https://www.maximintegrated.com/en/app-notes/index.mvp/id/723), ale proč? Mimo jiné např budeš potřebovat navíc jeden RS232 budič na zařízeních "uvnitř" sítě.

Tak tedy znovu - proč by Pepa3000 měl, namísto RS485 určeného pro připojení velkého množství zařízení použít RS232 určený pro point-to-point? Nebo dokonce snad i jen TTL úrovně přímo z pinů MCU?

Co mu to přinese?

Mirek

Re:Arduina komunikující na vzdálenost 10 metrů
« Odpověď #52 kdy: 03. 05. 2017, 12:59:08 »
A ještě dodám, jednoduchý SN75176 pro RS485 (vím, má své mouchy, ale na uvedený účel bohatě stačí), stojí 10-15 Kč. RS232 budiče jsou výrazně dražší.

ehmmm

Re:Arduina komunikující na vzdálenost 10 metrů
« Odpověď #53 kdy: 03. 05. 2017, 13:04:28 »
Nebo dokonce snad i jen TTL úrovně přímo z pinů MCU?

Jo, presne tak jsem to myslel.  :)

Co mu to přinese?

Spoustu zabavy.

(Nez se na to vykasle a udela to po rs485. Evidentne to je nejaky student, ktery ma spoustu casu na pokusy a objevovani, kudy ne. Tohle mu neublizi.)

Jinak dekuji za doplneni vzdelani, SN75176 jsem neznal. Vzdycky jsem v prumyslu pracoval pouze s celymi hotovymi prevodniky "RS485 na neco", napr. od Papoucha. Na ebayi je tech brouku dokonce 5 kusu za dolar.

MarSik

Re:Arduina komunikující na vzdálenost 10 metrů
« Odpověď #54 kdy: 03. 05. 2017, 14:32:13 »
Spoustu zabavy.

Přesně, pokud ho opravdu nechcete zatěžovat komplikacema, tak ať se vykašle na diferenciální vedení, rozchodí si to na stole přes čisté "TTL" (klidně s vlastním protokolem) a pak tam "jen" vloží RS485 driver, přidá nějakou XOR kontrolu, případně naimplementuje modbus. Stejně musí nejdříve přijít na to jak navrhnout aplikační logiku. Dekompozice problému na jednodušší celky ho naučí mnohem víc, než když to nějak slepí a nebude vědět proč.

(Nez se na to vykasle a udela to po rs485. Evidentne to je nejaky student, ktery ma spoustu casu na pokusy a objevovani, kudy ne. Tohle mu neublizi.)

Taky si myslím. Než se dostane k 10m vzdálenosti nodů v zarušeném prostředí nebo dvěma klávesnicím, tak přijde ještě na hodně dalších otázek.

Pepa3000

Re:Arduina komunikující na vzdálenost 10 metrů
« Odpověď #55 kdy: 03. 05. 2017, 15:13:42 »
A taky dostal...

Ustredna:
Kód: [Vybrat]

void loop() { // run over and over
    keypad();
}


void keypad(){
   // Send base information and password request
    mySerial.write(88);
   
    if (mySerial.available() > 0){
      int status=mySerial.read();
      if (status==1){
        while (mySerial.available() > 0){
         int intByte= mySerial.read();
         password+=(int)intByte;
        }     
        mySerial.write(armState);   
        mySerial.write(passwordState);
      }
    }
}




Klavesnice:

Kód: [Vybrat]
void loop() { // run over and over

   called=mySerial.read();       
    if (called==ID){   
     serialInterrupt();
    }               
Serial.println(armState);
}

void serialInterrupt(){
      mySerial.write(1);
      mySerial.write(passwd);
      if (mySerial.available() > 0){
         armState = mySerial.read();   
      }
      if (mySerial.available() > 0){
         passwordState = mySerial.read();   
      }
     
     
}


Problem je ze v kodu klavesnice dostavam do promennych "armstate" nebo "passwordState" hodnotu 88, tedy oznaceni startu komunikace s pozadovanou klavesnici.

ehmmm

Re:Arduina komunikující na vzdálenost 10 metrů
« Odpověď #56 kdy: 03. 05. 2017, 15:27:16 »
No to je divny, vid.  :)
Kdyz podle ukazky tam ustredna porad tlaci 88. Ovsem nekdy se skutecne muze stat, ze pred dokoncenim odeslani 88 z ustredny prijde z klavesnice jednicka a v takovem pripade ustredna klavesnici posle i neco jineho nez 88.
Hele, mas vubec tuseni, co se ti tam odehrava?
Jak vubec to posilani a prijem probiha a jak dlouho to trva?
Co takhle nejake timeouty?
Co takhle neco jako nejake pakety s nejakym uvozovacim znakem, delkou, kontrolnim souctem, atd.?
Nechces si treba prohlednout, jak vypada komunikace modbusem? Nemyslim nejakou knihovnu, myslim ten protokol. Zrejme to pro tebe bude docela objevne.

MarSik

Re:Arduina komunikující na vzdálenost 10 metrů
« Odpověď #57 kdy: 03. 05. 2017, 15:36:03 »
Kód: [Vybrat]

void loop() { // run over and over
    keypad();
}


void keypad(){
   // Send base information and password request
    mySerial.write(88);

Je ti jasné, že to 88 posíláš ve smyčce pořád dokola? Ta odpověď nestihne přijít včas na to, aby ten následující if hned něco provedl. Takže se zamysli nad časováním.

Kód: [Vybrat]
   
    if (mySerial.available() > 0){
      int status=mySerial.read();
      if (status==1){
        while (mySerial.available() > 0){

Tady počítáš s tím, že ten přenos bude dost rychlý na to, aby celé heslo bylo v paměti dřív, než proběhne ten tvůj while. No a ono nebude. Pošli si nejdřív délku, ať víš kolik znaků čekat. available() ti jenom řekne, jestli čekají přijatá data v bufferu.

Kód: [Vybrat]
         int intByte= mySerial.read();
         password+=(int)intByte;

Plus? Cože si to posíláš? Co je password? String? Takhle se totiž stringy v C nespojují..


Klavesnice:

Kód: [Vybrat]
void loop() { // run over and over

   called=mySerial.read();       
    if (called==ID){   
     serialInterrupt();
    }               
Serial.println(armState);
}

A co když to ID nesedí? To je pak zpráva pro někoho jiného a měl bys ji celou ignorovat než zase začneš čekat na ID. Další důvod proč posílat i délku.

Kód: [Vybrat]
void serialInterrupt(){
      mySerial.write(1);
      mySerial.write(passwd);
      if (mySerial.available() > 0){
         armState = mySerial.read();   
      }

Zase available(). Ono to opravdu udělá něco jiného než čekáš. Tady by asi mělo být spíš while(!mySerial.available());

Kód: [Vybrat]
      if (mySerial.available() > 0){
         passwordState = mySerial.read();   
      }

A tady taky.
     
     
Citace
Problem je ze v kodu klavesnice dostavam do promennych "armstate" nebo "passwordState" hodnotu 88, tedy oznaceni startu komunikace s pozadovanou klavesnici.

Tomu se vůbec nedivím. To Arduino běží na 16Mhz, TTL UART je tam typicky nastavený na 115200 baud (nebo dokonce jen 9600), tj nepočítej s tím, že ti přijde odpověď hned v čase pro další instrukci. Synchronizaci ti musí dělat ty zprávy a to Arduino na ně musí počkat. Druhá věc je to, že posíláš výzvu 88 pořád dokola místo čekání na odpověď a neznáš délku odpovědi, abys rozhodl, že už ji máš celou.

MarSik

Re:Arduina komunikující na vzdálenost 10 metrů
« Odpověď #58 kdy: 03. 05. 2017, 15:46:00 »
Dejte už pokoj s MODBUSem. To jste si nevšimli, že studovat strukturu jeho rámců (a důvod pro ni) je poněkud víc než zvládne? Trocha googlení mi ale našla třeba celkem slušné pojednání tady: http://eli.thegreenplace.net/2009/08/12/framing-in-serial-communications/

MarSik

Re:Arduina komunikující na vzdálenost 10 metrů
« Odpověď #59 kdy: 03. 05. 2017, 15:52:56 »
Ale když už o něm mluvíte, zajímá ho sekce 2.5.1.1 z http://www.modbus.org/docs/Modbus_over_serial_line_V1.pdf

A je to ten framing typ 1) z toho článku výše.