RT-thread内核之IO设备管理系统

RT-Thread系统的IO设备管理模块为上层应用提供了一个对设备进行访问的通用抽象接口,而对于下层设备来说则提供了底层设备驱动框架,并通过定义的数据结构对设备信息和底层设备驱动进行管理。从系统整体位置来说I/O设备管理模块相当于底层设备驱动和上层应用之间的一个中间层。

      I/O管理模块实现了对设备驱动程序的封装:设备驱动程序的实现与I/O管理模块独立,提高了模块的可移植性。应用程序通过I/O管理模块提供的标准接口访问底层设备,设备驱动程序的升级不会对上层应用产生影响。这种方式使得与设备的硬件操作相关的代码与应用相隔离,双方只需各自关注自己的功能,这降低了代码的复杂性,提高了系统的可靠性。

一、I/O设备管理控制块:在include/rtdef.h中:

复制代码
typedef struct rt_device *rt_device_t;
/**
 * Device structure
 */
struct rt_device
{
    struct rt_object          parent;                   /**< inherit from rt_object *///内核对象

    enum rt_device_class_type type;                     /**< device type */           //IO设备类型
    rt_uint16_t               flag;                     /**< device flag */           //设备标志
    rt_uint16_t               open_flag;                /**< device open flag */      //设备打开标志  

    rt_uint8_t                ref_count;                /**< reference count */       //打开计数值。设备注册时初始为0,每打开一次加1,每关闭一次减1。主要用于设备多次打开后,要关闭时判断是否完全关闭。
    rt_uint8_t                device_id;                /**< 0 - 255 */               //设备ID 

    /* device call back */
    rt_err_t (*rx_indicate)(rt_device_t dev, rt_size_t size);                         //数据接收回调函数  
    rt_err_t (*tx_complete)(rt_device_t dev, void *buffer);                           //数据发送完回调函数  

    /* common device interface */
    rt_err_t  (*init)   (rt_device_t dev);                                            //初始化通用接口  
    rt_err_t  (*open)   (rt_device_t dev, rt_uint16_t oflag);                         //打开通用接口
    rt_err_t  (*close)  (rt_device_t dev);                                            //关闭通用接口  
    rt_size_t (*read)   (rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size);//读设备通用接口
    rt_size_t (*write)  (rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size);//写设备通用接口
    rt_err_t  (*control)(rt_device_t dev, rt_uint8_t cmd, void *args);                //控制通用接口

    void                     *user_data;                /**< device private data */   //私有数据 
};

在以前版本的设备控制块中,还有以下:
/* 用于支持电源管理的函数接口 */
#ifdef RT_USING_DEVICE_SUSPEND  
  rt_err_t (*suspend) (rt_device_t dev); //挂起设备  
 rt_err_t (*resumed) (rt_device_t dev); //还原设备  
#endif
复制代码

从设备控制块,我们可以看到,每个设备对象都会在内核中维护一个设备控制块结构,这种结构是使设备对象继承rt_object基类,然后形成rt_device设备类型。

其中设备类型type为一枚举变量,在include/rtdef.h中定义:

复制代码
/**
 * device (I/O) class type
 */
enum rt_device_class_type
{
    RT_Device_Class_Char = 0,                           /**< character device */    //字符设备
    RT_Device_Class_Block,                              /**< block device */        //块设备
    RT_Device_Class_NetIf,                              /**< net interface */       //网络设备
    RT_Device_Class_MTD,                                /**< memory device */       //内存设备
    RT_Device_Class_CAN,                                /**< CAN device */          //CAN设备
    RT_Device_Class_RTC,                                /**< RTC device */          //RTC设备
    RT_Device_Class_Sound,                              /**< Sound device */        //音频设备
    RT_Device_Class_Graphic,                            /**< Graphic device */      //图形显示设备
    RT_Device_Class_I2CBUS,                             /**< I2C bus device */      //I2C总线设备
    RT_Device_Class_USBDevice,                          /**< USB slave device */    //USB从设备
    RT_Device_Class_USBHost,                            /**< USB host bus */        //USB主设备
    RT_Device_Class_SPIBUS,                             /**< SPI bus device */      //SPI总线设备
    RT_Device_Class_SPIDevice,                          /**< SPI device */          //SPI接口设备
    RT_Device_Class_SDIO,                               /**< SDIO bus device */     //SDIO总线设备
    RT_Device_Class_PM,                                 /**< PM pseudo device */    //电源管理伪设备
    RT_Device_Class_Pipe,                               /**< Pipe device */         //管道设备
    RT_Device_Class_Portal,                             /**< Portal device */       //传输设备
    RT_Device_Class_Miscellaneous,                      /**< Miscellaneous device *///其他设备
    RT_Device_Class_Unknown                             /**< unknown device */      //未知设备
};
复制代码

二、I/O设备管理函数接口:在src/device.c中

复制代码
注册设备:
rt_err_t rt_device_register(rt_device_t dev,               //设备句柄
                            const char *name,              //设备名称
                            rt_uint16_t flags);            //设备标志
一个设备能够被上层应用访问前,需要先把这个设备注册到系统中,并添加一些相应的属性。这些注册的设备均可以通过设备名,采用“查找设备口”的方式来查找,从而获得该设备控制块(或设备句柄)。
flags参数支持下列参数(可以采用或的方式支持多种参数):
#define RT_DEVICE_FLAG_DEACTIVATE       0x000           /**< device is not not initialized *///未初始化设备
#define RT_DEVICE_FLAG_RDONLY           0x001           /**< read only */                    //只读设备
#define RT_DEVICE_FLAG_WRONLY           0x002           /**< write only */                   //只写设备
#define RT_DEVICE_FLAG_RDWR             0x003           /**< read and write */               //读写设备
#define RT_DEVICE_FLAG_REMOVABLE        0x004           /**< removable device */             //可移除设备
#define RT_DEVICE_FLAG_STANDALONE       0x008           /**< standalone device */            //独立设备
#define RT_DEVICE_FLAG_ACTIVATED        0x010           /**< device is activated */          //已激活设备
#define RT_DEVICE_FLAG_SUSPENDED        0x020           /**< device is suspended */          //挂起设备
#define RT_DEVICE_FLAG_STREAM           0x040           /**< stream mode */                  //设备处于流模式
#define RT_DEVICE_FLAG_INT_RX           0x100           /**< INT mode on Rx */               //设备处于中断接收模式
#define RT_DEVICE_FLAG_DMA_RX           0x200           /**< DMA mode on Rx */               //设备处于DMA接收模式
#define RT_DEVICE_FLAG_INT_TX           0x400           /**< INT mode on Tx */               //设备处于中断发送模式
#define RT_DEVICE_FLAG_DMA_TX           0x800           /**< DMA mode on Tx */               //设备处于DMA发送模式
设备流模式RT_DEVICE_FLAG_STREAM参数用于向串口终端输出字符串:当输出的字符是“\n”时,自动在前面补一个“\r”做分行。警告:应当避免重复注册已经注册的设备,以及注册已有名字的设备驱动程序。

卸载设备:
rt_err_t rt_device_unregister(rt_device_t dev);
将设备从设备系统中卸载,被卸载的设备将不能再通过“查找设备接口”被查找到。注:卸载设备并不会释放设备控制块所占用的内存。
复制代码
复制代码
初始化所有设备:
rt_err_t rt_device_init_all(void);
初始化所有注册到设备对象管理器中的未初始化的设备。注:自版本1.2.x,该函数不再需要在系统初始化调用,因为在上层应用中打开设备时会进行相应设备初始化。

初始化设备:
rt_err_t rt_device_init(rt_device_t dev);
当一个设备初始化完成后它的flags域中的RT_DEVICE_FLAG_ACTIVATED应该被置位。如果设备的flags域已经是RT_DEVICE_FLAG_ACTIVATED,调用这个接口将不再重复做初始化。返回dev->init函数返回值RT_EOK。
注:在设备打开时rt_device_open时会调用该函数先初始化需要打开的设备。
查找设备:
rt_device_t rt_device_find(const char *name);
使用这个函数接口时,系统会在设备对象类型所对应的对象容器中根据设备名称遍历寻找设备对象,然后返回该设备句柄,如果没有找到相应的设备对象,则返回RT_NULL。
复制代码
复制代码
打开设备:
rt_err_t rt_device_open(rt_device_t dev, rt_uint16_t oflag);
根据设备控制块来打开设备,其中访问模式oflags支持以下列表中的参数:
#define RT_DEVICE_OFLAG_CLOSE           0x000           /**< device is closed */ //已关闭模式
#define RT_DEVICE_OFLAG_RDONLY          0x001           /**< read only access */ //只读模式访问
#define RT_DEVICE_OFLAG_WRONLY          0x002           /**< write only access *///只写模式访问
#define RT_DEVICE_OFLAG_RDWR            0x003           /**< read and write */   //读写模式访问
#define RT_DEVICE_OFLAG_OPEN            0x008           /**< device is opened */ //已打开模式
返回dev->open函数返回值。注: 如果设备flags域包含RT_DEVICE_FLAG_STANDALONE参数,将不允许重复打开。

关闭设备:
rt_err_t rt_device_close(rt_device_t dev);
根据设备控制块来关闭设备。返回dev->close函数返回值。
复制代码
复制代码
读设备:
rt_size_t rt_device_read(rt_device_t dev,                     //设备句柄
                         rt_off_t    pos,                     //待读取数据的偏移量
                         void       *buffer,                  //读取的数据存放地址
                         rt_size_t   size)                    //读取数据的大小
根据设备控制块来读取设备。根据底层驱动的实现,通常这个接口并不会阻塞上层应用线程。
返回读到数据的实际大小(以字节为单位);如果返回0,则需要读取当前线程的errno来判断错误状态。

写设备:
rt_size_t rt_device_write(rt_device_t dev,                     //设备句柄
                          rt_off_t    pos,                     //待写入数据的存放偏移量
                          const void *buffer,                  //待写入数据源地址
                          rt_size_t   size)                    //待写入数据大小
根据设备控制块来写入设备。根据底层驱动的实现,通常这个接口也不会阻塞上层应用线程。
返回写入数据的实际大小(以字节为单位);如果返回0,则需要读取当前线程的errno来判断错误状态。
注: 在RT
-Thread的块设备中,从1.0.0版本开始,rt_device_read()和rt_device_write()接口的pos、size参数按照以块为单位。0.3.x以前的版本则按字节为单位。
复制代码
复制代码
控制设备:
rt_err_t rt_device_control(rt_device_t dev, rt_uint8_t cmd, void *arg);
dev:设备句柄
cmd:命令控制字,这个参数通常与设备驱动程序相关
arg:控制的参数
返回dev->control函数返回值。

设置数据接收指示回调函数:
rt_err_t rt_device_set_rx_indicate(rt_device_t dev,      //设备句柄 
     rt_err_t (*rx_ind)(rt_device_t dev, rt_size_t size))//接收回调函数
设置一个回调函数,当硬件设备收到数据时回调以通知用程序有数据到达,但一般只是进行些简单的操作,如释放信号量,而让另一个接收线程来处理接收到的数据
在调用这个函数时,回调函数rx_ind由调用者提供。当硬件设备接收到数据时,会回调这个函数并把收到的数据长度放在size参数中传递给上层应用。上层应用线程应在收到指示后,立刻从设备中读取数据。返回RT_EOK。

设置发送完成指示回调函数:
rt_err_trt_device_set_tx_complete(rt_device_t dev,     //设备句柄 
    rt_err_t (*tx_done)(rt_device_t dev, void *buffer))//发送回调函数
在上层应用调用rt_device_write写入数据时,如果底层硬件能够支持自动发送,那么上层应用可以设置一个回调函数。这个回调函数会在底层硬件给出的发送完成后(例如DMA传送完成或FIFO已经写入完毕产生完成中断时)被调用。
调用这个函数时,回调函数tx_done参数由调用者提供,当硬件设备发送完数据时,由驱动程序回调这个函数并把发送完成的数据块地址buffer做为参数传递给上层应用。上层应用(线程)在收到指示时应根据发送buffer的情况,释放buffer内存块或将其做为下一个写数据的缓存。返回RT_EOK。
复制代码

 三、设备底层驱动实现:

这些驱动实现的底层接口是上层应用最终访问的落脚点,例如上层应用调用rt_device_read接口进行设备读取数据操作,上层应先调用rt_device_find获得相对应的设备句柄,而在调用rt_device_read时,就是使用这个设备句柄所对应驱动的driver_read。上述的接口是一一对应关系。I/O设备模块提供的这六个接口(rt_device_init/open/read/write/control),对应到设备驱动程序的六个接口(driver_init/open/read/write/control等),可以认为是底层设备驱动必须提供的接口。

init:设备初始化。设备初始化后,设备控制块的flag会被置成激活状态(RT_DEVICE_FLAG_ACTIVATED)。如果设备控制块中的flag标志已经设置成激活状 态,那么再运行初始化接口时,会立刻返回,而不会重新进行初始化。

open:打开设备。有些设备并不是系统一启动就已经打开开始运行或者需要进行数据接收,但如果上层应用还未准备好,设备也不应默认已经使能并开始接收数据。所以建议在写底层驱动程序时,应在调用open接口时才使能设备。

close:关闭设备。建议在打开设备时,设备驱动自行维护一个打开计数,在打开设备时进行+1操作,在关闭设备时进行-1操作, 当计数器变为0时,进行真正的关闭操作。

read:从设备中读取数据。参数pos指出读取数据的偏移量,但是有些设备并不一定需要指定偏移量,例如串口设备,设备驱动应忽略这个参数。而对于块设备来说,pos以及size都是以块设备的 数据块大小做为单位的。这个接口                           返回的 类型是rt_size_t,即读到的字节数或块数目。正常情况下应 该会返回参数中size的数值,如果返回零请设置对应的errno值。

write:向设备中写入数据。参数pos指出写入数据的偏移量。与读操作类似,对于块设备来说,pos以及size都是以块设备的数据块 大小做为单位的。这个接口返回的类型是rt_size_t,即真实写入数据的字节数或块数目。正常情况下应该会返回参数中size的数值,如果返回零请设置对应的errno值。

control:根据不同的cmd命令控制设备。命令往往是由底层各类设备驱动自定义实现。例如参数RT_DEVICE_CTRL_BLK_GETGEOME,意思是获取块设备的大小信息。

底层驱动实现步骤:

• 按照RT-Thread的对象模型,扩展一个对象有两种方式:
  (1)定义自己的私有数据结构,然后赋值到RT-Thread设备控制块的user_data指针上;
  (2)从struct rt_device结构中进行派生。
• 实现RT-Thread I/O设备模块中定义的6个公共设备接口,开始可以是空函数(返回类型是rt_err_t的可默认返回RT_EOK);
• 根据自己的设备类型定义自己的私有数据域。特别是在可能有多个相类似设备的情况下(例如串口1、2),设备接口可以共用同一套接口,不同的只是各自的数据域(例如寄存器基地址);
• 根据设备的类型,注册到RT-Thread设备框架中,即调用rt_device_register接口进行注册。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
快递分拣设备--前端伸缩机简介伸缩皮带输送机的使用,缩短了人工往返搬运物料的距离,可以缩短货物装卸货时间,降低劳动强度,减少货品损伤,降低装卸成本,提高工作效率,伸缩皮带输送机最先用于物流快递,烟草行业。目前伸缩机一般都用PLC来实现,一旦量大了,对于设备厂商来说,价格贵是一方面;还有很多客户想实时得知设备的运行状态,所以做了这款可以联网的伸缩机。 硬件说明本项目,主要实现ARTPI控制系统,执行系统,网络系统。控制系统驱动网络系统与上位机通信。上位机通过指令的发送,通过控制系统来控制执行系统完成伸综缩机上升,下降,伸出,缩回等功能;上位机也可以实时读取当前设备的运行状态。 开发环境 硬件:ART-PI 扩展板:控制底板,W5500网络模块 RT-Thread版本:RT-Thread V 4.0.3 开发工具及版本:MDK 5.26 RT-Thread使用情况概述内核部分:调度器,信号量,消息队列。 调度器:创建多个线程来实现不同的工作。 信号量:用来同步线程。 消息队列:用来实现线程之间传递的数据。 组件部分:SPI框架, SAL 套接字抽象层,LWIP 软件包:WIZnet,netdev,network-sample 本项目主要是两块功能: 1.网络通信 工控行业,还是以有线传输为主。本项目主要采用W5500网络模块,设备为TCP SERVER,与上位机通信,上位机为TCP CLIENT。采集当前信号状态。 2.输入输出控制 检测信号的输入和控制信号的输出。 软件框架说明程序开始,等待各个模块的初始化成功,主任务同时在查询两个队列,一个是输入信号队列是否有数据过来,另外一个是网络队列是否有数据请示。如果有则进行处理,没有则任务实时查询。 软件模块的说明: 1.网络通信任务:TCPPROCESS_TASK(void *parameter) 主要是实时获取上位机的数据,与上位的数据进行收发处理。 2.输入输出任务: main(void) 主要检测IO口的输入输出功能。 3.信号处理任务:MASTER_TASK(void *parameter) 主要是通过接收前面两个任务的信号量,进行数据的判断并数据发送。 硬件现场图视频: 比赛感悟非常感谢这次RT-Thread公司能够提供ART-PI开发板,而且ART-PI非常适合上手,技术支持也做得非常到位。以为一直对RTThread这个系统用得不是很熟练,因为我们公司主要是以做工控为主的,基本上都 是以FreeRTOS为主,因为FreeRTOS更加贴近底层,自己更好掌握,用了RTThread,因为封装了太多层了,生怕万一出了什么问题解决不了。通过这次的大赛,使我增加了对使用RTThread系统 的信心,因为软件包真的太好用了,当然也希望有更多的人,包括自己能够有能力和机会分享和维护软件包。最后感谢主办方提供了这么好的一个平台!
风速监测报警作者:苏庆洪 概述风速监测报警系统基于 MCU芯片开发,支持采集多路从机分节点的风速数据,通过无线主从传输,主机收集数据,通过显示屏实时监视,在风速超过报警值时,通过GPIO输出接点信号,启动预警,降低自然风灾害对生命财产损失的风险。点对点无线传输距离可达 2000m ~ 3000m,具有传输距离远的特点,通过组网可以覆盖大面积预警区域,该系统适用于野外对风速敏感的设备,房屋进行监测,特别是各风景名胜区,地处名山大川,其载客索道缆车,当线路上风速过大时,可以和主控系统联动,进行减速和停机控制。 开发环境硬件:stm32f103-atk-mini RT-Thread版本:RT-Thread V 4.0.3 开发工具及版本:MDK 5.25 RT-Thread使用情况概述内核部分:调度器,信号量,消息队列。 调度器:创建多个线程来实现不同的工作。 信号量:用来同步线程。 设备框架:通过 RT-Thread提供的 I/O 设备管理接口来访问串口硬件。 硬件框架从机MCU 定时读取 风速传感器数据,然后通过 ATK-LORA 传输到主机,主机对数据进行比例运算处理,LCD显示和GPIO输出 软件框架说明MCU 上电之后首先完成板级外设的初始化,图形界面littleVGL初始化,定时请求数据,串口中断释放信号量,线程实时处理数据,并显示、控制。 软件模块说明主机创建了3个线程,1个信号量。 main:完成初始化,创建信号量,打开串口设备,设置中断响应函数,创建线程,定时请求从机数据。 lcd_thread_entry:开启littlevgl的事务处理lv_task_handler()。 usart_thread_entry:take信号量的方式,获取到信号量之后,开始数据接收,正确收到数据后,显示,并输出IO信号。 演示效果模拟仪表显示,绿色指针为当前风速值,红色指针为故障上限,黄色指针为报警上限 拖动滑块左右移动可以设定报警值 切换软件开关,对太阳能电池进行充电 B站地址 比赛感悟时代的发展,MCU的性能也越来越强,万物互联的需求也愈加强烈,使用RTOS来实现物与网的链接,是时代发展的潮流,当我接触到RT-Thread 这个国人自主RTOS后,经过对比其他的freertos,ucos等,RT-Thread代码很优雅,组件功能多,小而美,我开始了深入的学习。 通过 RT-Thread官网上的文档中心,我学习了多线程及其调度、信号量、邮箱、消息队列、内存管理、定时器等,但是感觉认识很肤浅,对于信号量是怎么实现的?rtos是怎么达到实时性?还是一头雾水。 于是又学习了火哥出版的《RT-Thread 内核实现与应用开发实战—基于STM32》,手把手,一步一步实现了RT-Thread,终于有了深刻认识,可以实际操作了。 通过这次比赛的项目实践,我对RT-Thread有了全新的认识,他不仅仅是一个嵌入式RTOS,当各种组件有序结合起来,必能够发挥出更大能量,体现无与伦比的扩展性和灵活性,无愧小而美物联网操作系统的称呼,现在RT-Thread smart已经上线了,无疑体现出来RT-Thread的蓬勃生命力和无限美好的发展前景,我相信选择RT-Thread绝对是正确的。 这个小作品,还有待完善,现在仅能通过触摸屏显示一些数据,并调整参数,还得增加一些功能,比如省电管理,远程开关机,还得解决开发硬件、软件的版权问题,在此仅作为演示,给下一步的开发提供一些思路,距离产品还有很长的路要走。 美中不足的地方,RT-Thread studio编译代码偏大,以至于我这个mini板flash和ram容量不够,下一步还得好好研究,怎样裁剪,用RT-Thread studio做产品的问题。 最后感谢主办方提供了这么好的一个平台,不仅能展示自我,也能学到很多知识,还要感谢论坛上那些解决我问题以及制作软件包的大佬,希望有朝一日我也能给开源社区贡献一份自己力量。
一、概述: 在做产品开发的时候我们总是需要用到各种常用调试设备,比如:万用表、示波器、can分析仪等常见设备。有些比较特殊的场景比如在做汽车某一部分的功能开发前需要对can数据进行破解时往往需要对can数据进行过滤方便破解因此就有必要自制过滤板; 再有在产品完成研发进行测试时测试工程师往往只能反馈有bug但是并不能直接定位问题所在,而如果在产品上加非易失存储电路会增加硬件成本,总是接着电脑采集数据也不现实,毕竟还有进行开发,因此就需要有一款调试设备能实时抓取数据并进行保存了。综上所述,就是希望把电子工程师常用的工具整合起来。当前设计仅为第一步,实现了电压测量及电压历史变化曲线的记录,当我们需要检测一系列电平信号时会比万用表有优势。 二、开发环境: 硬件:ART-Pi,正点原子7寸电容屏,Industry_IO扩展板。 RT-Thread版本:RT-Thread V4.0.2 开发工具:RT-Thread Studio 三:RT-Thread使用情况概述内核部分:线程。 调度器:创建多个线程来实现不同的工作。 组件部分:ft5426(触摸驱动),I2C(触摸芯片通信),ADC1,LCD(显示屏通信),TouchGFX(图形库)、PIN(IO输入输出)。 四:硬件框架五:软件框架说明 六、实物展示: 七、具体功能: 1、CPU使用率显示: 左上角显示了当前CPU的使用率。 当点击该图标后还能实现显示方式的切换。 2、硬件交互 当按下开发板上的用户按键,显示屏的小绿点状态取反(亮/灭);当点击右边的按钮时扩展板的蜂鸣器状态也取反(响/不响)从而实现显示屏与开发板的双向交互。 3、电压测量 左侧的控件显示当前电压在0-3.3V间所占的百分比;右侧的表能显示之前的电压值与当前的电压值便于根据一系列电压状态判断产品逻辑是否正确,滑动右侧的滑条可以实现当前显示数值的放大和缩小。 八、比赛感悟: 因为刚学习RT-Thread没多久,而网上关于使用touchGFX的资料实在太少了所以在上面花了大量的时间,但是也算是有所收获得到了大家的肯定。 最近CSDN上写的4篇博客有3篇阅读量已过千。 上过RTT的公众号 成功打入内部交流群 虽然由于时间关系本次的比赛要结束了,但是后续会继续在CSDN更新相关系列教程。 九、演示视频
【ART-Pi作品秀】瞎转悠作者: 樊晓杰 概述简单介绍项目应用产生的背景 ,所产生的软硬件方案 及主要实现的功能。 应用产生背景在和娃玩老鹰转小鸡时候,突然就想做个小车,可以和孩子互动,就想到人挡在小车前面,然后转向,就一直这么循环下去,一个很简单的功能。就是漫无目的 瞎转悠,这就是名字的由来。也是一个提醒,尤其到冬天了还是在疫情期间,没事别瞎转悠,老实在家呆着没事 就玩玩rt-thread,多参加参加电路城的活动。 所采用的硬件方案硬件方案采用 : 主控板 ART-Pi + SR04 超声波 测距仪 + 小车套件。 1.ART-Pi 简介ART-Pi是 RT-Thread 团队经过半年的精心准备,专门为嵌入式软件工程师、开源创客设计的一款极具扩展功能的 DIY 开源硬件。 板载资源: - STM32H750XBH6 - On-board ST-LINK/V2.1 - USB OTG with Type-C connector - SDIO TF Card slot - SDIO WIFI:AP6212 - HDC UART BuleTooth:AP6212 - RGB888 FPC connector - 32-Mbytes SDRAM - 16-Mbytes SPI FLASH - 8-Mbytes QSPI FLASH - D1(blue) for 3.3 v power-on - Two user LEDs:D2 (blue),D2 (red) - Two ST-LINK LEDs: D4(blue),D4 (red) - Two push-buttons (user and reset) 扩展接口: - 4路UART(LPUART) - 3路SPI - 2路hardware iic - 1路USB-FS - 1路ETH - 1路SAI - 1路DCMI - 2路CANFD - 超过5路ADC (支持查分输入ADC) - 超过15路PWM(支持高精度定时器HRTIM) 驱动支持: - UART - SPI - SDMMC - CAN - QSPI - ADC - PWM - DCMI - SAI - LTDC - USB - ETH - SDRAM - HRTIM - I2C 2.SR04 超声波测距传感器超声波测距 我们这里采用很常见的一个模块 SR04 。HC-SR04超声波模块常用于机器人避障、物体测距、液位检测、公共安防、停车场检测等场所。HC-SR04超声波模块主要是由两个通用的压电陶瓷超声传感器,并加外围信号处理电路构成的。 3. 小车套件 小车基础平台采购慧净电子四驱智能小车底盘 及驱动板。 4.电机驱动模块:每一路需要3个信号控制,一路pwm ,一路正传一路反转。 所采用软件方案软件方案 基于 RT-Thread IoT RTOS 此方案中使用SR04 超声波测距软件包,RT-Robot 软件包。 开发环境: 使用的是rt-thread 4.0.3 版本软件,使用mdk 结合env 工具 开发。 分别简介如下: RT-Thread 的架构简介: 近年来,物联网(Internet Of Things,IoT)概念广为普及,物联网市场发展迅猛,嵌入式设备的联网已是大势所趋。终端联网使得软件复杂性大幅增加,传统的 RTOS 内核已经越来越难满足市场的需求,在这种情况下,物联网操作系统IoT OS)的概念应运而生。物联网操作系统是指以操作系统内核(可以是 RTOS、Linux 等)为基础,包括如文件系统、图形库等较为完整的中间件组件,具备低功耗、安全、通信协议支持和云端连接能力的软件平台,RT-Thread 就是一个 IoT OS。 RT-Robot 是 RT-Thread 的机器人框架,希望能够支持智能小车、机械臂、无人机等各种不同类型的机器人。 当前以智能车为主要目标,希望支持两轮差分驱动、四轮差分驱动、麦克纳姆轮驱动、经典 Ackerman (两轮差分,一方向连杆) 的小车底盘。 当前功能特点: 支持两轮差分驱动、四轮差分驱动、麦克纳姆轮驱动的小车底盘 支持增量、位置式 PID 支持单相、AB 相编码器 支持双 PWM、单 PWM 的直流电机驱动,支持驱动舵机 支持 PS2 遥控器 支持 ANO_TC 匿名科创地面站 SR04 软件包工作流程 ultrasonic sensor v2.0 a.单片机引脚触发Trig测距,给至少 10us 的高电平信号; b.模块自动发送 8 个 40khz 的方波,自动检测是否有信号返回; c.有信号返回,通过 IO 输出一高电平,并单片机定时器计算高电平持续的时间; d.超声波从发射到返回的时间.计算公式:测试距离=(高电平时间*声速(340M/S))/2; 目前

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值