Problema con el uso de servos y UART en Arduino Nano

Buenos días a todos!

Estoy trabajando en un proyecto en el que desde un arduino nano emisor le mando a otro nano receptor un mensaje por UART, y este receptor gestiona ese mensaje para encender unos servos comunes de 1000KV para levantar un dron.

Primero desarrollé la comunicación por UART, y todo correcto.
Después desarrollé el encendido de los motores configurando los motores a los pines PWM y mandándole las órdenes de movimiento directamente desde el dron receptor. Todo correcto aquí también.

El problema me surge cuando en el arduino nano receptor pongo a la vez la recepción por UART del emisor, más la configuración de los motores. Pongo código para que me entendáis:

Primera prueba (arduino emisor envia mensaje y receptor lo muestra en consola):
Códigos adjuntados: “Arduino nano emisor.ino” y “Arduino nano receptor.ino”

Estos códigos funcionan bien. Envío un mensaje desde un arduino emisor por el terminal de Arduino y lo imprimo en el terminal del arduino receptor sin problema. Ambos arduinos los conecto por UART (TX del emisor a RX del receptor).

Después de haber hecho esto, hice el código para mover unos motores brushless por PWM, dándole las órdenes desde el terminal de Arduino. Para esto solo conecté un arduino nano por usb al PC, escribo por el terminal el número del motor y la velocidad y se me enciende el motor correspondiente sin problemas. Muestro el código:

Arduino mueve motores a través de órdenes por terminal:
Código adjuntado: ControlMotores.ino

Todo funciona correctamente aquí. Tras el setup() los motores pitan indicando que se han calibrado correctamente y comienza el loop(). Las líneas

const int lim_inf = 1295;

y

const int lim_sup = 1826;

definen solo los valores mínimo y máximo que se le puede dar a los motores para que giren. Aquí lo que hago es escribir primero el número del motor que voy a mover, el 1 por ejemplo, y luego le pongo la velocidad, 1500 por ejemplo. Si luego quiero mover el motor 2, escribo “1” en el terminal para desactivar el motor 1 y después escribo “2” para activar el motor 2, y ya le puedo escribir por ejemplo “1500” para que se mueva.

Hasta aquí todo bien. El problema lo tengo cuando unifico los dos programas, e intento enviar el mensaje del arduino emisor al receptor por UART (como el primer ejemplo) y el receptor recibe el mensaje por Serial para actuar según corresponda (como cuando lo he escrito yo a mano por terminal). En el código que voy a mostrar, si comento la parte de los motores del setup(), donde hago los .attach() de los servos, recibo el mensaje sin problema, aunque claro, no puedo mover los motores porque no los he configurado. Cuando descomento la parte de los motores, al recibir algo por Serial, es como si fuera aire, no llega a entrar en el

if (Serial.available()){

, y no entiendo por qué. Deduzco que tengo que estar haciendo algo raro en el setup() al meter tanto la configuración de los motores como la del Serial, pero no logro verlo. No sé por qué no soy capaz de recibir nada por el puerto serie cuando tengo los motores configurados en el setup(). Ahí va el código:

Arduino emisor envia mensaje, receptor recibe y manda orden a los motores por PWM:
Código adjuntado: 1_Codigo completo uart-motores

Para comprobar que no entraba por el primer if() del bucle loop() puse un mensaje de “Mensaje recibido”, y comprobé que no llega a entrar cuando tengo la parte de los motores sin comentar en el setup(). Cuando están comentadas, entra sin problema al recibir algo. Conexiones que hago:

Arduino emisor TX – Arduino receptor RX – Arduino receptor PWM – ESC de los motores.

Disculpad lo largo del mensaje pero me estoy volviendo loco y quería explicarlo lo mejor posible, porque sé que tiene que ser una tontería y yo diría que los tiros están por el setup() al configurar los motores y el Serial. Por cierto, es indiferente que configure primero los motores y luego el Serial o viceversa, el resultado es el mismo.

Espero que podáis darme alguna pista! Cualquier duda con los códigos preguntadme sin problema!

Mil gracias!

Arduino nano emisor.ino (708 Bytes)

Arduino nano receptor.ino (1.29 KB)

Control Motores.ino (3.55 KB)

1_Codigo completo uart-motores.ino (5.37 KB)

Bueno parece que finalmente encontré el problema, así que me respondo a mí mismo y lo pongo aquí por si a alguien puede serle útil.

Resulta que las librerías SoftwareSerial.h y Servo.h son incompatibles, al menos en un arduino nano, ya que utilizan el mismo timer. La solución en mi caso concreto ha sido comentar todas las referencias a la librería SoftwareSerial (variables, inicializaciones, #include, etc.), de tal manera que no entre en conflicto con la librería Servo.h.

El cableado continua siendo del TX del arduino emisor al RX del arduino receptor, eso no cambia. No se necesario inicializar ningún tipo de pin para activar la recepción por el RX del arduino receptor, por lo que configurando el Serial en el setup() y comentando todo lo relacionado con el SoftwareSerial es más que suficiente para que pueda recibir el mensaje y mover los motores.

Aquí os dejo el enlace de donde me han dado la solución correcta: https://forum.arduino.cc/index.php?topic=661716.0

Y lo que has hecho es una falta a las normas al tener un doble posteo, foro en Inglés y foro en español. No doble postees.

Deberia borrar el hilo pero para que conste, creo que has malentendido las respuesta.

Alguien te dice que usas SoftwareSerial y que comparten el mismo Timer pero resulta que no usas mySerial que es el puerto serie virtual creado en pines 30 y 31 entonces si no lo usas tu solución es justamente eliminar toda referencia a lo que genera una interferrencia a Servo o al timer que se encarga de mantener actualizado el Servo.

Asi que hay una doble lectura de tu problema. No debes usar SoftwareSerial con Servo pero lo definiste inutilmente.