Projeto 24: Mouse e Teclado USB
Este projeto mostra a possibilidade da biblioteca USB HID do MikroC PRO PIC para simular mais de um dispositivo ( Teclado e mouse ), utilizando apenas o PIC18F2550.
Quando você se conecta à porta USB, o computador vai reconhecer um mouse e um teclado. Eles podem trabalhar juntos. Nenhum driver adicional necessário.
Simula todos os botões de um mouse(esquerdo, direito e meio), além do movimento do mouse( Left, Right, Up, Down ).
Também pode simular todas as teclas de um teclado, no projeto coloquei algumas.
Os capacitores C2 e C3, são de 22pF.
Os capacitores C2 e C3, são de 22pF.
EXPLICAÇÃO DO CÓDIGO:
Para simular um mouse é necessário enviar 9 bytes.
Byte 1: envia o ID( para o mouse o valor é 0x02);
Byte 2:
Y overflow | X overflow | Y sign bit | X sign bit | 1 | Botão Meio | Botão Direito | Botão Esquerdo |
---|
Byte 3: Eixo x
Byte 4: Eixo y
Byte 5-9: valor 0
Para simular um teclado também é necessário enviar 9 bytes:
Byte 1: envia o ID(para o teclado o valor é 0x01);
Byte 2:
0x00 | Nada |
0x01 | LCtrl |
0x02 | LShift |
0x04 | LAlt |
0x08 | LWin |
0x10 | RCtrl |
0x20 | RShift |
0x40 | RAlt (LAlt + LCtrl) |
0x80 | RWin |
Byte 3: valor 0x00;
Byte 4: teclas:
Byte 5-9: valor 0x00;
Também é necessário que possua o arquivo descriptor configurado para ser usado como interface para mouse e teclado. Esse arquivo descriptor deve ser adicionado ao projeto.
obs.: Nesse projeto, retirei a função da rodinha do mouse, pois causava erro.
O clock utilizado é de 4MHz. Para outros valores, edite o projeto: clique em Project >> Edit Project e escolha o clock no campo PLL Prescaler Selection.
Lembre-se de que a frequência do clock no projeto é de 48MHz.
DOWNLOAD:
Projeto: USBKeyboardMouse (atualizado 05/08/2013)
CÓDIGO-FONTE:
//Memoria destinada para a USB unsigned char readbuff[64] absolute 0x500; unsigned char writebuff[64] absolute 0x540; char especial = 0; char keycode = 0; short ud = 0; short lr = 0; char buttons = 0x80; void interrupt() { USB_Interrupt_Proc(); } void readKeyboard() { especial = 0; keycode = 0; if(PORTA.F0) keycode = 0x17; if(PORTA.F1) keycode = 0x0C; if(PORTA.F2) keycode = 0x04; if(PORTA.F3) keycode = 0x0A; if(PORTA.F4) keycode = 0x12; if(PORTC.F0) especial = 0x01; if(PORTC.F1) especial = 0x02; if(PORTC.F2) especial = 0x04; if(PORTC.F6) especial = 0x08; writebuff[0]= 0x01; //ID writebuff[1]= especial; //especial writebuff[2]= 0x00; writebuff[3]= keycode; //key; while(!HID_Write(writebuff, 9)); } void readMouse() { if(PORTB.F7) ud = 1;//pra baixo if(PORTB.F6) ud = -1;//pra cima if(PORTB.F5) lr = 1;//pra direita if(PORTB.F4) lr = -1;//pra esquerda buttons = 0x80; if(PORTB.F1) buttons.F0 = 1; if(PORTB.F2) buttons.F1 = 1; if(PORTB.F3) buttons.F2 = 1; writebuff[0]= 0x02; //ID writebuff[1]= buttons; //Buttons writebuff[2]= lr; //x axis writebuff[3]= ud; //y axis while(!HID_Write(&writebuff, 9)); } void main() { TRISB = 255;//define portb como entrada TRISA = 255;//define porta como entrada TRISC = 255;//define portc como entrada ADCON1 = 0b00001111;//altera as entradas analogicas para digitais PORTA = 0; PORTB = 0; PORTC = 0; HID_Enable(readbuff,writebuff); while(1) { readMouse(); Delay_ms(100); readKeyboard(); Delay_ms(100); } }
boa tarde, como eu faço a união do decriptor com o arquivo hex?
ResponderExcluirou o descriptor é um bootloard?
Boa tarde!
ExcluirVocê tem que adicionar o descriptor ao seu projeto e compilar!!
Estava a pensar fazer algo parecido. mas seria o contrario, ou seja, controlar o micro com um teclado de pc. Há alguma ideia pra isso?
ResponderExcluirOlá, vc só pode utilizar um teclado USB se for conectar no PIC que possui USB HOST.
ExcluirSe for usar o teclado USB em algum PIC sem USB HOST, teria q conectar o teclado e o PIC ao computador, e através de algum software fazer a comunicação entre eles.
Pode também utilizar um teclado PS/2, aí nem vai precisar de USB.
ola boa tarde adimiro muito e aprendi muito com o site, mas teria ele pronto para abrir no mikroc para aprimirar o conhecimento, muito bom o blog de vcs parabens
ResponderExcluirObrigado!
Excluircoloquei o link!!
Muito legal, vc tambem trabalha como freelance ?
ExcluirEsse projeto seria possivel com pic18f4550 ? pois comprei um kit de desenvolvimento, ai da para testar!
ResponderExcluirÉ possível sim!!
ExcluirBoa Noite, estava procurando esse código igual a um louco, só tenho uma duvida ,qual é o compilador utilizado para esse código, esse código está completo, é só eu copiar e colar no compilador que funciona. Eu uso o PIC C . Desde já muito obrigado, se possível responda para o email collidobrasil@gmail.com
ResponderExcluirgostaria de saber se vc tem algum projeto de controle arcade via usb usando o pic 18f4550 ,queria montar meu próprio controle se puder me ajudar.
ResponderExcluirAtenciosamente
linderson
meu email para contato é lin_games@hotmail.com
ExcluirMontei o mouse teclado usb mas a minha cpu nao reconheceu.
ResponderExcluirO meu sistema e o XP
teria uma ideia do que acontece?
Seria fácil Fazer um circuito parecido, pra utilizar apenas a função e acionar teclas durante um tempo automaticamente?
ResponderExcluirOlá amigo! Não estou conseguindo compilar. Como faço a configuração do decriptor e edição do projeto para 20Mhz ? Um grande abraço e obrigado.
ResponderExcluirOlá! Que tipo de erro está aparecendo?
ExcluirPara utilizar um outro valor de cristal lembre-se:
1 - Menu Project >> Edit Project >> PLL Prescaler - selecionar 20MHz
Olá! Tiago Henrique estou precisando usar do tipo de seu projeto com esse pic, com 15 teclas da função do teclado. Meu email é maximino2006@gmail.com , vç poderia me passar telefone de contato para eu poder te ligar. Desde já agradeço atenção !
ResponderExcluirOlá Tiago! Montei um projeto de teclado HID com pic18f2550 que encontrei a algum tempo na net, mas só funciona perfeitamente no PC da minha sobrinha ( Win7 SP1 32Bits ). Eu instalei o mesmo sistema operacional usado por ela em outra máquina, mas os botões do teclado HID não funcionam. O sistema até reconhece e instala o dispositivo com êxito, mas as teclas não funcionam. Tentei também com Win7 64Bits e XP 32Bits sem sucesso.
ResponderExcluirVocê pode me dar alguma dica sobre esse mistério ? Por que só funciona no PC da minha sobrinha? Grande abraço e muito obrigado.
Olá, vc só pode utilizar um teclado USB se for conectar no PIC que possui USB HOST.
ResponderExcluirSe for usar o teclado USB em algum PIC sem USB HOST, teria q conectar o teclado e o PIC ao computador, e através de algum software fazer a comunicação entre eles.
Pode também utilizar um teclado PS/2, aí nem vai precisar de USB.
Tiago Henrique então pode conectar direto por PS2?? é isso!!!
Olá, pode sim. O MikroC até tem uma biblioteca para isso.
ExcluirTiago henrique onde eu baixo esse arquivo decriptor?
ResponderExcluirEsse arquivo é gerado pela Ferramenta "HID Terminal" do MikroC.
ExcluirTiago tem como vc me ajudar nesse projeto!! eu to querendo retirar esse LCD e colocar para PS2 ou rs232 mas não to conseguindo!!
ResponderExcluir#include <16F877a.h>
#fuses XT
#use delay(clock=1M)
#define LCD_DB4 PIN_D4
#define LCD_DB5 PIN_D5
#define LCD_DB6 PIN_D6
#define LCD_DB7 PIN_D7
#define LCD_RS PIN_D2
#define LCD_E PIN_D3
#define use_portd_lcd TRUE
#include
#include //
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
void main(){
char k;
lcd_init();
kbd_init();
port_b_pullups(TRUE);
for(;;){
k=kbd_getc();
if(k!=0)
lcd_putc(k);
}
}
foi feito no CCS e eu passei pro proteus e funciona no lcd mas eu quero retirar esse lcd e colocar para PS2 ou rs232!! pra mim visualizar as letras quando eu teclo e ver sair no bloco de notas do windows!! se vc puder me ajudar eu agradeço pq sei que vc é fera em microcontroladores.vlw
ResponderExcluirComo eu testo esse projeto Tiago Henrique?? tem como fazer uma video aula?
ResponderExcluirBoa noite, qual byte seria o responsavel pela scroll(rodinha do mouse)?teria como postar essa parte do codigo?
ResponderExcluirTiago henrique eu fiz esse teclado no proteus e usei com osciloscopio do proteus e não funciona sabe me dizer porque??? conectei o osciloscopio do proteus nas saidas usb e não da sinal!!!
ResponderExcluirPara a comunicacao USB do Proteus funcionar é necessario instalar um driver. Nas pastas do Proteus deve ter alguma pasta com este driver.
ExcluirO sinal nas saídas do USB provavelmente não funciona porque a comunicação USB entre o Proteus e o S.O. é feita internamente.
Olá. seu projeto muito bom . minha pergunta é : como enviar mais de 6 teclaas ??
ResponderExcluirwritebuff [ 8 ] = keycode ; // Key ;
o limite é de 9 bytes ??
Eu preciso de três usb teclados com pic 18F4550
desculpe pela linguagem . apenas falo espanhol .
Eu não posso cambair o descrptor . Você poderia me ajudar com o descritor do 3 teclados ??
Para enviar uma tecla e necessario enviar os 9 bytes.
ExcluirSe voce quiser enviar mais de 1 tecla, e necessario repetir o envio dos bytes...
Isso não funciona! eu copilei este codigo, fiz tudo certinho como se pediu ai e NÃO FUNCIONOU!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
ResponderExcluirIsso não funciona! eu copilei este codigo, fiz tudo certinho como se pediu ai e NÃO FUNCIONOU!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
ResponderExcluirComo faço pra utilizar esse programa com o MPLABx? Testei de vários jeitos, preciso fazer um teclado um pouco diferente, com sensores de impacto, daí editei um pedaço do programa mas várias partes ficam em falta, tais como as bibliotecas necessárias para rodar o programa. Preciso fazer pelo MPLABx pois o meu bootloader interpreta apenas através desse tipo de compilação.
ResponderExcluirAmigo tenho um teclado ps2 e gostaria de fazer uma interface com pic para liga-lo em usb, e um teclado diferente as teclas f1 a f12 não tem existe. quero retirar o cabo e conectar os fios de clock e dados no pica para a conversão para usb com 16f84 e possível ? pode dar uma dica ?
ResponderExcluirOlá, Como você fez para o computador reconhecer o pic? Qual drive você usou para que funcionasse.
ResponderExcluirComo posso fazer para apertar duas teclas cursoras e enviar uma diagonal como no teclado convencional ?
ResponderExcluirComo saber que o valor dos buttons é 0x80 e se fosse para botoes de joystick?
ResponderExcluirBoa NOite THiago sou leigo no assunto .. queria usar esse projeto seu pra utilizacao em junkbox....( maquinas de musica ) vc teria um email para entrar em contato com vc para tirar duvidas .. quero testar seu projeto para ver seu uso .. se tiver como me envie obg
ResponderExcluirtdbfabio@hotmail.com
obg
é possível criar, baseado no seu projeto, um teclado customizado?
ResponderExcluirex: um teclado que tivesse apenas as teclas: A B C D E...
e fazer isso funcionar num computador?
precisa implementar algum driver para reconhecer o teclado?
Tiago henrique tem como vc agregar nesse projeto o descriptor e upar ele denovo e colocar pra download?
ResponderExcluirExcelente projeto, o melhor que encontrei na internet. Devo acrescentar que o arquivo descriptor que criei no mikroc não funcionou, muitos valores diferentes, tive que copiar quase todo o código do descriptor desse projeto para funcionar, deixei apenas as partes de "Manufacturer string descriptor" e "Product string descriptor" do arquivo criado por mim no mikroc. É óbvio que não dá pra você pensar em tudo, e perdi muito tempo tentando enviar apenas uma tecla com este código, depois percebi que nesse caso aí quando não é pressionada tecla nenhuma o pic fica constantemente enviando os valores 0x00 para tecla e 0x00 para especial, no meu código não estava sendo tratado esse detalhe, eu enviava uma tecla e o computador ficava repetindo ela indefinidamente. Demorei muito pra perceber essa diferença relevante. Que sirva para outros, sempre que for enviada uma tecla deve ser enviado o valor zero para tecla e e zero para especial em seguida. Em casos em que há varredura isso acontece automaticamente, caso não haja varredura e atualização de valores o computador interpreta errado.
ResponderExcluir