Go Down

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

Aurelioape

Oct 14, 2018, 08:13 pm Last Edit: Oct 14, 2018, 08:20 pm by surbyte
Hola, estoy haciendo un modelo de barco velero con radio control y me encuentro en una encrucijada.
Necesito que los servos hagan unos determinado movimientos simples que con una radio digital se pueden programar de tipo: modo A los servos responderán así, modo B los servos responderán asá.
Esa selección se puede hacer desde la emisora; pero necesito, por diversos motivos, que sea un proceso automatizado a través de un sensor a bordo de la embarcación. Por lo tanto me hace falta una tarjeta controladora que reciba esa señal en el barco y según sea esta, me permita que los servos respondan a la radio en modo A o B.

La primera pregunta obvia es si la arduino one, por ejemplo, ¿la puedo conectar al receptor de la radio?
En caso afirmativo, la siguiente es, ¿con esta placa puedo hacer lo descrito?

Si alguna de las dos anteriores es negativa, ¿sabéis que dispositivo tendría que usar?

Si no he explicado bien mi problema, adjunto un diagrama que puede clarificarlo.

En realidad, he pensado que lo óptimo sería disponer de un tercer modo C, aunque si esto complica o impide que pudiese funcionar, podría apañármelas sin el tercer modo


surbyte

No termino de comprender.
Mas datos del receptor es posible? Que recibe puntualmente, un tiempo, una orden?


Aurelioape

Hola Surbyte.

Intentaré aclarar mis necesidades. La botavara es un palo oscilante que forma parte de los elementos del aparejo de un barco; puede oscilar durante la navegación entre un costado y el otro de la embarcación. Si dividimos su movimiento en dos partes iguales, me interesa que mientras que permanezca en una de las dos partes, los servos reaccionen del modo A, si se mueve por la otra mitad me interesa que los servos obedezcan en modo B.

En mi ignorancia, he pensado que a la botavara le puedo poner un contacto eléctrico que rozará por dos pistas  distintas conectadas a dos entradas de la placa. La pista solo tiene contacto si la botavara está en su costado. Es decir el circuito se cierra solo a través de una de las pistas, excluyendo a la otra. Aplicando al contacto eléctrico de la botavara una tensión o pulso, lo que sea necesario; la tensión estaría entrando a la placa Arduino por un pin u otro.

Mi intención es que la placa, si le entra señal o tensión, por uno de los pines haga responder los servos a la radio, en modo A. Si le llega por el otro, que los servos respondan a la radio en modo B.

La radio pensada para ello sería la Flysky FS i6 con un receptor FSiA6 o bien, si es más adecuado, el FSiA6B.

Como decía antes el proyecto está en permanente revisión y en realidad lo que me interesaría es tener tres modos, A,B y C que se discriminarían del mismo modo antes explicado, pero con tres pistas y tres entradas a Arduino, si es que se puede hacer.

Te agradezco tu respuesta e interés. Espero haber clarificado mi pregunta, en caso contrario lo intentaría explicar de otro modo.

surbyte

Entiendo perfectamente lo que quieres hacer pero no respondiste mi consulta o tal vez no lo sabes.

Mi pregunta tiene que ver con que se transmite o que recibe (para el caso es lo mismo) y con el dato del transmisor/receptor he visto que lo que tienes es una salida PWM que actúa directamente sobre el servo.

Algo que estaba explicado pero como no suele trabajar con estos equipos lo desconocía.

Bien.. tienes una alternativa que es usar un Arduino NANO que lea la salida del receptor en el canal que gustes y si dicha salida esta de 0 a 50% PWM hace una cosa y si esta de 50.01 al 100% hará otra.
Eso te sirve?

Si lo haces con uno puedes hacerlo con 2 canales.

Bueno se me ocurrió buscar Flysky FS i6 Arduino y mira con qué me encontré: FlySky-i6-Mod-

Miralo con detenimiento porque creo que agrega funcionalidades que te pueden resolver el problema e incluso darte mas opciones.

Aurelioape

#4
Oct 15, 2018, 02:43 pm Last Edit: Oct 15, 2018, 05:44 pm by Aurelioape Reason: Corrección de enlace
Gracias por tu tiempo Surbyte.

Tu respuesta no me soluciona el problema. A ver si consigo transmitir lo que necesito.

Esa radio, por ejemplo, dispone de un swicht (creo que se llama así) de tres posiciones en el que yo podría programar que, en cada una de sus posiciones, los servos me respondiesen a la radio de la manera que me interese. Pero lo tengo que seleccionar yo, en la radio y cuando sea oportuno.
Por unos motivos marineros que no vienen al caso, no me conviene que esa selección dependa de mi pilotaje porque la distancia y una perspectiva inadecuada pueden confundirme y seleccionar el "modo" incorrecto. En este modelo, por su diseño, esa posible equivocación puede desarbolarme el barco.
Una manera infalible de seleccionar el modo correcto es aprovechar el movimiento de la botavara, que haciendo de contacto oscilante permitiría el paso de una corriente o señal por cada una de las tres pistas que se le ofrecerán durante su desplazamiento.

Mi intención es aprovechar la botavara y su movimiento natural como swicht de tres posiciones (que obviamente tengo que mecanizar y acoplarle) para que la placa Arduino interprete, según por cual entrada le llegue la señal y active los modos de respuesta A, B o C de los servos a la señal de la radio.

Creo que he encontrado la respuesta a la primera de mis preguntas en esta url:
https://www.luisllamas.es/conectar-emisora-radio-control-con-arduino/

Mi problema no es que los servos se muevan de determinada manera, si no que la selección del modo de funcionamiento adecuado sea automático a bordo de la embarcación. Como ves soy lego en esta materia de programaciones y demás y quizás no es una Arduino lo que me hace falta.

De nuevo gracias por tus respuestas

surbyte

Lo que hace Luis Llamas es lo que te sugerí pero no entendiste

Quote
Bien.. tienes una alternativa que es usar un Arduino NANO que lea la salida del receptor en el canal que gustes y si dicha salida esta de 0 a 50% PWM hace una cosa y si esta de 50.01 al 100% hará otra.
Eso te sirve?

Aurelioape

Si no entiendo mal, lo que hace Luís LLamas es conectar la radio a los servos a través de la placa Arduino. Hasta ahí bien.

Ahora necesito saber si con la disposición antes mencionada, de usar la botavara como conmutador de tres posiciones de una señal o tensión, la placa es capaz de hacer funcionar de manera distinta los servos dependiendo de la posición del conmutador.

Gracias por tus respuestas y disculpa mi ignorancia electrónica.

surbyte

Buen lo que el código de Luis Llamas hace es transformar una señal PWM en un valor que varia entre 0 y 1 con punto decimal

Tu conmutador tendra 3 posiciones y esas 3 posiciones supongo que serán 3 zonas de desplazamiento del servo.
Supongamos que podrian ser 0 90 180. Corrígeme si estoy equivocado.

Si es asi tu tendrias algo como 0 0.5 1.0 o valores proximos a esos que tmb pueden modificarse.

De aqui en adelante puede hacerse lo que gustes.

Aurelioape

Gracias por tu paciencia Surbyte.

No es exactamente eso lo que necesito.

Ya veo que puedo conectar la emisora a la placa Arduino y que las señales de la radio lleguen a los servos a través de ella.

Me interesa saber si Arduino puede hacer el siguiente ejemplo simplificado:
Tenemos a bordo un conmutador de tres posiciones (en realidad será la botavara moviéndose según sus necesidades con el viento). Imaginemos que se mueve entre 0º y 180º totales, de 0º a 75º modo A, de 75º a 105º modo B y de 105º a 180º modo C.
Dependiendo de ese conmutador que hará entrar una señal o tensión (no sé que tipo de entradas tiene la placa ni que tipo de señal detecta) por alguno de sus tres canales.
Si el conmutador está en A el servo X irá a su posición 180º y permanecerá ahí.
Si el conmutador está en B el servo X irá a su posición 180º y permanecerá ahí.
Si el conmutador está en C el servo X obedecerá las ordenes del canal 1 de la emisora.

Esto exactamente es lo que necesito, con la salvedad que son cuatro  y no uno, los servos que Arduino deberá controlar, siempre en función de la posición del conmutador, modos A,B y C, unos servos van a su posición 0º, otros a su posición 180º y otros obedecerán las ordenes del canal 1 de la emisora.

Como te decía, yo puedo hacer eso mismo solo con la programación de la emisora, los servos me obedecerán tal como yo quiero mientras que seleccione el modo correcto en la misma radio.
Pero por motivos marineros intento que esa selección sea automática a bordo de la embarcación, de ahí el conmutador y la placa.

Gracias por tu tiempo.

Aurelioape

Estoy luchando contra viento y marea, nunca mejor dicho, con la programación de la UNO a  través de UnoArduSimV2.2, un simulador de la placa.

Tengo muchas preguntas; pero por el momento seguiré navegando solo en el mar de la programación, he naufragado, metafóricamente, un montón de veces. Sigo intentándolo y probablemente necesitaré que me remolquéis para salir de los bajíos en que me meto; cuando tenga alguna pregunta concreta irresoluble por mis medios, os la planteo.

De momento al profundizar en la Arduino he visto que no puedo conectar los servos directamente a la placa por cuestión de intensidades. La solución creo que pasa por un relé en cada salida o un transistor de potencia. Esto de nuevo es una complicación más.

Los servos previstos tienen un consumo máximo en carga de 1.2 A por unidad.
Me pregunto si es posible que la alimentación de los servos esté separada de la placa, positivo y negativo de los servos directamente a su batería de 6v y la señal que le llegue desde la placa a 5v, imagino que si se puede hacer los negativos deberían de ser comunes. Esto me facilitaría mucho las cosas.

Gracias por vuestras respuestas.

surbyte

Si claro que puedes. Siempre que el consumo supere 350 mA considera una alimentación externa.
Lo único que debes hacer es lo siguiente. Todo lo que es control queda como esta, o sea las conexiones que salen del Arduino y van a los servos incluido GND.
Luego debes alimentar tus servos y para ello usarás otra fuente de la potencia adecuada y solo compartirás GND con el Arduino.

Respecto del simulador no lo conozco pero te aconsejo que aproveches la comunidad compartiendo tu objetivo de la forma mas detallada posible y el codigo. Se que te has explicado pero yo sigo sin comprender totalmente la idea.

Entonces el mismo código que usas en el simulador lo posteas aca (con etiquetas) y nos dices que pretenden y vamos avanzando con el mejor grupo de simuladores que tiene el foro Arduino.

Que te parece la idea?

Aurelioape

Me parece genial. Gracias Surbyte.

En breve publicaré un código que aunque no funcione, sea lo más clarificador posible.

Aurelioape

#12
Oct 25, 2018, 09:45 pm Last Edit: Oct 25, 2018, 10:19 pm by Aurelioape Reason: añadir etiquetas
Hola amigos.

Estoy muy contento :)  he conseguido programar un código que aparentemente hace lo que necesito. :o  Copiando trozos de código de ejemplos de la red y con muuuucho ensayo/error he dado con la tecla; o eso creo.

Os pego el código e incluyo dos archivos, uno del ide, y otro del simulador UnoArduSim que es la única manera que tengo de comprobar si funciona, porque ya me he dado cuenta que una cosa es que lo compile bien y otra que haga lo que esperas. Echadle un vistazo por si hubiese algo raro.
Por cierto cuando me las prometía muy felices al pasar el código al ide me daba error hasta que descubrí que no acepta las ñ.  >:(

Soy consciente que esta es la mitad de la faena porque me queda la parte de conectar una radio de verdad; pero estoy esperando al 11 del 11 a ver si pillo algo mejor el precio.

La verdad que me he divertido trasteando con la programación, si he llegado hasta aquí, si no saco adelante la conexión a la radio, con un empujoncito vuestro seguro que lo logro. :smiley-confuse:
Gracias por toda la info que me habéis proporcionado.

El código:

Code: [Select]
int senalradio = A5;    // Pin usado para conectar el potenciómeto simulando el canal 1 de la futura radio
int valorsenalradio;     // Esta variable definirá la posición del servo

int variableAmura = 0;       // declara una variable y le asigna el valor 0. Es la desencadenante de todo,
//detecta si la botavara está en el costado de estribor o no. Si no está valor 0 si está valor 1

#include <Servo.h>           // Incluímos la librería para poder controlar los servos.


Servo servoMotor2;
Servo servoMotor3;
Servo servoMotor4;
Servo servoMotor5;// Declaramos las variables para controlar los servos.

void setup()
{

pinMode(A5, INPUT); //configura el pin'A5'como entrada (analog) para el canal 1 de la radio, simulado por potenciómetro
pinMode(11, INPUT); // configura el pin '11' como entrada, 0 amurados a estribor, 1 amurados a babor

pinMode(12, OUTPUT); // configura el pin '12' como salida, luz verde para amurados estribor
pinMode(13, OUTPUT); // configura el pin '13' como salida, luz roja para amurados babor

servoMotor2.attach(2);
servoMotor3.attach(3);
servoMotor4.attach(4);
servoMotor5.attach(5);// Iniciamos los servos para que empiecen a trabajar con los pines 2,3,4 y 5
}

void loop()



{
variableAmura = digitalRead(11);// la variable recoge el valor digital del pin '11'
if (variableAmura == 0)
{
digitalWrite(12 , HIGH);   // encender led verde (amurados a estribor)
delay(1000);                   // esperar un segundo
digitalWrite(12 , LOW);    //apagar led verde (amurados a estribor)
delay(1000);                   // esperar un segundo}
valorsenalradio = analogRead(senalradio); //realiza la lectura tensión en 'A5' y la convierte en un número de 0 a1023
valorsenalradio = map(valorsenalradio, 0, 1023, 0, 180);// valor proporcional a la escala del servomotor (valor entre 0 y 180)

servoMotor2.write(valorsenalradio); //servoMotor2 se mueve con el potenciometro conectado A5
servoMotor3.write(0); //servoMotor3 va a posición 0
servoMotor4.write(valorsenalradio); //servoMotor4 se mueve con el potenciometro conectado A5
servoMotor5.write(180); //servoMotor5 va a posición 180

}

else
{
digitalWrite(13 , HIGH);   // encender led roja (amurados a babor)
delay(1000);                   // esperar un segundo
digitalWrite(13 , LOW);    //apagar led roja (amurados a babor)
delay(1000);                   // esperar un segundo}
valorsenalradio = analogRead(senalradio); //realiza la lectura tensión en 'A5' y la convierte en un número de 0 a1023
valorsenalradio = map(valorsenalradio, 0, 1023, 0, 180);// valor proporcional a la escala del servomotor (valor entre 0 y 180)

servoMotor2.write(0); //servoMotor2 va a posición 0
servoMotor3.write(valorsenalradio); //servoMotor3 se mueve con el potenciometro conectado A5
servoMotor4.write(180); //servoMotor2 va a posición 180
servoMotor5.write(valorsenalradio); //servoMotor5 se mueve con el potenciometro conectado A5
}
}





Hector_A

#13
Nov 11, 2018, 03:17 am Last Edit: Nov 11, 2018, 03:22 am by Hector_A
... me queda la parte de conectar una radio de verdad; pero estoy esperando al 11 del 11 a ver si pillo algo mejor el precio.

Ya tiene una radio de verdad. Si con 10 canales no alcanza para mover un velero es otro tema.

Me acabo de leer todo y no me quedó claro que tienen que mover los servos. ¿Tal vez el timón?

En cuanto a los receptores, para este caso da lo mismo que sea un iA6 o un iA6B, la diferencia entre ambos es que el iA6B puede manejar datos por PPM e iBus (de esta manera puedo controlas más de 10 canales) mientras que el otro sólo PWM y hasta los 6 canales correspondientes a sus salidas.

Entiendo que usted quiera reinventar su propia rueda y no me parece mal, al contrario, porque yo haría lo mismo de puro "mete mano" que soy en electrónica, pero también creo que tiene opciones mucho más simples y con menos quebraderos de cabeza como es utilizar una placa controaldora KK o una CC3D o, incluso, aunque sea mucho más cara, una APM (ArduPilot Mega) basada en una placa Arduino Mega sin todo el circuiterío de la misma, sólo lo necesario.

Si estoy mal enganchado en el tema pido disculpas, es lo que yo entendí, lo que si quiero remarcarle es que usted ya tiene una buena radio, yo no gastaría en comprar otra (bueno, yo si pero lo que estoy buscando es una multiprotocolo) mejor. Salvo que por snobismo o comentarios de otros aficionados pretenda comprar una Taranis o una Futaba.

En el tema modelismo radiocontrolado estoy hace más de 30 años y he conocido muchas personas que se compran lo más caro mientras que yo, con un equipo que cuesta la cuarta parte de lo que tenían, hacía lo mismo y me quedé en la actividad, mientras que muchos de ellos abandonaban en menos de un año.

Mis radios son: una TG-9x, una FS-i6 y una FS-i6x y la que más uso para mover cualquier cosa es la FS-i6 (con la modificación de 10 canales). Por mi experiencia bien podría cambiar a una Taranis, por ejemplo, pero tengo el gran problema de que tendría que migrar unos 20 receptores entre los cuales hay media docena de ellos instalados en modelos (dos autos, 2 aviones, 1 tricóptero y 1 cuadricóptero).

A pesar de todo lo dicho, si aún persiste en hacer ese control de navegación con Arduino, le recomiendo que lea la página RoboticBoard de Inglaterra que no dudo de que ya la conoce.

SaludOS/2

Aurelioape

Hola Héctor.
Lamento no haberte contestado antes, por alguna razón no me llegó el aviso de su post.

Probablemente no me he explicado bien.
Hasta la fecha no disponía de radio, ahora ya sí. Una FlySky I6.
Lo que pretendo manejar a través del arduino, son las velas. El timón directo al receptor, en otro canal.

¿Por qué todo este tinglado?
Porque el modelo es un velero antiguo con las siguientes velas a controlar: mayor más escandalosa, trinqueta, foque y foque volante, todas con sus particularidades de movimiento y longitudes de escotas distintas. Por si fuera poco hay dos pares de cabos, en ambos costados, se llaman burdas, su función es sostener el palo hacia atrás, como limitan el movimiento de la botavara, deben de aflojarse las del lado conveniente para permitir que el barco abra su mayor.

¿Eso no se puede hacer con la radio, simplemente asignando canales a los distintos servos?
Sí; pero ahí es donde quiero introducir la innovación. Todo el trabajo de pilotaje de afloja unos y tira de otros en los momento oportunos, con la distancia y la perspectiva se complica. En realidad todo se reduce a unos pocos movimientos que dependen de por qué costado recibimos el viento.
La botavara es la pieza clave, cuando oscila de un costado al otro es el desencadenante para que los servos actúen en "modo amurados a estribor" o "modo amurados a babor"; siguiendo la señal de la radio de tirar o aflojar. Ahí entra el arduino que me permitirá dosificar y distribuir esa orden de cazar o largar velas a cada servo con indicaciones por separado.

¿Objetivo final?
Que el barco se maneje del mismo modo que un velero moderno de rc, en que solo usamos un canal para cazar y largar velas y otro para la dirección conectado al timón. De no ser así, para la maniobra completa necesitaría, en el mejor de los casos, otros dos canales adicionales, para burdas y foques, que tendría que manejar manual.

Espero haber respondido a su post.
Por cierto no conocía la web, esa gente está a otro nivel, gps y más cosas. Yo con automatizar el cambio de amura, me doy por satisfecho.

El código anteriormente publicado cumple la función esperada; el potenciómetro simula la señal de la radio y los servos responden a lo previsto en ambos "modos". Ahora mismo tengo la parte electrónica atascada en el siguiente punto.
A continuación os pongo el código  obtenido de https://www.luisllamas.es/conectar-emisora-radio-control-con-arduino/    en su ejemplo usa seis canales y unas abreviaturas que me hacen perderme, no termino de entenderlo; agradecería si alguien me lo modifica para que lea un solo canal , el 3, y que me indique cual es el nombre y la salida física del parámetro que yo luego tengo que usar como equivalente a la señal de la radio.
Code: [Select]
int rcPins[6] = {5,6,7,8,9,10};
float chValue[6];
 
const int pulseInDelay = 20000;
 
void setup()
{
  Serial.begin(9600);
}
 
float fmap(float x, float in_min, float in_max, float out_min, float out_max)
{
  return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}
 
void readChannel(int channel)
{
  int rawValue = pulseIn(rcPins[channel], HIGH, pulseInDelay);
  chValue[channel] = fmap( (float)rawValue, 1000.0, 2000.0, 0.0, 1.0);
  chValue[channel] = chValue[channel] < 0.0 ? 0.0 : chValue[channel];
  chValue[channel] = chValue[channel] > 1.0 ? 1.0 : chValue[channel];
}
 
void printChannel()
{
  for(int iChannel = 0; iChannel < 6; iChannel++)
  {
    Serial.print("Ch #");
    Serial.print(iChannel);
    Serial.print(": ");
    Serial.println(chValue[iChannel]);
  };
  Serial.println("------------");
}
 
void loop()
{
  for(int iChannel = 0; iChannel < 6; iChannel++)
  {
    readChannel(iChannel);
  }
  printChannel();
  delay(2500);
}


Os agradezco de antemano vuestras respuestas.
Aunque no tiene relación directa con el foro, sí con este post. Las longitudes que tiene que realizar los cabos de labor no me permiten usar servos con un brazos tan largos, así que la solución son los multivueltas. Por no ser habituales tienen un precio mucho mayor, necesito seis y he terminado haciéndomelos yo, acoplándoles un potenciómetro multivueltas consigo casi cinco giros completos. Por si alguien está interesado en el tema dejo el link del tutorial que hice de ello. https://www.youtube.com/watch?v=OggquYdNHu4

Por la fecha del post no puedo menos que desearos Felices Fiestas a tod@s.

Go Up