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