sábado, 28 de agosto de 2021

U-BLOX NINA B302 (ARDUINO BLE 33 SENSE) - AGORA COM COMPONENTE MÓDULO U-BLOX NINA B302

U-BLOX NINA B302 (ARDUINO BLE 33 SENSE) - AGORA COM COMPONENTE MÓDULO U-BLOX NINA B302 - MBed Engine


O objetivo deste BLOG é mostrar como é possível programar o U-BLOX NINA B302 para que possa ter utilizado como o ARDUINO BLE 33 SENSE, mas com um custo reduzido, ou seja, você não precisa colocar todos os sensores.

Para a implementação, foi utilizado a nova versão do Software VISUINO o qual recentemente incluiu o BLE 33 SENSE.

Tenha então acesso por Software aos seguintes sensores/atuadores:

LSM9DS1-9: O LSM9DS1-9chip possui um sensor de aceleração linear digital 3D, um sensor de taxa angular digital 3D e um sensor magnético digital 3D. E é usado para medir a aceleração linear, velocidade angular e força do campo magnético, respectivamente, nos três eixos. A taxa máxima de atualização para o acelerômetro e giroscópio é de 952Hz e até 80 Hz para o magnetômetro.

HTS221: O HTS221 é um sensor ultracompacto para umidade relativa e temperatura. Ele vem com um elemento de sensoriamento e um ASIC de sinal misto (Circuito Integrado Específico de Aplicação) a fim de fornecer informações sobre o ambiente externo através de interfaces seriais digitais.

LPS22HB: O LPS22HB é um sensor de pressão absoluta piezoresistive ultracompacto que funciona como um barômetro de saída digital. O chip vem com um elemento de sensoriamento e uma interface IC que se comunica através da interface I2C ou SPI para a placa Nano.

MP34DT05-A: O MP34DT05-A é um microfone MEMS ultracompacto, de baixa potência, omnidirecional e digital construído com um elemento capacitivo e uma interface IC. O microfone é capaz de detectar ondas acústicas, é fabricado usando um processo especializado de micromaquinação de silício dedicado à produção de sensor de áudio

VISUINO

Visuino é o mais recente software inovador da Mitov Software. Um ambiente de programação visual que permite programar suas placas Arduino. ... Os componentes encontrados no software Visuino representam seus componentes de hardware e você poderá criar e projetar facilmente seus programas usando arrastar e soltar.

http://www.visuino.com/



Dentro do VISUINO, escolha o BLE 33 SENSE


Como podes observar, o módulo já tem a INTERFACE para os sensores do BLE NANO 33 SENSE, basta ligá-los, seguindo o esquema 



Como transferir o programa para o seu U-BLOX NINA B302 ?

Montamos então uma placa com U-BLOX NINA B302 conforme figura abaixo:



O esquema elétrico é este




Algumas características do Kit

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

Pequena 

72mmX21mm


Muito fácil de utilizar.

Use o gravador SEGGER JLINK para gravar o BREAKOUT com módulo U-BLOX NINA B112 e U-BLOX NINA B302, conecte nos pinos do SWCLK (pino 7) e SWDIO (pino 9) do SEGGER JLINK nos pinos  SWDCLK e SWDIO do BREAKOUT (pinos nas laterais, próximo à antena). Não esquecer de ligar os GND do BREAKOUT no GND do SEGGER JTAG, bem como alimentar o BREAKOUT com 3.3V.



Ligue os pinos SWD DIO e CLK ...
...nestes pinos da placa BREAKOUT


Você pode também usar o ST-LINK V2



Com o software da SEGGER, gravei o BOOTLOADER do NINA BLE 33 SENSE.





Conecte na USB o U-BLOX NINA B302 e você verá uma COMM virtual


Aqui tem-se um projeto no VISUINO que manda um Hello!!! a cada 1 segundo pela UART (USB)


Compilando (seja paciente, é baseado no Mbed compiler)


Gravando

Executando



Altere o 
variant.cpp para

#include "Arduino.h" #include "pinDefinitions.h" /* wiring_analog variables definition */ /* Flag to indicate whether the ADC config has been changed from the default one */ bool isAdcConfigChanged = false; /* * Configuration used for all the active ADC channels, it is initialized with the mbed default values * When it is changed, all the ADC channels are reconfigured accordingly */ analogin_config_t adcCurrentConfig = { .resistor_p = NRF_SAADC_RESISTOR_DISABLED, .resistor_n = NRF_SAADC_RESISTOR_DISABLED, .gain = NRF_SAADC_GAIN1_4, .reference = NRF_SAADC_REFERENCE_VDD4, .acq_time = NRF_SAADC_ACQTIME_10US, .mode = NRF_SAADC_MODE_SINGLE_ENDED, .burst = NRF_SAADC_BURST_DISABLED, .pin_p = NRF_SAADC_INPUT_DISABLED, .pin_n = NRF_SAADC_INPUT_DISABLED }; void analogReference(uint8_t mode) { nrf_saadc_reference_t reference = NRF_SAADC_REFERENCE_VDD4; nrf_saadc_gain_t gain = NRF_SAADC_GAIN1_4; if (mode == AR_VDD) { reference = NRF_SAADC_REFERENCE_VDD4; gain = NRF_SAADC_GAIN1_4; } else if (mode == AR_INTERNAL) { reference = NRF_SAADC_REFERENCE_INTERNAL; gain = NRF_SAADC_GAIN1; } else if (mode == AR_INTERNAL1V2) { reference = NRF_SAADC_REFERENCE_INTERNAL; gain = NRF_SAADC_GAIN1_2; } else if (mode == AR_INTERNAL2V4) { reference = NRF_SAADC_REFERENCE_INTERNAL; gain = NRF_SAADC_GAIN1_4; } adcCurrentConfig.reference = reference; adcCurrentConfig.gain = gain; analogUpdate(); } void analogAcquisitionTime(uint8_t time) { nrf_saadc_acqtime_t acqTime = NRF_SAADC_ACQTIME_10US; if (time == AT_3_US) { acqTime = NRF_SAADC_ACQTIME_3US; } else if (time == AT_5_US) { acqTime = NRF_SAADC_ACQTIME_5US; } else if (time == AT_10_US) { acqTime = NRF_SAADC_ACQTIME_10US; } else if (time == AT_15_US) { acqTime = NRF_SAADC_ACQTIME_15US; } else if (time == AT_20_US) { acqTime = NRF_SAADC_ACQTIME_20US; } else if (time == AT_40_US) { acqTime = NRF_SAADC_ACQTIME_40US; } adcCurrentConfig.acq_time = acqTime; analogUpdate(); } AnalogPinDescription g_AAnalogPinDescription[] = { // A0 - A7 { P0_4, NULL }, // A0 { P0_5, NULL }, // A1 { P0_30, NULL }, // A2 { P0_29, NULL }, // A3 { P0_31, NULL }, // A4/SDA { P0_2, NULL }, // A5/SCL { P0_28, NULL }, // A6 { P0_3, NULL } // A7 }; PinDescription g_APinDescription[] = { // D0 - D7 { P1_3, NULL, NULL, NULL }, // D0/TX { P1_10, NULL, NULL, NULL }, // D1/RX { P1_11, NULL, NULL, NULL }, // D2 { P1_12, NULL, NULL, NULL }, // D3 { P1_15, NULL, NULL, NULL }, // D4 { P1_13, NULL, NULL, NULL }, // D5 { P1_14, NULL, NULL, NULL }, // D6 { P0_23, NULL, NULL, NULL }, // D7 // D8 - D13 { P0_21, NULL, NULL, NULL }, // D8 { P0_27, NULL, NULL, NULL }, // D9 { P1_2, NULL, NULL, NULL }, // D10 { P1_1, NULL, NULL, NULL }, // D11/MOSI { P1_8, NULL, NULL, NULL }, // D12/MISO { P0_13, NULL, NULL, NULL }, // D13/SCK/LED // A0 - A7 { P0_4, NULL, NULL, NULL }, // A0 { P0_5, NULL, NULL, NULL }, // A1 { P0_30, NULL, NULL, NULL }, // A2 { P0_29, NULL, NULL, NULL }, // A3 { P0_31, NULL, NULL, NULL }, // A4/SDA { P0_2, NULL, NULL, NULL }, // A5/SCL { P0_28, NULL, NULL, NULL }, // A6 { P0_3, NULL, NULL, NULL }, // A7 // LEDs { P0_24, NULL, NULL, NULL }, // LED R { P0_16, NULL, NULL, NULL }, // LED G { P0_6, NULL, NULL, NULL }, // LED B { P1_9, NULL, NULL, NULL }, // LED PWR { P0_19, NULL, NULL, NULL }, // INT APDS // PDM { P0_17, NULL, NULL, NULL }, // PDM PWR { P0_26, NULL, NULL, NULL }, // PDM CLK { P0_25, NULL, NULL, NULL }, // PDM DIN // Internal I2C { P0_14, NULL, NULL, NULL }, // SDA2 { P0_15, NULL, NULL, NULL }, // SCL2 // Internal I2C { P1_0, NULL, NULL, NULL }, // I2C_PULL { P0_22, NULL, NULL, NULL }, // VDD_ENV_ENABLE // Extras Gpios { P0_23, NULL, NULL, NULL }, //IO47 { P0_21, NULL, NULL, NULL }, //IO48 { P0_20, NULL, NULL, NULL }, //IO50 { P0_7, NULL, NULL, NULL }, //IO45 { P0_12, NULL, NULL, NULL }, //IO46 { P0_11, NULL, NULL, NULL } //IO32 }; extern "C" { unsigned int PINCOUNT_fn() { return (sizeof(g_APinDescription) / sizeof(g_APinDescription[0])); } } #include "nrf_rtc.h" #include "nrf_uarte.h" #include "nrf_uart.h" void initVariant() { // turn power LED on pinMode(LED_PWR, OUTPUT); digitalWrite(LED_PWR, HIGH); // Errata Nano33BLE - I2C pullup is controlled by the SWO pin. // Configure the TRACEMUX to disable routing SWO signal to pin. NRF_CLOCK->TRACECONFIG = 0; // FIXME: bootloader enables interrupt on COMPARE[0], which we don't handle // Disable it here to avoid getting stuck when OVERFLOW irq is triggered nrf_rtc_event_disable(NRF_RTC1, NRF_RTC_INT_COMPARE0_MASK); nrf_rtc_int_disable(NRF_RTC1, NRF_RTC_INT_COMPARE0_MASK); // FIXME: always enable I2C pullup and power @startup // Change for maximum powersave pinMode(PIN_ENABLE_SENSORS_3V3, OUTPUT); pinMode(PIN_ENABLE_I2C_PULLUP, OUTPUT); digitalWrite(PIN_ENABLE_SENSORS_3V3, HIGH); digitalWrite(PIN_ENABLE_I2C_PULLUP, HIGH); // Disable UARTE0 which is initially enabled by the bootloader nrf_uarte_task_trigger(NRF_UARTE0, NRF_UARTE_TASK_STOPRX); while (!nrf_uarte_event_check(NRF_UARTE0, NRF_UARTE_EVENT_RXTO)) ; NRF_UARTE0->ENABLE = 0; NRF_UART0->ENABLE = 0; NRF_PWM_Type* PWM[] = { NRF_PWM0, NRF_PWM1, NRF_PWM2 #ifdef NRF_PWM3 ,NRF_PWM3 #endif }; for (unsigned int i = 0; i < (sizeof(PWM)/sizeof(PWM[0])); i++) { PWM[i]->ENABLE = 0; PWM[i]->PSEL.OUT[0] = 0xFFFFFFFFUL; } } #ifdef SERIAL_CDC static void utox8(uint32_t val, uint8_t* s) { for (int i = 0; i < 16; i=i+2) { int d = val & 0XF; val = (val >> 4); s[15 - i -1] = d > 9 ? 'A' + d - 10 : '0' + d; s[15 - i] = '\0'; } } uint8_t getUniqueSerialNumber(uint8_t* name) { #define SERIAL_NUMBER_WORD_0 NRF_FICR->DEVICEADDR[1] #define SERIAL_NUMBER_WORD_1 NRF_FICR->DEVICEADDR[0] utox8(SERIAL_NUMBER_WORD_0, &name[0]); utox8(SERIAL_NUMBER_WORD_1, &name[16]); return 32; } void _ontouch1200bps_() { __disable_irq(); NRF_POWER->GPREGRET = DFU_MAGIC_SERIAL_ONLY_RESET; NVIC_SystemReset(); } #endif