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