Como comunicar dos arduinos ?

Hola a todos,

este es mi primer post en el foro. Estoy empezando con arduino y quisiera implementar un sistema basado en 2 arduinos el primero le llamaremos trasmisor y el segundo receptor. Lo que quiero hacer es usar varios pines del trasmisor como input para sensores digitales (en total 9 sensores) luego establecer un tipo de comunicación serie (entendiendo por serie una comunicación robusta sin errores con 1 ó dos hilos max) hasta el otro arduino que estará distanciado unos 50mts. El arduino receptor se encargará de recibir los datos y habilitar los pìnes correspondientes de salida para reflejarexactamente en los mismos pines, los valores de los sensores digitales (0 ó 5V).

He estado mirando bastante en el foro pero no termino de ver como implementarlo. Mi preocupación es: - Que comunicación serie es la mas robusta para ser usada entre los dos arduinos ? - Puedo hacer uso de los pines 0 y 1 TX y RX a pelo y entrecruzarlos en las placas TX a RX y RX a TX? O es mejor usar un par de pines digitales para crear una secuencia de las lecturas de los valores de los sensores?

Ando un poco dspistado y seguro que los que teneis mas experiencia podéis darme un poco de luz en este proyecto.

Un saludo.

2tor

Hola,

RS485 => Bueno, bonito y barato!!! y sencillo!!

http://real2electronics.blogspot.com/2009/09/buses-de-campo-para-arduino-rs485.html

:D

Igor R.

Gracias Igor,

cuando tenag un rato le echo un look. Una pregunta mas.... como los arduinos van a estar separados unos 50 metros, crees que habrá algun problema con tanta tirada de cable ?, serña lo suficiente robusto ante errores de comunicacion? Por otra parte el arduino remoto estará en un entorno de Radiofrecuencia... ves alguna limitación?

Muchas gracias por tu respuestas.

Un saludo. 2tor

Es un bus diferencial, no deberia haber problema.... Es un bus muy utilizado en la industria.

http://www.maxim-ic.com/app-notes/index.mvp/id/763

El bus RS485 solo define la capa fisica, tendras que hacerte tu propio protocolo. En el link puedes ver un ejemplo basado en uno profesional (un variador de frecuencia). En la practica es como manejar un puerto serie.....

Saludos

Igor R.

Hola Igor,

Quiero probar el slave que esta en tú pagina (http://real2electronics.blogspot.com/2009/09/buses-de-campo-para-arduino-rs485.html) a traves del terminal serial del arduino, boton send de la parte superior del terminal.

Infelizmente no logro conseguir enviar nada que el slave entienda, o sea, el slave no "enciende" el led.

Hay alguna forma de enviar essos comados (0x00 0x30 0x31 0x05 0x44 0x30 0x30 0x20 0x30 0x30 0x30 0x31 0x03 0x01 0xEE) de modo que my slave entienda? Como seria?

Quiero poder probar todo (diversas subrotinas) en la parte del slave antes de ponerlo sobre una tarjeta autonoma.

saludos,

cristal

Hola Cristal,

Si que puedes. Pero lo estas haciendo por RS485 ó por RS232??? Un poco de info...... ;)

Hola Igor,

Quieor hacerlo por RS485, pero quiero verificar que todo me funciona dentro del Slave utilizando el terminal del Arduino (enviando la string de controle), caso contrario, tengo que sacar el Atmega a todo momento de su circuito para hacel las modificaciones necesarias.

saludos, Cristal

Usa el RealTerm, en vez del terminal de Arduino. Ya que el que viene con el IDE,sólo te permite enviar en ASCII.

http://realterm.sourceforge.net/

Con éste, puedes enviar dicha trama en Hexadecimal.

;)

Fue la primera cosa que hice, pero no me funciono...selecionado el puerto com3, 9600, y en send number, envie algo tipo 00 48 49 68 48 48 32 ... y tambien probe 00484968484832...petambien no me funciona. Qual seria la forma adecuada?

saludos, Cristal

Has probado mandando en hexadecimal?? 0x00 0x30 0x31 0x05 0x44 0x30 0x30 0x20 0x30 0x30 0x30 0x31 0x03 0x01 0xEE

Hazte un programita que el Arduino repita lo que recibe por puerto serie, asi sabes lo que le esta llegando.... son dos lineas de programación!!!

;)

Voy a probarlo y despues te comento

Saludos, Cristal

Hola Igor,

No se lo que me ocurre, he porbado con el realterm y me funciona cuando estoy con el ATmega en el Arduino, cuando lo pongo en my circuito, no funciona.

He provado con un sketch muy simples, solamente para verificar la comunicacion y aun no me funciona.

Transmissor:

 //transmissor
const int ledPin = 13;      // the pin that the LED is attached to
#define  pinCONTROL    02
void setup() {
  Serial.begin(9600);
  pinMode(ledPin, OUTPUT);
  pinMode(pinCONTROL,OUTPUT);
digitalWrite(pinCONTROL,HIGH);
}

void loop() {

  byte b = 0;

  Serial.write(b);
  analogWrite(ledPin, b);
  delay(1000);

  b=255;

  Serial.write(b);
  analogWrite(ledPin, b);
  delay(1000);
}

Receptor :

 //receptor
const int ledPin = 13;      // the pin that the LED is attached to
#define  pinCONTROL    02
void setup() {
  Serial.begin(9600);
  pinMode(ledPin, OUTPUT);
  pinMode(pinCONTROL,OUTPUT);
digitalWrite(pinCONTROL,LOW);
}

void loop() {
  byte brightness;

  if (Serial.available()) {// check if data has been sent from the computer:

    brightness = Serial.read(); // read the most recent byte (which will be from 0 to 255):

    analogWrite(ledPin, brightness); // set the brightness of the LED:
  }
}

Mi circuito:

D:\rs485.gif

Hoal Igor,

aqui esta mi circuito de pruebas:

Los resistores de 4K7 son opcionales, pero con ellos o sin ellos da igual...no funciona

Los cables que utilizo son tranzados.

Y que haces con el pin de control(/RE-DE)??? Dicho pin sirve para poner el transceiver en modo Tx (transmisión,HIGH) ó Rx (recepcion). En tu programa lo tienes que poner alto y bajo, según lo que te interese hacer.

TX 1- Pongo pin Alto 2- Transmito 3- Pongo pin Bajo

RX Siempre pin Bajo

Hola Igor,

Si te fijas en mi setup veras que, para pruebas, el pin de control esta siempre HIGH, y en el receptor siempre en LOW.

transmissor

pinMode(pinCONTROL,OUTPUT);
digitalWrite(pinCONTROL,HIGH);

receptor

pinMode(pinCONTROL,OUTPUT);
digitalWrite(pinCONTROL,LOW)

No se, ahora entras en fase de depuracion.... ;)

Conecta ambos Arduinos directamente, a ver si el software esta bien. Es decir, el TX de tu Arduino transmisor, al RX del receptor. (con 232, sin usar rs485). Asi aseguras que es algo con el bus y no nada del software.

Comparten masas ambos Arduinos???? Como estas alimentando ambas placas ??

Igor,

No tengo dos arduinos, lo que hecho a sido probar e lmaster sobre arduino, y me funciona pues el led parpadea.

Despues e sacado el master y he puesto el slave, y con el realterm envio 255 y el led se enciende, despues envio un zero y el led se apaga.

He notado una cosa un poco estraña con mis 75176, cuando mido la tension sobre la resistencia de 120 ohms sin los Atmegas conectados, apenas los 75176 alimentados estoy midiendo 2.9V (con osciloscopio).

Esso es normal? no deberia ser algo como 200mV?

Cundo introduzco los Atmegas en el circuito, sigue lo mismo 2.9V de base y me aparecen pulsos a cada 500ms con amplitudaproximada de 5Vpp.

Cual seria la aplitud normal? los pulsos deberian ser constantes, tren de pulsos no?

Aqui puedes encontrar unas capturas de osciloscopio: http://www.maxim-ic.com/app-notes/index.mvp/id/763

las masas son comunes en ambos micros???? (tienen que serlo)

Si no me equivoco, es algo como maximo +/-6 V si no hay carga, y como minimo +/-1.5V con carga.

Documento con capturas tipicas del bus RS485 (y como detectar problemas): http://www.sbc-support.ch/faq/files/files.get.php?ZSESSIONID=n38bphov4ls4cdsvtbd8tl6jb4&fi_index=100179

Estupendo Igor,

Con etas informaciones creo que consigo solucionar mi problema.

Cuando termine te informo. Gracias por tu ayuda.

Cristal

PS. Las masas son las mismas, me havia olvidado de informarte ;)

Como fue Cristal? Funciona?

He visto que sigues el ejemplo de aqui => http://modprobe.complex.ch/2010/03/13/hello-rs485-arduino/

Saludos