RS 485
Úvodní stránka › Fórum › Vaše projekty › Arduino › RS 485
- Toto téma obsahuje celkem 7 odpovědí. Do diskuze (4 diskutující) se naposledy zapojil uživatel Pepan a poslední změna proběhla před 7 roky a 9 měsíci.
-
AutorPříspěvky
-
27.12.2016 v 0:12 #9758PepanÚčastník
Ahoj
Jiz nekolik tydnu resim komunikaci arduin pres RS 485.Mam problem s obousmernou komunikaci.Kdyz posilam z jednoho arduina do druheho vse funguje.V okamziku kdy prepnu modul na prijem nasledujici posilani odesila spatna nebo zadna data.
Nemate nekdo funkcni priklad posilani obema smery?
Diky za pomoc27.12.2016 v 13:17 #9764posjirkaÚčastníkten dotaz toho moc neřekne. Jaké používáš moduly pro komunikaci? Na jakou vzdálenost? kod programu by taky nebyl k zahození 🙂
Proč používáš Rs485? potřebuješ tahat kvanta dat nebo komunikuješ s jiným zařázením?
I2c je Arduinu blíž, i když má krátky dosah. Už před pár lety jsem měl myšlenku komunikovat pře one-Wire sběrnici. Jednoduchá, s dlouhým dosahem (i když né 1,2Km jak Rs485) a pro základní komunikaci je to bez problémů. Kolega řešil doma síť proopjení asi 3 arduin a nakonec to vyřešil pomocí SW seriových portů na 1 arduinu, které řídilo zbytek. Tochu těžkopádné, ale účelové.27.12.2016 v 18:35 #9768PepanÚčastníkTak to byla druha moznost.
Moduly jsou klasika:
Modul
Potrebuji komunikovat na 30m se 3 arduiny.Proto chci pouzit RS485.Zatim to mam na stole a posilam si datum a cas.Kdyz zakomentuji nebo odpojim pin na prepinani Vysilani/prijem vse funguje.
Kod Master:#include <Wire.h> // Nativni knihovna pro praci se sbernici I2C #include "DS3231.h" // Rucne doinstalovana knihovna pro hodiny DS3231 z GitHubu #define DS3231_I2C_ADDRESS 0x68 // Objekt nasich RTC hodin DS3231 hodiny; // Text s datem a casem ve formatu dd.mm. yyyy hh:mm:ss char txtDatumCas[21]; // Ceske popisky dnu v tydnu (zacina se nedeli) char dny[][7] = {"Ne", "Po", "Ut", "St", "Ct", "Pa", "So"}; DateTime cas(2016, 12, 9, 21, 33, 0, 5); #define SSerialTxControl 2 // RS modul pin 3 // moje adresa, aby prijmac poznal od koho jsou hodnoty // můžete zvolit jakékoliv čislo od 2 do 255 byte myAddress = 8; // buffer pro funkci převodu čísla na text char buff[10]; void setup() { Wire.begin(); // Nastartuj sbernici I2C hodiny.begin(); // Nastartuj RTC hodiny // Inicializujeme seriový port na klasickém pin 0 a 1 (TX a RX) Serial.begin(9600); pinMode(SSerialTxControl, OUTPUT); pinMode(13, OUTPUT); digitalWrite(3, LOW); } void loop() { RTC(); //volani funkce SendData(1, 2,txtDatumCas); // SendData(adresát, cislo promenné, data v char[]) delay(2000); // v jakém inervrvalu se data budou odesílat } /////////////////////////////////////////////////////// // deklarace funkce které data v určitém formátu odešle void SendData(byte address, byte var, char data[]){ digitalWrite(13,HIGH); digitalWrite(SSerialTxControl, 1); // mod odelsilaní delay(100); Serial.write(0x02); //start byte Serial.write(address); // ardesat (komu odesíláme) - u primece neni vyuzito Serial.write(myAddress); //moje adresa - od koho to prijmaci doslo Serial.write(var); // ocislovaní promenné Serial.write(data); // hodnota nebo data Serial.write(0x03); // stop byte digitalWrite(SSerialTxControl, 0); // konec modu odelsilaní digitalWrite(13,LOW); delay(100); } String RTC() { // Ziskej aktualni cas z RTC hodin cas = hodiny.now(); // Uloz do txtDatumCas datum a cas ve formatu dd.mm. yyyy hh:mm:ss snprintf(txtDatumCas, sizeof(txtDatumCas), "%02d.%02d.%d %02d:%02d:%02d", cas.date(), cas.month(), cas.year(), cas.hour(), cas.minute(), cas.second()); return txtDatumCas;
28.12.2016 v 11:26 #9771Zbyšek VodaSprávceDobrý den, jakou desku máte?
Nemůžou se vám tlouct piny použitých periferií?Třeba deska Arduino Leonardo používá pin 2 pro I2C komunikaci.
28.12.2016 v 11:46 #9772PepanÚčastníkJedno arduino je uno jako master a jako slave je pouzito nano.Komunikace nefunguje,ani kdyz vynecham RTC a posilam jen text.Zkousel jsem to i pres softverovou seriovou linku a chova se to stejne.Jednou komunikace projde a pak uz ne.Je to tim ze na konci odesilani prepinam komunikac na prijem.Pokud to zakomentuji, nebo odpojim ridici pin z arduina tak data jsou odesilany a prijimany v poradku.
28.12.2016 v 17:57 #9779Luke_CZÚčastníkJednou jsem to řešil, problém byl ten, že se serial neměl rád s funkcí snprintf(), zkus posílat data jako pole, mě to vyřešilo problém.
L.
28.12.2016 v 21:50 #9789PepanÚčastníkfajn sice nevim jak,ale zitra se na to podivam.Diky
29.12.2016 v 22:12 #9804PepanÚčastníkTak odstraneni funkce snprintf(), nepomohlo.
Nepomohlo ani pridani kontroly bufferu
UCSR0A=UCSR0A |(1 << TXC0);
….
while (!(UCSR0A & (1 << TXC0))); -
AutorPříspěvky
- Pro reakci na toto téma se musíte přihlásit.