servos con arduino para barco RC

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.

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.

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.

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?

Me parece genial. Gracias Surbyte.

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

Hola amigos.

Estoy muy contento :slight_smile: 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. :confused:
Gracias por toda la info que me habéis proporcionado.

El código:

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
}
}

sketch_oct25a.ino (3.05 KB)

config arduino servos velas delanteras y burdas.ino (2.98 KB)

Aurelioape:
... 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

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 Conectar una 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.

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. Conversión servo estándar en multivueltas /Modify a standard servo to multiturn - YouTube

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

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?

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.

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.

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.

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.

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

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

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.

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 ?

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.

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.

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.