一种基于ESP32的光谱传感器模块驱动与WiFi传输装置及方法与流程

文档序号:19068840发布日期:2019-11-06 02:47阅读:717来源:国知局
本发明涉及一种光谱仪中cmos光谱传感器模块的时序驱动、模数转换、并通过网络传输的装置,具体地说是一种光谱数据的采集与wifi传输的装置及方法。
背景技术
::在一些测试led灯的光谱分布场景中,需要驱动光谱传感器得到340nm至780nm波长光谱的模拟信号,并通过模数转换芯片(adc)转换成数字量,再通过wifi上传至智能手机。常规的做法是需要一片模adc,一颗高性能的微处理器,以及一颗wifi模块。在微处理器的控制下,生成光谱传感器所需的时序,并通过adc把模拟量转换成数字量,然后通过wifi传送至服务器。wifi模块(例如:乐鑫公司的esp32)本身内嵌了处理能力较强的微处理器,并且协议栈仅占用微处理器一半以下的资源。利用wifi模块内嵌的微处理器来驱动光谱传感器和adc芯片,去掉了不必要添加额外的微处理器,从而减小产品体积、降低成本、提高可靠性和延长电池工作寿命。技术实现要素:为了克服现有光谱传感器的成本较高、产品体积较大的不足,为了降低成本、减少产品体积,本发明提供一种通过智能手机或电脑等终端设备,利用esp32模块的wifi功能,以及模块其内嵌的高性能的微处理器,采用c语言编写光谱传感器和adc芯片驱动程序,添加到micropython固件中;编写python代码,实现光谱分布的数据采集与wifi传输功能。本发明解决其技术问题所采用的技术方案是:一种基于esp32模块的光谱传感器模块驱动与wifi传输装置,所述装置主体内置锂电池和电路板,所述锂电池通过充放电一体模块升压至稳定的5v为装置提供电源,充放电一体模块通过外接usb口为锂电池充电;所述电路板以esp32模块为核心,外接gpio口实现光谱传感器模块的时序和积分时间,使得光谱传感器输出合适的光谱分布模拟信号;所述esp32模块外接spi接口的adc芯片,对光谱分布的模拟信号实现模数转换;所述esp32模块内置高性能微处理器,采用c语言编写光谱传感器和adc芯片驱动程序,添加到micropython固件中;所述esp32模块内置的微处理器,编写python代码,调用固件实现光谱分布数据的采集,并通过tcp协议,实现与智能手机/电脑的交互。进一步,所述esp32模块,内置了xtensa32-bitlx6超低功耗、高达240mhz双核处理器以及32mb大小flash空间,模块上有拓展的i/o口。对于光谱分布的数据采集与传输已经足够,无需添加额外的微控制器,节约成本和空间。再进一步,所述esp32模块采用c语言编程,按照光谱传感器(例如c12666ma)的时序和积分时间的要求,在gpio管脚上产生合适的逻辑电平,驱动传感器输出340nm至780nm波长的光谱模拟量;按照adc芯片(例如ads8326)的时序、光谱传感器时序和转换速率要求,在合适的时刻把光谱模拟量转换成相应的数字量;将驱动添加到micropython固件中,在main.py调用固件中的函数完成相应的功能。再进一步,所述基于esp32模块的光谱分布数据采集驱动采用定时器加状态机来协同控制光谱传感器与adc芯片的时序完成数据采集。esp32定时器以设定的时间值(例如20us)产生中断,在中断服务函数中,翻转光谱传感器的时钟clk管脚,保证50%占空比的要求;光谱传感器st管脚上的相邻两个下降沿时间差决定了像素点的积分时间;st下降沿开始,每隔4个clk时钟,输出1个像素的模拟信号;状态机结合计数器,来控制光谱传感器的积分时间、每个像素模拟量的串行输出、adc芯片开始转换、结束转换,以及把转换之后的模拟量存入数组中。进一步,所述基于esp32模块的光谱分布数据采集驱动的固件提供了micropython接口。自定义了包括光谱传感器和adc芯片引脚、状态、spi接口、积分时间等在内的结构体machine_ccd_obj_t;在modmachine.h文件中添加externconstmp_obj_type_tmachine_ccd_type;在modmachine.c文件中的子类表staticconstmp_rom_map_elem_tmachine_module_globals_table[]数组中,添加{mp_rom_qstr(mp_qstr_ccd),mp_rom_ptr(&machine_ccd_type)};在驱动文件modcd.c的模块函数字典staticconstmp_rom_map_elem_tmachine_ccd_locals_dict_table[]数组中,添加了{mp_rom_qstr(mp_qstr_ccd_read),mp_rom_ptr(&machine_ccd_read_obj)}接口函数;在驱动文件modcd.c中,读取光谱分布数据的可变参数接口函数定义为staticmp_obj_tmachine_ccd_read(mp_uint_tn_args,constmp_obj_t*pos_args,mp_map_t*kw_args)和staticmp_define_const_fun_obj_kw(machine_ccd_read_obj,1,machine_ccd_read)。这样,在main.py程序中,可以通过frommachineimportccd加载ccd驱动,然后ccd.read()就可以调用驱动程序,实现光谱分布数据的采集。一种基于esp32模块的光谱传感器模块驱动与wifi传输方法,esp32模块工作在ap模式下作为一个无线接入点,客户端设备连接此ap,主机和客户端进行tcp通信,主机通过select机制管理通信双方socket,通信双方规定一种消息和命令格式进行通信交互数据,实现数据传输。进一步,创建ap对象ap,调用ap对象的active()函数,创建无线ap,激活ap热点,设置ap的essid为一固定字符串加上ap的mac地址后3位,并设置ap的password;创建主机socket,绑定socket与主机地址,监听客户端连接,创建connections字典,用于保存客户端socket。。进一步,采取会话管理的方法来管理每一个客户端的连接。会话增加addsession,利用uscoket模块的accept()函数接收一个客户端的连接,得到客户端socket和地址,将socket保存到connections字典中,利用uselect模块的poll对象注册客户端socket并绑定监听事件;会话删除delsession,利用uselect模块的poll对象注销客户端连接,关闭客户端socket,在connections字典中删除客户端socket;关闭所有socketcloseall,遍历connections字典,注销和关闭每一个客户端socket,清空connections字典,注销和关闭主机socket。再进一步,利用uselect模块poll()方法获取poll对象poll_obj,利用poll_obj注册主机socket同时设置监听事件为pollin和pollhup,退出标志exitflag设置为false,利用poll_obj对象poll()方法获取事件对象events,遍历事件对象获取其中socket,如果是主机socket,则执行增加会话addsession,否则从connections字典中得到客户端socket,利用usocket模块recv()方法接收客户端消息msg,如果消息msg为空则执行删除会话delsession,否则利用ure模块的search()函数和正则表达式匹配双方既定的消息格式并获取命令字符串cmdstr,如果为空结则束本次循环,否则获取其中的命令并以逗号分割得到参数列表arglist,arglist[0]为命令cmd,arglist后面元素为cmd对应的参数,将cmd去匹配双方既定的命令,如果匹配成功则校验参数,若参数校验成功,则进行相应操作并发送数据给客户端,校验失败则向客户端发送参数错误信息,如果没有一个命令匹配成功则向客户端发送命令错误信息,遍历完毕events对象则判断exitflag是否为true,如果为真则执行closeall关闭所有socket,否则继续获取事件对象events本发明的有益效果主要表现在:1、本发明充分利用esp32作为微控制器的功能,以及芯片内部spi功能和模块上的i/o资源,避免使用额外微控制器,节约成本和节省空间。2、本发明利用micropython固件,添加数据采集驱动模块到micropython固件中,python代码可直接调用驱动模块得到光谱分布数据。3、本发明利用esp32的wifi功能提供一个ap,客户端连接此ap,两者通过tcp协议进行通信交互数据。esp32模块上利用select机制监听socket事件,对客户端的连接请求、断开、异常,以及收发数据进行管理。同时,规定了一种消息、命令格式,客户端依据约定的格式发送不同的请求命令,服务端解析命令并提供相应的服务,返回json格式的数据给客户端。附图说明图1是总体硬件架构图。图2是光谱分布数据采集状态图。图3是定时器中断服务程序isr流程图。图4是数据传输初始化过程图。图5是数据传输流程图。具体实施方式下面结合附图对本发明做进一步描述。参照图1~图5,一种基于esp32的光谱传感器模块驱动与wifi传输装置,所述装置主体内置锂电池和电路板,所述锂电池通过充放电一体模块升压至稳定的5v为装置提供电源,充放电一体模块通过外接usb口为锂电池充电;5v电源通过ldo稳压芯片为esp32模块提供3.3v电压;所述电路板以esp32模块为核心,外接gpio口实现光谱传感器模块的时序和积分时间,使得光谱传感器输出合适的光谱分布模拟信号;所述esp32模块外接spi接口的adc芯片,对光谱分布的模拟信号实现模数转换。所述esp32模块内置xtensa32-bitlx6超低功耗、高达240mhz双核处理器以及32mb大小flash空间,作为光谱传感器和adc芯片的微控制器,采用c语言编写驱动代码,并添加到micropython固件中;利用模块本身的wifi功能提供无线ap,智能手机/电脑连入此ap,利用tcp通信协议和规定的消息格式进行数据交互,实现数据传输服务。参照图2所示,为光谱传感器数据采集的状态机图。在空闲状态,初始化所有控制光谱传感器和adc芯片的管脚,为积分和转换做好准备;启动积分,使得光谱传感器进入积分状态,每一像素的积分时间为st管脚上2次相邻下降沿的时间差;积分时间到,每个像素的模拟信号依次串行移出,然后经过adc转换成数字量。在这里,选取了16位、5v的adc芯片而不是esp32内置的ad外设,这是因为光谱传感器输出的模拟信号的电压和模数转换的精度要求超过了esp32内置ad外设所能提供的性能。根据光谱传感器的时序图,每4个clk时钟,串行移出一个像素点的模拟值,只有当模拟量有效时,开启adc转换,并把转换后的数字量保存到数组中。参照图3所示为定时器中断服务程序isr流程。首次进入isr时,初始化光谱传感器和adc芯片的所有管脚,为后续的动作做好准备。每个像素点的积分时间由光谱传感器st管脚上的2次相邻下降沿的时间差来控制,因此在开始积分时刻和积分结束时刻,均在st管脚上产生下降沿。当进入到读取像素状态时,从光谱传感器中串行移出一个像素的模拟量,需要4个clk时钟,也即4个高电平、4个低电平,共8次isr中断。在第k次中断,如果k=3,此时某个像素的模拟量已在光谱传感器的video管脚有效输出,设置adc的片选有效,为ad转换做准备;在k=4时,启动adc转换,也即启动spi功能;在k=7时,ad转换已经结束,把转换后的数字量写到数组中保存起来;然后判断所有的像素是否已经全部移出并ad转换完毕,如果是,则在下一个isr中复位光谱传感器和adc芯片,并关闭定时器。在此流程中需要调用timer_init()函数初始化定时器,timer_set_counter_value()函数设置计数器的值,timer_set_alarm_value()函数设置定时器的闹钟警报值,timer_enable_intr()函数使能定时器中断,timer_isr_register()函数注册定时器isr函数,timer_start()函数开启定时器,调用timer_pause()函数停止定时器,调用esp_intr_free()函数释放isr函数。基于esp32模块的光谱分布数据采集驱动的固件提供了micropython接口。自定义了包括光谱传感器和adc芯片引脚、状态、spi接口、积分时间等在内的结构体machine_ccd_obj_t;在modmachine.h文件中添加externconstmp_obj_type_tmachine_ccd_type;在modmachine.c文件中的staticconstmp_rom_map_elem_tmachine_module_globals_table[]数组中,添加{mp_rom_qstr(mp_qstr_ccd),mp_rom_ptr(&machine_ccd_type)};在驱动文件modcd.c文件的staticconstmp_rom_map_elem_tmachine_ccd_locals_dict_table[]数组中,添加了{mp_rom_qstr(mp_qstr_ccd_read),mp_rom_ptr(&machine_ccd_read_obj)}接口函数;在驱动文件modcd.c文件中,读取光谱分布数据的可变参数接口函数定义为staticmp_obj_tmachine_ccd_read(mp_uint_tn_args,constmp_obj_t*pos_args,mp_map_t*kw_args)和staticmp_define_const_fun_obj_kw(machine_ccd_read_obj,1,machine_ccd_read)。这样,在main.py程序中,可以通过frommachineimportccd加载ccd驱动,然后ccd.read()就可以调用驱动程序,实现光谱分布数据的采集。参照图4所示,数据传输初始化过程为:创建esp32ap对象ap,调用ap对象的active()函数激活ap热点;设置ap的essid为一固定字符串加上ap的mac地址后3位,这是为了防止essid重复;设置ap的password;创建主socket,并与主机地址绑定;监听客户端连接;创建connections字典,用于保存客户端socket。参照图5所示,数据传输过程为:利用uselect模块poll()方法获取poll对象poll_obj,利用poll_obj对象的register()方法监听主socket的pollin和pollhup事件,设置退出标志exitflag为false。利用poll_obj对象的poll()方法获取事件对象events,遍历事件对象获取其中socket,如果是主socket,则说明是新增的会话,执行addsession()方法,把新用户的套接字和地址保存到字典connections中,并且poll_obj对象中添加新套接字的pollin和pollhup事件监听;如果不是主socket,则从connections字典中得到客户端socket,利用usocket模块recv()方法接收客户端上发的消息msg。从消息中利用ure模块的search()函数和正则表达式匹配双方既定的消息格式,提取出命令和参数,如果是合法的,则执行相应的功能;如果是非法的,则向客户端发送命令/参数错误信息。遍历完毕events对象,再判断exitflag是否为true,如果为真则调用poll_obj对象的unregister()方法和主动断开所有客户端的socket,否则继续监控事件对象events。当网络出现异常或者客户端退出时调用delsession()方法,从poll_obj对象中取消事件监听,并从字典中删除该用户的socket。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1