Arduino Atmega32U с nRF51 BLE от Adafruit ограничен 5-секундной частотой обновления?
Хотели бы попросить помощи с приведенным ниже кодом. Это модуль Adafruit Bluefruit Atmega32U LE с примерным скетчем «монитора сердечного ритма» Adafruit Arduino IDE. В коде используется аппаратная настройка SPI с кодом BLE от Adafruit между Atmega32U и nRF51822 с использованием AT-команд, встроенных в стек BLE от Adafruit.
Он работает с той же скоростью в режиме реального времени на последовательном USB-терминале Arduino IDE ПК, а также в приложении nRF Connect на телефоне Android или любом другом приложении BLE, которое может считывать «уведомления».
Проблема: при извлечении модуля из USB-порта ПК (поэтому последовательный порт останавливается и используется только BLE) скорость обновления в приложении BLE для Android снижается до 5-секундных интервалов по сравнению со скоростью, близкой к скорости реального времени при подключении. на USB. Я пробовал много вещей, в том числе комментировал команды Serial в void loop(), а также delay(), но без изменений. Как будто стек BLE от Adafruit будет иметь ограничение периода обновления. Согласно Adafruit, они не предоставляют доступ к своему стеку BLE. Но я мог бы загрузить еще один стек BLE на этот чип nRF51822. Также у меня есть Adafruit Sniffer с Wireshark, но я не эксперт в его использовании.
Как добиться частоты обновления менее 1 секунды? Поток данных не с интервалом в 1 секунду. Между показаниями может быть 10–15 секунд, но мне нужно, чтобы они обновлялись в течение 1 секунды после считывания с датчика.
https://learn.adafruit.com/adafruit-feather-32u4-bluefruit -le?view=all
#include <Arduino.h>
#include <SPI.h>
#include "Adafruit_BLE.h"
#include "Adafruit_BluefruitLE_SPI.h"
#include "Adafruit_BluefruitLE_UART.h"
#include "BluefruitConfig.h"
#if SOFTWARE_SERIAL_AVAILABLE
#include <SoftwareSerial.h>
#endif
// Создайте объект bluefruit, либо Software Serial...раскомментируйте эти строки
/*
SoftwareSerial bluefruitSS = SoftwareSerial(BLUEFRUIT_SWUART_TXD_PIN, BLUEFRUIT_SWUART_RXD_PIN);
Adafruit_BluefruitLE_UART ble(bluefruitSS, BLUEFRUIT_UART_MODE_PIN,
BLUEFRUIT_UART_CTS_PIN, BLUEFRUIT_UART_RTS_PIN);
*/
/* ...or hardware serial, which does not need the RTS/CTS pins. Uncomment this line */
// Adafruit_BluefruitLE_UART ble(BLUEFRUIT_HWSERIAL_NAME, BLUEFRUIT_UART_MODE_PIN);
/* ...hardware SPI, using SCK/MOSI/MISO hardware SPI pins and then user selected CS/IRQ/RST */
Adafruit_BluefruitLE_SPI ble(BLUEFRUIT_SPI_CS, BLUEFRUIT_SPI_IRQ, BLUEFRUIT_SPI_RST);
/* ...software SPI, using SCK/MOSI/MISO user-defined SPI pins and then user selected CS/IRQ/RST */
// Adafruit_BluefruitLE_SPI ble(BLUEFRUIT_SPI_SCK, BLUEFRUIT_SPI_MISO,
// БЛУФРУИТ_SPI_MOSI, БЛУФРУИТ_SPI_CS,
// BLUEFRUIT_SPI_IRQ, BLUEFRUIT_SPI_RST);
// Маленький помощник
void error(const __FlashStringHelper*err) {
Serial.println(err);
while (1);
}
/* The service information */
int32_t hrmServiceId;
int32_t hrmMeasureCharId;
int32_t hrmLocationCharId;
/**************************************************************************/
/*!
@brief Sets up the HW an the BLE module (this function is called
automatically on startup)
*/
/**************************************************************************/
void setup(void)
{
while (!Serial); // требуется для Flora & Микро
delay(500);
boolean success;
Serial.begin(115200);
Serial.println(F("Adafruit Bluefruit Heart Rate Monitor (HRM) Example"));
Serial.println(F("---------------------------------------------------"));
randomSeed(micros());
/* Initialise the module */
Serial.print(F("Initialising the Bluefruit LE module: "));
if ( !ble.begin(VERBOSE_MODE) )
{
error(F("Couldn't find Bluefruit, make sure it's in CoMmanD mode & check wiring?"));
}
Serial.println( F("OK!") );
/* Perform a factory reset to make sure everything is in a known state */
Serial.println(F("Performing a factory reset: "));
if (! ble.factoryReset() ){
error(F("Couldn't factory reset"));
}
/* Disable command echo from Bluefruit */
ble.echo(false);
Serial.println("Requesting Bluefruit info:");
/* Print Bluefruit information */
ble.info();
// эта строка особенно необходима для Флоры, но это хорошая идея
// в любом случае для супер длинных строк впереди!
// ble.setInterCharWriteDelay(5); // 5 мс
/* Change the device name to make it easier to find */
Serial.println(F("Setting device name to 'Bluefruit HRM': "));
if (! ble.sendCommandCheckOK(F("AT+GAPDEVNAME=Bluefruit HRM")) ) {
error(F("Could not set device name?"));
}
/* Add the Heart Rate Service definition */
/* Service ID should be 1 */
Serial.println(F("Adding the Heart Rate Service definition (UUID = 0x180D): "));
success = ble.sendCommandWithIntReply( F("AT+GATTADDSERVICE=UUID=0x180D"), &hrmServiceId);
if (! success) {
error(F("Could not add HRM service"));
}
/* Add the Heart Rate Measurement characteristic */
/* Chars ID for Measurement should be 1 */
Serial.println(F("Adding the Heart Rate Measurement characteristic (UUID = 0x2A37): "));
success = ble.sendCommandWithIntReply( F("AT+GATTADDCHAR=UUID=0x2A37, PROPERTIES=0x10, MIN_LEN=2, MAX_LEN=3, VALUE=00-40"), &hrmMeasureCharId);
if (! success) {
error(F("Could not add HRM characteristic"));
}
/* Add the Body Sensor Location characteristic */
/* Chars ID for Body should be 2 */
Serial.println(F("Adding the Body Sensor Location characteristic (UUID = 0x2A38): "));
success = ble.sendCommandWithIntReply( F("AT+GATTADDCHAR=UUID=0x2A38, PROPERTIES=0x02, MIN_LEN=1, VALUE=3"), &hrmLocationCharId);
if (! success) {
error(F("Could not add BSL characteristic"));
}
/* Add the Heart Rate Service to the advertising data (needed for Nordic apps to detect the service) */
Serial.print(F("Adding Heart Rate Service UUID to the advertising payload: "));
ble.sendCommandCheckOK( F("AT+GAPSETADVDATA=02-01-06-05-02-0d-18-0a-18") );
/* Reset the device for the new service setting changes to take effect */
Serial.print(F("Performing a SW reset (service changes require a reset): "));
ble.reset();
Serial.println();
}
/** Send randomized heart rate data continuously **/
void loop(void)
{
int heart_rate = random(50, 100);
//Serial.print(F("Обновление значения HRM до "));
//Serial.print(heart_rate);
// Serial.println(F(" BPM"));
/* Command is sent when \n (\r) or println is called */
/* AT+GATTCHAR=CharacteristicID,value */
ble.print( F("AT+GATTCHAR=") );
ble.print( hrmMeasureCharId );
ble.print( F(",00-") );
ble.println(heart_rate, HEX);
/* Check if command executed OK */
// если ( !ble.waitForOK() )
// {
// Serial.println(F("Не удалось получить ответ!"));
//}
/* Delay before next measurement update */
// delay(1000);
}
/////////////////А НИЖЕ ВКЛАДКА BluefruitConfig.h в IDE ARDUINO --Это отдельный файл на новой вкладке в IDE//////// ////////..
// ОБЩИЕ НАСТРОЙКИ
// ------------------------------------------------ -------------------------------------------------------------
// Эти настройки используются как в режиме SW UART, HW UART, так и в режиме SPI
// ------------------------------------------------ -------------------------------------------------------------
#define BUFSIZE 128 // Размер буфера чтения для входящих данных
#define VERBOSE_MODE true // Если установлено значение «true», разрешает вывод отладки
// ПРОГРАММНЫЕ НАСТРОЙКИ UART
// ------------------------------------------------ -------------------------------------------------------------
// Следующие макросы объявляют контакты, которые будут использоваться для серийного номера 'SW'.
// Вы должны использовать эту опцию, если вы подключаете UART Friend к UNO
// ------------------------------------------------ -------------------------------------------------------------
#define BLUEFRUIT_SWUART_RXD_PIN 9 // Требуется для прогрмаммного последовательного порта!
#define BLUEFRUIT_SWUART_TXD_PIN 10 // Требуется для прогрмаммного последовательного порта!
#define BLUEFRUIT_UART_CTS_PIN 11 // Требуется для прогрмаммного последовательного порта!
#define BLUEFRUIT_UART_RTS_PIN 8 // Необязательно, установите значение -1, если не используется
// АППАРАТНЫЕ НАСТРОЙКИ UART
// ------------------------------------------------ -------------------------------------------------------------
// Следующие макросы объявляют используемый вами последовательный порт HW. Раскомментировать
// эта строка, если вы подключаете BLE к Leonardo/Micro или Flora
// ------------------------------------------------ -------------------------------------------------------------
#ifdef Serial1 // это позволяет не жаловаться на компиляцию, если нет Serial1
#define BLUEFRUIT_HWSERIAL_NAME Serial1
#endif
// ОБЩИЕ НАСТРОЙКИ UART
// ------------------------------------------------ -------------------------------------------------------------
// Следующее устанавливает необязательный контакт Mode, это рекомендуется, но не обязательно
// ------------------------------------------------ -------------------------------------------------------------
#define BLUEFRUIT_UART_MODE_PIN 12 // Установите в -1, если не используется
// ОБЩИЕ НАСТРОЙКИ SPI
// ------------------------------------------------ -------------------------------------------------------------
// Следующие макросы объявляют контакты, которые будут использоваться для связи HW и SW SPI.
// SCK, MISO и MOSI должны быть подключены к контактам HW SPI на Uno, когда
// с использованием аппаратного SPI. Это следует использовать с модулями Bluefruit LE на базе nRF51822.
// которые используют SPI (Bluefruit LE SPI Friend).
// ------------------------------------------------ -------------------------------------------------------------
#define BLUEFRUIT_SPI_CS 8
#define BLUEFRUIT_SPI_IRQ 7
#define BLUEFRUIT_SPI_RST 4 // Необязательно, но рекомендуется, установите значение -1, если не используется
// ПРОГРАММНЫЕ НАСТРОЙКИ SPI
// ------------------------------------------------ -------------------------------------------------------------
// Следующие макросы объявляют контакты, которые будут использоваться для связи SW SPI.
// Это следует использовать с модулями Bluefruit LE на базе nRF51822, которые используют SPI
// (Bluefruit LE SPI Friend).
// ------------------------------------------------ -------------------------------------------------------------
#define BLUEFRUIT_SPI_SCK 13
#define BLUEFRUIT_SPI_MISO 12
#define BLUEFRUIT_SPI_MOSI 11
@TommyS, 👍1
Обсуждение1 ответ
Лучший ответ:
Режим "подробной" проверки ошибок для отладки на вкладке "BluefruitConfig.h" замедлял поток данных BLE. Я изменил его с «true» на «false», чтобы отключить его.
#define VERBOSE_MODE true // Если установлено значение "true", включается вывод отладки
- Запись загрузчика на Adafruit Feather 32u4
- Аппаратный SPI Arduino NANO не работает
- Дата и время GPS не отображаются правильно в Arduino Uno,NEO6M GPS модуль
- Adafruit Micro-SD breakout не инициализируется на MEGA 2560
- ADXL345 выдает ошибку проводки в режиме SPI
- Красный светодиод не выключается на игровой площадке Adafruit Circuit Classic
- Adafruit Feather 32u4 BLE совместим с программным SPI?
- Микропроект Arduino с низким энергопотреблением Bluetooth
Спасибо @Edgar Bonet за помощь в редактировании формата кода. Ценить это. Я немного опоздал, разобравшись., @TommyS
сначала удалите
пока (!Serial);
, @JurajЯ удалил «пока (! Serial)», и все еще есть 5-секундная задержка в приложениях для Android и iOS, получающих данные. Это вполне обычные 5 секунд, а не случайные интервалы. Кроме того, в void loop() не осталось ничего, что могло бы замедлить работу. Если я открою коробку последовательного терминала в среде разработки Arduino IDE, данные будут передаваться на полной скорости в режиме реального времени. Интересно, есть ли какая-то ошибка в стеке Adafruit BLE? Исходный код не выдается. Хотите знать, есть ли способ добавить код для запуска последовательного терминала (или что-то в этом роде) без фактического подключения USB-кабеля к ПК?, @TommyS
Как я могу проверить BLE на максимальную скорость? Я запустил пример программы Adafruit BLE, которая тестировала сторону UART BLE и имела поток данных около 1-2 КБ/с, но эта программа сердечного ритма использует GATT BLE, а не UART., @TommyS
попробуйте удалить Serial.begin или добавить Serial.end() в конце setup(), @Juraj
Раскомментирован Serial.begin и добавлен Serial.end() и та же 5-секундная задержка, но когда последовательный терминал Arduino IDE активен на ПК, данные передаются быстро. Я добавил 10-секундную задержку в void loop(), и данные поступали с 10-секундными интервалами в приложении iOS. Затем я активировал окно последовательного терминала Arduino IDE на ПК, и данные оставались с 10-секундными интервалами. Я думаю, что задержка связана с стеком Adafruit BLE. BLE использует аппаратный SPI, не знакомый с SPI... собираюсь проверить его., @TommyS
Я также собираюсь переустановить файлы библиотеки поддержки Adafruit BLE для Arduino., @TommyS
Похоже, теперь это работает. Я собираюсь проверить это, но, похоже, режим «подробной» проверки ошибок замедлил поток данных BLE. Я изменил его с «true» на «false», чтобы отключить его., @TommyS
@Juraj, спасибо за помощь. Это помогло мне сузить круг вопросов, на которых следует сосредоточиться, и в конечном итоге привело к решению., @TommyS