Dudas con receptor infrarrojo para mover chasis a distintas velocidades

Buenas a tod@s!

Recientemente adquirí un Arduino UNO con un Motor Driver y un receptor infrarrojo para realizar un pequeño proyecto que tengo en mente y que iré ampliando poco a poco.
De momento quiero poder controlar un chasis con dos ruedas mediante un mando infrarrojo.

Mi mayor problema viene a la hora de entender el funcionamiento de la libería IRremote de Arduino.

Como compré este KIT receptor más mando sí que he podido hacer algo así:

  switch (key)
  {
    case 32640:  // BOTÓN POWER DEL MANDO
      digitalWrite(M1,HIGH);
      digitalWrite(M2,LOW);     
      analogWrite(E1,255);
      analogWrite(E2,255);
      break;
 
    case 32130:  // BOTÓN |<< DEL MANDO
      digitalWrite(E2,LOW); //PARAMOS RUEDA2
      digitalWrite(M1,HIGH);
      analogWrite(E1,255);
      break;

Es decir, con el botón POWER del mando a distancia muevo el chasis hacia adelante. Con el botón |<< lo que hago es que gire.

Ahora, lo que me gustaría hacer es poder seleccionar con los botones "1", "2" y "3" distintas velocidades para los motores. Es decir, con el "1", por ejemplo, seleccionaría una salida analógica de 100. Con el botón "2" de 160 y así con otros botones.

Querría algo así: analogWrite(E1,valor)

Y ese valor sería el que yo variaría al apretar los diferentes botones.

He intentado bucles if, pero no se me queda ese 100, 160, etc guardado en la variable valor :

int valor = 0;

if (key == 30600) //SI PULSO EL BOTÓN 1 (30600)
{
valor = 100;
}

else if (key == 30470) // SI PULSO EL BOTÓN 2 (30470)
{
valor = 160;
}

No se me guardan esos valores en la constante para luego poder utilizarla en el switch case.

switch (key)
{
  case 32640:  // BOTÓN POWER DEL MANDO
      digitalWrite(M1,HIGH);
      digitalWrite(M2,LOW);     
      analogWrite(E1,valor);
      analogWrite(E2,valor);
      break;

Espero haberme explicado más o menos de forma correcta.

También ,si pudierais pasarme información sobre cómo han obtenido los valores que corresponden a cada botón (que el 1 es el número 30600 o el 2 el 30472, etc) os lo agradecería, pues he intentado buscar documentación pero no la termino de comprender.

Muchas gracias de antemano y espero poder compartir con vosotros muchas dudas y soluciones =D

Porque no lo pones asi????

switch (key)
{
  case 32640:  // BOTÓN POWER DEL MANDO
      valor=160;
      digitalWrite(M1,HIGH);
      digitalWrite(M2,LOW);     
      analogWrite(E1,valor);
      analogWrite(E2,valor);
      break;

Un saludo

Hola!

El problema de poner lo que tú me dices, es que entonces cada vez que pulse el botón POWER, el robot se moverá a esa velocidad y no podré cambiarla.

Yo lo que quiero es hacer eso mismo, ponerlo en marcha a una determinada velocidad, pero luego apretar el botón "2", por ejemplo, y que la velocidad aumente. Si pulso "0", valor sería = 0 y por tanto se pararía.

¿Me explico?

Gracias!

Pues pon el valor para cada valor del pulsador.

Si pulsas el 1 se mueve a X velocidad.
Si pulsas el 2 se mueve a Y velocidad.

Eso es exactamente lo que quiero, pero mi problema es que cuando pulso cada botón no sé cómo hacer para que se quede el valor guardado en la variable.

He probado con el if de antes, pero no sustituye valor por el número que yo quiero. Se queda en 0, que es el primer valor asignado cuando declaro la variable.

Saludos!

A la varible valor le asignas el valor 0 dentro de la funcion loop? Si lo haces asi, todo el rato le estan diciendo que sea 0, asi que prueba a declararla al principio del programa.

Si, yo creo que tu problema es que inicializas la variable justo antes del IF. De esa manera la estas poniendo continuamente a 0.

Claro... veo un posible gran fallo :stuck_out_tongue:

Luego cuando lo pruebe esta tarde os digo algo. Pero muchas gracias @canyardo y @chocala :wink:

Por cierto. Sobre el funcionamiento de los receptores/emisores infrarrojo (enfocado sobre todo a los mandos a distancia) alguien conoce algún sitio donde expliquen -más o menos paso a paso- la librería? Es que me pierdo un bastante a la hora de entender por qué escriben tal código.
He hecho búsquedas en Google, pero con el material que encuentro no termino de verlo muy claro.

Muchas gracias compañeros!

Chicos, mil gracias. He solucionado el problema tal como me habéis dicho:

Tenía que declarar la variable fuera de cualquier función. Dentro de loop() sí que pongo el bucle if y de este modo se me guarda el valor que tengo asignado para cada botón. Ahora ya puedo controlar la velocidad en cada momento :stuck_out_tongue:

Mis conocimientos de programación son básicos, pero sí pensaba estar un poco familiarizado con el tema de los bucles. El problema ha sido no tener en cuenta que al estar dentro de loop() el valor de la variable siempre era el mismo. ¡Algo no me cuadraba! :wink:

Gracias de nuevo! Un tema zanjado. Ahora me queda la duda sobre los infrarrojos.

Saludos!

promanolillo:
Gracias de nuevo! Un tema zanjado. Ahora me queda la duda sobre los infrarrojos.

Saludos!

Para leer (tomar valores hexadecimales) de cualquier aparato ir, utiliza la librería NECIRrcv. Es muy fácil y te lo dan todo hecho. Carga el código en tu arduino, conectando el receptor ir en el pin adecuado. Pulsa cualquier botón de tu mando y en la consola saldrá el valor hexadecimal. Una vez tengas los valores, sigue tu código con la constante valor.

PascuaL:
Para leer (tomar valores hexadecimales) de cualquier aparato ir, utiliza la librería NECIRrcv. Es muy fácil y te lo dan todo hecho. Carga el código en tu arduino, conectando el receptor ir en el pin adecuado. Pulsa cualquier botón de tu mando y en la consola saldrá el valor hexadecimal. Una vez tengas los valores, sigue tu código con la constante valor.

Gracias por indicarme esa librería. Yo conocía la de DFRobot y era la que estoy utilizando para mi chasis, pero creo que es bastante complicada.
Aquí tenéis un código de ejemplo... pero el funcionamiento en sí no lo entiendo :stuck_out_tongue:

Gracias!!