terça-feira, novembro 03, 2015

Usando o nRF24L01+ com o MSP430: Um Sensor a Bateria - Parte 1

Completando esta etapa de experimentos com o nRF24L01+, vamos ligá-lo a um MSP430 e fazer um sensor a bateria para transmitir periodicamente as leituras para um Raspberry Pi. Vamos começar com uma prova de conceito usando uma Launchpad alimentada pela USB. Mais para frente vamos montar o nosso hardware e alimentá-lo com uma bateria de 3V.


Hardware de Teste

A ideia é fazer um hardware é bastante simples, aproveitando as ideias do meu intervalômetro. Um cristal de 32KHz é usado quando o MSP430 está dormindo, para reduzir o consumo. O rádio é ligado à interface SPI. Os sensores serão os mesmos que usei no teste do datalogger: um sensor de efeito Hall e um sensor de temperatura DS18B20. A figura abaixo mostra a ideia do circuito final:



O cristal foi espetado diretamente no conector da Launchpad. Neste primeiro teste usei o botão da placa como substituto para o sensor efeito Hall e não conectei o sensor DS28B20.

Abri os jumpers dos sinais Rx e Tx (no topo da placa), pois eles correspondem aos sinais P1.1 e P1.2. Abri também o jumper que liga o sinal P1.6 a um LED (na parte inferior da placa).

Software

O objetivo do primeiro software de teste é exercitar algumas das funções necessárias para o software definitivo:
  • Iniciação e interação com o  nRF24L01+, considerando que desejo apenas transmitir.
  • Manter o processador dormindo a maior parte do tempo e só acordar por tempo ou pressionamento do botão.
O software foi feito com uma versão antiga do IAR Workbench que eu tinha instalada no micro. Mais para frente vou tentar adaptar para o MSP GCC.
Dificuldades com a SPI

Incialmente a comunicação RF não funcionava. Usando os recursos de depuração do IAR, percebi que a leitura do status do nRF24L01+ estava funcionando mas a escrita de comandos não. Após muito quebrar a cabeça e vários testes, percebi que o MSP430 tem uma convenção diferente da que eu imaginava.

O padrão SPI é bastante flexível no que diz respeito ao clock (SCK). Ele prevê duas opções para a polaridade e duas opções para a fase, o que dá quatro modos distintos.

A polaridade do clock determina se o sinal SCK está baixo ou alto quando em repouso.

A fase do clock determina em qual borda (a primeira ou a segunda) é feita a leitura e em qual é feita a escrita.

Um exame cuidadoso do datasheet do nRF24L01+ revela que ele usa o modo 0. Em outras palavras, o sinal MISO (dado fornecido pelo nRF24L01+) deve ser lido pelo MSP na primeira borda (subida) do SCK e o sinal MOSI (dado enviado pelo MSP) deve ser alterado na segunda borda (descida).

No Arduino, o modo 0 é o default e não precisei me preocupar com isto. No MSP430, a polaridade é definida no registrador USICKCTL e a fase no registrador USICTL1.  A convenção para o controle da fase no MSP430 é diferente da usual. No Arduino (e em muitos outros lugares), a fase do modo 0 é referenciado como CPHA=0, no MSP430 é necessário colocar o bit USICKPH em 1.

Mesmo com esta correção o funcionamento ainda estava intermitente. Finalmente consegui ter uma operação confiável enviado um comando NOP no começo da iniciação do nRF24L01+. Desconfio que alguma flutuação dos sinais após o reset seja o motivo desta necessidade.

O software final pode ser baixado dos arquivos do blog, está em MSP_NRF24_1.zip.

Nenhum comentário: