segunda-feira, 26 de novembro de 2012

Mouse Bluetooth usando Arduino UNO e módulo Roving RN-42 HID

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
                apresenta as informações básicas do módulo
E                 apresenta as informações adicionais do módulo
SF,1              restaura configurações de fábrica
R,1               reboot
$$$               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
R,1               reboot



Comandos seriais detalhados para este módulo:



Somente para verificar, depois de configurado, ficou assim:


D
***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:




























Mostrando em detalhe as ligações na proto-board:



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:



quinta-feira, 29 de dezembro de 2011

Integrando Android com Hardware externo


O Android 3.1 possui o Android Open Accessory que permite a conexão de um hardware via cabo USB ao aparelho com Android. A Google também portou esta funcionalidade para o Android 2.3.4, mas não há garantias que um aparelho com Android 2.3.x tenha esta funcionalidade ativa (isto é uma opção do fabricante), sendo assim considere que a versões 3.1 em diante que possuem o Android Open Accessory.

O objetivo deste post é apresentar um passo-a-passo sem explicações teóricas, de maneira que o interessado no assunto possa utilizar o ADK (Accessory Development Kit) sem necessariamente entender os conceitos. Para informações profundas consulte: Android Open Accessory Development Kit.

Equipamentos necessários


Tablet com Android 3.1 (ou superior), nós usamos o Motorola XOOM e o Toshiba Thrive:




Preparação do Ambiente de desenvolvimento


Efetue login com usuário que possua direitos de Administrador no Windows

Instalação do Eclipse

Faça o download do Eclipse Classic:






Descompacte o Eclipse que você fez o download, e copie a pasta para o C:\Android, ficando assim:



Obs: O importante neste passo é que o Eclipse seja copiado para uma pasta que outros usuários do Windows tenham direitos de gravação.


Faça o download e instale o JDK - Java DevelopmentKit  









Faça o download e instale o Android SDK:















Instalação do ADT PlugIn, execute o Eclipse.exe:







https://dl-ssl.google.com/android/eclipse/









Depois do Eclipse reiniciar, irá surgir a seguinte tela, configure o Existing Location com caminho onde você instalou o Android SDK:



Validando a instalação:






Importante: Use Google APIs (Google Inc.) - API Level 10





Espere...











Vai aparecer o Hello World:



Instalação OK!


ADK – DemoKit

Faça o download do ADK package.

Descompacte o arquivo adk_release_0512.zip que você fez o download, e copie a pasta app para o C:\Android, ficando assim:









Considerando que o emulador estava fechado irá surgir a seguinte tela:





O DemoKit original apresenta 8 warnings, que não afetam o funcionamento.





Pronto, a parte Java no Eclipse está OK.

Exportando o .apk

Vamos exportar o instalador .apk





Usei a senha teste123






Pronto, agora copie e instale o DemoKitLaunch.apk no seu dispositivo (eu usei o tablet Motorola XOOM) é importante que tenha o Android 3.0 ou superior. No caso do Android 2.3.4, normalmente somente os smartphones Nexus que suportam o Open Accessory.

Vamos configurar a Arduino Mega ADK e depois executar a aplicação.

Preparação do Ambiente de Desenvolvimento Arduino


Faça download da IDE do Arduino.



Descompacte o arquivo arduino-1.0-windows.zip e copie a pasta arduino-1.0 para C:\Android, ficando assim:






Conecte a Arduino ADK ao seu computador usando um cabo USB A/B, cuidado a placa Arduino ADK possui dois conectores USB a conexão deve ser feita usando a ponta B (quadrada) , a ponta A (retangular) deve ser conectada no PC.



Quando conectar no computador pela primeira vez, será solicitado o driver, na minha configuração com o Windows 7 não reconheceu, segue o passo-a-passo:


Obs: Se você já está acostumado a instalar drivers, basta saber que o diretório C:\Android\arduino-1.0\drivers contém os drivers necessários para instalar a Arduino Mega ADK.

Abra o Device Manager (Gerenciador de Dispositivos):





Em Other Devices, clique com o botão direito sobre o dispositivo Arduino Mega ADK e clique em seguida em Update Driver Software...






Veja em que porta COM a Arduino ADK ficou configurada (no meu caso foi a COM21), se você fechou a janela acima e não viu a COM, não tem problemas. Volte ao Device Manager e pocure a seção Ports (COM & LPT). IMPORTANTE: Lembre-se que COM21 foi no meu computador, você precisa verificar em que porta COM a sua Arduino ADK ficou configurada.


Execute C:\Android\arduino-1.0\Arduino.exe

Configure a porta correspondente (no meu caso COM21):



Configure a placa correspondente (no nosso caso Mega ADK):



Teste se está tudo ok, chamando um Sketch exemplo (Blink):
(Sketch = Programa para Arduino)






A placa Arduino irá piscar os leds RX / TX  durante o upload. Se tudo deu certo, em seguida um led próximo irá piscar (um segundo aceso e um segundo apagado).





Pronto, a configuração da IDE da Arduino e sua conexão está ok.






Integrando Arduino com Android



Faça o download das bibliotecas do ADK.



Abra os seguintes arquivos e substitua void por size_t nas funções write:

arduino_bundle_ADK\libraries\AndroidAccessory\AndroidAccessory.cpp
A linha 280 fica assim:
size_t AndroidAccessory::write(uint8_t b)

arduino_bundle_ADK\libraries\AndroidAccessory\AndroidAccessory.h
A linha 71 fica assim:
size_t write(uint8_t b);

arduino_bundle_ADK\libraries\USB_Host_Shield\Max_LCD.cpp
A linha 257 fica assim:
inline size_t Max_LCD::write(uint8_t value)

arduino_bundle_ADK\libraries\USB_Host_Shield\Max_LCD.h
A linha 101 fica assim:
virtual size_t write(uint8_t);

Porque isso? Com a IDE Arduino 1.0 todas as funções write retornam variáveis do tipo size_t e não void, como estas bibliotecas não foram feitas para esta IDE precisamos fazer esta pequena correção.

Uma vez que você já corrigiu as bibliotecas e copie as pastas AndroidAccessory e USB_Host_Shield 




Para o C:\Android\arduino-1.0\libraries

Faça download da biblioteca Cap Sense 04

Descompacte o arquivo CapSense04.zip e copie a pasta  CapSense, para o C:\Android\arduino-1.0\libraries
A pasta libraries fica assim:






Agora vamos abrir o Sketch do demokit. Do arquivo adk_release_0512.zip que você já fez o download e descompactou, procure o arquivo demokit.pde 









No código, procure a função setup() e comente com // a chamada da função init_joystick( 5 );
A linha 117 fica assim:
//init_joystick( 5 );

Obs.: Isto é necessário, pois a inicialização do joystick suspende o programa quando não se tem o joystick conectado, que é o nosso caso, pois estamos somente com a placa Arduino ADK.
Agora substitua send por write nas seguintes linhas:

A linha 377 fica assim:
Wire.write(reg_addr);

A linha 391 fica assim:
Wire.write(reg_addr);

A linha 392 fica assim:
Wire.write(val);

Agora substitua receive por read nas seguintes linhas:
A linha 383 fica assim:
c = Wire.read();

Agora salve como demokit.ino (.ino é a nova extensão para os Sketchs no Arduino 1.0)

Clique em Verify, você deve receber uma mensagem “Done Compiling.”




Com a placa Arduino Mega ADK conectada no micro clique em upload, você deve receber uma mensagem “Done Uploading.”



Pronto a sua placa Arduino Mega ADK está pronta.

Teste


Neste ponto já é possível executar a aplicação no Tablet  e conectar a Arduino Mega ADK, porém não seria visível o funcionamento. Para solucionar isto vamos ligar um led e um resistor de 470Ω.





Agora vamos conectar o lado positivo (Led) no A0 da Arduino Mega ADK e o lado do resistor no GND.  O pino A0 é ativado quando na aplicação Android for acionado o Relé 01




Considerando que você já instalou o DemoKit no Tablet, execute ele agora.  Irá aparecer uma tela como esta abaixo, aguardando a conexão da Arduino Mega ADK:



Conecte a Ardunio Mega ADK no PC através do Cabo USB A/B (somente para alimentar a Arduino), e com o cabo USB Micro conecte a Arduino Mega ADK com o Tablet, aparecerá uma janela perguntando se o Demokit deve ser aberto quando o acessório USB for conectado, clique em OK.


Em seguida, clique no botão ON/OFF do Relay1  e note que o led na Arduino Mega ADK acende e quando clica novamente ele apaga.




Finalizado, você conseguiu controlar um hardware externo a partir de um Tablet Android. Você pode brincar de colocar o led em outras posições de acordo com as porta usadas.



Por exemplo o Relé 01 estava na porta A0

#define  RELAY1         A0



O Relé 02 esta na A1

#define  RELAY2         A1



Todas as definições estão no arquivo demokit.pde ou demokit.ino(que você usou).


Veja o vídeo que demonstra o controle do led: