Fork me on GitHub

Microcontrolandos

O Blog está passando por uma fase de mudanças. Todos os posts estão sendo atualizados, códigos, links e imagens estão sendo arrumados. Conteúdos novos ainda estão por vir.

PIC: Mouse e Teclado USB

Share:

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.

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:
0x00Nada
0x01LCtrl
0x02LShift
0x04LAlt
0x08LWin
0x10RCtrl
0x20RShift
0x40RAlt (LAlt + LCtrl)
0x80RWin

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);
        }
}

41 comentários:

  1. boa tarde, como eu faço a união do decriptor com o arquivo hex?
    ou o descriptor é um bootloard?

    ResponderExcluir
    Respostas
    1. Boa tarde!
      Você tem que adicionar o descriptor ao seu projeto e compilar!!

      Excluir
  2. 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?

    ResponderExcluir
    Respostas
    1. Olá, vc só pode utilizar um teclado USB se for conectar no PIC que possui USB HOST.
      Se 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.

      Excluir
  3. 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

    ResponderExcluir
  4. Esse projeto seria possivel com pic18f4550 ? pois comprei um kit de desenvolvimento, ai da para testar!

    ResponderExcluir
  5. Boa 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

    ResponderExcluir
  6. gostaria 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.

    Atenciosamente

    linderson

    ResponderExcluir
  7. Montei o mouse teclado usb mas a minha cpu nao reconheceu.
    O meu sistema e o XP
    teria uma ideia do que acontece?

    ResponderExcluir
  8. Seria fácil Fazer um circuito parecido, pra utilizar apenas a função e acionar teclas durante um tempo automaticamente?

    ResponderExcluir
  9. Olá 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.

    ResponderExcluir
    Respostas
    1. Olá! Que tipo de erro está aparecendo?
      Para utilizar um outro valor de cristal lembre-se:
      1 - Menu Project >> Edit Project >> PLL Prescaler - selecionar 20MHz

      Excluir
  10. 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 !

    ResponderExcluir
  11. Olá 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.
    Você pode me dar alguma dica sobre esse mistério ? Por que só funciona no PC da minha sobrinha? Grande abraço e muito obrigado.

    ResponderExcluir
  12. Olá, vc só pode utilizar um teclado USB se for conectar no PIC que possui USB HOST.
    Se 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!!!

    ResponderExcluir
  13. Tiago henrique onde eu baixo esse arquivo decriptor?

    ResponderExcluir
  14. Tiago tem como vc me ajudar nesse projeto!! eu to querendo retirar esse LCD e colocar para PS2 ou rs232 mas não to conseguindo!!
    #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);


    }

    }

    ResponderExcluir
  15. 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

    ResponderExcluir
  16. Como eu testo esse projeto Tiago Henrique?? tem como fazer uma video aula?

    ResponderExcluir
  17. Boa noite, qual byte seria o responsavel pela scroll(rodinha do mouse)?teria como postar essa parte do codigo?

    ResponderExcluir
  18. Tiago 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!!!

    ResponderExcluir
    Respostas
    1. Para a comunicacao USB do Proteus funcionar é necessario instalar um driver. Nas pastas do Proteus deve ter alguma pasta com este driver.
      O sinal nas saídas do USB provavelmente não funciona porque a comunicação USB entre o Proteus e o S.O. é feita internamente.

      Excluir
  19. Olá. seu projeto muito bom . minha pergunta é : como enviar mais de 6 teclaas ??

    writebuff [ 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 ??

    ResponderExcluir
    Respostas
    1. Para enviar uma tecla e necessario enviar os 9 bytes.
      Se voce quiser enviar mais de 1 tecla, e necessario repetir o envio dos bytes...

      Excluir
  20. Isso não funciona! eu copilei este codigo, fiz tudo certinho como se pediu ai e NÃO FUNCIONOU!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    ResponderExcluir
  21. Isso não funciona! eu copilei este codigo, fiz tudo certinho como se pediu ai e NÃO FUNCIONOU!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    ResponderExcluir
  22. Como 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.

    ResponderExcluir
  23. Amigo 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 ?

    ResponderExcluir
  24. Olá, Como você fez para o computador reconhecer o pic? Qual drive você usou para que funcionasse.

    ResponderExcluir
  25. Como posso fazer para apertar duas teclas cursoras e enviar uma diagonal como no teclado convencional ?

    ResponderExcluir
  26. Como saber que o valor dos buttons é 0x80 e se fosse para botoes de joystick?

    ResponderExcluir
  27. Boa 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

    tdbfabio@hotmail.com

    obg

    ResponderExcluir
  28. é possível criar, baseado no seu projeto, um teclado customizado?
    ex: 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?

    ResponderExcluir
  29. Tiago henrique tem como vc agregar nesse projeto o descriptor e upar ele denovo e colocar pra download?

    ResponderExcluir
  30. Excelente 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