Максимальная скорость интервала соединения bluefruit NRF52 (connInterval)

У меня есть Adafruit Bluefruit NRF52, подключенный к 9-осевому датчику ориентации Adafruit BNO055, который собирает 3 оси абсолютной ориентации плюс 3 оси ускорения (всего 6 поплавков) и отправляет сигнал через Bluetooth через bleuart. Мне нужно, чтобы bleuart обновлял каждые 7,5 миллисекунд новой строкой значений, но когда я запускаю его, он не печатает более 20 строк новых строк значений каждую секунду. По сути, мне нужно, чтобы значения обновлялись как можно быстрее, так как я измеряю очень высокую скорость и точность воспроизведения.

В начале каждой строки у меня также есть трехзначное число, которое представляет состояние калибровки каждого датчика в IMU. Каждая напечатанная строка выглядит примерно так:

303 68.69   4.19    -2.19   -0.12   0.14    -0.40

В настоящее время я транслирую на свой iphone последнюю версию iOs, которая теоретически может обрабатывать интервалы 7,5 мс.

Я читал, что решение может состоять в том, чтобы буферизовать значения и пересылать их в большем куске через большие интервалы соединения, но я не уверен, как это сделать.

Мой соответствующий код Arduino ниже:

Bluefruit.setConnIntervalMS(7.5, 20);

void loop()
{
    imu::Vector<3> accel = 
    bno.getVector(Adafruit_BNO055::VECTOR_LINEARACCEL);

    /* Get a new sensor event */
    sensors_event_t event;
    bno.getEvent(&event);

    /* Display the floating point data */
    bleuart.print(event.orientation.x);
    bleuart.print("\t");
    bleuart.print(event.orientation.y);
    bleuart.print("\t");
    bleuart.print(event.orientation.z);
    bleuart.print("\t");

    /* Display the floating point data for Linear Acceleration */
    bleuart.print(accel.x());
    bleuart.print("\t");
    bleuart.print(accel.y());
    bleuart.print("\t");
    bleuart.print(accel.z());
    bleuart.print("\n");
}

1 ответ

Решение

iOS фактически не поддерживает интервал соединения 7,5 мс. Проверьте раздел параметров соединения (11.6) в руководстве разработчика Apple. Тот факт, что вы указываете низкий уровень КИ, не означает, что вы его получите. В этом сценарии nRF52 является ведомым устройством и запрашивает только низкий интервал от главного устройства (вашего телефона). Мастер, если он этого пожелает, может полностью игнорировать ваш запрос.

Вам было бы лучше, поскольку вы уже избежали этого, буферизировать ваши данные и отправлять их через пользовательские характеристики. Выясните, сколько байтов вам нужно, и, возможно, вы можете упаковать пару чтений в одну запись BLE. Если вы действительно боретесь с пропускной способностью, то вам понадобится специальный сервис с несколькими характеристиками. Недавно я работал над проектом, который транслирует 8 каналов данных (~125 Гц /16-бит) по BLE с тремя характеристиками, и это граничит с максимальной пропускной способностью, которую вы можете достичь.

В качестве отступления: оценка пропускной способности по количеству строк, напечатанных в секунду, является большой нет, нет. Функции печати, как правило, имеют огромные накладные расходы и негативно влияют на измеренную пропускную способность.

Дайте мне знать, если я могу помочь дальше.

Другие вопросы по тегам