This forum uses cookies
This forum makes use of cookies to store your login information if you are registered, and your last visit if you are not. Cookies are small text documents stored on your computer; the cookies set by this forum can only be used on this website and pose no security risk. Cookies on this forum also track the specific topics you have read and when you last read them. Please confirm whether you accept or reject these cookies being set.

A cookie will be stored in your browser regardless of choice to prevent you being asked this question again. You will be able to change your cookie settings at any time using the link in the footer.

  • 1 voto(s) - 5 Media
  • 1
  • 2
  • 3
  • 4
  • 5
Comunicación entre arduinos a larga distancia
#1
Holas

Estoy maquinando un nuevo proyecto, pero en el planteamiento inicial tengo la siguiente duda...

Necesito interconectar dos o mas arduinos para que cada uno realice una serie de funciones. Cada arduino estaría separado bastantes metros y hay varias plantas por medio por lo que la comunicacion xbee o RF es inviable. La unica opcion seria por cable UTP. Mi pregunta es...

¿Que sistema de transmision usariais? A ser posible me gustaria no usar shields ethernet ya que encareceria demasiado el proyecto.
  Responder
#2
Puerto serie del arduino Tx-Rx lo que nose cual sera la distancia efectiva, con dos cables lo tienes

Enviado desde mi Nexus 4 mediante Tapatalk
  Responder
#3
Si usas la uart como dice Triggerr, probablemente tendrás que convertir los niveles. Digo probablemente por que tendrías que cuantificar esos "bastantes metros". si no es mucho, con un max232 por ejemplo (Convirtiendo los niveles TTL a los de RS232, para el soft del micro no hay diferencia), y si la distancia es más larga con un max490 (Convirtiendo a 485/422)

Lo único que podrías tener que añadir es quizá algún pin de enable para los transceivers, para apagar el de envío cuando no lo necesites.

Realmente te digo el max232 y el max490 como te podría decir cientos de integrados parecidos. Mira exactamente que necesitas, y elige uno en consecuencia, no son demasiado caros y no te complican apenas. Y para las pruebas puedes pedir samples directamente a maxim, o a texas instruments...
  Responder
#4
Gracias por las respuestas

El problema de la comunicacion TX-RX es que es solo entre dos arduinos, solo el mega creo que tiene dos TX-RX. ¿Sabeis si hay alguna libreria que implemente un protocolo de TX con los pines del arduino que no use la UART?
  Responder
#5
Thorontir escribió:Si usas la uart como dice Triggerr, probablemente tendrás que convertir los niveles. Digo probablemente por que tendrías que cuantificar esos "bastantes metros". si no es mucho, con un max232 por ejemplo (Convirtiendo los niveles TTL a los de RS232, para el soft del micro no hay diferencia), y si la distancia es más larga con un max490 (Convirtiendo a 485/422)

Lo único que podrías tener que añadir es quizá algún pin de enable para los transceivers, para apagar el de envío cuando no lo necesites.

Realmente te digo el max232 y el max490 como te podría decir cientos de integrados parecidos. Mira exactamente que necesitas, y elige uno en consecuencia, no son demasiado caros y no te complican apenas. Y para las pruebas puedes pedir samples directamente a maxim, o a texas instruments...

Es obligatorio convertir los niveles si conectas los arduinos entre ellos por uart y estan cerca?

Enviado desde mi Nexus 4 mediante Tapatalk
  Responder
#6
A ver, si usas los niveles TTL vas a tener un alcance mucho menor. Piensa que en vez de 0~5V vas a tener +12~-12 (Normalmente, el mínimo creo que eran +3/-3 y del máximo ya no me acuerdo xD). Y con Rs422, además tienes pares diferenciales en vez de una línea por canal. Por algo se definieron esos estándares...

Pero vamos, que quien más quien menos ha usado alguna uart en ttl usando cables y conectando placas... Y desde luego, si los dos micros están en la misma placa no creo que se lo piense nadie: te limitas a los niveles ttl...

En resumen, no te sabría decir si es "obligado" por normativa, pero en mi experiencia conviertes los niveles si lo necesitas, nada más. Y el necesitarlo o no dependerá de varias cosas: para una misma distancia, puede que para una velocidad menor no sea necesario y al subirla si.

EDIT: Daniez, ¿Y de SPI o I2C tienes pines accesibles? Seguro que hay librerias para uart por soft en cualquier pin, pero siempre es mejor aprovechar el hard y no sobrecargar la cpu...
  Responder
#7
Thorontir escribió:A ver, si usas los niveles TTL vas a tener un alcance mucho menor. Piensa que en vez de 0~5V vas a tener +12~-12 (Normalmente, el mínimo creo que eran +3/-3 y del máximo ya no me acuerdo xD). Y con Rs422, además tienes pares diferenciales en vez de una línea por canal. Por algo se definieron esos estándares...

Pero vamos, que quien más quien menos ha usado alguna uart en ttl usando cables y conectando placas... Y desde luego, si los dos micros están en la misma placa no creo que se lo piense nadie: te limitas a los niveles ttl...

En resumen, no te sabría decir si es "obligado" por normativa, pero en mi experiencia conviertes los niveles si lo necesitas, nada más. Y el necesitarlo o no dependerá de varias cosas: para una misma distancia, puede que para una velocidad menor no sea necesario y al subirla si.

EDIT: Daniez, ¿Y de SPI o I2C tienes pines accesibles? Seguro que hay librerias para uart por soft en cualquier pin, pero siempre es mejor aprovechar el hard y no sobrecargar la cpu...

Te refieres si usas los niveles de RS232 no? Nos niveles TTL quiero decir donde tienes tensiones negativas es en el 232 eso o no he entendido bien el primer parrafo jajajaj

Enviado desde mi Nexus 4 mediante Tapatalk
  Responder
#8
Thorontir escribió:EDIT: Daniez, ¿Y de SPI o I2C tienes pines accesibles? Seguro que hay librerias para uart por soft en cualquier pin, pero siempre es mejor aprovechar el hard y no sobrecargar la cpu...

Ok entendido.. tengo que usar un driver RS232 para convertir los niveles.

Sin embargo el protocolo SPI o IC2 tengo entendido que son para cortas distancias, si no recuerdo mal para un par de metros maximo. O sea que aqui no sirve ¿no?
  Responder
#9
daniez escribió:
Thorontir escribió:EDIT: Daniez, ¿Y de SPI o I2C tienes pines accesibles? Seguro que hay librerias para uart por soft en cualquier pin, pero siempre es mejor aprovechar el hard y no sobrecargar la cpu...

Ok entendido.. tengo que usar un driver RS232 para convertir los niveles.

Sin embargo el protocolo SPI o IC2 tengo entendido que son para cortas distancias, si no recuerdo mal para un par de metros maximo. O sea que aqui no sirve ¿no?

Hay circuitos integrados para aumentar la distancia en estos protocolos si no ne falla la memoria, pero tendrias que meter circuitos intermedios, no estoy muy enterado.

Enviado desde mi Nexus 4 mediante Tapatalk
  Responder
#10
Ahhh pues no lo sabia. Si pudiese hacerlo con i2C seria la caña... ya he hecho cosillas con este protocolo.

Voy a investigar por ahi.

Gracias a los dos.
  Responder
#11
Puedes hacer una comunicación unidireccional con los puertos UART, de modo que un Arduino maestro (emisor/central), envié los datos y los demás reciban todos las ordenes y las ejecuten solo si están dirigidas para él.
También he probado si después los esclavos podían enviarle datos al maestro pero nada, los esclavos luchan entre ellos y el maestro solo los recibe cuando solo hay un esclavo conectado. Imagino que los mensajes de todos chocaran aunque me esperaba que no lo hicieran si se enviaban los datos a intervalos distintos... pero no :/



Maestro:
Código:
unsigned long antes1 = 0;
unsigned long antes2 = 0;
unsigned long antes3 = 0;
unsigned long ahora;

void setup()
{
    Serial.begin(9600);
}

void loop()
{
    ahora = millis();

    if(ahora - antes1 > 1000)
    {
        antes1 = millis();
        Serial.print("1");
    }

    if(ahora - antes2 > 2000)
    {
        antes2 = millis();
        Serial.print("2");
    }

    if(ahora - antes3 > 3000)
    {
        antes3 = millis();
        Serial.print("3");
    }
}

Esclavos:
Código:
#define LED 13
char cad;

void setup()
{
    pinMode(LED, OUTPUT);
    Serial.begin(9600);
}

void loop()
{
    if( Serial.available() > 0)
    {
        delay(5);
        cad = Serial.read();
        while( Serial.available() > 0 && Serial.read() != -1);

        if(cad == '1') // El numero que corresponda al Arduino
        {
            digitalWrite(LED,HIGH);
            delay(500);
            digitalWrite(LED,LOW);
        }
    }
}
giltesa.com Mi blog personal sobre informática, electrónica, Arduino, bricolaje, etc.
  Responder
#12
Para eso sirve el rs485. Tienes multipunto en vez de punto a punto. Además, puedes hacerlo muy sencillo si los intervalos son fijos: en vez de decidir cuando comunica cada nodo, el maestro "pregunta" (Todos los esclavos escuchan continuamente al maestro) y el esclavo adecuado habilita su transmisor y contesta. De este modo te evitas colisiones...
  Responder
#13
Muy interesante. Ahora estoy recordando que algo asi estudié. Se llamaba token ring. Solo habla en el medio comun el que tenga el token o testigo. Es justo lo que necesito.

Gracias

Enviado desde mi M3 mediante Tapatalk
  Responder


Posibles temas similares…
Tema Autor Respuestas Vistas Último mensaje
  Mover mi camara con mi cabeza a distancia nolocrema 2 620 24-08-2021, 08:07 PM
Último mensaje: nolocrema
  CONSULTA consulta conexion interruptores entre arduino y reles polarode 3 2,036 10-02-2018, 11:23 AM
Último mensaje: drow
  medidor de distancia a con bluetooth o wiffi homer32 4 3,107 28-10-2017, 11:28 AM
Último mensaje: homer32
  Enlazar Arduinos maxi94 17 4,354 02-09-2016, 12:47 AM
Último mensaje: maxi94
  ¿Diferencia entre modulo bluetooth hc-06 y hc-05? Iván 8 26,966 24-08-2015, 09:46 AM
Último mensaje: Iván