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

, 👍1

Обсуждение

Спасибо @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


1 ответ


Лучший ответ:

0

Режим "подробной" проверки ошибок для отладки на вкладке "BluefruitConfig.h" замедлял поток данных BLE. Я изменил его с «true» на «false», чтобы отключить его.

#define VERBOSE_MODE true  // Если установлено значение "true", включается вывод отладки
,