Oppure

Loading
09/12/15 20:05
alex1995
salve, sto cercando di fare comunicare 2 arduino con l' rs485 questo è il mio sorgente:

master:
#include <SoftwareSerial.h>
/*-----( Declare Constants and Pin Numbers )-----*/
#define SSerialRX        10  //Serial Receive pin
#define SSerialTX        11  //Serial Transmit pin

#define SSerialTxControl 3   //RS485 Direction control

#define RS485Transmit    HIGH
#define RS485Receive     LOW

#define Pin13LED         13

SoftwareSerial RS485Serial(SSerialRX, SSerialTX); // RX, TX

int byteReceived;
int byteSend;

void setup()
{

	Serial.begin(9600);
	Serial.println("YourDuino.com SoftwareSerial remote loop example");
	Serial.println("Use Serial Monitor, type in upper window, ENTER");
	pinMode(Pin13LED, OUTPUT);   
	pinMode(SSerialTxControl, OUTPUT);    
	digitalWrite(SSerialTxControl, RS485Receive);
	RS485Serial.begin(127000);

}


void loop()
{
	digitalWrite(Pin13LED, HIGH);
	if (Serial.available())
	{
		byteReceived = Serial.read();
		
		if(byteReceived == 48)
		{
			digitalWrite(SSerialTxControl, RS485Transmit);
			RS485Serial.write(48);
			digitalWrite(Pin13LED, LOW);
			delay(10);
			RS485Serial.write(49);
			digitalWrite(Pin13LED, LOW);
			delay(10);
			RS485Serial.write(50);
			digitalWrite(Pin13LED, LOW);
			delay(10);
			RS485Serial.write(51);
			digitalWrite(Pin13LED, LOW);
			delay(10);
			RS485Serial.write(52);
			digitalWrite(Pin13LED, LOW);
			delay(10);
			RS485Serial.write(53);
			digitalWrite(Pin13LED, LOW);
			delay(10);
			RS485Serial.write(54);
			digitalWrite(Pin13LED, LOW);
			delay(10);
			RS485Serial.write(55);
			digitalWrite(Pin13LED, LOW);
			delay(10);
			RS485Serial.write(56);
			digitalWrite(Pin13LED, LOW);
			delay(10);
			RS485Serial.write(57);
			digitalWrite(Pin13LED, LOW);
			delay(10);
			digitalWrite(SSerialTxControl, RS485Receive); 
		}
		
	}
	
	if (RS485Serial.available())
	{
		digitalWrite(Pin13LED, HIGH);
		byteReceived = RS485Serial.read();
		Serial.write(byteReceived);
		delay(10);
		digitalWrite(Pin13LED, LOW);  
	}  

}


slave:

#include <SoftwareSerial.h>
#include <WString.h>
/*-----( Declare Constants and Pin Numbers )-----*/
#define SSerialRX        10  //Serial Receive pin
#define SSerialTX        11  //Serial Transmit pin

#define SSerialTxControl 3   //RS485 Direction control
#define RS485Transmit    HIGH
#define RS485Receive     LOW

#define Pin13LED         13

SoftwareSerial RS485Serial(SSerialRX, SSerialTX); // RX, TX

int byteReceived;
int byteSend;
int *data;
int counter = 0;


void setup()
{
  Serial.begin(9600);
  Serial.println("SerialRemote");
  
  pinMode(Pin13LED, OUTPUT);   
  pinMode(SSerialTxControl, OUTPUT);  
  digitalWrite(SSerialTxControl, RS485Receive);
  RS485Serial.begin(127000);
}


void loop()
{
  if (RS485Serial.available()) 
  {
    while(RS485Serial.available() > 0)
    {
      byteSend = RS485Serial.read();
      data[counter] += byteSend;
      digitalWrite(Pin13LED, HIGH);
      delay(10);              
      digitalWrite(Pin13LED, LOW);
      counter++;
    }
    
    digitalWrite(SSerialTxControl, RS485Transmit);  
    if(data[0] == 48)
    {
      RS485Serial.write(48);
      delay(10);
    }

    digitalWrite(SSerialTxControl, RS485Receive);   

  }
  
}


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.
aaa
12/12/15 17:46
Roby94
Come sono collegate le due schede? Lo standard RS485 non può essere gestito direttamente da Arduino.
aaa
24/12/15 12:48
alex1995
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:

#include <SoftwareSerial.h>
#define SSerialRX        10  //Serial Receive pin
#define SSerialTX        11  //Serial Transmit pin

#define SSerialTxControl 3   //RS485 Direction control
#define RS485Transmit    HIGH
#define RS485Receive     LOW

SoftwareSerial RS485Serial(SSerialRX, SSerialTX); // RX, TX

char charbuff;
char message;
String buffer;

void setup()
{
	pinMode(13, OUTPUT);   
	pinMode(SSerialTxControl, OUTPUT);

  digitalWrite(SSerialTxControl, RS485Transmit); // trasmetti

  Serial.begin(9600);
  RS485Serial.begin(127000);
}

void loop()
{

	if (Serial.available())
	{

		charbuff = (char)Serial.read();
		buffer = String(charbuff);

		if(buffer == "A")
		{
			digitalWrite(SSerialTxControl, RS485Transmit);  // Enable RS485 Transmit
			digitalWrite(13, HIGH);
			RS485Serial.print("A");          // Send charbuff to Remote Arduino   
			digitalWrite(SSerialTxControl, RS485Receive);  // Disable RS485 Transmit
			digitalWrite(13, LOW);
			delay(10); 
			buffer = "";
		}
	}


	if (RS485Serial.available()) 
	{
		message = RS485Serial.read();
		Serial.print(message);
	}
}


Slave:

#include <SoftwareSerial.h>
#define SRS485SerialRX        10  //RS485Serial Receive pin
#define SRS485SerialTX        11  //RS485Serial Transmit pin

#define SRS485SerialTxControl 3   //RS485 Direction control
#define RS485Transmit    HIGH
#define RS485Receive     LOW

SoftwareSerial RS485Serial(SRS485SerialRX, SRS485SerialTX); // RX, TX

char charbuff;
String buffer;

void setup()
{
	pinMode(13, OUTPUT);   
	pinMode(SRS485SerialTxControl, OUTPUT);

  digitalWrite(SRS485SerialTxControl, RS485Receive); // trasmetti

  RS485Serial.begin(9600);
  RS485Serial.begin(127000);
}

void loop()
{

	if (RS485Serial.available())
	{
		charbuff = (char)RS485Serial.read();
		if(charbuff != (char)-1)
		{
			buffer += String(charbuff);
		}
		if(buffer == "A")
		{
			delay(10);
			digitalWrite(SRS485SerialTxControl, RS485Transmit);  // Enable RS485 Transmit
			digitalWrite(13, HIGH);
			RS485Serial.print("B");          // Send charbuff to Remote Arduino   
			digitalWrite(SRS485SerialTxControl, RS485Receive);  // Disable RS485 Transmit
			digitalWrite(13, LOW);
			buffer = "";
		}
	}
}
Ultima modifica effettuata da alex1995 24/12/15 12:50
aaa
24/12/15 18:41
Roby94
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.
aaa
27/12/15 15:46
alex1995
ok grazie
aaa
27/01/16 9:35
alex1995
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:

#include <SoftwareSerial.h>
#define SRS485SerialRX        10  //RS485Serial Receive pin
#define SRS485SerialTX        11  //RS485Serial Transmit pin

#define SRS485SerialTxControl 13   //RS485 Direction control
#define RS485Transmit    HIGH
#define RS485Receive     LOW

SoftwareSerial RS485Serial(SRS485SerialRX, SRS485SerialTX); // RX, TX

char charbuff;
String message;
String buffer;

void setup()
{
	pinMode(13, OUTPUT);   
	pinMode(SRS485SerialTxControl, OUTPUT);
	digitalWrite(SRS485SerialTxControl, RS485Receive); // trasmetti
	Serial.begin(9600);
	RS485Serial.begin(4600);
}

void loop()
{

	begin:
	if(digitalRead(SRS485SerialTxControl) != LOW)
	{
		digitalWrite(SRS485SerialTxControl, RS485Receive);
		RS485Serial.flush();
		Serial.flush();	
	}

	if(RS485Serial.available())
	{
		while(RS485Serial.available())
		{
			while(String(charbuff) != String((char)-1)) 
			{
				charbuff = (char)RS485Serial.read();
		  		if(String(charbuff) != String((char)-1))
		  		{
		  			Serial.print(charbuff);
		  		}
		  		if(String(charbuff) == String("\n"))
		  		{
		  			Serial.print(charbuff);
		  			RS485Serial.flush();
					Serial.flush();
					break;
		  		}
			}
		}
	}

	if (Serial.available())
	{

		charbuff = (char)Serial.read();
		buffer = String(charbuff);

		if(buffer == "A")
		{
			digitalWrite(SRS485SerialTxControl, RS485Transmit);  // Enable RS485 Transmit
			RS485Serial.print("A10");          // Send charbuff to Remote Arduino 
			RS485Serial.flush();  
			digitalWrite(SRS485SerialTxControl, RS485Receive);  // Disable RS485 Transmit
			buffer = "";
			goto begin;
		}
		if(buffer == "B")
		{
			digitalWrite(SRS485SerialTxControl, RS485Transmit);  // Enable RS485 Transmit
			RS485Serial.print("B10");          // Send charbuff to Remote Arduino   
			RS485Serial.flush();
			digitalWrite(SRS485SerialTxControl, RS485Receive);  // Disable RS485 Transmit
			buffer = "";
			goto begin;
		}
	}




}


slave a:

#include <SoftwareSerial.h>
#define SRS485SerialRX        4  //RS485Serial Receive pin
#define SRS485SerialTX        3  //RS485Serial Transmit pin

#define SRS485SerialTxControl 13   //RS485 Direction control
#define RS485Transmit    HIGH
#define RS485Receive     LOW

SoftwareSerial RS485Serial(SRS485SerialRX, SRS485SerialTX);

char byteBuffer;
String commandBuffer;

void setup()
{
	pinMode(13, OUTPUT);
	Serial.begin(9600);
	RS485Serial.begin(4600);
	digitalWrite(SRS485SerialTxControl, RS485Receive);
}

void loop()
{

	if(digitalRead(SRS485SerialTxControl) != LOW)
	{
		digitalWrite(SRS485SerialTxControl, RS485Receive);
	}

	if(RS485Serial.available())
	{
		if(digitalRead(SRS485SerialTxControl) != LOW)
		{
			digitalWrite(SRS485SerialTxControl, RS485Receive);
		}

		while(RS485Serial.available()) 
		{

			if(digitalRead(SRS485SerialTxControl) != LOW)
			{
				digitalWrite(SRS485SerialTxControl, RS485Receive);
			}
			
			byteBuffer = (char)RS485Serial.read();
	  		if(String(byteBuffer) != String((char)-1))
	  		{
	  			commandBuffer += String(byteBuffer);
	  		}
	  		else
	  		{
				break;
	  		}

	  		if(commandBuffer.length() == 3)
			{
				if(String(commandBuffer) == String("A10"))
				{
delay(10);
					Serial.println("mando");
					digitalWrite(SRS485SerialTxControl, RS485Transmit);
					RS485Serial.print("X12345678901234567890123456789012345678901234567890123456789012345678901234567890\n");
					RS485Serial.flush();
					digitalWrite(SRS485SerialTxControl, RS485Receive);
					commandBuffer = "";
					break;
				}
			}

			if(commandBuffer.length() > 3)
			{
				RS485Serial.flush();
				if(digitalRead(SRS485SerialTxControl) != LOW)
				{
					digitalWrite(SRS485SerialTxControl, RS485Receive);
				}
				commandBuffer = "";	
				break;
			}
		}
	}

}


slave b:

#include <SoftwareSerial.h>
#define SRS485SerialRX        4  //RS485Serial Receive pin
#define SRS485SerialTX        3  //RS485Serial Transmit pin

#define SRS485SerialTxControl 13   //RS485 Direction control
#define RS485Transmit    HIGH
#define RS485Receive     LOW

SoftwareSerial RS485Serial(SRS485SerialRX, SRS485SerialTX);

char byteBuffer;
String commandBuffer;

void setup()
{
	pinMode(13, OUTPUT);
	Serial.begin(9600);
	RS485Serial.begin(4600);
	digitalWrite(SRS485SerialTxControl, RS485Receive);
}

void loop()
{

	if(digitalRead(SRS485SerialTxControl) != LOW)
	{
		digitalWrite(SRS485SerialTxControl, RS485Receive);
	}

	if(RS485Serial.available())
	{
		if(digitalRead(SRS485SerialTxControl) != LOW)
		{
			digitalWrite(SRS485SerialTxControl, RS485Receive);
		}

		while(RS485Serial.available()) 
		{

			if(digitalRead(SRS485SerialTxControl) != LOW)
			{
				digitalWrite(SRS485SerialTxControl, RS485Receive);
			}
			
			byteBuffer = (char)RS485Serial.read();
	  		if(String(byteBuffer) != String((char)-1))
	  		{
	  			commandBuffer += String(byteBuffer);
	  		}
	  		else
	  		{
				break;
	  		}

	  		if(commandBuffer.length() == 3)
			{
				if(String(commandBuffer) == String("A10"))
				{
delay(10);
					Serial.println("mando");
					digitalWrite(SRS485SerialTxControl, RS485Transmit);
					RS485Serial.print("Z12345678901234567890123456789012345678901234567890123456789012345678901234567890\n");
					RS485Serial.flush();
					digitalWrite(SRS485SerialTxControl, RS485Receive);
					commandBuffer = "";
					break;
				}
			}

			if(commandBuffer.length() > 3)
			{
				RS485Serial.flush();
				if(digitalRead(SRS485SerialTxControl) != LOW)
				{
					digitalWrite(SRS485SerialTxControl, RS485Receive);
				}
				commandBuffer = "";	
				break;
			}
		}
	}

}
aaa