LiteOS на основе трансплантации ультразвукового модуля Sensorhub

Интернет вещей

Резюме: В этой статье рассказывается о применении LiteOS на основе трансплантации ультразвукового модуля Sensorhub.

1. Концентратор датчика

Платформа датчиков LiteOS, или Sensor Hub, — это среда управления датчиками, основанная на операционной системе Huawei LiteOS IoT.

С развитием Интернета вещей терминалы IoT становятся все более и более интеллектуальными.Например, все больше и больше датчиков будет настраиваться на персональных носимых устройствах, умных домах, домашних медицинских и других терминалах, чтобы получать больше данных датчиков и делать терминалы более интеллектуальный.Усложняет разработку и обслуживание. Инфраструктура датчиков LiteOS единообразно управляет различными типами датчиков на терминальных устройствах IoT, таких как акселерометр, гироскоп, барометр, гигрометр и т. д. Абстрагируя различные типы интерфейсов датчиков, защищая свои аппаратные детали и достигая «аппаратной» независимости, очень удобно для разработки. , техническое обслуживание и расширение функций устройств IoT.

Платформа обнаружения LiteOS в основном включает диспетчер датчиков, диспетчер BSP и конвергентные алгоритмы.

  • Sensor Manager: Унифицированное управление взаимодействием с датчиками, например настройка датчиков, отбор проб, создание отчетов и управление.
  • BSP Manager: Унифицированный интерфейс драйвера, отвечающий за управление драйвером датчика, управление питанием и управление взаимодействием с датчиком, например за открытие, закрытие, чтение и запись датчика и обновление данных.
  • Converged Algorithms: Библиотека алгоритмов объединения (алгоритмы основаны на конкретных бизнес-моделях), в соответствии с конкретными бизнес-моделями объединение алгоритмов выполняется на конечной стороне MCU, например, алгоритмы мониторинга окружающей среды, алгоритмы шагомера и т. д., обновление традиционных и простых алгоритмов сбора данных. к интеллектуальным алгоритмам, и приложение вызывает напрямую, чтобы повысить бизнес-точность данных датчиков и уменьшить задержку сбора данных.

2. Ультразвуковой модуль SR04

Ультразвуковой дальномер HC-SR04 может обеспечивать функцию бесконтактного измерения расстояния от 2 см до 400 см, а точность измерения дальности может достигать 3 мм; модуль включает в себя ультразвуковой передатчик, приемник и схему управления. Основной принцип работы: (1) Используйте порт ввода-вывода TRIG для запуска диапазона и подачи сигнала высокого уровня не менее 10 мкс; (2) модуль автоматически отправляет 8 прямоугольных волн 40 кГц и автоматически определяет, есть ли возврат сигнала; ( 3) Сигнал возвращается, выводится высокий уровень через ЭХО порта ввода-вывода, а продолжительность высокого уровня - это время от запуска до возврата ультразвуковой волны. Тестовое расстояние = (время высокого уровняСкорость звука (340 м/с))/2 2. Физическая карта: разводка, как показано справа, VCC для источника питания 5 В, GND для земли, вход сигнала управления триггером TRIG, выход эхо-сигнала ECHO и другие четыре линии. . Рисунок 1 Физический Рисунок 3. Электрические параметры: электрические параметры Ультразвуковой модуль HC-SR04 Рабочее напряжение 5 В пост. тока Рабочий ток 15 мА Рабочая частота 40 Гц Максимальный диапазон 4 м Ближний диапазон 2 см Угол измерения 15 градусов Входной сигнал запуска 10 мкс TTL Импульсный выход Эхо-сигнал Выход TTL Сигнал уровня , пропорционально диапазону Размер 4520*15мм.

Из временной диаграммы видно, что вам нужно только обеспечить импульсный сигнал запуска более 10 мкс, и модуль отправит 8 уровней цикла 40 кГц и обнаружит эхо. Как только эхо-сигнал обнаружен, эхо-сигнал выводится. Ширина импульса эхо-сигнала пропорциональна измеренному расстоянию. Исходя из этого, расстояние можно рассчитать по временному интервалу между переданным сигналом и принятым эхо-сигналом. Формула: мкСм/58=см или мкСм/148=дюйм; или: расстояние = время высокого уровня * скорость звука (340 м/с)/2; рекомендуется, чтобы период измерения был более 60 мс, чтобы предотвратить воздействие передаваемого сигнала на эхо-сигнал.

3. HC-SR04 драйвер сенсорного концентратора

Простую приемную программу для чтения датчика можно выполнить через временную диаграмму: (здесь в качестве примеров используются GPIOA1 и GPIOA4)

uint32_t hcsr04_read (void)
{
 local_time=0;
 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);  // pull the TRIG pin HIGH
 delay(2);  // wait for 2 us


 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);  // pull the TRIG pin HIGH
 delay(10);  // wait for 10 us
 HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);  // pull the TRIG pin low

 // read the time for which the pin is high

 while (!(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_4)));  // wait for the ECHO pin to go high
 while (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_4))    // while the pin is high
  {
  local_time++;   // measure time for which the pin is high
  delay (1);
  }
 return local_time * .034/2; 
}

4. Зарегистрируйте драйвер в SensorHub.

Сначала запишите операции ввода-вывода, инициализируйте, откройте, закройте и прочитайте операции с данными

STATIC INT32 SR04Init(SensorType *sensor)
{
    (VOID)(sensor);
 
  GPIO_InitTypeDef GPIO_InitStruct;

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOA_CLK_ENABLE();

  /*Configure GPIO pin : PD11 */
  GPIO_InitStruct.Pin = GPIO_PIN_1;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /*Configure GPIO pins : PD12 PD13 PD14 PD15 */
  GPIO_InitStruct.Pin = GPIO_PIN_4;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    return LOS_OK;
}
STATIC INT32 SR04ReadData(SensorType *sensor)
{
    PRINTK("read datan");
    INT32 *data = (INT32 *)sensor->sensorData;
    data[0] =  hcsr04_read();
     return LOS_OK;
}
STATIC INT32 SR04Open(SensorType *sensor, OpenParam *para)
{
    UINT32 ret;
    (VOID)(para);

    SR04 *SR04 = (SR04 *)sensor->priv;

    if ((sensor->sensorStat == SENSOR_STAT_OPEN) && (sensor->interval == SR04Period)) {
        return LOS_OK;
    }

    if (SR04->gyroTimerId != INVALID_TIMER_ID) {
        ret = LOS_SwtmrDelete(SR04->gyroTimerId);
        SR04->gyroTimerId = INVALID_TIMER_ID;
        if (ret != LOS_OK) {
            PRINT_ERR("delete a timer failed!n");
            return LOS_NOK;
        }
    }

    // creat a timer, first parameter is ticks.
    ret = LOS_SwtmrCreate(sensor->interval, LOS_SWTMR_MODE_PERIOD, (SWTMR_PROC_FUNC)GypoTimerFunc, &SR04->gyroTimerId, (UINT32)sensor);
    if (ret != LOS_OK) {
        PRINT_ERR("creat a timer failed!n");
        return LOS_NOK;
    }

    ret = LOS_SwtmrStart(SR04->gyroTimerId);
    if (ret != LOS_OK) {
        PRINT_ERR("start timer errn");
    }

    SR04Period = sensor->interval;

    PRINTK("SR04 on.n");
    return LOS_OK;
}

STATIC INT32 SR04Close(SensorType *sensor)
{
    UINT32 ret;

    if (sensor->sensorStat == SENSOR_STAT_CLOSE) {
        PRINT_DEBUG("sr04 has been closedn");
        return LOS_OK;
    }

	__HAL_RCC_GPIOA_CLK_DISABLE();

    PRINTK("SR04 off.n");
    return LOS_OK;
}

Затем зарегистрируйте разработанный драйвер в фреймворке.

STATIC struct SensorOperation Sr04Ops = {
    .Init = SR04Init,
    .Open = SR04Open,
    .Close = SR04Close,
    .ReadData = SR04ReadData,
};

STATIC SensorType g_sensorSR04 = {
    .sensorOp = &Sr04Ops,
    .sensorData = &g_SR04Data,
    .sensorDataLen = sizeof(g_SR04Data),
    .priv = &g_SR04Priv,
    .tag = TAG_BEGIN,
    .cmd = CMD_CMN_INTERVAL_REQ,
    .interval = DEFAULT_INTERVAL,

};
VOID SR04Register(VOID)
{
    SensorRegister(&g_sensorSR04);
}

Зарегистрируйте драйвер в универсальном модуле драйвера датчика. Сегодняшняя миграция кода в основном завершена, и датчики и платы будут использоваться для проверки в будущем.

Суммировать

Есть проблема с этим драйвером,то есть это программа которая блокируется при чтении.Пробовал позже.Его нужно проектировать с таймерами и внешними прерываниями.Эту заблокированную программу можно поменять на неблокирующую,и эффективность значительно улучшен. Я объясню, как это сделать позже. Дополните этот дизайн драйвера таймерами и прерываниями, запускаемыми извне.

Нажмите «Подписаться», чтобы впервые узнать о новых технологиях HUAWEI CLOUD~