quarta-feira, 28 de abril de 2021

U-BLOX NINA B302 RODANDO TINYGO - BLUETOOTH (BLE)

 U-BLOX NINA B302 RODANDO TINYGO - BLUETOOTH (BLE)


O objetivo deste BLOG é demonstrar como é possível programar o módulo U-BLOX NINA B302 com a linguagem TINYGO. Foi utilizado o breakout NINA B302. Neste exemplo faremos uma comunicação via BLE (Heartrate).


Adquirimos então os seguintes componentes



Montamos a BREAKOUT (U-BLOX NINA B302)


O esquema elétrico é este



Algumas características do Kit

-Botão de RESET;
-Botão de Modo BOOTLOADER (W102);
-Plugável no PROTOBOARD;
-Acesso às várias GPIOS;

Pequena 
BREAKOUT


TinyGo é um projeto para levar a linguagem de programação Go para microcontroladores e navegadores modernos, criando um novo compilador baseado em LLVM.

Você pode compilar e executar programas TinyGo em muitas placas microcontroladoras diferentes, como o micro:bit da BBC e o Arduino Uno.

TinyGo também pode ser usado para produzir código WebAssembly (WASM), que é muito compacto em tamanho.

Só quer ver o código? Vá ao repositório do Github em 


TinyGo também tem suporte para vários dispositivos diferentes, como acelerômetros e magnetômetros. Confira o repositório do Github em 

https://github.com/tinygo-org/drivers para obter mais informações.

GO BLUETOOTH

Go Bluetooth é um pacote multiplataforma para usar hardware Bluetooth Low Energy da linguagem de programação Go.

Ele funciona em sistemas operacionais típicos como Linux, macOS e Windows.

Também pode ser usado executando "bare metal" em microcontroladores produzidos pela Nordic Semiconductor usando TinyGo, os quais fazem parte dos módulo U-BLOX NINA B112 e B302.

O pacote Bluetooth Go pode ser usado para criar tanto central de baixa consumo Bluetooth quanto para criar periféricos Bluetooth de baixa consumo

Periférico BLE

Um periférico típico de baixa consumo Bluetooth seria um sensor de temperatura ou sensor de frequência cardíaca.

Este exemplo mostra um periférico que se anuncia como disponível para conexão:

package main import ( "time" "tinygo.org/x/bluetooth" ) var adapter = bluetooth.DefaultAdapter func main() { // Enable BLE interface. must("enable BLE stack", adapter.Enable()) // Define the peripheral device info. adv := adapter.DefaultAdvertisement() must("config adv", adv.Configure(bluetooth.AdvertisementOptions{ LocalName: "Go Bluetooth", })) // Start advertising must("start adv", adv.Start()) println("advertising...") for { // Sleep forever. time.Sleep(time.Hour) } } func must(action string, err error) { if err != nil { panic("failed to " + action + ": " + err.Error()) } }

Suporte atual

LinuxmacOSWindowsNordic Semi
API usedBlueZCoreBluetoothWinRTSoftDevice
Scanning✔️✔️✔️✔️
Connect to peripheral✔️✔️✔️
Write peripheral characteristics✔️✔️✔️
Receive notifications✔️✔️✔️
Advertisement✔️✔️
Local services✔️✔️
Local characteristics✔️✔️
Send notifications✔️✔️
U-BLOX Nina B302

Esse suporte requer a compilação de seus programas usando o TinyGo.

Você também deve usar firmware conhecido como "SoftDevice". O SoftDevice é uma bolha binária que implementa a pilha BLE. Existem outras pilhas BLE (de código aberto), mas os SoftDevices são bastante sólidos e têm todas as qualificações que você pode precisar. 

O SoftDevice pode ser usado tanto como um BLE Central quanto como um Ble Periférico, dependendo de qual chip está sendo usado. 

Você deve instalar o TinyGo para ser capaz de compilar código de metal nu usando Go Bluetooth. Siga as instruções do seu sistema operaciona abaixo.

Instalando no WINDOWS 10

Você deve usar o Go 1.14.x+ com a instalação nativa do Windows 10 do TinyGo.

Se você ainda não o instalou, você pode obtê-lo a partir de https://golang.org/dl/

Escolha o link de download para Microsoft Windows, Windows 7 ou posterior, processador Intel de 64 bits.


Descomprima o arquivo assim:

Primeiro clique duas vezes no arquivo ZIP baixado para abri-lo.

Agora arraste a pasta "tinygo" na janela do arquivo ZIP para a unidade "C:".

Quando a pasta terminar de extrair, você pode fechar a janela de arquivo ZIP.

Você precisará adicionar C:\tinygo\bin ao seu PATH.

set PATH=%PATH%;"C:\tinygo\bin";

Agora você deve ser capaz de executar o comando TinyGo:

tinygo version
tinygo version 0.17.0 windows/amd64 (using go version go1.16 and LLVM version 11.0.0)

Montagem

Um cabo USB foi soldado em D+, D-, GND e VBUS do U-BLOX NINA B302

Gravando o BOOTLOADER

Diferente do U-BLOX NINA B112, o U-BLOX NINA B302 tem uma USB a qual permite que você possa criar um COM virtual e MSD e copiar os programas, graças ao bootloader do time da Adafruit.

Adafruit Team

feather_nrf52840_express_bootloader-0.5.0.zip

Com seu gravador SEGGER J-TAG, será necessário gravar o BOOTLOADER  da Adafruit.




DFU

Obs: além de um dispositivo MSD, teremos uma COMM Virtual (para debug)

CDC USB COMM E MSD


INFO_UF2.TXT dentro do MSD

UF2 Bootloader 0.5.0 lib/nrfx (v2.0.0) lib/tinyusb (0.9.0-22-g7cdeed54) lib/uf2 (remotes/origin/configupdate-9-gadbb8c7)
Model: Adafruit Feather nRF52840 Express
Board-ID: nRF52840-Feather-revD
SoftDevice: S140 version 6.1.1
Date: Apr  4 2021

Como pode observar, está o Softdevice S140 junto!

Gravando a programa TINYGO

Conecte o u-BLOX NINA B302 na porta USB do seu computador.
Mostre seu programa TinyGo para o quadro usando este comando:

tinygo flash -port=COMxx -target=feather-nrf52840 examples/serial


O NRF52840 é o core do U-BLOX NINA-B302

A placa u-BLOX NINA B302 deve reiniciar e, em seguida, começar a executar o seu programa.

Solucionando problemas

Se você tiver problemas para enviar código para o U-BLOX NINA B302 receber código, tente isso:

Pressione o botão "RESET" na placa duas vezes para deixar a placa U-BLOX NINA B302 pronta para receber o código.

A placa U-BLOX NINA B302 aparecerá no seu computador como uma unidade USB.

Depois de atualizar sua placa U-BLOX NINA B302 pela primeira vez, depois disso você deve ser capaz de "flash-lo" inteiramente da linha de comando.

Notas
Você pode usar a porta USB para o U-BLOX NINA B302 como uma porta serial. UART0 refere-se a esta conexão.

Para um exemplo que usa os LEDs Neopixel embutidos, dê uma olhada no repositório de drivers TinyGo localizado em 


O suporte bluetooth já está disponível para a placa U-BLOX NINA B302.

Executando o exemplo Serial

Gravando na FLASH

Execução do Exemplo - 115200

código Fonte

Interfaces implementadas no U-BLOX NINA B302 com o TINYGO


PISCANDO LED

Gravando na Flash

Código Fonte

Para direcionar machine.LED para o pino GPIO02  do U-BLOX NINA B302 foi necessário abrir o arquivo board_feather-nrf52840.go e configurá-lo para D26, que corresponde à P0_14 ou GPIO 02.

D26 = P0_14 

const (
LED      = D26


Breakout

Datasheet

Execução

Restrições TINYGO


Testando BLE com TINYGO

Instalando

Você deve obter o pacote Go Bluetooth usando o Git

https://github.com/tinygo-org/bluetooth.git de clone git

Agora entre na pasta bluetooth\examples\heartheat e compile/transfira para o U-blox NINA B302 e então execute

tinygo flash -port=COM21 -target=feather-nrf52840







package main
import (
"math/rand"
"time"
"tinygo.org/x/bluetooth"
)
var adapter = bluetooth.DefaultAdapter
// TODO: use atomics to access this value.
var heartRate uint8 = 75 // 75bpm
func main() {
println("starting")
must("enable BLE stack", adapter.Enable())
adv := adapter.DefaultAdvertisement()
must("config adv", adv.Configure(bluetooth.AdvertisementOptions{
LocalName: "Go HRS",
ServiceUUIDs: []bluetooth.UUID{bluetooth.ServiceUUIDHeartRate},
}))
must("start adv", adv.Start())
var heartRateMeasurement bluetooth.Characteristic
must("add service", adapter.AddService(&bluetooth.Service{
UUID: bluetooth.ServiceUUIDHeartRate,
Characteristics: []bluetooth.CharacteristicConfig{
{
Handle: &heartRateMeasurement,
UUID: bluetooth.CharacteristicUUIDHeartRateMeasurement,
Value: []byte{0, heartRate},
Flags: bluetooth.CharacteristicNotifyPermission,
},
},
}))
nextBeat := time.Now()
for {
nextBeat = nextBeat.Add(time.Minute / time.Duration(heartRate))
println("tick", time.Now().Format("04:05.000"))
time.Sleep(nextBeat.Sub(time.Now()))
// random variation in heartrate
heartRate = randomInt(65, 85)
// and push the next notification
heartRateMeasurement.Write([]byte{0, heartRate})
}
}
func must(action string, err error) {
if err != nil {
panic("failed to " + action + ": " + err.Error())
}
}
// Returns an int >= min, < max
func randomInt(min, max int) uint8 {
return uint8(min + rand.Intn(max-min))
}


Questões: suporte@smartcore.com.br

Sobre a SMARTCORE

A SmartCore fornece módulos para comunicação wireless, biometria, conectividade, rastreamento e automação.
Nosso portfólio inclui modem 2G/3G/4G/NB-IoT/Cat.M, satelital, módulos WiFi, Bluetooth, GNSS / GPS, Sigfox, LoRa, leitor de cartão, leitor QR code, mecanismo de impressão, mini-board PC, antena, pigtail, LCD, bateria, repetidor GPS e sensores.
Mais detalhes em www.smartcore.com.br

Nenhum comentário:

Postar um comentário