EmbeddedIoTLinuxProgramaçãoRaspberry

Como configurar NRF24L01 com Raspberry

Confesso que preciso brincar um pouco mais com periféricos no Raspberry. Apesar de já ter conectado alguns periféricos nesse brinquedo e até ter escrito um suporte ao BMP180 em Python, ainda tem muito a desbravar com esse computadorzinho (apesar da galera preferir tratá-lo como um video-game -e logo monto o meu também). E hoje vou dar mais um passo na direção das interconexões, mostrando como configurar um rádio NRF24L01 com Raspberry Pi para (de quebra)  fazer uma rede mesh.

Onde adquirir o módulo NRF24L01?

Primeiramente, você precisará definir qual módulo utilizar – e tem alguns modelos, hum? O que você deverá considerar é o custo/benefício. O modelo com antena embutida é mais barato, mas em contrapartida o modelo com antena externa tem uma melhor recepção. Tem relatos de alcance a até 14km de distância em campo aberto, mas sem pensar nesse exagero de distância, certamente é possível ter um alcance realmente bom com esse dispositivo. Escolha nesse link o seu modelo preferido para configurar seu NRF24L01 com Raspberry e sigamos.

Wiring



Peguei a imagem do mysensors.org porque não gosto muito de ter que parar pra usar o Fritizng. Repare que é recomendado a utilização de um capacitor de desacoplamento ao rádio.

NRF24L01 com Raspberry
NRF24L01 com Raspberry

Se quiser dar uma conferida no pinout do Raspberry (1, 2 e 3), sugiro esse artigo com várias outras informações importantes para usuários de Raspberry Pi.

Capacitor de decoupling

O capacitor deve ser um 4.7u/47uF, único requisito. A solda é simples, caso não tenha conhecimentos em eletrônica (não chego nem a aprendiz de técnico, mas) basta colocar desse jeito:

Capacitor   NRF24L01
negativo GND
positivo 3V3

O capacitor é obrigatório?

Não, mas se a recepção ou transmissão de dados não acontecer, adicione o capacitor ao seu NRF24L01 com Raspberry.

Pinout

O pino de interrupção do NRF24L01 não está em uso no momento, mas em outro artigo eu mostrarei como aguardar uma interrupção do dispositivo. De antemão, se desejar ver como as interrupções podem ser tratadas no Raspberry, veja esse outro artigo.

NRF24L01 com Raspberry
NRF24L01 pinout – NRF24L01 com Raspberry

 

 

Os pinos estão conectados da seguinte maneira:

 NRF24L01   Raspberry 
VCC 1 (3V3)
GND  6
CE  15
CS  24
SCK  23
MOSI  19
MISO  21

Não se esqueça de habilitar o barramento SPI no Raspberry. Se não sabe como fazê-lo, dê uma olhada nesse outro artigo onde exemplifico isso em detalhes.

Interconexão de rádio – NRF24L01 com Raspberry

Antes de seguirmos, deixe-me exclarecer que não é possível utilizar esse módulo para conectar-se à sua rede WiFi doméstica, ok? Mas nada impede de fazer uma bridge entre o um ponto de rádio com uma RPi conectada à internet por ethernet ou WiFi. Veremos isso futuramente.

A comunicação poderá ser feita entre Raspberry e Arduino ou entre placas da mesma arquitetura, sem maiores problemas. Esse artigo estou escrevendo como predecessor de uma rede mesh com múltiplas arquiteturas. Saber configurar cada arquitetura previamente é uma maneira de reduzir o tamanho do artigo que terá o propósito específico.

Compilando o gateway

Um gateway é o caminho padrão para estações conectadas à mesma rede. Isso é, qualquer destino não conhecido pela estação faz a busca do destino através do respectivo gateway. Em uma rede TCP/IP,  pode-se ter uma rota estática para um destino (um gateway comum) e/ou uma rota padrão para todos os endereços não pertencentes ao mesmo endereçamento da rede (default gateway). No caso desse artigo, utilizaremos o rádio como um modelo “master/slave”, tendo um nó principal e dispositivos arredores.

Faça login no Raspberry (local ou remotamente) e tendo-o conectado à Internet, dispare os seguintes comandos:

cc1plus: error: bad value (cortex-a7) for -mtune switch

Pegou esse erro na compilação? Não se desespere, os erros são feios mais na maioria das vezes a solução é simples.

apt-get dist-upgrade

De imediato, fiz um “apt-get dist-upgrade”, já que há muito tempo eu não atualizava meu Raspberry. Não é obrigatório, mas gosto de ter as coisas atualizadas, isso evita erros por incompatibilidade de versões com bibliotecas.

Após uma atualização dessas, é necessário um reboot.

Makefile



Para resolver o erro, edite o Makefile e remova a opção ‘-mtune’ dessa linha (ou como eu, comente a linha e faça uma cópia com o parâmetro excluido):

NRF24L01 com Raspberry - makefile e mtune
Makefile e mtune – NRF24L01 com Raspberry

A compilação deve ocorrer sem problemas a posteriori:

 

NRF24L01 com Raspberry - compilação
Compilação – NRF24L01 com Raspberry

Não se preocupe com a arquitetura, não será compilado pra x86 pela falta do tunning.

bcm2835.c:1207:28: error: invalid suffix “x” on integer constant

Se pegar esse erro, entre as soluções possíveis você pode mudar o Makefile da librf24-bmc em Raspberry/librf24-bmc/Makefile:

Não caia na blacklist

Garanta que o módulo spi-bmc2708 não esteja na blacklist, senão nada vai funcionar. Comente-o se estiver na blacklist. Comentar significa colocar a cerquilha (ou sustenido, jogo da velha, cardinal,  octothorpe , tralha, cancela, numeral, malha, sharp, carré, hash, trama ou seja lá como você chama esse símbolo – mas evite ‘sustenido’, que só é parecido) caso não esteja com ela no começo da linha. O arquivo que deve ser editado é o  raspi-blacklist.conf:

E a linha deverá ficar assim:

Hora de começar a brincadeira.

PyGatewaySerial

Eu ainda não havia feito o wiring, mas executei o comando de qualquer modo. Se você fizer o wiring de forma errada, obterá a mesma mensagem:

PiGatewaySerial - NRF24L01 com Raspberry
PiGatewaySerial – NRF24L01 com Raspberry

Se você habilitou o SPI como referenciado no link de referência lá em cima e fez o wiring adequadamente, quando executar o comando /usr/local/sbin/PiGatewaySerial deverá ver algo assim:

PiGatewaySerial - NRF24L01 com Raspberry
PiGatewaySerial – NRF24L01 com Raspberry

Após confirmar o funcionamento, comemore e interrompa com Ctrl+C.

/etc/init.d/PiGatewaySerial

Para quem não é muito íntimo de sistemas Linux, /etc/init.d é o diretório de serviços do sistema. O PiGatewaySerial também é um serviço de sistema. Serviços de sistema rodam sob prioridade administrativa (não com o PID de root necessariamente), de modo que se for iniciá-lo manualmente, você deve estar com autoridade garantida. Você pode fazer isso de dois modos:

Para garantir que o processo está rodando adequadamente, verifique o serviço através do arquivo contido em /dev:

Uma mensagem igual ou semelhante a esse deve ser exibida:

cat /dev/ttyMySensorsGateway - NRF24L01 com Raspberry
cat /dev/ttyMySensorsGateway – NRF24L01 com Raspberry

Auto-inicialização do serviço

Claro que você quererá seu rádio funcionando automaticamente a cada reboot, hum? Existem pelo menos 3 modos de fazê-lo sem que possam ser chamados de “gambiarra”, sendo que recomendarei o último caso nesse artigo, porque é o procedimento adotado pelo criador da biblioteca. Mas vale a pena citar todos.

rc.local

Adicione o serviço no último arquivo lido pelo sistema operacional durante o processo de boot; o /etc/rc.local.  Inclua uma linha:

update-rc.d

Ou habilite-o da forma mais limpa:

Serviço de sistema - NRF24L01 com Raspberry
Serviço de sistema – NRF24L01 com Raspberry

make

De dentro do diretório Raspberry (cuja toda a compilação foi feita até aqui), digite o comando:

Confirmar a execução do serviço após o boot

Se precisar confirmar o serviço em execução (após ter comprovado seu funcionamento no sistema com os comandos anteriores), basta consultar com ps:

ps ax - NRF24L01 com Raspberry
ps ax – NRF24L01 com Raspberry

Integração com outros sistemas de domótica

O funcionamento da comunicação será como qualquer comunicação serial, mas diversos programas estão preparados para ler apenas dispositivos padrão do sistema, em /dev/tty*, onde o sufixo é sempre algo como USBx ou ACMx (por exemplo, /dev/ttyUSB0). Para evitar problemas, podemos criar um link simbólico do dispositivo que foi gerado e “linkado” pelo driver apontando para uma tty convencional do sistema. Em outro artigo mostrarei a integração com um desses sistemas, por enquanto, apenas mantenha um dispositivo disponível e funcionando:

link simbolico para o dispositivo - NRF24L01 com Raspberry
Link simbólico para o dispositivo – NRF24L01 com Raspberry

Atualmente as distribuições Linux populam o diretório /dev em tempo de boot, baseando-se nos dispositivos realmente existentes no sistema. Antigamente montes desses dispositivos eram criados sem serem utilizados, então a prática atual é boa, mas causará um inconveniente; o dispositivo /dev/ttyUSB20 não existirá mais. Obviamente não executaremos manualmente o link simbólico a cada boot e para resolver essa questão, basta recorrer ao /etc/rc.local. Adicione o comando do link simbólico antes de “exit 0″:

Cuidados a tomar com amplificação de sinal

O nível lógico do Raspberry é 3v3 e não existe nenhum tipo de proteção para os GPIO, por isso não tente resolver qualquer problema advindo de uma configuração problemática ligando o NRF24L01 à tensão de 5V. Além disso, se for amplificar o sinal, proporcione uma alimentação externa, uma vez que o limite de corrente que pode ser drenado do Raspberry Pi é de 50mA. Utilizando simplesmente o rádio, você não terá com o que se preocupar, pois seu consumo não deve passar de 15mA. Tendo feito a alimentação externa, atente-se em derivar o GND para o Raspberry ou o módulo não funcionará.

Transferência de dados

A comunicação com rádio poderá ser utilizada inclusive para atualização OTA, mas tenha em mente que a velocidade do rádio é consideravelmente lenta.

Próximo artigo relacionado

Eu acredito que esse artigo mereça exclusividade porque está bastante informativo, então vou deixar a comunicação entre o Raspberry e outros dispositivos para o próximo artigo relacionado, ok? No próximo, colocarei uns 3 dispositivos na rede, sendo Arduinos e ESP8266 para termos uma rede mesh híbrida, é só acompanhar!

Curtir a página

Que tal curtir a página no facebook como feedback? Assim você recebe uma notificação de novos artigos, hum? Tem também nosso canal no youtube e afins, logo mais abaixo.

Por favor, mostre seu interesse clicando nas estrelinhas pra avaliar, curtindo nossa página e assinando nosso canal no YouTube, em breve teremos um video bacana dessa rede mesh e também um outro incrível de um projeto quase finalizado.

Inscreva-se no nosso newsletter, alí em cima à direita e receba novos posts por email.

Siga-nos no Do bit Ao Byte no Facebook.

Prefere twitter? @DobitAoByte.

Inscreva-se no nosso canal Do bit Ao Byte Brasil no YouTube.

Nossos grupos:

Arduino BR – https://www.facebook.com/groups/microcontroladorarduinobr/
Raspberry Pi BR – https://www.facebook.com/groups/raspberrybr/
Orange Pi BR – https://www.facebook.com/groups/OrangePiBR/
Odroid BR – https://www.facebook.com/groups/odroidBR/
Sistemas Embarcados BR – https://www.facebook.com/groups/SistemasEmbarcadosBR/
MIPS BR – https://www.facebook.com/groups/MIPSBR/
Do Bit ao Byte – https://www.facebook.com/groups/dobitaobyte/

Próximo post a caminho!

3 comments
  1. Rede mesh com Arduino e Raspberry usando NRF24L01 • Do bit Ao Byte

    […] Se você está acompanhando essa série de comunicação com o NRF24L01, deve ter lido o artigo anterior. Nele está disposta toda a configuração e uma comunicação simples (sem mesh) entre Arduino e Raspberry. No artigo anterior, o mais importante é que você consiga fazer o wiring e a configuração do dispositivo no Raspberry. Minha sugestão é que esteja com o sistema devidamente atuallizado, porque do jeito que está escrito no artigo anterior foi como procedi, sem problemas. Com versões mais antigas do sistema houve uma série de complicações que precisaram ser sanadas. Se por alguma razão você não pode atualizar seu Raspberry Pi, pode ser bom dar uma olhada nesse artigo também. […]

Comments are closed.

%d blogueiros gostam disto: