TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: pipipi 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.
:-/
-
Creo que se puede hacer! El teclado es usb o PS/2?
Saludos!
-
El amigo Mario hizo algo como lo descripto
-
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
-
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
-
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!
-
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
-
Sino lo mejor es utilizar un 18F2550 y usar USB con la clase HID Keyboard (http://picmania.garcia-cuervo.net/usb_2_hidtransfers.php).
Saludos!
-
Totalmente de acuerdo Suky. La clase Joystick seria recomendable tambien.
-
Hola:
Muchisimas gracias lo voy a checar y les cuento como me fue. :-/
-
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);
}
}
}
-
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
-
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
-
hola...
si alguna buena persona me pudiera ayudar, todavía no entiendo como hago pa enviar las teclas... en el codigo original (http://picmania.garcia-cuervo.net/usb_2_hidtransfers.php)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.
-
hola...
si alguna buena persona me pudiera ayudar, todavía no entiendo como hago pa enviar las teclas... en el codigo original (http://picmania.garcia-cuervo.net/usb_2_hidtransfers.php)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
-
hola...
si alguna buena persona me pudiera ayudar, todavía no entiendo como hago pa enviar las teclas... en el codigo original (http://picmania.garcia-cuervo.net/usb_2_hidtransfers.php)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".
ya solucioné el problema enviar todos los botones, pero ahora surgió otro, en el ejemplo de redpic solo se pueden enviar 5 botones a las vez, necesito por lo menos 2 mas sabe alguien si existe alguna forma de hacerlo?? por lo menos el teclado de mi laptop alcanza a escribir 6 teclas al tiempo...
y alguien me puede explicar la función de los tres primeros puestos de la cadena de envío?
/////////////////////////////////////////////////////////////////////////////
//
// 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
//
/////////////////////////////////////////////////////////////////////////////
el hecho es por que el [2]= const 0 por que no lo puedo usar?
y el "[1]= modificador (un mapa de 8 bits de cambio, Tecla, se oprime una tecla ALT) " se supone que este sirve para enviar teclas modificadoras?? como se debería usar??
* como funciona el usb implementado como joystick?? este recibe mas botones a la vez? si alguien a trabajado con esto por favor comparta su experiencia.
gracias por leer.
pd: quiero mi guitarra!!!!
Pd2:el teclado es para una guitarra!!
Pd3: guitar hero !!! pa pc.
-
En el teclado puede decir que tienes presionado hasta 6 teclas a la vez, así se configura en el report (http://www.atmel.com/Images/doc7602.pdf). Ahora un joystick puedes armarlo de la cantidad de botones que quieras y no tiene problema de indicar todos pulsados a la vez.
Saludos!
-
En el teclado puede decir que tienes presionado hasta 6 teclas a la vez, así se configura en el report (http://www.atmel.com/Images/doc7602.pdf). Ahora un joystick puedes armarlo de la cantidad de botones que quieras y no tiene problema de indicar todos pulsados a la vez.
Saludos!
revisaré muchas gracias
-
Hola a Todos:
Alguien me puede ayudar en C18 como hago para saber el estado de los leds (Num Lock, Scroll Lock y Caps Lock). Yo estoy utilizando el ejemplo de Teclado de microchip, ya organice los pines para mi board con el pic 18f2550, ya he enviado las teclas al editor de texto. ahora necsito baber el estado de los leds.
Gracias por su ayuda.