Entrada Analogica - Subida de señal cuando otros entradas ocurren.

Hola.
Estoy reutilizando un mando de PS3 roto para hacer una emisora RC.
También uso un Arduino Pro Mini 5v,

Reutiliza los dos joys (cuatro potenciómetros, agrupados en dos parejas X-Y), y cuatro botones del mando.

Le viejo circuito (el original del mando) esta completamente aislado y eliminado, para evitar ruido o funcionamientos erráticos.

Conecte los cuatro ejes de a los primeros cuatro puertos analógicos, además de voltaje (desde el Arduino) y masa. De una forma muy similar al siguiente imagen, pero con dos joys.Arduino Joy Diagram

El circuito funciona y puedo recoger los valores desde el Arduino sin problemas, obteniendo unos valores de 0 a 640 con analogRead().

El problema es:
Cuando muevo uno de los los ejes hacia el valor mas alto, los otros tres ejes sube ligeramente con el (15%+).
Si subo dos de ellos (cualquiera), los otros dos suben un poco mas que antes (16%+).
Si subo los cuatro, todos ellos alcanzan máximas muy superior a las anteriores individualmente (60%+).

Por si los potenciómetros ejercían demasiado poca resistencia añadí cuatro resistencias de 220ohms en cada entrada. El mismo resultado.
Por si fuera problema de amperaje añadí otro regulador de potencia de 5voltios con un amperio mas. El mismo resultado.
Si hay entradas en las puertos digitales, no parece ser interferir el resultado de los analogicos.
Tambien he probodo a ennder leds en los digitales y tampoco parace afetar a los analogicos.

Enumerando lo cruceta con números del 1 al 9, Estos serian los valores.
1 2 3
4 5 6
7 8 9

RX RY LX LY
__ __ __ ____ ____ ____ ____
5 1 345 342 1 0
5 2 359 360 361 0
5 3 503 498 846 0
5 4 366 363 0 371
5 5 373 373 374 377
5 6 502 496 836 522
5 7 502 497 2 633
5 8 501 500 511 698
5 9 503 499 865 856
.
1 5 0 178 354 352
2 5 362 2 365 364
3 5 647 0 512 524
4 5 0 359 364 363
5 5 370 370 373 372
6 5 695 498 513 524
7 5 2 704 512 525
8 5 500 701 511 522
9 5 778 780 512 524
.
9 9 919 920 911 913

He pensado en desarrollar un función para depurar el ruido sobrante... pero estoy seguro que no es ncesario, y que algo algo estoy haciendo mal.

Muchas gracias de antemano.
JP

Porque hablas de ruido?

Ruido sería si una valor tiene mucha variación, y no valores estables. Ese es el problema?
O tu problema es que cuando mueves los que no deberían comprometerse lo hacen en ese 15 o 16%

Tienes razón.
Es cierto que hay ruido, seguramente por las resistencias recientemente añadidas, pero este no es el problema, con un redondeo de los diez últimos valores me valdría.

La verdad es que no se muy bien como llamarlo. Supongo que el nombre mas correcto seria "interferencia entre entradas"... Pero estoy abierto a otras formas de definirlo.

El problema parece que el hecho de mover cualquier eje, mueva los rangos de rastreo de los otros tres.

Con este código se reproduce perfectamente:

int serial_putc( char c, FILE * ){
  Serial.write( c );
  return c;
}

const byte pin_lx = 3, pin_ly = 2;
const byte pin_rx = 1, pin_ry = 0;

void setup() {
  pinMode(pin_rx, INPUT);
  pinMode(pin_ry, INPUT);
  pinMode(pin_lx,  INPUT);
  pinMode(pin_ly,  INPUT);
  Serial.begin(115200);
  fdevopen( &serial_putc, 0 ); 
}


void loop() {
  unsigned int joy_RX,joy_RY,joy_LX,joy_LY;
  joy_RX = analogRead(pin_rx);
  joy_RY = analogRead(pin_ry);
  joy_LX = analogRead(pin_lx);
  joy_LY = analogRead(pin_ly);
  printf("LX=%d\tLY=%d\tRX=%d\tRL=%d\r\n",joy_LX,joy_LY,joy_RX,joy_RY);
  delay(1);
}

printf("LX=%d\tLY=%d\tRX=%d\tRL=%d\r\n",joy_LX,joy_LY,joy_RX,joy_RY);

Con que arduino corres esta línea?

Esto correrá en todos, si previamente defines con fdevopen() a otra función con la que él podrá escribir allá done quieras (en mi caso, el puerto serie).
fdevopen() es una función inherente de libc, al iguale que printf(), y siempre se pre-cargan.

En concreto a tu pregunta, yo estoy usando un Arduino Pro Mini 5v.

int mi_funcion_de_salida_en_puerto_serie( char c, FILE * ){
  Serial.write( c );
  return c;
}

void setup() {
  Serial.begin(115200);
  fdevopen( &mi_funcion_de_salida_en_puerto_serie, 0 );
  printf("Bienvenido a %s!!", "printf");
}

void loop(){}

Excelente explicación. Merece un punto aparte pero en otro hilo.

Estuve viendo como esta conformado el joystick y te puedo asegurar que es imposible evitar la interacción de los potenciometros. Asi que tendrás que tolerar la situación o idear algo para descartar información no útil.