Резюме: В этой статье рассказывается о применении 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~