RS485

Uživatelský avatar
dzooky
Příspěvky: 124
Registrován: 03 úno 2018, 01:09
Reputation: 0
Bydliště: Fintice
Kontaktovat uživatele:

RS485

Příspěvek od dzooky » 29 bře 2018, 22:05

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

T_O_M
Příspěvky: 25
Registrován: 15 srp 2017, 22:05
Reputation: 0

Re: RS485

Příspěvek od T_O_M » 31 bře 2018, 08:05

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.

Uživatelský avatar
dzooky
Příspěvky: 124
Registrován: 03 úno 2018, 01:09
Reputation: 0
Bydliště: Fintice
Kontaktovat uživatele:

Re: RS485

Příspěvek od dzooky » 31 bře 2018, 13:12

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.

T_O_M
Příspěvky: 25
Registrován: 15 srp 2017, 22:05
Reputation: 0

Re: RS485

Příspěvek od T_O_M » 31 bře 2018, 18:57

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íť.

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: RS485

Příspěvek od pavel1tu » 31 bře 2018, 21:36

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 :-)
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

Uživatelský avatar
dzooky
Příspěvky: 124
Registrován: 03 úno 2018, 01:09
Reputation: 0
Bydliště: Fintice
Kontaktovat uživatele:

Re: RS485

Příspěvek od dzooky » 31 bře 2018, 22:17

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

Uživatelský avatar
dzooky
Příspěvky: 124
Registrován: 03 úno 2018, 01:09
Reputation: 0
Bydliště: Fintice
Kontaktovat uživatele:

Re: RS485

Příspěvek od dzooky » 01 dub 2018, 23:27

@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

T_O_M
Příspěvky: 25
Registrován: 15 srp 2017, 22:05
Reputation: 0

Re: RS485

Příspěvek od T_O_M » 02 dub 2018, 20:22

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


BigSandy
Příspěvky: 219
Registrován: 23 zář 2017, 07:09
Reputation: 0

Re: RS485

Příspěvek od BigSandy » 22 dub 2018, 16:04

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

Uživatelský avatar
dzooky
Příspěvky: 124
Registrován: 03 úno 2018, 01:09
Reputation: 0
Bydliště: Fintice
Kontaktovat uživatele:

Re: RS485

Příspěvek od dzooky » 27 dub 2018, 21:26

Mam kupene https://www.aliexpress.com/item/MAX485- ... 0.0.uByXMG

Pozriem linky co si doporucil

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 6 hostů