RS485
- dzooky
- Příspěvky: 124
- Registrován: 03 úno 2018, 01:09
- Reputation: 0
- Bydliště: Fintice
- Kontaktovat uživatele:
RS485
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
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
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.
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.
- dzooky
- Příspěvky: 124
- Registrován: 03 úno 2018, 01:09
- Reputation: 0
- Bydliště: Fintice
- Kontaktovat uživatele:
Re: RS485
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.
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
Zjednodušený kód pro TX:
Tady je kód pro RX:
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
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.).
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íť.
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);
}
}
}
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 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);
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)
{
...
Zatím jsem to zkoušel jen mezi 2 převodníky, ale měla by takto jít udělat celá síť.
- pavel1tu
- Příspěvky: 2054
- Registrován: 26 říj 2017, 08:28
- Reputation: 0
- Bydliště: Trutnov
- Kontaktovat uživatele:
Re: RS485
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
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
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"
Pavel1TU
"Správně napsaný kod lze číst jako knihu"
- dzooky
- Příspěvky: 124
- Registrován: 03 úno 2018, 01:09
- Reputation: 0
- Bydliště: Fintice
- Kontaktovat uživatele:
Re: RS485
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
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
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)
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
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
Odesláno z mého Redmi Note 3 pomocí Tapatalk
Re: RS485
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/
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
Na 20 metru by to ale mělo chodit i bez té 485.
https://www.arduinotech.cz/inpage/ardui ... periferie/
Uvažoval jsem o tom ale nenašel jsem nic lepšího, jak to zapijít, než takto.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
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
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 30 hostů