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
-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
Linux | macOS | Windows | Nordic Semi | |
---|---|---|---|---|
API used | BlueZ | CoreBluetooth | WinRT | SoftDevice |
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.
Baixe o arquivo TinyGo para Windows de https://github.com/tinygo-org/tinygo/releases/download/v0.16.0/tinygo0.16.0.windows-amd64.zip
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!
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
código Fonte
Interfaces implementadas no U-BLOX NINA B302 com o TINYGO
PISCANDO LED
Gravando na Flash
Código Fonte
D26 = P0_14
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
FONTES:
Nenhum comentário:
Postar um comentário