Close

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 3 měsíci.
Aktuálně je na stránce zobrazeno 8 příspěvků - 1. až 8. (celkem z 8)
  • Autor
    Příspěvky
  • #9758
    Pepan
    Úč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 pomoc

    #9764
    posjirka
    Účastník

    ten 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é.

    #9768
    Pepan
    Účastník

    Tak 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;
    
    #9771
    Zbyšek Voda
    Správce

    Dobrý 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.

    #9772
    Pepan
    Účastník

    Jedno 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.

    #9779
    Luke_CZ
    Účastník

    Jednou 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.

    #9789
    Pepan
    Účastník

    fajn sice nevim jak,ale zitra se na to podivam.Diky

    #9804
    Pepan
    Účastník

    Tak odstraneni funkce snprintf(), nepomohlo.
    Nepomohlo ani pridani kontroly bufferu
    UCSR0A=UCSR0A |(1 << TXC0);
    ….
    while (!(UCSR0A & (1 << TXC0)));

Aktuálně je na stránce zobrazeno 8 příspěvků - 1. až 8. (celkem z 8)
  • Pro reakci na toto téma se musíte přihlásit.