Servo SG90 + HC-05 + MIT app Android: ¡Bluetooth se desconecta!

Hola. Tengo esto:

-Arduino UNO o MEGA (ambos CH-340).
-Servo Tower Pro SG-90 9g (el típico que viene en los starter kits de Arduino).
-Módulo bluetooth HC-05 utilizado en modo esclavo.
-App hecha con Google MIT Inventor2.

El caso es que estoy enviando al módulo blutooth cada x milisegundos una variable, como por ejemplo, el azimut. Y se desconecta dando un mensaje de "broken pipe".

PERO si desconecto el servo y monitoreo los valores en el Serial, nunca se desconecta, va todo como la seda. Pero con el servo puesto, va a trompicones, temblando mucho, y siempre antes de unos cuantos segundos, se desconecta.

¿Puede ser que haya un conflicto con las librerías, que utilicen mismas interrupciones o algo así?

O simplemente que el HC-05 no da para más y tendría que considerar adquirir uno más avanzado con por ejemplo el HC-10?

No he puesto códigos pero si hiciera falta los adjunto. Gracias.

Y que librería estas usando?
La librería Servo si mal recuerdo no libera su posicionamiento hasta completar la tarea que le encomiendas.
Hay otras librería que no tienen esa desventaja.

Puedes probar con esta VarSpeedServo que usa interrupciones y permite comandar hasta 8 servos asincrónicamente.

Supports up to 8 servos
Allows simultaneous, asynchronous movement of all servos
The speed of a move can be set
The write() function initiates a move and can optionally wait for completion of the move before returning
A servo can be sent a sequence of moves (where each move has a position and speed)

Puedes usar ServoEX
Pero ya tiene 3 años sin actualizaciones. Tmb usa interrupciones.

Gracias, pues utilizo la librería del servo que trae por defecto el IDE. Mañana pruebo con esas 2 librerías y te cuento los reultados arrojados :wink:

Espero que resuelvan tu problema.

Actualización: ahora por alguna razón mágica ya no se me desconecta nunca. No entiendo cómo es que casualmente ha pasado esto, pero bienvenido sea.

Ahora me queda solo el problema de los trompicones. He simplificado el programa y he hecho que solamente envíe un valor, por ejemplo el pitch, o el azimut, solo uno.

He probado ambas librerías, VarSpeedServo y ServoEX, una directamente no funciona y la otra arroja el mismo comportamiento.

Lo he hecho también sin librería, con el siguiente código pelao:

void moverServo (int pin, int angulo)
{
  float pausa;
  pausa = angulo * 2000.0 / 180.0 + 500;
  digitalWrite(pin, HIGH);
  delayMicroseconds(pausa);
  digitalWrite(pin, LOW);
  delayMicroseconds(2500 - pausa);
}

Y el resultado es el mismo.

En cuanto a la parte de MITAppInventor2:

  • Tengo 2 formas de recoger la variable y enviarla por BT, mediante un evento de cambio en el valor del sensor o mediante un timer, ambos elegibles en tiempo real en el programa. El valor del disparo del timer es configurable con un slider.
  • Tengo además otro slider que permite una cierta sensibilización, es decir, en el bucle continuo recoge el valor y lo guarda en una variable temporal cuando proceda. Imaginemos que el slider está con un valor actual de 10. Entonces compara el valor absoluto entre el valor actual de la variable del sensor menos el que había en la variable temp [ abs(pitch-pitch_temp) ]. Si la diferencia > 10 (o el valor que haya en el slider), recoge el nuevo valor, lo envía por BT y sustituye el valor de temp por ese nuevo valor. Todo esto para darle una suavidad o que esté muy escalonado, o sea, buscar empíricamente un valor óptimo a gusto del usuario.
  • Dispone de una función para que envíe directamente el valor de la variable convertida al rango de 0 a 180. Como BT envía un byte, hasta 255, me sobra. No quiero que arduino mapee el valor para adaptarlo a la escala de 0 a 180, sino que le llegue el valor "limpio", lo recoja directamente y lo pase al servo. Para todo esto tengo 2 botones que al pulsarlos, guarda en 2 variables el inicio y el fin de carrera, entonces hago algo parecido al map (valor, x0, x1, y0, y1) pero en la app del móvil.

problema de los trompicones.

What!! En español por favor pero que sea NEUTRO.

surbyte:
What!! En español por favor pero que sea NEUTRO.

Trompicones ---> Temblores.

La verdad es que el programa de MIT está muy bien elaborado con muchas opciones de confuguración, pero el servo tiembla mucho, es como si tuviera mucho "ruido" parásito. No se, a ver si va a ser que el servo es de bajo coste y no da para más.

Y lo alimentas con el Arduino?
Agrega un capacitor de 100uF 6.3V (como mínimo hablo de la tensión) entre los bornes VCC y GND del servo a ver si eso suaviza su operación.