Autor Tema: COMO HACER UN TECLADO  (Leído 13074 veces)

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado pipipi

  • PIC12
  • **
  • Mensajes: 91
COMO HACER UN TECLADO
« en: 15 de Diciembre de 2009, 19:35:59 »
Hola amigos del foro:

Estoy realizando un proyecto y necesito de su ayuda. :)

Tengo un juego de pc el problema es que dicho juego responde a los botones del teclado de la pc, para ser mas preciso en el juego se utilizan los botones que traen las flechas para el movimiento, lo que quiero hacer es realizar un dispositivo por medio de un microcontrolador el cual pueda hacer las funciones de estas teclas pero presionando swichs, esto es,  :shock: que al precionar un swich el microcontrolador interactue con el juego como si fuera el teclado.

Tengo entendido que la comunicacion entre el teclado y la pc es serie pero no tengo idea como hacer para que la pc reconosca los swich. MMM no se si alguien de ustedes haya echo algo similar o si se pueda hacer. Espero no estar muy loco jejeje. Espero sus respuestas.

Gracias.
 :-/

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: COMO HACER UN TECLADO
« Respuesta #1 en: 15 de Diciembre de 2009, 19:47:15 »
 Creo que se puede hacer! El teclado es usb o PS/2?



Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Felixls

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 300
Re: COMO HACER UN TECLADO
« Respuesta #2 en: 15 de Diciembre de 2009, 19:52:32 »
El amigo Mario hizo algo como lo descripto


Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: COMO HACER UN TECLADO
« Respuesta #3 en: 15 de Diciembre de 2009, 22:29:46 »
Muy bueno.

Creo que si solo quieres que reconozca una determinada tecla al pulsar un switche, se podría usar un PIC18F2550 con la clase HID tipo keyboard. Otra opción es usar la clase HID Jostick.

Saludos
El papel lo aguanta todo

Desconectado pipipi

  • PIC12
  • **
  • Mensajes: 91
Re: COMO HACER UN TECLADO
« Respuesta #4 en: 16 de Diciembre de 2009, 12:29:54 »
Hola:

Muchas gracias por sus respuestas a un no me queda claro como hacerlo, si se que se podria ser sp2 o via usb el problema es como hacer que me reconosca el micro como un teclado. MMM en realidad no tengo problemas con la programacion por lo que se debiera hacer ya que he manejado familia 16 y 18 lo unico que necesito saber es que se le tiene que programar al micro.

Gracias

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: COMO HACER UN TECLADO
« Respuesta #5 en: 16 de Diciembre de 2009, 12:52:57 »
Si es PS/2 revisa el hilo de RedPIC en donde se emula un teclado, allí puedes obtener un manual en español completo y veras que es muy sencillo. En este caso se puede hacer con un 16F628 por ejemplo, en cambio hacerlo en USB se necesita un 18F, debes hacerlo como dice MLO_ con la clase HID keyboard, que emula teclado o Jostick. En ambos casos hay que recopilar información. En la misma pagina de RedPic hay algo  ;-)


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado pipipi

  • PIC12
  • **
  • Mensajes: 91
Re: COMO HACER UN TECLADO
« Respuesta #6 en: 17 de Diciembre de 2009, 20:00:58 »
hOLA:

Gracias por sus repuestas he estado leyendo el proyecto de redpic pero ahora tengo un gran problema. Hace un rato que cambie mi teclado  ps2 por uno usb, la verdad no me acordaba cual era el motivo de averlo cambiado, pero ya me acorde que el ps2 del teclado de mi pc esta dañado. MMM tengo un convertidor de ps2 a usb, la pregunta es si utilizo el ejemplo de redpic y lo conecto con el adaptador no tendre ningun problema?.

Espero susu respuestas. Gracias

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: COMO HACER UN TECLADO
« Respuesta #7 en: 17 de Diciembre de 2009, 23:42:40 »
Sino lo mejor es utilizar un 18F2550 y usar USB con la clase HID Keyboard.

Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: COMO HACER UN TECLADO
« Respuesta #8 en: 18 de Diciembre de 2009, 00:03:00 »
Totalmente de acuerdo Suky. La clase Joystick seria recomendable tambien.
El papel lo aguanta todo

Desconectado pipipi

  • PIC12
  • **
  • Mensajes: 91
Re: COMO HACER UN TECLADO
« Respuesta #9 en: 18 de Diciembre de 2009, 23:39:07 »
Hola:

Muchisimas gracias lo voy a checar y les cuento como me fue. :-/

Desconectado pipipi

  • PIC12
  • **
  • Mensajes: 91
Re: COMO HACER UN TECLADO
« Respuesta #10 en: 23 de Diciembre de 2009, 14:31:54 »
Hola amigos:

He estado checando el ejemplo de RedPic para emular un teclado con USB ya he bajado el proyecto y lo grabe en el PIC18f4550 el problema es que no le entiendo a dos subrutinas dentro de la programacion si alguien me pudiese explicar ya que es necesario comprenderlo para realizar mi aplicacion gracias:


/////////////////////////////////////////////////////////////////////////
////                                                                 ////
////  rr2_HID_kbd_usb_Monitor.c                                      ////
////                                                                 ////
////  by RedPic                                                      ////
////                                                                 ////
////  08/10/2006                                                     ////
////                                                                 ////
/////////////////////////////////////////////////////////////////////////

#include <18F4550.h>
//#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL3,CPUDIV1,VREGEN
#use delay(clock=48000000)

#DEFINE USB_HID_DEVICE  TRUE

#define USB_EP1_TX_ENABLE  USB_ENABLE_INTERRUPT   //turn on EP1 for IN bulk/interrupt transfers
#define USB_EP1_TX_SIZE 8

#define USB_EP1_RX_ENABLE  USB_ENABLE_INTERRUPT   //turn on EP1 for IN bulk/interrupt transfers
#define USB_EP1_RX_SIZE 8

#include <pic18_usb.h>
#include <usb_kbd_HID.h>               //USB Configuration and Device descriptors for this UBS device
#include <usb.c>                                 //handles usb setup tokens and get descriptor reports
#include <ctype.h>

/////////////////////////////////////////////////////////////////////////////
//
// Defines y Zarandajas
//
/////////////////////////////////////////////////////////////////////////////

#define LED1    PIN_E0
#define LED2    PIN_E1
#define LED3    PIN_E2

#define LED_ON  output_high
#define LED_OFF output_low

#define PIN_SOURCE PIN_B1

/////////////////////////////////////////////////////////////////////////////
//
// RAM
//
/////////////////////////////////////////////////////////////////////////////

int8 enumerated;
int8 rx_msg[USB_EP1_RX_SIZE];
int8 tx_msg[8]={2,0,0,0,0,0,0,0};

char NextChar='0';
int1 hay_dato=0;


/////////////////////////////////////////////////////////////////////////////
//
// usb_debug_task()
//
// Muestra la información de depuración en serie para
// la enumeración y los estados de conexión. Las luces LED2 y LED3 indican
// la enumeración y el estado de la conexión.
//
/////////////////////////////////////////////////////////////////////////////

void usb_debug_task(void) {

   enumerated=usb_enumerated();//Devuelve 1 si el dispositivo fue enumerado correctamente

   if(enumerated){
      LED_ON(LED1);
      LED_OFF(LED3);
   }
   else{
      LED_ON(LED3);
      LED_OFF(LED1);
   }
}

/////////////////////////////////////////////////////////////////////////////
//
// usb_keyboard_task()
//
// Envía un paquete de datos del teclado. El protocolo se especifica en el
// descriptor de informe HID (véase usb_desc_kbmouse.h), y es:
//     tx_msg[0]   = Informe HID ID (2)
//     tx_msg[1]   = modificador (un mapa de 8 bits de cambio, Tecla, se oprime una tecla ALT)
//     tx_msg[2]   = const 0
//     tx_msg[3:7] = se presiono una serie de teclas. a = 4, B = 5, etc
//                   si msg [2:7] = (0) entonces no se mantienen presionadas las teclas
//
//     rx_msg[1] = Informe HID ID (2)
//     rx_msg[0] = 5BIT de mapa de bits de estado LED
//
/////////////////////////////////////////////////////////////////////////////

int8 char_2_usb_kbd_code(char c)
{

   int8 ic;
   
//El isalpha function () devuelve un valor distinto de cero si su argumento
//es una letra del alfabeto. De lo contrario, se devuelve cero.

   if(isAlpha(c))
   {
      ic=c-'a'+4;
   }
   else
   {
      if(c=='0')
      {
        ic=39;
      }
      else{
        ic=c-'1'+30;
      }
   }
   return(ic);
}

void usb_keyboard_task(void) {


   if(hay_dato==1){

      hay_dato=0;
      tx_msg[3]=char_2_usb_kbd_code(NextChar);
      usb_put_packet(1,tx_msg,sizeof(tx_msg),USB_DTS_TOGGLE);
     
      ++NextChar;
      if(NextChar>'z'){
         NextChar='0';
      }
      if(NextChar>'9'&&NextChar<'a'){
         NextChar='a';
      }
      LED_OFF(LED2);
      delay_ms(5);

   }else{

      tx_msg[3]=0;
      usb_put_packet(1,tx_msg,sizeof(tx_msg),USB_DTS_TOGGLE);
      delay_ms(5);

   }
}

/////////////////////////////////////////////////////////////////////////////
//
// usb_rx_task()
//
// Escucha a EP1 para todos los paquetes entrantes. El único informe ID que
// es configurdo que nos envíe los datos es de 2 (teclado LED de estado, véase más arriba)
//
/////////////////////////////////////////////////////////////////////////////

void usb_rx_task(void){

   if (usb_kbhit(1)){
      usb_get_packet(1, rx_msg, sizeof(rx_msg));
   }
}

/////////////////////////////////////////////////////////////////////////////
//
// recibe por interrupción ext
//
/////////////////////////////////////////////////////////////////////////////

#int_ext
void ext_handler(void){

   if(hay_dato==0){
     hay_dato=1;
     LED_ON(LED2);
   }
}

void main() {

   hay_dato=0;

   delay_ms(500);

   LED_OFF(LED1);
   LED_OFF(LED2);
   LED_OFF(LED3);

   usb_init_cs();

   port_b_pullups(true);
   set_tris_b(0b00000001);
   output_high(PIN_SOURCE);
   ext_int_edge(0,L_TO_H);
   enable_interrupts(int_ext);
   enable_interrupts(global);

   while (TRUE) {

      usb_task();
      usb_debug_task();

      if (usb_enumerated())//Devuelve 1 si el dispositivo fue enumerado correctamente
      {
         usb_keyboard_task();
         usb_rx_task();
         delay_ms(5);
      }
   }
}

« Última modificación: 23 de Diciembre de 2009, 14:38:08 por pipipi »

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: COMO HACER UN TECLADO
« Respuesta #11 en: 23 de Diciembre de 2009, 15:57:43 »
Leete los documentos que RedPic te recomienda, en uno de ellos esta la relación entre los códigos del teclado USB y el teclado PS2.

Esas funciones son para pasar el opcode (creo que asi es) del teclado del PS2 al teclado USB.

Saludos
El papel lo aguanta todo

Desconectado pipipi

  • PIC12
  • **
  • Mensajes: 91
Re: COMO HACER UN TECLADO
« Respuesta #12 en: 27 de Diciembre de 2009, 12:33:16 »
Hola amigos del foro:

Estoy haciendo una comunicacion USB HID con un pic 18f4550 y un teclado matricial apoyandome en el ejemplo de RedPic. Hata ahora ya logre establecer comunicacion con la pc y el micro. El programa tiene como finalidad que la pc detecte las teclas del teclado matricial al oprimirlas esta es la programacion que llevo hasta ahora:


#include <18F4550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL3,CPUDIV1,VREGEN
#use delay(clock=48000000)

#use fast_io(B)

#DEFINE USB_HID_DEVICE  TRUE

#define USB_EP1_TX_ENABLE  USB_ENABLE_INTERRUPT   //turn on EP1 for IN bulk/interrupt transfers
#define USB_EP1_TX_SIZE 8

#define USB_EP1_RX_ENABLE  USB_ENABLE_INTERRUPT   //turn on EP1 for IN bulk/interrupt transfers
#define USB_EP1_RX_SIZE 8

#include <pic18_usb.h>
#include <usb_kbd_HID.h>               //USB Configuration and Device descriptors for this UBS device
#include <usb.c>                                 //handles usb setup tokens and get descriptor reports
#include <ctype.h>

/////////////////////////////////////////////////////////////////////////////
//
// Defines y Zarandajas
//
/////////////////////////////////////////////////////////////////////////////

#define LED1    PIN_E0
#define LED2    PIN_E1
#define LED3    PIN_E2

#define LED_ON  output_high
#define LED_OFF output_low



/////////////////////////////////////////////////////////////////////////////
//
// RAM
//
/////////////////////////////////////////////////////////////////////////////

#byte PUERTOB    = 0xF81
#bit  BEEP    = 0xF83.3

byte LSB=0b11111110;
byte tecla1;
char tecla;
int8 enumerated;
int8 rx_msg[USB_EP1_RX_SIZE];
int8 tx_msg[8]={2,0,0,0,0,0,0,0};
int1 hay_dato=0;


/////////////////////////////////////////////////////////////////////////////
//
// usb_debug_task()
//
// Muestra la información de depuración en serie para
// la enumeración y los estados de conexión. Las luces LED2 y LED3 indican
// la enumeración y el estado de la conexión.
//
/////////////////////////////////////////////////////////////////////////////

void usb_debug_task(void)
{

   enumerated=usb_enumerated();//Devuelve 1 si el dispositivo fue enumerado correctamente

   if(enumerated){
      LED_ON(LED1);
      LED_OFF(LED3);
   }
   else
   {
      LED_ON(LED3);
      LED_OFF(LED1);
   }
}

/////////////////////////////////////////////////////////////////////////////
//
// usb_keyboard_task()
//
// Envía un paquete de datos del teclado. El protocolo se especifica en el
// descriptor de informe HID (véase usb_desc_kbmouse.h), y es:
//     tx_msg[0]   = Informe HID ID (2)
//     tx_msg[1]   = modificador (un mapa de 8 bits de cambio, Tecla, se oprime una tecla ALT)
//     tx_msg[2]   = const 0
//     tx_msg[3:7] = se presiono una serie de teclas. a = 4, B = 5, etc
//                   si msg [2:7] = (0) entonces no se mantienen presionadas las teclas
//
//     rx_msg[1] = Informe HID ID (2)
//     rx_msg[0] = 5BIT de mapa de bits de estado LED
//
/////////////////////////////////////////////////////////////////////////////
int8 char_2_usb_kbd_code(char c){

   int8 ic;
   tx_msg[1] = 0x00;

   if(isAlpha(c)){
      ic=c-'a'+4;
   }
   else{
      if(c=='0'){
        ic=39;
      }
      else{
        ic=c-'1'+30;
      }
   }
   return(ic);
}

/////////////////////////////////////////////////////////////////////////////
//
// usb_rx_task()
//
// Escucha a EP1 para todos los paquetes entrantes. El único informe ID que
// es configurdo que nos envíe los datos es de 2 (teclado LED de estado, véase más arriba)
//
/////////////////////////////////////////////////////////////////////////////

void usb_rx_task(void)
{

   if (usb_kbhit(1))
   {
      usb_get_packet(1, rx_msg, sizeof(rx_msg));
   }
}

///////////////////////////////////////////////////////////////////////////////
//subrutina de corrimiento
///////////////////////////////////////////////////////////////////////////////

Corrimiento()
{

   PUERTOB=LSB;
   rotate_left( &LSB, 1);
   if(LSB==0b11101111)
   LSB=0b11111110;
}

///////////////////////////////////////////////////////////////////////////////
//SUBRUTINA ENTERO, determina que tecla se oprimio
///////////////////////////////////////////////////////////////////////////////

int Entero()
{
   tecla1=PUERTOB;
   
   switch (tecla1)
   {
      case 0xEE : tecla='a';       break;
      case 0xED : tecla='9';           break;
      case 0xEB : tecla='8';           break;
      case 0xE7 : tecla='7';         break;
      case 0xDE : tecla='e';           break;
      case 0xDD : tecla='6';           break;
      case 0xDB : tecla='5';         break;
      case 0xD7 : tecla='4';          break;
      case 0xBE : tecla='d';         break;
      case 0xBD : tecla='3';         break;
      case 0xBB : tecla='2';         break;
      case 0xB7 : tecla='1';         break;
      case 0x7E : tecla='c';         break;
      case 0x7D : tecla='b';         break;
      case 0x7B : tecla='a';         break;
      case 0x77 : tecla='0';          break;
      default   : tecla=16;      break;
      }
      return tecla;
}


////////////////////////////////////////////////////////////////////////////////
//PROGRAMA PRINCIPAL
////////////////////////////////////////////////////////////////////////////////

void main()
{

   hay_dato=0;

   delay_ms(500);

   LED_OFF(LED1);
   LED_OFF(LED2);
   LED_OFF(LED3);

   usb_init_cs();
   set_tris_b(0b11110000);              // Inicializacion del Teclado
   port_b_pullups(TRUE);
   LSB=0b11111110;
   PUERTOB=LSB;
   tecla=16;
 

   while (TRUE)
   {

      usb_task();
      usb_debug_task();

      if (usb_enumerated())//Devuelve 1 si el dispositivo fue enumerado correctamente
      {
       
         Corrimiento();
         Entero();
         
         if(tecla!=16)
         {
            tx_msg[3]=char_2_usb_kbd_code(tecla);
            usb_put_packet(1,tx_msg,sizeof(tx_msg),USB_DTS_TOGGLE);
            LED_ON(LED2);
            delay_ms(300);
            LED_OFF(LED2);
            tecla=16;           

         }
          else
         {
                     
            tx_msg[3]=0;
            usb_put_packet(1,tx_msg,sizeof(tx_msg),USB_DTS_TOGGLE);
            delay_ms(5);
           
         }
         
         usb_rx_task();
         delay_ms(5);
      }
   }
}




Hasta aqui todo funciona bien pero el problema es que quiero enviar otros simbolos (/, *, -, +) enves de las letras a,b,c,d he intentado varias cosas pero nada funciona, segun yo ago los cambios a la programacion y no logro que se mande los simbolos: /,*,-,+ si  no que aparece cualquier otra cosa que nada tiene que ver. Se que tiene que ver con los datos mandados en tx_msg pero no logro decifrar que es. Si alguien me pudiera echar la mano es esto se los agradeceria ampliamente.

Gracias

Desconectado gio013

  • PIC10
  • *
  • Mensajes: 27
Re: COMO HACER UN TECLADO
« Respuesta #13 en: 18 de Abril de 2012, 22:57:09 »
hola...

si alguna buena persona me pudiera ayudar, todavía no entiendo como hago pa enviar las teclas... en el codigo original de red pic esta el push-button. pero no se como hacerle pa: si oprimo el botón 1 me envié la letra E y si oprimo los botones 1 y 2 me los envié E y R simultáneamente.

modificación 1 -2h despues- :
ya entendí como es la mecánica del envió, pero el push-button esta por #int_ext , si necesito 6 botones, no los puedo hacer todos por int_ext (?), como los podría hacer ? y que los tome en el orden que los oprimí. estoy usando el 18f2550 "the warrior".


gracias por leer.  
pd: quiero mi guitarra!!!!
Pd2:el teclado es para una guitarra!!
Pd3: guitar hero !!! pa pc.
« Última modificación: 19 de Abril de 2012, 00:35:26 por gio013 »

Desconectado darck_khronos

  • PIC18
  • ****
  • Mensajes: 493
Re: COMO HACER UN TECLADO
« Respuesta #14 en: 18 de Abril de 2012, 23:44:45 »
hola...

si alguna buena persona me pudiera ayudar, todavía no entiendo como hago pa enviar las teclas... en el codigo original de red pic esta el push-buton. pero no se como hacerle pa: si oprimo el botón 1 me envié la letra E y si oprimo los botones 1 y 2 me los envié E y R simultáneamente.

gracias por leer. 
pd: quiero mi guitarra!!!!
Pd2:el teclado es para una guitarra!!
Pd3: guitar hero !!! pa pc.

pense que solo era el unico que queria algo asi xD