A veces la pulsación de una tecla en el mando IR provoca que la siguiente tecla sea ignorada y se repita la acción asociada a la primera pulsación. Parece como si se quedara guardado el primer código y no se limpiara con la siguiente pulsación.

¿A alguien más le ocurre lo mismo?

Un saludo.

Aitor.

A veces la pulsación de una tecla en el mando IR provoca que la siguiente tecla sea ignorada y se repita la acción asociada a la primera pulsación. Parece como si se quedara guardado el primer código y no se limpiara con la siguiente pulsación. ¿A alguien más le ocurre lo mismo? Un saludo. Aitor.
editado 23 Mar '16 a las 7:18 pm

Si es con el Starter Kit o con una Orion, puedes hacer una prueba en Scratch de la siguiente forma:

56eede0821404.png

Si ves el código de la tecla que se muestra te responde a la vez del mando entonces puede ser problema del programa que tengas cargado en la placa (no se si has hecho alguno en Arduino o estás usando el Firmware)

Otra opción es que se te quede alguna tecla del mando pulsada, que también lo podrás ver con el ejemlo anterior

Si es con el Starter Kit o con una Orion, puedes hacer una prueba en [Scratch](http://www.mblock.cc/download) de la siguiente forma: ![56eede0821404.png](serve/attachment&path=56eede0821404.png) Si ves el código de la tecla que se muestra te responde a la vez del mando entonces puede ser problema del programa que tengas cargado en la placa (no se si has hecho alguno en Arduino o estás usando el Firmware) Otra opción es que se te quede alguna tecla del mando pulsada, que también lo podrás ver con el ejemlo anterior

Estoy con el Starter Kit trabajando directamente con Arduino, a partir de código generado desde Scratch. Scratch generaba varios (6 o 7) "ir_6.loop()" que no acababa de entender y decidí pasarme a Arduino.

Intento hacer algo parecido al firmware pero sin mantener apretadas las teclas del mando para que se mueva (con una pulsación de una tecla se pone en marcha, con otra tecla se para). A veces hay que dar varias veces a la misma tecla para que se ejecute la acción asociada. Sospecho que el problema está en el uso del ir_6.loop() pero no estoy seguro.

Esto es una simplificación del código que tengo ahora, el que tiene que ver con el mando IR:

__void mando_ir()
{
int codigo = ir_6.getCode();
switch (codigo) {

// case IRBUTTON?:
// procesar tecla ?
// break;

// ............
// procesado de otras teclas del mando...
// ............

}
}

void setup() {
// Inicio de las variables
//......

ir_6.begin();
}

void loop() {

// procesar codigos de tecla del mando IR
mando_ir();

// gestionar obstaculos con el sensor de ultrasonidos
sensor_us();

ir6.loop();
}_

Estoy con el Starter Kit trabajando directamente con Arduino, a partir de código generado desde Scratch. Scratch generaba varios (6 o 7) "ir_6.loop()" que no acababa de entender y decidí pasarme a Arduino. Intento hacer algo parecido al firmware pero sin mantener apretadas las teclas del mando para que se mueva (con una pulsación de una tecla se pone en marcha, con otra tecla se para). A veces hay que dar varias veces a la misma tecla para que se ejecute la acción asociada. Sospecho que el problema está en el uso del ir_6.loop() pero no estoy seguro. Esto es una simplificación del código que tengo ahora, el que tiene que ver con el mando IR: __void mando_ir() { int codigo = ir_6.getCode(); switch (codigo) { // case IR_BUTTON_?: // procesar tecla ? // break; // ............ // procesado de otras teclas del mando... // ............ } } void setup() { // Inicio de las variables //...... ir_6.begin(); } void loop() { // procesar codigos de tecla del mando IR mando_ir(); // gestionar obstaculos con el sensor de ultrasonidos sensor_us(); ir_6.loop(); }__

Es mucho más sencillo y fácil de entender de la siguiente forma:

void loop()
{
  if(infraredReceiverDecode.buttonState() == 1)    //- Si mantenemos pulsado un botón
    {
        switch(infraredReceiverDecode.read())
        {
          case IR_BUTTON_PLUS: 
               myMotor.run(100);    //- movemos el motor en un sentido
               break;
          case IR_BUTTON_MINUS:
                myMotor.run(-50);    //- movemos el motor en otro sentido
               break;            //  y lo hacemos más despacio
          case IR_BUTTON_NEXT:
               myMotor.run(150);    //- Aumentamos la velocidad del motor
               break;
          default:
           break;
        }
    }
    else    //- al levantar un botón
    {
      myMotor.run(0);   //- hacemos que el motor se detenga
    }
}
Es mucho más sencillo y fácil de entender de la siguiente forma: ```` void loop() { if(infraredReceiverDecode.buttonState() == 1) //- Si mantenemos pulsado un botón { switch(infraredReceiverDecode.read()) { case IR_BUTTON_PLUS: myMotor.run(100); //- movemos el motor en un sentido break; case IR_BUTTON_MINUS: myMotor.run(-50); //- movemos el motor en otro sentido break; // y lo hacemos más despacio case IR_BUTTON_NEXT: myMotor.run(150); //- Aumentamos la velocidad del motor break; default: break; } } else //- al levantar un botón { myMotor.run(0); //- hacemos que el motor se detenga } } ````

He probado de la forma que sugieres y el resultado es el mismo.

Es un problema que con el firmware suministrado no pasa porque no se da la situación.

Intentaré explicarlo.

Trato de programar el robot de forma que no haya que mantener pulsada la tecla para que se mueva. Cada pulsación hace que empiece a moverse (girar, avanzar, retroceder) o que se pare.

A veces pasa (parece que cuando la pulsación es un poco más larga) que se repite la última orden en lugar de la que está asociada a la tecla pulsada. Esto se hace visible con una acción que tengo asociada a la tecla "C" que hace que el robot de un giro completo (intento probar una nueva función que gire el angulo que le pase como parámetro).

Pongo un ejemplo:

Robot parado -> Tecla "C" -> Robot gira una vuelta -> Tecla "avanzar" -> Robot avanza (esto sería lo normal)

Robot parado -> Tecla "C" con pulsación un poco más larga-> Robot gira una vuelta -> Tecla "avanzar" -> Robot gira una vuelta (aquí no debería dar vuelta)

Entiendo que la pulsación larga hace que la tecla se procese varias veces y se encola el código de tecla de manera que con la siguiente pulsación se termina de procesar el anterior código de tecla.

Lo que busco es algo que vacíe la cola de teclas para asegurar que no proceso códigos antiguos o una forma de evitar que se repitan los códigos con la misma pulsación. Sigo haciendo pruebas pero todavía no he conseguido solucionarlo.

Tampoco es un gran problema, basta con hacer pulsaciones cortas, pero parece que a los niños se les queda pegado el dedo a la tecla...

Un saludo.

Aitor.

He probado de la forma que sugieres y el resultado es el mismo. Es un problema que con el firmware suministrado no pasa porque no se da la situación. Intentaré explicarlo. Trato de programar el robot de forma que no haya que mantener pulsada la tecla para que se mueva. Cada pulsación hace que empiece a moverse (girar, avanzar, retroceder) o que se pare. A veces pasa (parece que cuando la pulsación es un poco más larga) que se repite la última orden en lugar de la que está asociada a la tecla pulsada. Esto se hace visible con una acción que tengo asociada a la tecla "C" que hace que el robot de un giro completo (intento probar una nueva función que gire el angulo que le pase como parámetro). Pongo un ejemplo: Robot parado -> Tecla "C" -> Robot gira una vuelta -> Tecla "avanzar" -> Robot avanza (esto sería lo normal) Robot parado -> Tecla "C" con pulsación un poco más larga-> Robot gira una vuelta -> Tecla "avanzar" -> Robot gira una vuelta (aquí no debería dar vuelta) Entiendo que la pulsación larga hace que la tecla se procese varias veces y se encola el código de tecla de manera que con la siguiente pulsación se termina de procesar el anterior código de tecla. Lo que busco es algo que vacíe la cola de teclas para asegurar que no proceso códigos antiguos o una forma de evitar que se repitan los códigos con la misma pulsación. Sigo haciendo pruebas pero todavía no he conseguido solucionarlo. Tampoco es un gran problema, basta con hacer pulsaciones cortas, pero parece que a los niños se les queda pegado el dedo a la tecla... Un saludo. Aitor.

Yo creo que es más un problema de cómo plantear el código a la hora de programar.

Si lo que quieres es que pulse por ejemplo la flecha arriba y se ponga a andar aunque suelte el botón y que pare (o acelere o gire o lo que quieras) cuando pulses otro botón. Entonces tendrás que hacer como una especie de máquina de estados.

puedes declarar una variable global que indique el estado y que se actualice al pulsar la tecla.

también puedes intentar realizar la acción sólo cuando suelto el dedo de la tecla, de esta forma aunque tengas el dedo un rato en una tecla, el programa no hará caso a nada hasta que levantes el dedo.

También puedes basar tu código en el propio firmware del starter kit y modificarlo a tu gusto:

https://github.com/Makeblock-official/Makeblock-Libraries/blob/master/makeblock/example/Firmware_for_Starter/IR_Ultrasonic/IR_Ultrasonic.ino

Yo creo que es más un problema de cómo plantear el código a la hora de programar. Si lo que quieres es que pulse por ejemplo la flecha arriba y se ponga a andar aunque suelte el botón y que pare (o acelere o gire o lo que quieras) cuando pulses otro botón. Entonces tendrás que hacer como una especie de máquina de estados. puedes declarar una variable global que indique el estado y que se actualice al pulsar la tecla. también puedes intentar realizar la acción sólo cuando suelto el dedo de la tecla, de esta forma aunque tengas el dedo un rato en una tecla, el programa no hará caso a nada hasta que levantes el dedo. También puedes basar tu código en el propio firmware del starter kit y modificarlo a tu gusto: https://github.com/Makeblock-official/Makeblock-Libraries/blob/master/makeblock/example/Firmware_for_Starter/IR_Ultrasonic/IR_Ultrasonic.ino
935
vistas
5
respuestas
3
seguidores
vista previa (en vivo)
introduzca al menos un 10 caracteres
Advertencia: Mencionaste a %MENTIONS%, pero ellos no pueden ver el mensaje y no serán notificados
Guardando...
Guardado
Todos los posteos de este tema serán borrados ?
Borrador pendiente ... Click para continuar editando
Descartar borrador