RT-Thread傳感器設備驅動框架介紹

2021-01-09 RTThreadIoT作業系統

背景與概述

Sensor 是物聯網重要的一部分,「Sensor 之於物聯網」相當於「眼睛之於人類」。人沒有眼睛就看不到這大千的花花世界,物聯網沒有了 Sensor 更是不能感知這變化萬千的世界。

現在,為物聯網開發的 Sensor 已經很多了,有加速度計(Accelerometer),磁力計(Magnetometer),陀螺儀(Gyroscope),光感計(Ambient light sensor),接近光(Proximity),氣壓計(Barometer/pressure),溼度計(Humidometer)等等。這些傳感器,世界上的各大半導體廠商都有出產,雖然增加了市場的可選擇性,同時也加大了應用程式開發的難度。因為不同的傳感器廠商、不同的傳感器都需要配套自己獨有的驅動才能運轉起來,這樣在開發應用程式的時候就需要針對不同的傳感器做適配,自然加大了開發難度。為了降低應用開發的難度,增加傳感器驅動的可復用性,我們設計了 Sensor 驅動框架。

Sensor 驅動框架的作用是:為上層提供統一的操作接口,提高上層代碼的可重用性;簡化底層驅動開發的難度,只要實現簡單的 ops(operations: 操作命令) 就可以將傳感器註冊到系統上。

整體框架

Sensor 驅動框架的整體架構圖如下:

sensor

它為上層提供的是標準 device 接口

open/close/read/write/control

,為底層驅動提供的是簡單的 ops 接口:

fetch_data/control

。並且框架支持 module(模塊),為底層存在耦合的傳感器設備提供服務。

工作原理

Sensor 設備其實是對標準設備

rt_device

的一個豐富,是在原有標準設備的基礎上增加了 Sensor 自己獨有的一部分

屬性

控制命令

,如下圖所示:

sensor

整個 Sensor 設備包括兩個部分:

繼承自標準設備的一些特性,包括:標準的控制接口 、回調函數、device_id 等。Sensor 設備獨有的部分,包括:Sensor 的類型、相關的信息、特有的控制命令、ops、以及一些 數據的結構。sensor 的結構體

Sensor 設備的結構體如下所示:

1struct rt_sensor_device2{ 3 struct rt_device parent; /* The standard device */ 4 5 struct rt_sensor_info info; /* The sensor info data */ 6 struct rt_sensor_config config; /* The sensor config data */ 7 8 void *data_buf; /* The buf of the data received */ 9 rt_size_t data_len; /* The size of the data received */1011 const struct rt_sensor_ops *ops; /* The sensor ops */1213 struct rt_sensor_module *module; /* The sensor module */14};15typedef struct rt_sensor_device *rt_sensor_t;

Sensor 的信息

struct rt_sensor_info info 裡存儲的是一些與 Sensor 自身相關的信息,在 Sensor 設備註冊的時候提供,在使用的過程中不應修改其內容。具體成員如下所示。

1struct rt_sensor_info2{ 3 rt_uint8_t type; /* The sensor type */ 4 rt_uint8_t vendor; /* Vendor of sensors */ 5 const char *model; /* model name of sensor */ 6 rt_uint8_t unit; /* unit of measurement */ 7 rt_uint8_t intf_type; /* Communication interface type */ 8 rt_int32_t range_max; /* maximum range of this sensor's value. unit is 'unit' */ 9 rt_int32_t range_min; /* minimum range of this sensor's value. unit is 'unit' */10 rt_uint32_t period_min; /* Minimum measurement period,unit:ms. zero = not a constant rate */11 rt_uint8_t fifo_max; /* Maximum depth of fifo */12};

Sensor 的類型暫時只有以下幾種,如果有新的傳感器類型,可以提 PR 添加上。

1#define RT_SENSOR_CLASS_ACCE (1) /* Accelerometer */2#define RT_SENSOR_CLASS_GYRO (2) /* Gyroscope */ 3#define RT_SENSOR_CLASS_MAG (3) /* Magnetometer */ 4#define RT_SENSOR_CLASS_TEMP (4) /* Temperature */ 5#define RT_SENSOR_CLASS_HUMI (5) /* Relative Humidity */ 6#define RT_SENSOR_CLASS_BARO (6) /* Barometer */ 7#define RT_SENSOR_CLASS_LIGHT (7) /* Ambient light */ 8#define RT_SENSOR_CLASS_PROXIMITY (8) /* Proximity */ 9#define RT_SENSOR_CLASS_HR (9) /* Heart Rate */10#define RT_SENSOR_CLASS_TVOC (10) /* TVOC Level */11#define RT_SENSOR_CLASS_NOISE (11) /* Noise Loudness */12#define RT_SENSOR_CLASS_STEP (12) /* Step sensor */

其他的幾個成員,分別是廠商、model(如:"mpu6050")、傳感器數據的單位、通信接口類型、測量的最大範圍、測量的最小範圍、最小測量周期、硬體 FIFO 的最大深度。

Sensor 的配置

Sensor 驅動框架抽象出了一些公共的配置選項,這些可配置的選項置於

struct rt_sensor_config

裡, 成員如下:

1struct rt_sensor_config2{3 struct rt_sensor_intf intf; /* sensor interface config */4 struct rt_device_pin_mode irq_pin; /* Interrupt pin, The purpose of this pin is to notification read data */5 rt_uint8_t mode; /* sensor work mode */6 rt_uint8_t power; /* sensor power mode */7 rt_uint16_t odr; /* sensor out data rate */8 rt_int32_t range; /* sensor range of measurement */9};

這些配置項中的 intf 和 irq_pin 是為了將傳感器和硬體解耦而抽象出來的,通過在底層初始化的時候傳入

struct rt_sensor_config

這個參數,完成了通信接口的解耦。

1struct rt_sensor_intf2{3 char *dev_name; /* The name of the communication device */4 rt_uint8_t type; /* Communication interface type */5 void *user_data; /* Private data for the sensor. ex. i2c addr,spi cs,control I/O */6};

其餘的一些配置項是用 Sensor 特有控制命令控制的,如下所示:

1#define RT_SENSOR_CTRL_GET_ID (0) /* 讀設備ID */2#define RT_SENSOR_CTRL_GET_INFO (1) /* 獲取設備信息 */3#define RT_SENSOR_CTRL_SET_RANGE (2) /* 設置傳感器測量範圍 */4#define RT_SENSOR_CTRL_SET_ODR (3) /* 設置傳感器數據輸出速率,unit is HZ */5#define RT_SENSOR_CTRL_SET_MODE (4) /* 設置工作模式 */6#define RT_SENSOR_CTRL_SET_POWER (5) /* 設置電源模式 */7#define RT_SENSOR_CTRL_SELF_TEST (6) /* 自檢 */

結合 ops 中的 control 接口使用,就可以完成傳感器的配置了。

Sensor 數據的存儲

為了方便數據的解析,規定每一個類型的 Sensor 都有自己獨有的數據結構,這些成員之間使用

共用體

以減少代碼量。

1/* 3-axis Data Type */2struct sensor_3_axis 3{ 4 rt_int32_t x; 5 rt_int32_t y; 6 rt_int32_t z; 7}; 8struct rt_sensor_data 9{10 rt_uint32_t timestamp; /* The timestamp when the data was received */11 rt_uint8_t type; /* The sensor type of the data */12 union13 {14 struct sensor_3_axis acce; /* Accelerometer. unit: mG */15 struct sensor_3_axis gyro; /* Gyroscope. unit: mdps */16 struct sensor_3_axis mag; /* Magnetometer. unit: mGauss */17 rt_int32_t temp; /* Temperature. unit: dCelsius */18 rt_int32_t humi; /* Relative humidity. unit: permillage */19 rt_int32_t baro; /* Pressure. unit: pascal (Pa) */20 rt_int32_t light; /* Light. unit: lux */21 rt_int32_t proximity; /* Distance. unit: centimeters */22 rt_int32_t hr; /* Heat rate. unit: HZ */23 rt_int32_t tvoc; /* TVOC. unit: permillage */24 rt_int32_t noise; /* Noise Loudness. unit: HZ */25 rt_uint32_t step; /* Step sensor. unit: 1 */26 } data;27};

特有的 ops

ops(操作函數)包含兩個函數指針, 一個的作用是獲取傳感器數據(fetch_data),另一個的作用是通過控制命令控制傳感器(control)。

1struct rt_sensor_ops2{3 rt_size_t (*fetch_data)(struct rt_sensor_device *sensor, void *buf, rt_size_t len);4 rt_err_t (*control)(struct rt_sensor_device *sensor, int cmd, void *arg);5};

註冊方式

傳感器驅動框架提供了一個 Sensor 註冊函數,通過傳入 Sensor 的控制塊,名稱,標誌位和私有數據,就可以完成傳感器設備的註冊。

1int rt_hw_sensor_register(rt_sensor_t sensor,2 const char *name,3 rt_uint32_t flag,4 void *data);

這樣看來 Sensor 驅動框架依託於標準的設備框架,只要將傳感器驅動對接到 Sensor 的 ops 上,並通過調用

rt_hw_sensor_register

函數註冊為 Sensor 設備就可以通過標準的設備接口控制傳感器了。

module支持

module 的定義是解決底層有耦合的兩個傳感器而出現的,有些傳感器既有加速度計的功能又有陀螺儀的功能,並且他們的FIFO是共用的,在 FIFO 模式下,只能將兩個類型的傳感器的數據同時讀出,這就說明他們的數據是耦合的。

為了解決這個問題,我們定義了 module 的類型

1struct rt_sensor_module2{3 rt_mutex_t lock; /* The module lock */45 rt_sensor_t sen[RT_SENSOR_MODULE_MAX]; /* The module contains a list of sensors */6 rt_uint8_t sen_num; /* Number of sensors contained in the module */7};

裡面包含有耦合的傳感器的設備控制塊指針,通過這個功能就可以在讀取陀螺儀的數據的時候,同時更新加速度計的值,解決了底層耦合的問題。

相關焦點

  • 《RT-Thread驅動框架分析》-Pin驅動
    簡要接下來做一個專輯《RT-Thread驅動框架分析》,我會按照自己的理解來描述每一個驅動。有不對的歡迎隨時來懟我。RT-Thread的版本分為兩大類,一個是完整版本,一個是nano版本。而驅動框架是相對於完整版本的。所以要了解驅動框架,只能在完整版上了解。RT-Thread提供了很多驅動框架,比如常見的外設驅動:I2C, SPI等。
  • 是的,RT-Thread 3.0.3發布了
    完善signal支持,增加rt_signal_wait函數(對應到POSIX sigwait接口);當打開finsh shell時,rtthread.h頭文件中主動包含finsh修訂rtdbg.h接口來輸出調試信息;DBG_SECTION_NAME 給出每行調試信息的前綴;DBG_LEVEL 定義調試信息的輸出等級;DBG_COLOR 定義指明是否攜帶帶顏色輸出的信息增加libc_stdio_get_console()接口,用於返回console的文件描述符(fd)更改UI engine為獨立的package;增加SPI上通用的TF/SD卡驅動
  • RPlidar A1軟體包使用教程,RT-Thread 連接 RPlidar A1 雷射雷達
    在這個時間之前,大家只要把作品分享到自己的博客/其他論壇,並提交作品連結至📫郵箱:andychen@rt-thread.com,即可參與評選!請務必報名,否則會影響評選!雷射雷達基本上已經成為無人駕駛的必備傳感器了,當然,它的成本也並不低,這篇文檔將會介紹如何利用 RT-Thread 獲取思嵐 RPLidar A1 的掃描數據。
  • 熊大生日特輯 | RT-Thread Family !一起來Party~
    所以今天大家購買柿餅派除了享受30元優惠以外,在GitHub(連結:https://github.com/RT-Thread/rt-thread)上點個star還可以再領10元優惠噢~合計40元優惠,直接在淘寶聯繫客服改價即可)  購買連結:【柿餅Pie 柿餅GUI 智能屏 非串口屏 RTThread GUI 顯示屏模組 4.3】https
  • USB設備驅動程序
    既然還沒有"驅動程序",為何能知道是"android phone"答1. windows裡已經有了USB的總線驅動程序,接入USB設備後,是"總線驅動程序"知道你是"android phone" 提示你安裝的是"設備驅動程序"
  • RT-Thread Studio V1.1.4 更新重磅來襲!亮點多多,邀你來品鑑
    下面介紹部分亮點給大家。  全新的工程創建模式全新的新建工程嚮導,基於開發板模式創建工程可以查看開發板信息,工程類型可以選擇基於常規的模板工程類型創建也可以基於示例工程類型創建新工程。暫時只為大家介紹這麼多亮點,更多亮點和改變,希望大家能親自上手體驗,去「點亮」和發現。V1.1.4 ChangeLog  1.
  • 傳感器生產製造工藝介紹
    傳感器生產製造工藝介紹 傳感器技術 發表於 2020-12-24 14:41:07 傳感器技術作為現代科技的前沿技術,同計算機技術、通訊技術並稱為信息技術的三大支柱
  • 通過Python 執行複雜的PYNQ 框架方案
    通過預處理從傳感器讀取的數據,賽靈思® Zynq 產品系列大幅度提高性能和確定性,同時降低時延。 這種被稱為 PYNQ 框架方案,能從應用處理器有效卸載不必要佔用處理器帶寬的大量重要但重複的操作。這種卸載功能對於滿足工業物聯網中邊緣應用提高的智能需求有重要意義。
  • 轉角傳感器是什麼?轉角傳感器介紹
    方向盤轉角傳感器用於檢測方向盤的中間位置、轉動方向、轉動角度和轉動速度。在電控懸架中,懸架ECU根據車速傳感器信號和方向盤轉角傳感器信號,判斷汽車轉向時側向力的大小,以控制車身的傾斜。轉角傳感器介紹:介紹轉角傳感器,是測量或監控物體轉動角度的傳感器,例如風力發電機軸轉動角度、焊接管轉動角度監控、海上平臺定位轉角測量等。正如我們所知道的,很多微小的角度變化都會影響到某些工程的整體控制,所以,對角度的實時測量或監控就顯得尤為重要。
  • MiMix4很有可能是小米的第二個受益於該傳感器的設備
    我們上周早些時候曾報導說,該設備可能即將推出,它帶有一個帶有水滴屏的108MP攝像頭傳感器,現在來自中國的最新消息證實了其即將到來。小米尚未透露有關Mi Mix 4的任何細節,但是,該設備剛剛通過JD.com列表浮出水面,但幾乎沒有或沒有細節。
  • NUS 打造智能手套,液態金屬傳感器細如髮絲,玩《戰地 5...
    微纖維傳感器:精確快速控制手勢不少玩家都知道,雙手控制遊戲的概念已經不新鮮了,但目前市面上的智能設備通常體積龐大,靈活性也有所欠缺,主要原因在於它們所依賴的是笨重的傳統傳感器。據新加坡國立大學的官方介紹,每個 InfinityGlove 包含 5 個線狀傳感器(thread-like sensors),也就是每隻手指各一個。傳感器由一根超薄的、可拉伸的橡膠狀微纖維製成,僅有頭髮絲細,中間填充有導電的液態金屬。微電流流過液態金屬會產生電讀信號,當纖維彎曲或液態金屬移動時,電讀信號會發生改變。
  • 常見的四種溫度傳感器優缺點介紹
    打開APP 常見的四種溫度傳感器優缺點介紹 y511374875 發表於 2020-12-24 10:58:54 在這篇文章中,筆者將介紹四種類型的溫度傳感器(電阻式溫度檢測器 (RTD)、熱電偶、熱敏電阻器以及具有數字和模擬接口的集成電路 (IC) 傳感器)並討論每種傳感器的優點與缺點。 從系統級的立足點來看,溫度傳感器是否適合您的應用將取決於所需的溫度範圍、準確度、線性度、解決方案成本、功能、功耗、解決方案尺寸、安裝法(表面貼裝法與通孔插裝法以及電路板外安裝法)還有必要支持電路的易設計程度。
  • 密切注意心臟:帶有ECG心率傳感器的可穿戴設備
    現在有一系列健康的設備,它們能夠發出類似於專業心電圖的脈搏波形。值得注意的是,這些可穿戴設備中的大多數都無法進行完美的監測。但是希望是,他們可以產生警示作用,為一些不知道自己患有心臟病的人預警。當然,應始終避免自我診斷,您應諮詢您的醫生以對您的讀數進行醫學解釋。以下時我們選擇的其中一些ECG佼佼者進行介紹(無廣告,僅針對技術參數和產品設計進行客觀描述)。
  • MEMS加速度傳感器在電機健康狀態監測上的應用
    隨著工業4.0深入的推進,電機已經成為了工業生產中最主要的驅動設備,廣泛應用於各個生產領域。電機在長期運行中難免會產生一些故障,如何實時監測電機工作狀態,及時診斷出電機的健康狀況就變得非常重要。據ADI代理商Excelpoint世健公司介紹,世健已經為湖南、四川等多個地區的鋼鐵、風電等客戶搭建了從傳感器到雲端的全套系統,目前進入前期導入階段。常見的加速度傳感器主要有壓電陶瓷加速度傳感器、應變式加速度傳感器、電容式加速度傳感器和MEMS加速度傳感器,傳統的電機振動監測主要選用IEPE電壓輸出型壓電加速度傳感器。
  • 利用量子隧道技術,突破自供電量子傳感器極限,不要電運行一年!
    沙塔努·查克拉巴蒂實驗室一直致力於製造能用最少能量運行的傳感器,而且該實驗室在製造更小、更高效的傳感器方面非常成功,以至於他們在基本物理定律上遇到了障礙。然而,有時當你遇到一個看似不可逾越的障礙時,你只需要求助於量子物理,並通過隧道穿過它。這就是查克拉巴蒂和聖路易斯華盛頓大學麥凱爾維工程學院研究人員所做的。
  • 全球首款用於可穿戴和耳穿戴設備的自學習人工智慧傳感器
    全球首款用於可穿戴和耳穿戴設備的自學習人工智慧傳感器 MEMS 發表於 2020-12-23 11:35:24   全球首款用於可穿戴和耳穿戴設備的自學習人工智慧傳感器
  • 開源飛控設備連接圖介紹
    豐富的傳感器接口,使開源飛控具有在不同使用場景下有不同的傳感器設備支持和自定義開發。隨著開源飛控系統的不斷發展,從第一代Pixhawk開源飛控發展至今,開源飛控已經擁有完善的開源硬體、開發環境和社區論壇,採用全集成的硬體架構,對多處硬體做出了改進,包括主控處理器;加速度計、陀螺儀和磁力計組合慣性測量單元(IMU)。
  • 輕應用介紹-用JavaScript進行嵌入式開發
    簡介 輕應用:可運行在輕量級嵌入式設備上的JavaScript應用(左圖) 輕應用框架:封裝了JavaScript引擎和API接口,用於支持輕應用開發的軟體框架(右圖)