O objetivo desta postagem é indicar um passo-a-passo para criar um mouse Bluetooth de uma maneira direta, sem a pretensão de especificar todas as teorias envolvidas, pelo contrário a ideia é mostrar apenas uma das maneiras que funciona.
Este exemplo demonstra o uso do Mouse Bluetooth com um recurso importante que é o Mouse Wheel (a rodinha do mouse) implementada, além é claro da funções básicas Up, Down, Left, Right, Button 1 e Button2.
Equipamentos Básicos
Arduino UNO
http://arduino.cc/en/Main/ArduinoBoardUno
FTDI Cable 5V VCC-3.3V I/O
https://www.sparkfun.com/products/9717
Roving Networks Bluetooth SMD Module - RN-42-HID
https://www.sparkfun.com/products/10823
8 Micro switches
9 Resistores de 10KΩ 5%
1 Resistor de 20KΩ 5%
1 Regulador 78L33
Configuração do Módulo Bluetooth
Módulo com a identificação do pinos, importante ligue o CTS com RTS. Mais detalhes em:
http://www.sparkfun.com/datasheets/Wireless/Bluetooth/rn-42-ds.pdf
Outro lado do módulo já com a proteção (utilizado Tubo Termo Retrátil transparente)
Conexão do Cabo FTDI com o módulo, lembre-se que o cabo FTDI fornece sinal TX em 3,3v, mas a saída que ele fornece é de 5v, logo é necessário ligar o regulador 78L33 para alimentar o módulo
Conecte o cabo FTDI no computador e utilize seu aplicativo de terminal serial de preferência. O Windows 7 em algumas versões não vem com o HyperTerminal, mas existem algumas dicas de como instalar no link.
No Windows verifique em que porta COM foi instalado, você pode usar o Device Manager para isto. No meu caso foi a COM5.
Abra o HyperTerminal:
Escolha a porta COM correspondente:
Configure da seguinte forma (default do módulo):
Importante: Flow Control é None devido ao pinos CTS(16) e RTS(15) do módulo estarem ligados
Após configurar as propriedades da COM, configure o terminal:
1 - Disconnect
2 - Properties
3 - Settings
4 - ASCII Setup...
5 - Selecione as duas opções indicadas:
- Send line ends with line feeds
- Echo typed characters locally
Para conseguir a conexão, (pelo menos comigo) foi necessário um "ritual" que não consigo encontrar uma explicação, mas funciona. Se souber alguma outra forma melhor deixe nos comentários, agradeço muito.
Tentei diversas maneiras para estabelecer a comunicação, mas vou apresentar uma que consigo repetir sempre. Outros módulos Bluetooth como o WT12 não precisam deste "ritual", veja este post.
O "ritual" envolve mudar alguma característica da configuração da porta (no caso eu mudei o flow control, mas poderia ser outra característica) clicar em Apply, voltar a característica clicar em OK.
No passo 7 a Status Bar muda de "Auto detect" para "115200 8-N-1" , neste ponto o terminal está liberado para receber comandos.
Digitando
$$$ terá a resposta CMD, entra no modo de comandos
ST,255 terá a resposa AOK, desativa timer para poder enviar comandos por mais de 60s
D apresenta as informações básicas do módulo
E apresenta as informações adicionais do módulo
SF,1
R,1 reboot
$$$ modo de comandos
ST,255 desativa timer
$$$ modo de comandos
ST,255 desativa timer
S-,RN42HID-Mouse muda o nome para RN42HID-MOUSE-xxxx onde os 4 últimos dígitos do MAC address do módulo são adicionados automaticamente
SH,0220 configura como mouse
S~,6 ativa profile HID
SM,4 Auto-Connect DTR Mode, permite reconectar por comando $$$ C
SM,4 Auto-Connect DTR Mode, permite reconectar por comando $$$ C
R,1 reboot
Comandos seriais detalhados para este módulo:
***Settings***
BTA=000666450B29
BTName=RN42HID-Mouse-0B29
Baudrt(SW4)=115K
Parity=None
Mode =DTR
Authen=0
Encryp=0
PinCod=1234
Bonded=0
Rem=NONE SET
Veja acima que PIN será 1234 para a conexão via Bluetooth
E
***ADVANCED Settings***
SrvName= SPP
SrvClass=0000
DevClass=1F00
InqWindw=0060
PagWindw=0060
CfgTimer=255
StatuStr=NULL
HidFlags=220
DTRtimer=8
KeySwapr=0
Circuito na Proto-boad
Neste ponto o módulo está devidamente configurado, para construir o mouse, monte uma proto-board como esta abaixo:A Arduino trabalha o TX/RX com 5v e o módulo Bluetooth com 3,3v, sendo assim o TX da Arduino precisa ter sua tensão reduzida, para isso usei um divisor de tensão (figura abaixo). O RX da Arduino não precisa, pois quem gera o sinal é o TX do módulo Bluetooth com 3,3v e o RX consegue ler este sinal.
Detalhe na Arduino:
Codificação
Instale a IDE da Arduino, (quando eu fiz este post usei a versão 1.0.1):
http://arduino.cc/en/Main/Software
Utilize o código abaixo:
https://github.com/Marchanjo/SimpleMouseBT_RN42/tree/master/SimpleMouseBT_RN42
Obs.: Se você não tem experiência com a Arduino recomendo que brinque um pouco com os exemplos, uma fonte muito boa de tutoriais é encontrada em:
http://www.ladyada.net/learn/arduino/
IMPORTANTE: Antes de transferir (Upload) o código para a Arduino desconecte o Cabo TX/RX (nas figuras acima, fios verde e amarelo), pois a transferência do código irá utilizar o TX/RX da Arduino. Caso você não desconecte a IDE irá apresentar erros.
Faça o Upload do código para a Arduino, assim que estiver transferido, retire alimentação da Arduino (retire o cabo USB), conecte os fios do TX/RX, e alimente novamente a Arduino.
Conexão com o Bluetooth
Vou mostra com exemplo a conexão com Windows 7, mas o principio é similar em outros sistemas operacionais.
Selecione Add a Device no ícone do Bluetooth:
Note que o nome que definimos na configuração do módulo irá aparecer aqui, Selecione ele e clique em Next.
Selecione a opção que utiliza Pairing Code:
Digite 1234 (lembre-se que o PIN era 1234, na configuração padrão do módulo Bluetooth) e clique em Next.
Pronto o Windows irá instalar os drivers necessários e o logo em seguida o Mouse Bluetooth já está funcionando.
Teste
Dica1: Toda vez que você alimenta ou faz o reset a Arduino o Led da Arduino (pino 13, o mesmo do exemplo Blink) fica acesso e depois que conecta o Bluetooth ele apaga, caso não apague retire e retorne a alimentação.
Dica2: Para saber se os botões na proto-board estão funcionando adequadamente, fiz com que os botões nas entrada pares (D4,D6,D8 e D10) acendam o led e os botões nas entrada impares (D5,D7,D9 e D11) apaguem o led.
Clique nos botões e veja o comportamento do mouse
Um pequeno vídeo para mostrar o funcionamento, já pareado: