terça-feira, 6 de agosto de 2013

Reprogramando o SensorTag da Texas Instruments

O objetivo desta postagem é relatar o processo para re-programar o SensorTag da Texas Instruments tratasse de um dispositivoBluetooth low energy (BLE também conhecido como Bluetooth 4.0 e Bluetooth smart) que possui vários sensores:


  • Sensor de temperatura por Infravermelho
  • Sensor de humidade
  • Sensor de pressão
  • Acelerometro
  • Giroscópio
  • Magnetometros
  • 2 botões para comandos



Texas CC2541 Sensor Tag

Na prática podem existir várias formas de programar o este e outros dispositivos da família CC2540 e CC2541 (chips BLE), meu objetivo é mostrar uma que funciona, se desejar contribuir fique à vontade para comentar.

Além do próprio SensorTag seguem algumas ferramentas básicas que utilizei:

Visualizando o funcionamento do SensorTag:

Este é um aplicativo muito útil para você ver o SensorTag funcionado e para entender as mudança que você venha a fazer no código.

Programador: 

CC2540 Development Kit
Acredito que também seria possível utilizar o programador CC2540 Mini Development Kit  (inclusive é mais barato), mas novamente meu objetivo e relatar como e eu fiz (e eu não tenho ele) e não a melhor maneira de fazer, portanto o usa-lo ao invés do CC2540 Development Kit é uma opção sua.

CC2540 Mini Development Kit


Código fonte:

Com os stack vem o código fonte que podemos alterar como exemplos, além dos arquivos .Hex mais atualizados para reprogramar o SensorTag ou o Dongle. Meu teste usou o Stack 1.3.2.

Flash Programmer:

Necessário para aplicar o arquivo .Hex no SensorTag. Meu teste usou a versão 1.12.7.

IDE:

Os chips CC2540 ou CC2541 possuem um processador 8051 interno, atualmente (agosto de 2013) é a forma oficial da Texas para programar. Ele é um software pago, para o efeito de aprendizado desta postagem é necessário escolher a licença com período de expiração de 30 dias (existe uma outra opção de licença com limitação do tamanho do código em 4K que não funciona para o SensorTag, pois seu código é maior que isso). Meu teste usou a versão 8.20.1 com 30 days Evaluation edition License.

Você pode pesquisar se outras IDEs já suportam o CC2540 / CC2541, dois candidatos para o futuro são:

SDCC - Small Device C Compiler
http://sdcc.sourceforge.net/

Texas Code Composer Studio (CCStudio)
http://www.ti.com/tool/ccstudio

Passo a passo

Reprograme o Dongle

O dongle que vem no CC2540 Mini Development Kit está com um firmware de sniffer que precisa ser substituído. Instale o Bluetooth low energy software stack and tools e o SmartRF Flash Programmer.

Conecte a Evaluation Board SmartRF05(qualquer uma das duas) do CC2540 Mini Development Kit conforme abaixo:


Não esqueça da chave liga-desliga na evaluation board.

Os dois conectores USB precisam estar conectados, especificamente o que fica conectado na evaluation board (esquerda da foto) será utilizado para passar informações, o cabo conectado ao dongle (direita da foto) serve somente para alimentar o dongle.



MUITA ATENÇÃO: Na posição do cabo de debug, veja o fio vermelho na posição 1 indicada no dongle.


Abra o Flash Programmer:

Provavelmente irá aparecer esta janela informando que o firmware dela é antigo e precisa ser atualizado:



Configure conforme a imagem abaixo, para atualizar o firmware da evaluation board:


Feche o programa e abra novamente.

Configure conforme a imagem abaixo:


Em FlashImage utilize o .hex abaixo (o meu dongle usa o chip CC2540):
C:\Texas Instruments\BLE-CC254x-1.3.2\Accessories\HexFiles\CC2540_USBdongle_HostTestRelease_All.hex

Clique em Perform Actions para transmitir o firmware para o dongle

Uma vez reprogramado o dongle já pode ser utilizado, quando for conectado pela primeira vez será necessário o driver que está no diretório:
C:\Texas Instruments\BLE-CC254x-1.3.2\Accessories\Drivers

Mais informações no documento 4505.Reprogramming_CC2540_USB_dongle.pdf

Teste o Dongle e o SensorTag

Antes de reprograr o seu SensorTag, veja ele funcionando. Instale o Bluetooth low energy (BLE) Device Monitor e teste os SensorTag.

Desconecte a evaluation board o dongle o cabo de debug, e conecte somente o dongle no seu computador.

Abra o BLE Device Monitor. (instruções mais detalhadas aqui.)

Pressione o botão lateral do SensorTag:

No BLE Device Monitor click em Scan, aguarde aparecer o SensorTag, selecione ele e clique em Connect.

Uma vez conectado, e Attributes(à direita) expanda o item 93, depois o 94,  no 96 em Value escreva: 01:00

Aperte os botões do SensorTag e note que o valor de 95 irá mudar para 01 e 02 (de acordo com o botão que você apertar), em EventLog (à esquerda).


Isto demonstrou que o seu Dongle está configurado adequadamente e o SensorTag está se comunicando corretamente.

Clique em Disconnect e feche o BLE Device Monitor.


Configurando a IDE


Instale o IAR Embedded Workbench for 8051 (lembre-se de escolher a licença com período de expiração de 30 dias).

Copie o diretório:
C:\Texas Instruments\BLE-CC254x-1.3.2\Projects\ble\SensorTag

Para 
C:\Texas Instruments\BLE-CC254x-1.3.2\Projects\ble\MySensorTag

Somente para preservar o código original.

Abra o IAR Embedded Workbench, clique em File->Open->Workspace...



Selecione o arquivo:

C:\Texas Instruments\BLE-CC254x-1.3.2\Projects\ble\MySensorTag\CC2541DB\SensorTag.eww

Se aparecer a janela de mensagem abaixo clique em Sim.



Em Workspace clique com o botão direito em SensorTag-CC2541DK-Sensor e em seguida em Rebuild All.


Provavelmente dará o erro: Error[e16]: Segment SLEEP_CODE (size: 0x9 align: 0) is too long for segment definition. At least 0x1 more bytes needed. The problem occurred while ...









Existem um workaround que vou utilizar, mais informações aqui.

Expanda HAL->Target->Drivers e abra o arquivo hal_sleep.c procure a função:

 void halSetSleepMode(void)

Substitua:

PCON = halSleepPconValue; 

por:

asm("MOV     0x87,halSleepPconValue");



Salve, e execute o Rebuild All novamente somente para verificar se está tudo corrigido. 

Deve ter sido gerado com sucesso um arquivo em:

C:\Texas Instruments\BLE-CC254x-1.3.2\Projects\ble\MySensorTag\CC2541DB\CC2541DK-Sensor\Exe\SensorTag.hex

Renomeie este arquivo para SensorTagOri.hex. (Vamos usar este arquivo para voltar o SensorTag para a configuração original depois de modificá-lo.

Re-programando o SensorTag


Vamos gerar alguma modificação no código somente para provar que o ciclo completo foi realizado.

Quando apertamos os botões do SensorTag é transmitido o número 01 ou 02 dependendo do botão acionado. Vamos modificar estes número para 03 e 04.

Expanda APP  e abra o arquivo SensorTag.c procure a função:

static void sensorTag_HandleKeys( uint8 shift, uint8 keys 

procure a linha:

SK_Keys |= SK_KEY_LEFT;

Modifique para:

SK_Keys |= 0x03;//SK_KEY_LEFT;

Agora procure a linha:

SK_Keys |= SK_KEY_RIGHT;

Modifique para:

SK_Keys |= 0x04;//SK_KEY_RIGHT;


Salve, e execute o Rebuild All


Conecte o SensorTag na Evaluation Board e ela no computador:


Atenção para a posição do pino 1 (fio vermelho do cabo de debug)





Abra o Flash Programmer:

Reprograme o SensorTag com o arquivo:

C:\Texas Instruments\BLE-CC254x-1.3.2\Projects\ble\MySensorTag\CC2541DB\CC2541DK-Sensor\Exe\SensorTag.hex

Que acabou se ser gerado.

feche o Flash Programmer, desconecte a evaluation board e o SensorTag do cabo de debug.

Conecte o Dongle no computador e abra o BLE Device Monitor, conecte o SensorTag e veja que os números 03 e 04 são enviados quando os botões do SensorTag são pressionados.


Pronto! 

Agora, reprograme o SensorTag usando o SensorTagOri.hex (aquele que foi gerado antes da modificação), caso tenha pulado esta etapa, volte o código ao original e gere um novo .hex.


Dicas adicionais:


Fatal Error[e89]

A primeira vez que tentei reprogramar o SensorTag utilizei o IAR com a licença que limita o código em 4k, apresentou: 

Fatal Error[e89]: Too much object code produced (more than 0x1000 bytes) for this package 

Substitui a licença pela outra que é por tempo (30 dias), e o erro continuou. Aparentemente o IAR deixou algum arquivo que informava o a licença antiga no diretório do projeto.

Para resolve-lo é necessário  (fechar e abrir o IAR), copiar o diretório com o código fonte original e começar novamente a partir deste diretório "limpo".

Target Selection

Sempre compile através do Rebuild All.

O botão com um triangulo verde tem a Donwload e Debug que não é aplicável no nosso caso (eu cai nessa):


Quando você clica nele aparece a mensagem abaixo solicitando o Target Selection, que também não é necessária.


Em resumo: use o Rebuild All.


SensorTag e Python
Acesse o Blog da Isabela:


Conectando dois SensorTags no mesmo Dongle
Acesse o blog do Arthur:





quarta-feira, 10 de julho de 2013

Interfaces de entrada para Cadeira de rodas motorizada



Muitos projetos em eletrônica visam criar interfaces de entrada para pessoas com deficiências. Nesta postagem vou apresentar como podem ser feitas duas interfaces básicas o Joystick e o Penta.

O Joystick é uma interface analógica que possui uma escala suave de posições, permitindo alta capacidade de manobra da cadeira de rodas motorizada.



Joystick JC200 (Part Number: JC200BS1K1Y de 12V ) fonte: Farnell


Por outro lado temos uma interface digital (Penta) composta por cinco chaves (4 direções: frente, trás, esquerda e direita; e uma quinta chave adicional), esta interface é a base para a maioria de outras interfaces, devido a simplicidade de controlar estas cinco chaves. Por exemplo uma interface de sopro é tratada como Penta, interface por impulsos mio-elétrico também, interface por EEG normalmente é simplificada para uma única chave. 




Interface Penta fonte: Turning Point Technology 


Módulos de controle da PG Drives como o Omni possuem conexão DB9 macho, uma interface de entrada (Joystick ou Penta) precisa no seu cabo um conector DB9 fêmea com a seguinte pinagem.





Detalhe do conector DB9 fêmea


O pino 5 (detecta) deve ser conectado ao Terra no dispositivo e não dentro do conector DB9 (em caso de acidente, se o cabo do dispositivo for partido é importante que o detecta fique aberto para parar a cadeira) isto deve ser feito tanto para o Joystick quanto para o penta.

Dica: O sinal do pino 3 tem metade da tensão para o Joystick e 0 ou 1 (tensão máxima) para o Penta, se você estiver projetando o circuito no qual a interface de entrada vai ser conectada, você pode usar este sinal para detectar qual interface está conectada no seu sistema.

Montando um Joystick

O datasheet do JC200 pode ser encontrado aqui, existe um padrão nas cores dos fios do joystick que muitas vezes se repete com outros fabricantes:







No hardware do joystick não tem um fio para o Detecta, escolha um cabo com 6 fios, o fio que sobrar conecte no detecta (pino 5 do conector DB9) e na outra ponta do fio conecte ao terra, novamente é importante que este fio faça a conexão com o terra no lado próximo ao joystick (nunca no conector DB9), em caso de rompimento do cabo o módulo de controle irá detectar a desconexão. 

Montando um Penta

Para fazer um penta bastam 5 chaves, um cabo com 7 fios e 5 resistores de 3,3KΩ, não é necessário um fio para levar alimentação (pino 9) para a interface e nem a ligação do pino 9 e 7. Exceto se você desenvolver um penta mais sofisticado, por exemplo, um penta touch precisaria de um fio adicional para levar a alimentação de 12v para a interface e a ligação entre o pino 9 e 7.


Circuito de um Penta simples


Note novamente que o Detecta deve ser conectado ao Terra dentro a interface.








sexta-feira, 5 de abril de 2013

Blackberry Trackball na Arduino

O objetivo deste post é mostrar como ler os sinais de movimento do trackball usando uma Arduino.

Utilizei a Blackberry Trackballer Breakout da Sparkfun:



Ela possui quatro leds que não irei tratar aqui.

Utilizei uma Arduino Mega ADK, mas poderia ser uma Arduino qualquer.

Conexões do da breackout board com a Arduino.

Breakout  ->  Arduino

UP                 Digital 7 (configurado como IN) (fio Amarelo)
DWN            Digital 8 (configurado como IN) (fio Laranja)
LFT               Digital 3 (configurado como IN) (fio Verde)
RHT              Digital 5 (configurado como IN) (fio Roxo)
BTN              Digital 11 (configurado como IN) (fio Azul)
GND             GND (fio Marrom)
VCC              5v     (fio Vermelho)

Veja as conexões:






Com estas conexões só falta o código (utilizei a IDE Arduino 1.0.1), que pode ser encontrado aqui:


                  Obs.: O código que desenvolvi aqui foi totalmente inspirado neste projeto:

Você pode mudar a sensibilidade alterando a variável "threshold".

Uma vez que realizar o Upload para a Arduino, abra o Serial Monitor. Para o movimento acima do trackball irá aparecer o texto UP, para baixo DOWN, e assim por diante. Se você pressionar o trackball ira acionar um botão, no Serial Monitor irá aparecer BUTTON e o led da Arduino irá mudar de estado (se estiver apagado acende, se estiver aceso apaga.

Veja abaixo a tela do Serial Monitor: