Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
Sistemi integrati - problema slave master rs485 arduino
Forum - Sistemi integrati - problema slave master rs485 arduino

Avatar
alex1995 (Normal User)
Expert


Messaggi: 212
Iscritto: 27/01/2011

Segnala al moderatore
Postato alle 21:05
Mercoledì, 09/12/2015
salve, sto cercando di fare comunicare 2 arduino con l' rs485 questo è il mio sorgente:

master:
Codice sorgente - presumibilmente C++

  1. #include <SoftwareSerial.h>
  2. /*-----( Declare Constants and Pin Numbers )-----*/
  3. #define SSerialRX        10  //Serial Receive pin
  4. #define SSerialTX        11  //Serial Transmit pin
  5.  
  6. #define SSerialTxControl 3   //RS485 Direction control
  7.  
  8. #define RS485Transmit    HIGH
  9. #define RS485Receive     LOW
  10.  
  11. #define Pin13LED         13
  12.  
  13. SoftwareSerial RS485Serial(SSerialRX, SSerialTX); // RX, TX
  14.  
  15. int byteReceived;
  16. int byteSend;
  17.  
  18. void setup()
  19. {
  20.  
  21.         Serial.begin(9600);
  22.         Serial.println("YourDuino.com SoftwareSerial remote loop example");
  23.         Serial.println("Use Serial Monitor, type in upper window, ENTER");
  24.         pinMode(Pin13LED, OUTPUT);  
  25.         pinMode(SSerialTxControl, OUTPUT);    
  26.         digitalWrite(SSerialTxControl, RS485Receive);
  27.         RS485Serial.begin(127000);
  28.  
  29. }
  30.  
  31.  
  32. void loop()
  33. {
  34.         digitalWrite(Pin13LED, HIGH);
  35.         if (Serial.available())
  36.         {
  37.                 byteReceived = Serial.read();
  38.                
  39.                 if(byteReceived == 48)
  40.                 {
  41.                         digitalWrite(SSerialTxControl, RS485Transmit);
  42.                         RS485Serial.write(48);
  43.                         digitalWrite(Pin13LED, LOW);
  44.                         delay(10);
  45.                         RS485Serial.write(49);
  46.                         digitalWrite(Pin13LED, LOW);
  47.                         delay(10);
  48.                         RS485Serial.write(50);
  49.                         digitalWrite(Pin13LED, LOW);
  50.                         delay(10);
  51.                         RS485Serial.write(51);
  52.                         digitalWrite(Pin13LED, LOW);
  53.                         delay(10);
  54.                         RS485Serial.write(52);
  55.                         digitalWrite(Pin13LED, LOW);
  56.                         delay(10);
  57.                         RS485Serial.write(53);
  58.                         digitalWrite(Pin13LED, LOW);
  59.                         delay(10);
  60.                         RS485Serial.write(54);
  61.                         digitalWrite(Pin13LED, LOW);
  62.                         delay(10);
  63.                         RS485Serial.write(55);
  64.                         digitalWrite(Pin13LED, LOW);
  65.                         delay(10);
  66.                         RS485Serial.write(56);
  67.                         digitalWrite(Pin13LED, LOW);
  68.                         delay(10);
  69.                         RS485Serial.write(57);
  70.                         digitalWrite(Pin13LED, LOW);
  71.                         delay(10);
  72.                         digitalWrite(SSerialTxControl, RS485Receive);
  73.                 }
  74.                
  75.         }
  76.        
  77.         if (RS485Serial.available())
  78.         {
  79.                 digitalWrite(Pin13LED, HIGH);
  80.                 byteReceived = RS485Serial.read();
  81.                 Serial.write(byteReceived);
  82.                 delay(10);
  83.                 digitalWrite(Pin13LED, LOW);  
  84.         }  
  85.  
  86. }



slave:

Codice sorgente - presumibilmente C++

  1. #include <SoftwareSerial.h>
  2. #include <WString.h>
  3. /*-----( Declare Constants and Pin Numbers )-----*/
  4. #define SSerialRX        10  //Serial Receive pin
  5. #define SSerialTX        11  //Serial Transmit pin
  6.  
  7. #define SSerialTxControl 3   //RS485 Direction control
  8. #define RS485Transmit    HIGH
  9. #define RS485Receive     LOW
  10.  
  11. #define Pin13LED         13
  12.  
  13. SoftwareSerial RS485Serial(SSerialRX, SSerialTX); // RX, TX
  14.  
  15. int byteReceived;
  16. int byteSend;
  17. int *data;
  18. int counter = 0;
  19.  
  20.  
  21. void setup()
  22. {
  23.   Serial.begin(9600);
  24.   Serial.println("SerialRemote");
  25.  
  26.   pinMode(Pin13LED, OUTPUT);  
  27.   pinMode(SSerialTxControl, OUTPUT);  
  28.   digitalWrite(SSerialTxControl, RS485Receive);
  29.   RS485Serial.begin(127000);
  30. }
  31.  
  32.  
  33. void loop()
  34. {
  35.   if (RS485Serial.available())
  36.   {
  37.     while(RS485Serial.available() > 0)
  38.     {
  39.       byteSend = RS485Serial.read();
  40.       data[counter] += byteSend;
  41.       digitalWrite(Pin13LED, HIGH);
  42.       delay(10);              
  43.       digitalWrite(Pin13LED, LOW);
  44.       counter++;
  45.     }
  46.    
  47.     digitalWrite(SSerialTxControl, RS485Transmit);  
  48.     if(data[0] == 48)
  49.     {
  50.       RS485Serial.write(48);
  51.       delay(10);
  52.     }
  53.  
  54.     digitalWrite(SSerialTxControl, RS485Receive);  
  55.  
  56.   }
  57.  
  58. }



non riesco a capire come mai sulla seriale del master appare continuamente la lettera p quando dovrebbe comparire un 1 quando io scrivo 1 sulla seriale del master :S.


PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1127
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 18:46
Sabato, 12/12/2015
Come sono collegate le due schede? Lo standard RS485 non può essere gestito direttamente da Arduino.


La programmazione è arte... fa che i tuoi script siano degni di un museo.
PM Quote
Avatar
alex1995 (Normal User)
Expert


Messaggi: 212
Iscritto: 27/01/2011

Segnala al moderatore
Postato alle 13:48
Giovedì, 24/12/2015
avevo sbagliato a collegare l' rs485 nell arduino uno, l' ho messo su 3.3v poi l' ho spostato sul 5 e ha funzionato. che vuol dire che lo standard rs485 non può essere gestito da arduino?

questo è il sorgente che ora funziona.

Master:

Codice sorgente - presumibilmente C++

  1. #include <SoftwareSerial.h>
  2. #define SSerialRX        10  //Serial Receive pin
  3. #define SSerialTX        11  //Serial Transmit pin
  4.  
  5. #define SSerialTxControl 3   //RS485 Direction control
  6. #define RS485Transmit    HIGH
  7. #define RS485Receive     LOW
  8.  
  9. SoftwareSerial RS485Serial(SSerialRX, SSerialTX); // RX, TX
  10.  
  11. char charbuff;
  12. char message;
  13. String buffer;
  14.  
  15. void setup()
  16. {
  17.         pinMode(13, OUTPUT);  
  18.         pinMode(SSerialTxControl, OUTPUT);
  19.  
  20.   digitalWrite(SSerialTxControl, RS485Transmit); // trasmetti
  21.  
  22.   Serial.begin(9600);
  23.   RS485Serial.begin(127000);
  24. }
  25.  
  26. void loop()
  27. {
  28.  
  29.         if (Serial.available())
  30.         {
  31.  
  32.                 charbuff = (char)Serial.read();
  33.                 buffer = String(charbuff);
  34.  
  35.                 if(buffer == "A")
  36.                 {
  37.                         digitalWrite(SSerialTxControl, RS485Transmit);  // Enable RS485 Transmit
  38.                         digitalWrite(13, HIGH);
  39.                         RS485Serial.print("A");          // Send charbuff to Remote Arduino  
  40.                         digitalWrite(SSerialTxControl, RS485Receive);  // Disable RS485 Transmit
  41.                         digitalWrite(13, LOW);
  42.                         delay(10);
  43.                         buffer = "";
  44.                 }
  45.         }
  46.  
  47.  
  48.         if (RS485Serial.available())
  49.         {
  50.                 message = RS485Serial.read();
  51.                 Serial.print(message);
  52.         }
  53. }



Slave:

Codice sorgente - presumibilmente C++

  1. #include <SoftwareSerial.h>
  2. #define SRS485SerialRX        10  //RS485Serial Receive pin
  3. #define SRS485SerialTX        11  //RS485Serial Transmit pin
  4.  
  5. #define SRS485SerialTxControl 3   //RS485 Direction control
  6. #define RS485Transmit    HIGH
  7. #define RS485Receive     LOW
  8.  
  9. SoftwareSerial RS485Serial(SRS485SerialRX, SRS485SerialTX); // RX, TX
  10.  
  11. char charbuff;
  12. String buffer;
  13.  
  14. void setup()
  15. {
  16.         pinMode(13, OUTPUT);  
  17.         pinMode(SRS485SerialTxControl, OUTPUT);
  18.  
  19.   digitalWrite(SRS485SerialTxControl, RS485Receive); // trasmetti
  20.  
  21.   RS485Serial.begin(9600);
  22.   RS485Serial.begin(127000);
  23. }
  24.  
  25. void loop()
  26. {
  27.  
  28.         if (RS485Serial.available())
  29.         {
  30.                 charbuff = (char)RS485Serial.read();
  31.                 if(charbuff != (char)-1)
  32.                 {
  33.                         buffer += String(charbuff);
  34.                 }
  35.                 if(buffer == "A")
  36.                 {
  37.                         delay(10);
  38.                         digitalWrite(SRS485SerialTxControl, RS485Transmit);  // Enable RS485 Transmit
  39.                         digitalWrite(13, HIGH);
  40.                         RS485Serial.print("B");          // Send charbuff to Remote Arduino  
  41.                         digitalWrite(SRS485SerialTxControl, RS485Receive);  // Disable RS485 Transmit
  42.                         digitalWrite(13, LOW);
  43.                         buffer = "";
  44.                 }
  45.         }
  46. }


Ultima modifica effettuata da alex1995 il 24/12/2015 alle 13:50


PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1127
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 19:41
Giovedì, 24/12/2015
Arduino lavora con segnali digitali, 1 e 0 sopra i 5.5V danneggi la porta, segnale differenziale deve coprire una gamma di valori piu ampia, proprio perché deve resistere ai disturbi che su livello differenziale si annullano, se puoi generare solo 5V e 0V non puoi generare e ricevere un vero segnale differenziale, tanto è vero che la RS232 viene solitamente gestita mediante MAX232 con gli AVR.


La programmazione è arte... fa che i tuoi script siano degni di un museo.
PM Quote
Avatar
alex1995 (Normal User)
Expert


Messaggi: 212
Iscritto: 27/01/2011

Segnala al moderatore
Postato alle 16:46
Domenica, 27/12/2015
ok grazie


PM Quote
Avatar
alex1995 (Normal User)
Expert


Messaggi: 212
Iscritto: 27/01/2011

Segnala al moderatore
Postato alle 10:35
Mercoledì, 27/01/2016
io non lo uso perche devo metterlo in un ambiente con disturbi ma per la distanza elevata che riesce a raggiungere, devo arrivare sopra i 100 mt.

ora ho modificato il sorgente così e va più veloce il comando con la risposta solo che non riesco a capire perche se io do il comando all arduino nano (slave a) 3-4 volte di seguito lui risponde velocemente se invece do il comando allo slave a e poi al b velocemente il b non risponde se invece io aspetto circa 1 secondo tra comando all a e poi al b il b risponde, eppure io guardo i led della direzione del segnale e va immediatamente a low quindi il b dovrebbe essere in grado di ricevere e trasmettere immediatamente :S.

questo è il sorgente master:

Codice sorgente - presumibilmente C++

  1. #include <SoftwareSerial.h>
  2. #define SRS485SerialRX        10  //RS485Serial Receive pin
  3. #define SRS485SerialTX        11  //RS485Serial Transmit pin
  4.  
  5. #define SRS485SerialTxControl 13   //RS485 Direction control
  6. #define RS485Transmit    HIGH
  7. #define RS485Receive     LOW
  8.  
  9. SoftwareSerial RS485Serial(SRS485SerialRX, SRS485SerialTX); // RX, TX
  10.  
  11. char charbuff;
  12. String message;
  13. String buffer;
  14.  
  15. void setup()
  16. {
  17.         pinMode(13, OUTPUT);  
  18.         pinMode(SRS485SerialTxControl, OUTPUT);
  19.         digitalWrite(SRS485SerialTxControl, RS485Receive); // trasmetti
  20.         Serial.begin(9600);
  21.         RS485Serial.begin(4600);
  22. }
  23.  
  24. void loop()
  25. {
  26.  
  27.         begin:
  28.         if(digitalRead(SRS485SerialTxControl) != LOW)
  29.         {
  30.                 digitalWrite(SRS485SerialTxControl, RS485Receive);
  31.                 RS485Serial.flush();
  32.                 Serial.flush();
  33.         }
  34.  
  35.         if(RS485Serial.available())
  36.         {
  37.                 while(RS485Serial.available())
  38.                 {
  39.                         while(String(charbuff) != String((char)-1))
  40.                         {
  41.                                 charbuff = (char)RS485Serial.read();
  42.                                 if(String(charbuff) != String((char)-1))
  43.                                 {
  44.                                         Serial.print(charbuff);
  45.                                 }
  46.                                 if(String(charbuff) == String("\n"))
  47.                                 {
  48.                                         Serial.print(charbuff);
  49.                                         RS485Serial.flush();
  50.                                         Serial.flush();
  51.                                         break;
  52.                                 }
  53.                         }
  54.                 }
  55.         }
  56.  
  57.         if (Serial.available())
  58.         {
  59.  
  60.                 charbuff = (char)Serial.read();
  61.                 buffer = String(charbuff);
  62.  
  63.                 if(buffer == "A")
  64.                 {
  65.                         digitalWrite(SRS485SerialTxControl, RS485Transmit);  // Enable RS485 Transmit
  66.                         RS485Serial.print("A10");          // Send charbuff to Remote Arduino
  67.                         RS485Serial.flush();  
  68.                         digitalWrite(SRS485SerialTxControl, RS485Receive);  // Disable RS485 Transmit
  69.                         buffer = "";
  70.                         goto begin;
  71.                 }
  72.                 if(buffer == "B")
  73.                 {
  74.                         digitalWrite(SRS485SerialTxControl, RS485Transmit);  // Enable RS485 Transmit
  75.                         RS485Serial.print("B10");          // Send charbuff to Remote Arduino  
  76.                         RS485Serial.flush();
  77.                         digitalWrite(SRS485SerialTxControl, RS485Receive);  // Disable RS485 Transmit
  78.                         buffer = "";
  79.                         goto begin;
  80.                 }
  81.         }
  82.  
  83.  
  84.  
  85.  
  86. }



slave a:

Codice sorgente - presumibilmente C++

  1. #include <SoftwareSerial.h>
  2. #define SRS485SerialRX        4  //RS485Serial Receive pin
  3. #define SRS485SerialTX        3  //RS485Serial Transmit pin
  4.  
  5. #define SRS485SerialTxControl 13   //RS485 Direction control
  6. #define RS485Transmit    HIGH
  7. #define RS485Receive     LOW
  8.  
  9. SoftwareSerial RS485Serial(SRS485SerialRX, SRS485SerialTX);
  10.  
  11. char byteBuffer;
  12. String commandBuffer;
  13.  
  14. void setup()
  15. {
  16.         pinMode(13, OUTPUT);
  17.         Serial.begin(9600);
  18.         RS485Serial.begin(4600);
  19.         digitalWrite(SRS485SerialTxControl, RS485Receive);
  20. }
  21.  
  22. void loop()
  23. {
  24.  
  25.         if(digitalRead(SRS485SerialTxControl) != LOW)
  26.         {
  27.                 digitalWrite(SRS485SerialTxControl, RS485Receive);
  28.         }
  29.  
  30.         if(RS485Serial.available())
  31.         {
  32.                 if(digitalRead(SRS485SerialTxControl) != LOW)
  33.                 {
  34.                         digitalWrite(SRS485SerialTxControl, RS485Receive);
  35.                 }
  36.  
  37.                 while(RS485Serial.available())
  38.                 {
  39.  
  40.                         if(digitalRead(SRS485SerialTxControl) != LOW)
  41.                         {
  42.                                 digitalWrite(SRS485SerialTxControl, RS485Receive);
  43.                         }
  44.                        
  45.                         byteBuffer = (char)RS485Serial.read();
  46.                         if(String(byteBuffer) != String((char)-1))
  47.                         {
  48.                                 commandBuffer += String(byteBuffer);
  49.                         }
  50.                         else
  51.                         {
  52.                                 break;
  53.                         }
  54.  
  55.                         if(commandBuffer.length() == 3)
  56.                         {
  57.                                 if(String(commandBuffer) == String("A10"))
  58.                                 {
  59. delay(10);
  60.                                         Serial.println("mando");
  61.                                         digitalWrite(SRS485SerialTxControl, RS485Transmit);
  62.                                         RS485Serial.print("X12345678901234567890123456789012345678901234567890123456789012345678901234567890\n");
  63.                                         RS485Serial.flush();
  64.                                         digitalWrite(SRS485SerialTxControl, RS485Receive);
  65.                                         commandBuffer = "";
  66.                                         break;
  67.                                 }
  68.                         }
  69.  
  70.                         if(commandBuffer.length() > 3)
  71.                         {
  72.                                 RS485Serial.flush();
  73.                                 if(digitalRead(SRS485SerialTxControl) != LOW)
  74.                                 {
  75.                                         digitalWrite(SRS485SerialTxControl, RS485Receive);
  76.                                 }
  77.                                 commandBuffer = "";    
  78.                                 break;
  79.                         }
  80.                 }
  81.         }
  82.  
  83. }



slave b:

Codice sorgente - presumibilmente C++

  1. #include <SoftwareSerial.h>
  2. #define SRS485SerialRX        4  //RS485Serial Receive pin
  3. #define SRS485SerialTX        3  //RS485Serial Transmit pin
  4.  
  5. #define SRS485SerialTxControl 13   //RS485 Direction control
  6. #define RS485Transmit    HIGH
  7. #define RS485Receive     LOW
  8.  
  9. SoftwareSerial RS485Serial(SRS485SerialRX, SRS485SerialTX);
  10.  
  11. char byteBuffer;
  12. String commandBuffer;
  13.  
  14. void setup()
  15. {
  16.         pinMode(13, OUTPUT);
  17.         Serial.begin(9600);
  18.         RS485Serial.begin(4600);
  19.         digitalWrite(SRS485SerialTxControl, RS485Receive);
  20. }
  21.  
  22. void loop()
  23. {
  24.  
  25.         if(digitalRead(SRS485SerialTxControl) != LOW)
  26.         {
  27.                 digitalWrite(SRS485SerialTxControl, RS485Receive);
  28.         }
  29.  
  30.         if(RS485Serial.available())
  31.         {
  32.                 if(digitalRead(SRS485SerialTxControl) != LOW)
  33.                 {
  34.                         digitalWrite(SRS485SerialTxControl, RS485Receive);
  35.                 }
  36.  
  37.                 while(RS485Serial.available())
  38.                 {
  39.  
  40.                         if(digitalRead(SRS485SerialTxControl) != LOW)
  41.                         {
  42.                                 digitalWrite(SRS485SerialTxControl, RS485Receive);
  43.                         }
  44.                        
  45.                         byteBuffer = (char)RS485Serial.read();
  46.                         if(String(byteBuffer) != String((char)-1))
  47.                         {
  48.                                 commandBuffer += String(byteBuffer);
  49.                         }
  50.                         else
  51.                         {
  52.                                 break;
  53.                         }
  54.  
  55.                         if(commandBuffer.length() == 3)
  56.                         {
  57.                                 if(String(commandBuffer) == String("A10"))
  58.                                 {
  59. delay(10);
  60.                                         Serial.println("mando");
  61.                                         digitalWrite(SRS485SerialTxControl, RS485Transmit);
  62.                                         RS485Serial.print("Z12345678901234567890123456789012345678901234567890123456789012345678901234567890\n");
  63.                                         RS485Serial.flush();
  64.                                         digitalWrite(SRS485SerialTxControl, RS485Receive);
  65.                                         commandBuffer = "";
  66.                                         break;
  67.                                 }
  68.                         }
  69.  
  70.                         if(commandBuffer.length() > 3)
  71.                         {
  72.                                 RS485Serial.flush();
  73.                                 if(digitalRead(SRS485SerialTxControl) != LOW)
  74.                                 {
  75.                                         digitalWrite(SRS485SerialTxControl, RS485Receive);
  76.                                 }
  77.                                 commandBuffer = "";    
  78.                                 break;
  79.                         }
  80.                 }
  81.         }
  82.  
  83. }



PM Quote