Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: abigliazzi en 18 Abril 2018, 22:34 pm



Título: Arduino HID
Publicado por: abigliazzi en 18 Abril 2018, 22:34 pm
Hola, configure mi arduino Mega 2560 para que funcionara como un puerto HID para utilizarlo como macro de teclado, hice algunas pruebas de codigo como

Citar

#include "Keyboard.h"
#include "HID.h"

void setup() {

  Keyboard.begin();
}


void loop() {
delay (1000);
  Keyboard.write(65);


}



Funciono, cada 1 segundo me escribía la letra "A"..

Hasta acá todo bien, ahora lo que quiero hacer es que cuando apriete un botón en cualquier pin de la placa que arranque el loop ej, Key_F1 (cada 1 segundo) Key_F2(cada 20 segundos) Key_F3(cada 5 segundos) es decir, en 1 minuto se pulso 60 veces "F1" 3 veces "F2" y 12 veces "F3" sin detenerse

y finalmente que cuando vuelva a apretar el botón se detenga la cadena... me explico ?

estoy medio trabado con el codigo, me tira errores cuando quiero agregar mas de 1 tecla y también me tira error cuando pongo el pinmode.

Me ayudaría mucho que me pongan un ejemplo de varias teclas distintas con Keyboard.write y delay , ya que 1 sola pude hacerlo andar pero los errores comienzan cuando pongo mas de 1..

espero su  ayuda

Desde ya muchas gracias !


Título: Re: Arduino HID
Publicado por: engel lex en 18 Abril 2018, 22:46 pm
en este caso no deberías usar delay sino contar el tiempo y llevar el tiempo de cada cosa para saber cuantos segundos han pasado


Título: Re: Arduino HID
Publicado por: abigliazzi en 18 Abril 2018, 22:49 pm
Claro, pero es por tiempo indefinido, quiero finalizar el loop cuando vuelva a presionar el interruptor, porque lo que necesito es el F1 se presione cada 1 segundo y que el F2 cada 20 por ejemplo


Título: Re: Arduino HID
Publicado por: engel lex en 18 Abril 2018, 22:54 pm
explica en detalle los errores de los pines...

para tener el tiempo esta funcion te sirve
https://www.arduino.cc/reference/en/language/functions/time/millis/


Título: Re: Arduino HID
Publicado por: abigliazzi en 18 Abril 2018, 23:11 pm
Código:

#include "Keyboard.h"
#include "HID.h"

void setup() {

  Keyboard.begin();
}


void loop() {

currentMillis = millis();
    while (millis() - currentMillis < 1000) {

  Keyboard.write(Key_F1);


}



Algo así seria ? disculpa si estoy poniendo alguna burrada soy medio nuevo en arduino  :-X


Título: Re: Arduino HID
Publicado por: engel lex en 18 Abril 2018, 23:21 pm
Citar
Algo así seria ? disculpa si estoy poniendo alguna burrada soy medio nuevo en arduino  :-X

piensa en la algoritmia...

Código
  1. unsigned long time_F1;
  2. unsigned long time_F2;
  3.  
  4.  
  5. void setup() {
  6.  time_F1 = 0;
  7.  time_F2 = 0;
  8.  
  9. }
  10.  
  11.  
  12. void loop() {
  13.  
  14.  if(boton_presionado()){
  15.    time_F1 = millis() + 5000; // tiempo + 5 segundos
  16.    time_F2 = millis() + 20000; // tiempo + 20 segundos
  17.  }
  18.  
  19.  if(time_F1 && time_F1 < millis()){ // si time_F1 no es 0 y el tiempo ya pasó
  20.    time_F1 = 0; //lo volvemos a 0 para "apagarlo"
  21.  
  22.    //aquí tu proceso
  23.  
  24.  }
  25.  
  26.  if(time_F2 && time_F2 < millis()){ // si time_F2 no es 0 y el tiempo ya pasó
  27.    time_F2 = 0; //lo volvemos a 0 para "apagarlo"
  28.  
  29.    //aquí tu proceso
  30.  
  31.  }
  32.  
  33. }
  34.  

si no eres flojo como yo XD y usas array, puedes de una sola pasada activar y desactivar secuencias :P


Título: Re: Arduino HID
Publicado por: MAFUS en 18 Abril 2018, 23:27 pm
No he trabajado mucho en Arduino, así que voy a dar unas ideas generales.

Crea una variable tipo bool para saber si debe correr el temporizador.
Crea una variable tipo entero para saber qué pin ha sido el último en activarse.
Crea una variable tipo unsigned que marque el tiempo de marca del temporizador.

Cuando actives un pin:
   Cambias la mara de tiempo a la referente a ese pin
   Observa si el temporizador estaba en marcha
      Si lo estaba y el pin es igual al ultimo pin
         Detienes el temporizador
      Si estaba parado
         Pones en marcha el temporizador

Si el temporizador está en marcha
    Si el tiempo ha llegado a la marca
      Envías el carácter por el teclado virtual
      Reinicia el temporizador a 0