ArduinoRaspberry

LoRa com Raspberry e Arduino

Estou trabalhando em um projeto cujo hardware não pode ser divulgado. A imagem de destaque é o vazamento desse produto, do qual não posso sequer citar as especificações, mas enfim, é um hat para Raspberry e tem LoRa e fiz o teste inicial do LoRa com Raspberry e Arduino, com um bocado de esforço. Detalho.

LoRa com Raspberry e Arduino

Rádio é rádio, certo? O Driver é o mesmo para ambos, estou utilizando RadioHead, instalável pelo gerenciador de biblioteca do Arduino ou você pode pegá-lo nesse link.

Se quiser placas LoRa industriais, visite a AFE e faça sua escolha. Não é custo de hardware chinês, já adianto. É hardware profissional, mas nada impede que hobistas abusados (como eu) as tenham.

Não foi uma configuração transparente por diversos motivos e é importante salientar os pontos aqui.

Configurar LoRA rf95 no Raspberry (bcm2835)

No Raspberry não basta a biblioteca RadioHead. É necessário instalar previamente a biblioteca BCM2835, que dá acesso aos GPIO e outras funções do chip usado no Raspberry. Pegue-a nesse link. Se seu Raspberry 3 não estiver preparado para desenvolvimento, as dependências surgirão durante o processo a seguir:

Se estiver utilizando Raspberry Pi 2, execute raspi-config e em Advanced Options habilite a opção Enable Device Tree, então salve e reinicie-o antes de proceder com a configuração da biblioteca supracitada.

Pinos padrão SPI do Raspberry

Os pinos padrão são:

  • P1-19 (MOSI)
  • P1-21 (MISO)
  • P1-23 (CLK)
  • P1-24 (CE0)
  • P1-26 (CE1)

Para multi-rádio, uma implementação extra é necessária, mas isso só poderei mostrar quando a AF Eletrônica tiver um hardware para tal.

SPI auxiliar do Raspberry

Os pinos auxiliares são:

  • P1-38 (MOSI)
  • P1-35 (MISO)
  • P1-40 (CLK)
  • P1-36 (CE2)

Esse é o segundo SPI do Raspberry (wow).

Mais informações sobre a BMC2835 podem ser encontradas aqui.

Desabilite o SPI se estiver habilitado (!)

Estranho, não? Nem tanto, na verdade.

Através do configurador raspi-config podemos habilitar a interface SPI, entre outras. Porém, se estiver utilizando a biblioteca BCM2835, é necessário desabilitar o módulo do kernel Linux porque a biblioteca BMC2835 interage em baixo nível com o hardware, independente do módulo carregado pelo kernel.

Entre no configurador digitando raspi-config, então vá em Interface Options > SPI e desabilite-a.

Baixe a biblioteca RadioHead

Nesse ponto você já deve ter reiniciado seu Raspberry, caso a interface SPI estivesse habilitada. Tendo compilado e instalado a biblioteca BCM2835, agora baixe a biblioteca RadioHead. Por exemplo:

Nesse diretório que você deverá entrar após a extração do pacote baixado, estarão contidos os arquivos Makefile, rf95_client.cpprf95_server.cpp.

Detalhes importantes (fundamentais?)

O exemplo de client e server é para comunicação entre dois Raspberry Pi. No primeiro momento, eu precisava provar o conceito, sem endereçar os destinos dos pacotes (e tem muitas razões para isso). Desse modo, o rádio LoRa da placa da AF Eletrônica joga a informação no ar para quem quiser pegar. Para que a recepção ocorresse, foi necessário escrever algumas modificações no exemplo do server (que é o Raspberry).

Antes de expôr o código de exemplo, devemos considerar alguns pontos.

Não use interrupção

no site do RadioHead foi relatado que existe um bug conhecido e não solucionado, que não permite a utilização de interrupção do rádio. Antes de tomar conhecimento, eu já havia feito as configurações e testado. Com poucos minutos o Raspberry congelava, portanto, não tente usar interrupção até que o bug seja solucionado.

Declare os pinos da placa no arquivo ../RaspBoards.h

Esse arquivo contém a definição dos pinos para cada tipo de placa. Como a que estou utilizando para desenvolvimento ainda não está no mercado, tive que fazer as declarações. Vou dar como exemplo um dos modelos conhecidos:

No Raspberry não devemos utiizar a interrupção, portanto defina o pino como NOT_A_PIN.

Ajuste a frequência

O padrão é 434MHz à 13dBm, mas no EUA a regulamentação convenciona o uso de +14dBm, por isso é necessário modificar ou comentar a linha rf95.setTxPower.

Modifique também a frequência no define correspondente para 915.00.

Código do rf95_server.cpp modificado

Baseado no código de exemplo, as modificações resultaram em:

Deixei o programa original tanto quanto foi possível. Tendo feito essas modificações, agora basta compilar e executar:

O programa ficará em execução aguardando por qualquer mensagem.

Configurar LoRa rf95 no Arduino

Estou utilizando também uma placa da AF Eletrônica. No caso, essa (link para compra – aproveite porque está absurdamente barata), da imagem abaixo (descrita nesse artigo).

Essa placa utiliza um Arduino Pro-mini 3v3 (pode ser 5v) e tem slot para RF4463Pro e LoRa1276, à sua escolha. Estou utilizando LoRa1276 nela.

Para instalar a biblioteca, vá ao gerenciador de bibliotecas da IDE do Arduino e digite RadioHead. Instale-a. Após, use esse código no sketch:

Bem mais simples que o Raspberry, hum? Mas convenhamos que agora trata-se de uma microcontroladora e um driver direto, com tudo já definido. Claro que o mínimo foi necessário; ajustar txPower para 915MHz, 13dBm. Subindo o sketch, a comunicação já deve começar em um ou dois segundos e o resultado deve ser algo como:

Espero que esse artigo lhe seja útil, porque foi muito duro chegar nesse ponto.

Meu ambiente consiste de um Raspberry Pi 3 na sala (piso inferior da casa) e um AFSmartRadio no meu quarto (piso superior). A imagem do terminal do Raspberry mostrada acima é de um acesso por SSH, enquanto a IDE Atom (ao fundo) é local, no notebook.

Até a próxima!