Go Down

Topic: servos con arduino para barco RC (Read 2469 times) previous topic - next topic

surbyte

Y si eso pretendes porque no darle una especie de piloto automático al velero y tu solo le das la dirección a la que debe ir?

Aurelioape

Es apuntar muy alto para mi.
Ya se ha hecho, buscando info me tropecé con la web de un proyecto de un velero rc con el que pretendían llegar a Baleares, usando paneles solares y gps. La he estado buscando de nuevo pero no la encuentro, en cambio he encontrado otro proyecto de parecidas características https://riunet.upv.es/bitstream/handle/10251/32201/Memoria.pdf
Para navegación en estanque o similar esta virguería no es muy útil, principalmente porque te quitaría el placer de manejarlo tú mismo. Y porque además del gps habría que incorporar un equipo electrónico de captación de dirección y velocidad del viento. No es tan sencillo como parece. Los veleros no pueden navegar directamente en contra del viento, solo lo pueden hacer con un ángulo respecto a este que suele variar, según los tipos de veleros, entre 30º y 45º. La consecuencia de este hecho es que no puedes apuntar la proa hacia tu destino y ya está, como en un barco motorizado. Si el viento viene de ese punto exactamente, el peor de los casos, para avanzar hacia allí debes hacer un rumbo en zigzag con el ángulo menor que te permita tu barco, dar bordadas en lenguaje marinero, para, aunque multiplicando la distancia a recorrer, ir aproximándote a destino.
 
Por otro lado reitero mi petición de ayuda en el tema de adaptar el código del anterior post a un solo canal y en donde tengo, y con que nombre, la señal de la radio ya interpretada por el arduino.
Gracias por vuestro interés.

Aurelioape

Hola amigos.

No consigo aclararme con el código, publicado unos post atrás, de Luis LLamas para conectar la radio al arduino. Entiendo que usa abreviaturas y otras formas para ahorrar lineas de código; pero con mis limitadísimos conocimientos de programación no sé modificarlo.
Solo necesito que alguien me elimine los canales superfluos, el lo hace para seis, yo solo necesito monitorear con arduino la señal de uno. Y que me aclare en que variable queda grabada la señal finalmente. De verdad que lo he intentado, no paso de la complilación.

Al mismo tiempo se me ha presentado otro problema adicional. Por motivos mecánicos no puedo usar servos de movimiento estándar y uso multivueltas. Los servos de la librería tienen un rango de 0º a 180º, yo necesito 1750º de giro, casi unas cinco vueltas completas. ¿Cómo se hace en este caso? ¿Una librería especial? ¿Algún otro método?

Gracias por vuestra respuestas.

Aurelioape

Como os decía antes mi nuevo inconveniente son los rangos de giro del servo; de 0º a 180º no me sirve. necesito un rango de 0º a 1750º.

Modificar la librería de servos sería una posible solución, he abierto con el notepad el archivo servo.h y ahí se describe el rango de movimiento del servo. ¿No será tan fácil como cambiar esos valores? ¿verdad?

En caso contrario ¿qué puedo hacer para que arduino de ordenes de giro al servo con ese rango?

Por otro lado ¿nadie me puede echar una mano para modificar el código antes publicado para un solo canal y en qué parámetro me queda esa señal?

Gracias de antemano.

Aurelioape

Hola programadores.
Estoy a un tris de lanzar por la borda la parte del proyecto que corresponde a Arduino, debido a mi incapacidad para conseguir que funcione correctamente.

Os explico brevemente.
Me funciona, pero me hace cosas raras que no consigo entender por qué pasan y mucho menos solucionarlo.
Un código simple para leer el canal 3 de la radio y hacer que el servo 2 obedezca a esa señal. Esta es la base sobre la que si consigo que funcione ampliare con más servos. La primera sorpresa era que me salían valores negativos para el ángulo del servo. Esto lo solucioné añadiendo un if y una multiplicación *-1 convenientemente añadida, no será ortodoxo pero parecía funcionar. De hecho todo el código completo, con todas las ordenes a los distintos servos, en el simulador funciona perfectamente. El problema, como siempre, está cuando pasamos de lo virtual a la p... realidad.
Cuando conectamos el sistema, durante unos dos minutos el servo reacciona correctamente hasta que comienza un comportamiento errático y luego deja de funcionar, debiendo resetear el Arduino. He constatado que aunque no muevas el servo, pasado esos dos minutos, también deja de funcionar.
Esto con un servo normal, cuando le aplico los multivueltas que me veo obligado a usar, el comportamiento es peor, la última parte de su recorrido en un sentido la hace a trompicones, llegado al final de carrera retrocede 45º para volver a hacer el camino de nuevo constantemente y finalmente se bloquea como el normal.
Un desastre de funcionamiento. Estoy convencido que soy yo y no la placa, el culpable de que no funcione.
Si me podéis echar un cabo os lo agradeceré, en caso contrario lanzo por la borda el Arduino (sentido figurado) y controlo los servos manualmente desde la radio, como toda la vida.
Os pongo el código usado a ver si alguno encontráis en donde fallo.

Gracias por vuestro tiempo.

Code: [Select]
int ch3; // canal a leer de la radio, en este caso ch3
unsigned int valorsenalradio;  //valor prporcional de la radio a grados de giro
int senal;// Esta variable definira la posicion del servo en grados de giro Por alguna razón
// que desconozco, para evitar un valor negativo en el resultado final, genero esta variable
//que luego sí puedo corregirle el signo, ya que a "valorsenalradio" no me deja ¿?.
#include <Servo.h>           // Incluimos la libreria para poder controlar los servos.


Servo servoMotor2;//servo foque y foque volante babor

void setup()
{
 
  pinMode(6, INPUT); // pin'6'como entrada  para el canal 3 de la radio.
 
 
  // Iniciamos los servos para que empiecen a trabajar con los pines 2,3,4 y 5
  servoMotor2.attach(2);
 
  Serial.begin(9600); //Iniciamos Serial
}

void loop()





{   
 
 
 
 
  ch3 = pulseIn(6, HIGH, 20000); //Leemos el canal 3 de la radio
 
  valorsenalradio = map(ch3,1000,2000,0,180);
  senal = valorsenalradio;
 
  if (senal< 0)
  {
    servoMotor2.write(senal*-1); //servoMotor2 obedece a la radio canal 3.
   
  }   
 
  else   
  {
    servoMotor2.write(senal);//servoMotor2 obedece a la radio canal 3.
  }
}

jordi3sk97

#20
Feb 13, 2019, 09:58 am Last Edit: Feb 13, 2019, 10:02 am by jordi3sk97
Encuentro muy interesante tu proyecto, animo y no tires la toalla, y ahora inicias el buen camino, código corto y ir comprobando

Según el manual a la función map() le conviene que hagas un constraint() previo para asegurar los valores que le pasas.

ch3 = pulseIn(6, HIGH, 20000); //Leemos el canal 3 de la radio

constraint(ch3,1000,2000);
 
valorsenalradio = map(ch3,1000,2000,0,180);

Con lo que senalradio ya no te dará valores negativos

Otro tema es averiguar pulsein() que lee realmente
Entonces puedes hacer

ch3 = pulseIn(6, HIGH, 20000); //Leemos el canal 3 de la radio

serial.print(ch3);

constraint(ch3,1000,2000);
 
valorsenalradio = map(ch3,1000,2000,0,180);

Ahora ya puedes ver realmente que hace pulseIn() y comprobar si los valores van entre 1000 y 2000 y actuar en consequencia.

Personalmente no conozco nada de servos, pero quizás tendrías que tener en cuenta que el servo tarda en moverse y quizás no es conveniente enviar más movimientos hasta que termine el ya iniciado. 

Otro tema es el bloqueo.... tal y como lo cuentas, y con este código, no se que pasa

Aurelioape

Gracias Jordi, por tu respuesta.
He probado tu sugerencia.
En realidad solo me complila si pongo constrain, sin t; no obstante esto no anula los valores negativos que me devuelve el map a ch3.
Con serial.print(ch3) puedo ver lo que lee ch3, sí ¿pero donde?. Cuando lo pruebo virtual, como ch3 es una variable, su valor lo veo en pantalla, pero cuando hago una prueba física ¿como veo ese valor? Seguro que estoy preguntando una obviedad para vosotros; pero para mi es un abismo. Es como estar rodeado de hablantes de otra lengua que a duras penas comprendes.
En cuanto a lo del bloqueo, ahí está el tema, un código tan simple no debería de dar tantos problemas.
Gracias por vuestra paciencia.

jordi3sk97

Si perdona si falta o sobra una letra , no te estoy enviando código, solo intento darte ideas.

Tendrías que decir el valor de ch3 cuando el map te da negativo, y aun así

En algo te estas equivocando.

un constrain() y un map() tal y como en el ejemplo anterior no pueden negativo.

haces un constrain() para asegurar que el valor mínimo que pasaras sea mil y el máximo sea dos mil

luego haces un map() entre mil y dos mil y lo quieres pasar a 0 y 180

no veo como puedes obtener un negativo.

haz un programa desde 0 y comprueba.



Y que es una prueba física ?

Aurelioape

Nada que perdonar Jordi. En mi ignorancia copié la palabra tal cual; yo debería conocer el vocablo.
Para mi una prueba física es conectar los aparatos reales y ver si funcionan. Por eso pregunto como veis los datos del print es este caso.
Lo otro es una prueba virtual, el código y los elementos: servos y generador de pulsos digitales los pongo en UnoArdusim V2.2 programa que te simula un arduino y distintos perifericos. Aquí es donde leo en pantalla los datos de las variables y los print.

Quizás este código en otro simulador no dé resultados negativos. Yo no sé como probáis los profesionales los códigos. Os garantizo que si no lo trampeo con los *-1, el mensaje de error es siempre el mismo, me dice que los servos solo funcionan con un rango de 0 a 180º, porque le sale con un signo menos.
De todas maneras, quizás no esté ahí el problema, tras la corrección matemática el angulo queda bien y el servo se mueve obedeciendo a la radio, pero solo por unos dos minutos, luego empieza a reaccionar loco y termina bloqueado. Con un reseteo del Arduino vuelve a la normalidad; pero por otros dos minutos.
Te agradezco de veras tus respuestas.

jordi3sk97

Vale, yo no conozco nada de ningún simulador.

En todo caso tienes una capa mas de abstracción, y asumes que es un Arduino real. :o
 
Mi consejo: Olvídate de simuladores, pon encima la mesa el Arduino con los servos y la radio. El Arduino conectado al usb del PC y corre el programa, Cuando te de el valor (-), si es que te lo da,  di lo que tienes en ch3.

Si una cosa tan sencilla como un constrain y un map no funcionan como debieran, y tu no haces trampas poniendo más código que del que estamos hablando, no me queda otra que echarle la culpa al emulador

Ah, y si tienes el Arduino sin apantallar, aparta el transmisor una distancia prudencial del Arduino.

Aurelioape

Gracias Jordi.
Tus explicaciones me han llevado a descubrir que el botoncito de la derecha del IDE abre un diálogo en el que se puede ver lo que hace el programa. Claro, yo para llegar hasta aquí la única manera que tenía era a través del simulador, la pruebas físicas directas si saber como responde la placa de poca ayuda eran.
Dadme un tiempo a ver si ahora consigo resultados convincentes.

Go Up