Stránka 1 z 3

RS485

Napsal: 29 bře 2018, 22:05
od dzooky
Ahojte

Tu na fore mi poradili namiesto I2C na dlhsiu vzdialenost pouzit spominany RS485.
Potrebujem urobit taku arduino siet, zatial 4 arduina, roznych druhov (nano, uno, mega)
Jeden master a ostatne slave.
Master prijima aj vysiela data (spracuvava/vyhodnocuje).
Slaves zalezi od ktoreho, ale niektore rovnako prijimaju aj posielaju data, niektore len posielaju niektore len prijimaju.
V tom I2C to bolo pre mna bravurne osestrene a jednoducho a pochopitelne.
Tu sa k nicomu neviem dopatrat kniznica zatial nenajdena, samples mnou zatial nepochopene vacsinou komunikacia bola len jednostranna.
Viete nieco poradit s cim zacnem a hlavne dokazem toto moje riesenie zastresit RS485?

Mam kupene toto https://www.aliexpress.com/item/MAX485- ... 06607.html

Vdaka

Re: RS485

Napsal: 31 bře 2018, 08:05
od T_O_M
Knihovna není potřeba, komunikuješ normálně po sériové lince. Pokud chceš využívat jiné piny, tak použij knhovnu SoftwareSerial. Návod na kumunikaci např zde: http://www.arduino8.cz/lekce-35-arduino ... ost-1200m/ Pak jen musíš přepínat směr komunikace.

Mě se osvědčila komunikace z tohoto projektu: http://tnweb.tode.cz/sledovani-spotreby ... mu-emontx/
Využívá knihovnou EasyTransfer a je tam krásně vidět, jak přepíná komunikaci. Hlavní Arduino vyšle požadavek a přepne se na příjem, slave požadavek přijme, zjistí jestli se týká komunikace právě ho (na základě přijaté zprávy) a pokud ano, tak se přepne na vysílání a odešle svůj packet, pak se opět přepne na příjem. Přepínání směru komunikace se děje přepínáním stavu na pinu RE+DE (modulu RS485).

Snad ti to takto pomůže.

Re: RS485

Napsal: 31 bře 2018, 13:12
od dzooky
Ahoj

To arduino8 som videl ale prave tam je komunikacia jednym smerom.
Zatial som nepochopil princip ako co prijimat a posielat. Na I2C mi to bolo jasne, mastrer povedal teraz sa posielaju data komu a co potom aj prijimanie tu mi to nie je jasne, hlavne na tom priklade kedze je komunikacia iba jednym smerom.

Na tej druhej linke pozeram tiez niesom mudrejsi hlavne ked je tam kod mastra, slave bude asi v inych clankoch .
No nic skusim vecer k tomu sadnut a dumat nad tym a snad to pochopim a aplikujem u seba.

Re: RS485

Napsal: 31 bře 2018, 18:57
od T_O_M
Zjednodušený kód pro TX:

Kód: Vybrat vše

#include <SoftEasyTransfer.h>
#include <SoftwareSerial.h>
SoftwareSerial mySerial(7, 8);//Arduino RX - RS485 RO, Arduino TX - RS485 DI
#define TXenableRS485 9 //RE + DE

SoftEasyTransfer ET;
const int nodeID = 1;				// emonTx cislo nodu

int inPinHDO = 6;

struct PayloadTX{
byte nodeID, address;
int data1, data2, data3, data4, data5, data6, data7, data8;
long data9, data10, data11, data12; };
									// (Include all the variables that are desired,
									// ensure the same struct is used to receive)

PayloadTX emontx;		// create an instance

boolean tarif;

void setup()
{
  pinMode(TXenableRS485,OUTPUT);
  pinMode(inPinHDO,INPUT);
  mySerial.begin(9600);
  //start the library, pass in the data details and the name of the serial port.
  ET.begin(details(emontx), &mySerial);

  digitalWrite(TXenableRS485,LOW);

  Serial.begin(9600);
  Serial.print("Node: ");
  Serial.println(nodeID);


}

void loop()
{
  tarif = digitalRead(inPinHDO); //zjisteni aktualniho tarifu
	   if(ET.receiveData())
   {
	   	Serial.print("Data recive: ");
	   	Serial.print(emontx.nodeID);
	   	Serial.println(emontx.address);

       if(emontx.nodeID == 10 && emontx.address == 1)
       {
	   	Serial.println("My data recive: ");

    //send data
  emontx.data5 = tarif;
 emontx.nodeID = nodeID;
  emontx.address = 10;
  digitalWrite(TXenableRS485,HIGH);
  ET.sendData();
	digitalWrite(TXenableRS485,LOW); // posli data
 	Serial.print("Tarif: ");
	Serial.println(emontx.data5);
	    }
    }
}
Tady je kód pro RX:

Kód: Vybrat vše

#include <SoftEasyTransfer.h>
#include <SoftwareSerial.h>
#include "U8glib.h"              // knihovna pro komunikaci s OLED displejem
U8GLIB_SSD1306_128X64 OLED(U8G_I2C_OPT_NONE); // inicializace OLED displeje z knihovny U8glib
SoftwareSerial mySerial(7, 8);//Arduino RX - RS485 RO, Arduino TX - RS485 DI
#define TXenableRS485 9 //RE + DE

SoftEasyTransfer ET;
const int nodeID = 10;				// emonTx cislo nodu

struct PayloadTX{
byte nodeID, address;
int data1, data2, data3, data4, data5, data6, data7, data8;
long data9, data10, data11, data12; };
									// (Include all the variables that are desired,
									// ensure the same struct is used to receive)

PayloadTX emontx;		// create an instance

unsigned long dataTime = 0;

void setup()
{
  pinMode(TXenableRS485,OUTPUT);
  mySerial.begin(9600);
  //start the library, pass in the data details and the name of the serial port.
  ET.begin(details(emontx), &mySerial);

  digitalWrite(TXenableRS485,LOW);

  Serial.begin(9600);
}

void loop()
{
if(millis() >= dataTime+1000){
    dataTime = millis();
    //send data
  emontx.nodeID = nodeID;
  emontx.address = 1;
  digitalWrite(TXenableRS485,HIGH);
  ET.sendData();
	digitalWrite(TXenableRS485,LOW); // posli data
	    }
	   if(ET.receiveData())
	{
		       if(emontx.nodeID == 1 && emontx.address == 10)
       {
	Serial.print("Tarif: ");
		 Serial.println(emontx.data5);
	Serial.print("Vrms: ");
		 Serial.println(emontx.data4);

    OLED.firstPage();
      do {
        OLED.setFont(u8g_font_7x14);
        OLED.setPrintPos(0, 10); // nastavime pozici kurzoru na 7 misto 1 radku
        OLED.print("Vrms: " + (String)emontx.data4 + " V"); // na displeji zobrazime hodnotu
        OLED.setPrintPos(0, 30); // nastavime pozici kurzoru na 9 misto 2 radku
        OLED.print("Vcc: " + (String)emontx.data9 + " mV"); // na displeji zobrazime chybu
        OLED.setPrintPos(0, 60); // nastavime pozici kurzoru na 9 misto 2 radku
        OLED.print("Tarif: " + (String)emontx.data5); // na displeji zobrazime chybu

        } while( OLED.nextPage() );

	}
 }
}
RX má adresu 10 a TX adresu 1.

RX pošle každých 1000ms data podle sturktury PayloadTX a přepne se na příjem

Kód: Vybrat vše

digitalWrite(TXenableRS485,LOW);
Všechny TX jsou přepnuté na příjem. RX tedy vyšle požadavek aby mu TX1 odeslalo svoje data. TX přijme data, zjistí zda byly odeslány z adresy 10 a jsou pro adresu 1 (pro druhé TX adresa 2 atd.).

Kód: Vybrat vše

...
   if(ET.receiveData())
   {
	   	Serial.print("Data recive: ");
	   	Serial.print(emontx.nodeID);
	   	Serial.println(emontx.address);

       if(emontx.nodeID == 10 && emontx.address == 1)
       {
...
Pak se přepne na vysílání, odešle svoje data a opět se přepne na příjem a čeká na nový požadavek.

Zatím jsem to zkoušel jen mezi 2 převodníky, ale měla by takto jít udělat celá síť.

Re: RS485

Napsal: 31 bře 2018, 21:36
od pavel1tu
Vím že se tu opět se zlou potážu, ale ten příklad zmátl i mne, a to mi již 485 funguje :-D

V českých příkladech je zmatečně používáno "zařízení RX" "zařízení TX" a tak nějak podobně.
V anglických příkladech je správně MASTER a SLAVE/REMOTE

Master je ten hlavní, ten jediný může "vysílat" do sběrnice. Buď odešle data pro nějakého slejva, nebo od nich data vyčítá.
Příkladů je na netu spousta tak nebudu vyzobávat kod, je to z příkladu u knihovny.

PS: základní knihovnu jsem nikdy nerozchodil s nějakou paritou, ani ji nemá, ale existují knihovny (má oblíbená je Auto485.h), která tuto základní knihovnu rozšiřují právě o tuto paritu - což jsem již při zkoušení na nepájivém poli ocenil :-)

Re: RS485

Napsal: 31 bře 2018, 22:17
od dzooky
No pomalicky zacinam tomu chapat ale predsa par otazok.
Ty hovoris ze mas 1 master a jeden slave.
Ak to dobre chapem najprv master posle konkretnemu slavovi s tebou budem komunikovat a ten mu odosle data.
Kvoli comu tam mas

Kód: Vybrat vše

if(emontx.nodeID == 1 && emontx.address == 10)
Ved odpovie mu len dany slave a mas tam predsa len jeden.
Iny by mu nemal odpoved aj ked ho tam nemas, preco toto?

Uvazujem ci toto nieje pomala komunikacia. Mam meteostanicu, kde komplet kod kym preleti vsetky snimace mu to trva viac ako sekundu.
Keby som mal niekolko takych slavov, ta len cakanie na data od nich bude trvat niekolko sekund a nie este co ma on spravit pomimo. Umna napriklad otvaranie brany tak neviem ci zaregistruje ze som stlacil tlacidlo ked bude akurat cakat na komunikaciu.

Opravte ak sa mylim

Re: RS485

Napsal: 01 dub 2018, 23:27
od dzooky
@T_O_M
Prerobil som tvoj kod ale skusil som priamo aj tvoj kod ale nefunguje mi.
Slave dostane spravu len nodeID a address ale akosi master potom uz neobdrzi nic, zatial netusim preco

Re: RS485

Napsal: 02 dub 2018, 20:22
od T_O_M
Divný, zkoušel jsem to asi dva měsíce zpátky a fungovalo to. Jak bude čas, tak to můžu zkusit poskládat. Určitě bude více cest, jak komunikaci rozhodit, já narazil na tento projekt a přišlo mi, že je to přesně co potřebuju (připojit asi 4 Arduina). Zatím mám ale vyzkoušenou jen komunikaci mezi dvěma, dál jsem se k tomu z časových důvodu nedostal. Proto jsou v kódu ty ID, pro 2 převodníky to tam být nemusí. Je ale možný, že až se dostanu dál, tak zjistím že to není ono. Dával jsem to sem proto, že jsem s tím dělal nedávno a fungovalo to.

Odesláno z mého Redmi Note 3 pomocí Tapatalk


Re: RS485

Napsal: 22 dub 2018, 16:04
od BigSandy
http://www.naylampmechatronics.com/blog ... duino.html

Na 20 metru by to ale mělo chodit i bez té 485.
https://www.arduinotech.cz/inpage/ardui ... periferie/
při napětí 12V Vám to bude fungovat spolehlivě na 100 m
při napětí 5V, bych se spoléhal na vzdálenost do 50 m
při napětí 3,3V bych se spoléhal na vzdálenost do 30 m
Uvažoval jsem o tom ale nenašel jsem nic lepšího, jak to zapijít, než takto.
https://s18.postimg.cc/d5flirjh5/arduino_UART.png
Když se však posere jedno arduino,spadne celý systém.

Nebo si kup 485 s automatickým přepinaním.
https://www.aliexpress.com/item/Single- ... 0.0.Bu98oQ
https://www.aliexpress.com/item/TTL-to- ... 0.0.Bu98oQ

Re: RS485

Napsal: 27 dub 2018, 21:26
od dzooky
Mam kupene https://www.aliexpress.com/item/MAX485- ... 0.0.uByXMG

Pozriem linky co si doporucil