概述
这是物联网项目设计的完结篇,本来想今年上半年完成的,但是中间因为一些事情比较忙,耽误了。后来整个项目设计推倒重来,采用了新的技术栈。但是前面的开发经历也为我提供了不少经验,后面我采用rtthread物联网操作系统,极大的加快了开发进度,同时采用在线电路设计软件立创EDA,让我一个从来没画过电路图的人很快掌握了原理图和PCB的绘制,强推一波。辉光钟的制作网上有很多资料,我也参考了网上的很多资料,但是把辉光钟和物联网结合到一起我觉得是个不错的创意,于是就去做了。
下面我先给出本项目的代码和电路图,希望大家喜欢的话给我的github仓库一些小星星~
####演示视频
[视频](https://www.bilibili.com/video/BV1ir4y1c7zz
代码仓库
https://github.com/FranHawk/nixie_clock_rt_thread.git
电路工程文件
因为我用了两个板子拼到一起,所以有两个工程文件,打开网址就可以找到原理图和pcb
https://lceda.cn/FranHawk/nixie_testboard
https://lceda.cn/FranHawk/nixie_mainboard
一、项目创意
辉光管属于电真空器件,也就是电子管,玻璃外壳,通常为圆柱形,金属电极从底部引出管身外,内部有一个阳极电极,若干个阴极电极。辉光管内部并不是真空,充满着由氖气、氩气以及水银蒸汽等组成的混合气体,主要成分是惰性气体氖气。
辉光管属于多年前的古老工艺,本是被时代淘汰的产物,但是由于辉光管发出的橙黄色光芒十分美观,且对驱动电路的要求非常高,所以受到广大爱好者的喜爱。而物联网技术的发展势头正劲,将古老的辉光管和新兴的物联网技术相结合,制作出的物联网辉光管时钟,将使辉光管焕发出新的活力。同时也体现出一定的技术性,创意性和装饰性。
二、项目需求
1.完成辉光管显示功能,四个IN12辉光管显示小时分钟或者分钟秒
2.辉光管发光稳定,走时精确,掉电时时钟保持走时
3.自动连接wifi远程控制功能,完成网页访问物联网平台控制辉光钟显示
4.自动校时功能,联网自动校准辉光钟时间
5.系统可保持长时间运行,不发生崩溃
三、框图及整机概述
本项目分为硬件设备端完成主要功能和云服务器端完成人机交互和控制功能。
硬件设备端
1.STM32F103RCT6
使用stm32f103rct6作为主控芯片,48kB RAM,256kB ROM搭载RT-thread物联网实时操作系统.完成对各模块的通讯控制和多任务管理。
2.ESP8266 WIFI模块
使用ESP8266模块完成硬件设备的物联网功能,ESP8266在数据链路层使用WIFI协议,适用于家庭室内这种不需要经常移动的场合。ESP8266已完整封装TCP/IP协议,只需要通过AT指令连接WIFI网络,然后进入透传模式,主控MCU发送过来的MQTT消息包就会经ESP8266发送至互联网,完成设备之间的解耦。同时通过ESP8266访问NTP服务器完成时钟的校时功能,ESP8266模块通过串口与主控MCU完成通讯。
3.DS3231 实时时钟芯片
使用DS3231高精度实时时钟芯片完成自动走时功能。DS3231是一款高精度I2C实时时钟器件,具有集成的温度补偿晶体振荡器。该器件包含电池输入端,断开主电源时仍可保持精确计时。集成的晶体振荡器可提高器件的长期精确度。DS3231的寄存器能保存秒、分、时、星期、日期、月、年和闹钟设置等信息。少于31天的月份,可自动调整月末日期,包括闰年补偿。时钟的工作格式为24小时或带AM/PM指示的12小时格式。DS3231提供两个可编程日历闹钟和一路可编程方波输出。DS3231与单片机通过I2C双向串行总线传输地址与数据。通过使用DS3231芯片完成自动走时功能,并通过电池提供备用电力的方式,实现调电保持计时功能。
4.HV57708 高压驱动芯片
使用HV57708高压驱动芯片为辉光钟提供驱动信号。HV57708是一款可以承受高电压的串行输入转并行输出的驱动芯片,可完成4路输入转64路输出的功能,适用于驱动辉光管,大大节省了单片机的IO口,同时芯片高度集成,节省了PCB的面积。
5.MAX1771升压电路
使用以MAX1771为控制核心的BOOST升压电路,将直流12V输入高效率地转化为170V输出,将辉光管点亮。
整个系统电路部分使用立创EDA完成PCB的绘制,为了使设备整体美观紧凑,将元器件布置在两块PCB上,一块PCB放置主要控制和电源电路,另一块PCB放置辉光管插座。
云服务器端
云端服务全部使用阿里云平台的服务,阿里云的服务具有稳定性强,配置便捷的特点,方便部署物联网应用,云端总体应用架构如下
1.阿里云物联网平台
云端物联网平台使用阿里云物联网平台。阿里云物联网平台为设备提供安全可靠的连接通信能力,向下连接海量设备,支撑设备数据采集上云;向上提供云端API,服务端通过调用云端API将指令下发至设备端,实现远程控制。提供设备接入,设备管理,安全能力和规则引擎。其中规则引擎用来完成数据转发,负责沟通数据在设备间,设备与数据库间,设备与服务器间流转。
2.阿里云 云端服务器
Web服务器使用阿里云服务器ECS,云服务器(Elastic Compute Service,简称ECS)是阿里云提供的性能卓越、稳定可靠、弹性扩展的IaaS(Infrastructure as a Service)级别云计算服务。云服务器ECS免去了您采购IT硬件的前期准备,让您像使用水、电、天然气等公共资源一样便捷、高效地使用服务器,实现计算资源的即开即用和弹性伸缩。阿里云ECS持续提供创新型服务器,解决多种业务需求,助力业务发展。
四、各模块电路设计及原理
4.1 主控模块
意法半导体的STM32F1系列产品作为基于ARM Cortex M3的32位微控制器,满足了工业、医疗和消费类市场的各种应用需求。使用C语言为编程语言,配合RT-thread操作系统,可以很好的满足需求。STM32F103RCT6 有32K RAM 256K ROM,满足操作系统和响应外设的运行需求。将STM32F103RCT6最小系统直接设计在整体电路板上,提高了整体的紧凑性和集成度。具体电路如下:
其中使用UART1串行总线和电脑上位机连接完成和电脑的通讯,方便观察运行状况和调试。原本准备在电路板上使用USB转串口芯片,但是考虑到运行时并不使用该模块,且占用电路板面积,最后使用排针引出加到转串口模块的方式,大大减少了PCB面积和工作量。
使用外部8M晶振提高程序运行时的时间准确性。
设计完成的pcb板如下:
实物如下:
4.2 实时时钟模块
使用DS3231MZ 作为实时时钟模块的主要芯片。DS3231是一款高精度I2C实时时钟器件,具有集成的温度补偿晶体振荡器。该器件包含电池输入端,断开主电源时仍可保持精确计时。集成的晶体振荡器可提高器件的长期精确度。芯片封装使用SOP-8封装,且几乎不需要外部器件支持,使用IIC协议和主控STM32f103芯片沟通。
为了达到主要电路调电依旧可以完成走时的功能,使用3.7V CR1220 纽扣电池和电池座为DS3231MZ芯片提供备用电源,使芯片在外部供电中断时依旧可以走时。
设计完成的原理图和pcb板如下:
实物图如下:
4.3 ATK-ESP8266 WIFI模块
ATK-ESP8266 是正点原子团队推出的一款高性能的 UART-WiFi(串口-无线)模块,ATK-ESP8266 板载了正点原子团队自主开发的 ATK-ESP-01 模块。
ATK-ESP8266 模块采用串口(LVTTL)与 MCU(或其他串口设备)通信,内置TCP/IP 协议栈,能够实现串口与 WIFI 之间的转换。通过 ATK-ESP8266 模块,传统的串口设备只是需要简单的串口配置,即可通过网络(WIFI)传输自己的数据。
主板将STM32的UART3总线引出到排母,使用排母和ESP8266模块连接,减少了电路设计工作量和成本。
实物如下:
4.4 HV57708 辉光管串转并高压驱动芯片
使用HV57708高压驱动芯片为辉光钟提供驱动信号。HV57708是一款可以承受高电压的串行输入转并行输出的驱动芯片,可完成4路输入转64路输出的功能,适用于驱动辉光管,大大节省了单片机的IO口,同时芯片高度集成,节省了PCB的面积。
STM32使用7个GPIO和HV57708进行通讯。通过HV57708内部逻辑最终可以输出64路输出,足够为4位辉光管40个引脚提供驱动。HV57708的引脚接在辉光管的阴极,辉光管的阳极接170V。芯片必须工作在反向模式。信号为低电平时,引脚输出为高电平(68V),此为VPP接入的电压值,这个电压值通过170V接电阻和稳压二极管得到68V电压,这样阴极阳极间无法产生170V压差而熄灭。当引脚输出低电平0V时,辉光管有压差170V,辉光管点亮。
4.5 辉光管
辉光管时钟采用IN12侧显式辉光管,辉光管是发明于1950年代中期,人们期望发明一种非点阵而是线状化地显示数字的方式。辉光管随之诞生,辉光管属于电子管的一种, 发光原理和霓虹灯差不多。通常在一个真空管里,放置一个金属丝网制成的阳极和10个阴极,形状为数字0到9,某些还有一个或两个小数点。在管内充入惰性气体氖气和汞或氩,再通上高压后,每一个阴极可以发出红橙色光。
IN12辉光管生产于上世纪80年代,使用170V高压即可点亮。设计小巧,亮度适中,造型美观,价格合适,于是选用四位IN12辉光管作为显示部分。
4.4 电源模块
4.4.1 AMS1117-3.3稳压模块
AMS1117-3.3为一块电压降压型直流线性稳压芯片,最大输出电流可达1A.,输出电压为3.3V。外部电路仅需要电容用来保证输出电压的稳定性,并添加LED灯用于指示稳压芯片是否工作正常。该稳压模块主要输出3.3V电压,给STM32F103,DS3231,ESP8266供电。
4.4.2 AMS1117-5.0稳压模块
AMS1117-5.0为一块电压降压型直流线性稳压芯片,最大输出电流可达1A.,输出电压为5.0V。外部电路仅需要电容用来保证输出电压的稳定性,并添加LED灯用于指示稳压芯片是否工作正常。该稳压模块主要输出5.0V电压,给HV57708高压驱动芯片的逻辑部分供电。
电路设计如下:
4.4.3 MAX1771 12V升170V boost升压电路模块
设计要求:Vin=12V,Vout=170V
- MOS管的选择
由于输出电压较高,所以需要耐压值较高的MOSFET,选择耐压值250V以上MOS,其内阻越低越好。考虑到成本和体积限制,我选用的是TK8P65W。 - 反馈电阻的选择
芯片的参考电压为1.5V,两个电阻对输出电压进行分压之后送入FB引脚进行反馈显然,其中电阻的选择公式如下。
这里我们选择R2=1.8MΩ,R1=16KΩ。
- 电流控制电阻的选择
Rsense为电流控制电阻,控制着MOS管的最大电流,可以防止意外情况发生,诸如输出短路引起MOS烧毁。这里要根据我们的需求进行选择。假设我们要求输出20mA的最大电流,效率80%情况下, 可计算得到最大的Ids=354mA,此时由于比较电压为0.1V,可计算得到Rsense的最小值为0.1V/354mA=282mΩ。但是往往我们不这样做,因为这样计算出来的Rsense非常大,会严重影响效率。对于这里,我们不需要对输出电流进行太大限制,所以我们适当选择一个防止输出短路引起MOS发烫烧毁就好,我设计时选择的限流电阻为50mΩ。 - 功率电感的选择
根据数据手册中的公式可以得到,选择最佳功率电感范围是10uH~300uH。我选取220uH作为电路中功率电感。 - 输入输出电容选择
为了保持电路输入输出端电压保持稳定,需要选取合适的电容稳定电压,这里选取220UF作为输入端电容,10UF作为输出端电容。
4.5 其他I/O模块
LED指示灯:用于指示程序是否正常运行
4.6 PCB的绘制,焊接与装配
PCB的绘制
为了保证设备整体美观大方,将控制部分和辉光管显示部分分成两个pcb板,中间使用排针排母连接。
控制部分PCB板设计时分为电源部分和控制部分,并分成模拟地和数字地中间用0欧电阻用于隔离。控制部分将SWD烧写线和UART串口通讯用排针引出放于电路板边缘,美观且便于调试。
显示部分使用插针的形式而不是直接将辉光管焊在板子上,保证辉光管可以重复利用。
控制部分和显示部分在相同位置都有M3孔,便于使用铜柱相互连接,便于装配。
控制板顶层和底层
显示板顶层和底层
PCB的焊接和装配
PCB的焊接遵循先电源后控制,由外而内,边焊接边测试的思路,先从电源模块开始焊接,测试电源模块工作情况,再焊接控制部分。电源部分焊接完毕后如图,开关稳压输出保持在170V附近,证明电源部分焊接完毕。
电源部分焊接与测试
电源部分焊接完毕后焊接控制部分。控制部分主要芯片为stm32最小系统电路,实时时钟电路和WIFI模块电路。Stm32焊接完毕后烧写测试程序,控制点亮小灯隔1s闪烁一次,证明焊接成功,实时时钟芯片和无线模块焊接完成后分别使用IIC和UART总线使之和STM32完成通讯,证明焊接成功。
下一步焊接辉光管驱动芯片模块和显示部分PCB板,焊接完毕后使用同铜柱将两个板子连接到一起,烧写测试程序并使用电压表测试各管脚电压是否正常,检查完毕后将辉光管插上,成功点亮辉光管。
控制板和显示板焊接成品图
控制板和显示板装配测试图
五、程序部分编写与调试
5.1 RT-Thread物联网操作系统
辉光钟对时间的要求非常严格。若采用普通的前后台系统,只依靠定时器中断很难做到各模块协调工作,很容易出现逻辑上的漏洞。采用嵌入式实时操作系统可以做到对逻辑和时序的精确控制,可以使各任务执行无误而且准时。
本系统采用RT-Thread嵌入式物联网实时操作系统。RT-Thread,全称是 Real Time-Thread,顾名思义,它是一个嵌入式实时多线程操作系统,基本属性之一是支持多任务,允许多个任务同时运行并不意味着处理器在同一时刻真地执行了多个任务。事实上,一个处理器核心在某一时刻只能运行一个任务,由于每次对一个任务的执行时间很短、任务与任务之间通过任务调度器进行非常快速地切换(调度器根据优先级决定此刻该执行的任务),给人造成多个任务在一个时刻同时运行的错觉。在 RT-Thread 系统中,任务通过线程实现的,RT-Thread 中的线程调度器也就是以上提到的任务调度器。对于资源丰富的物联网设备,RT-Thread 又能使用在线的软件包管理工具,配合系统配置工具实现直观快速的模块化裁剪,无缝地导入丰富的软件功能包,实现类似 Android 的图形界面及触摸滑动效果、智能语音交互效果等复杂功能。
相较于 Linux 操作系统,RT-Thread 体积小,成本低,功耗低、启动快速,除此以外 RT-Thread 还具有实时性高、占用资源小等特点,非常适用于各种资源受限(如成本、功耗限制等)的场合。
近年来,物联网(Internet Of Things,IoT)概念广为普及,物联网市场发展迅猛,嵌入式设备的联网已是大势所趋。终端联网使得软件复杂性大幅增加,传统的 RTOS 内核已经越来越难满足市场的需求,在这种情况下,物联网操作系统(IoT OS)的概念应运而生。物联网操作系统是指以操作系统内核(可以是 RTOS、Linux 等)为基础,包括如文件系统、图形库等较为完整的中间件组件,具备低功耗、安全、通信协议支持和云端连接能力的软件平台,RT-Thread 就是一个 IoT OS。
RT-Thread 与其他很多 RTOS 如 FreeRTOS、uC/OS 的主要区别之一是,它不仅仅是一个实时内核,还具备丰富的中间层组件,如下图所示。
RT-Thread操作系统的架构
物联网辉光钟的任务虽然不多,但是使用的模块很多,且都遵循自己的协议,为了方便管理和软件开发,主要使用物联网操作系统提供的中间件驱动的功能,可以为驱动开发节省很多时间。
RT-Thread操作系统的使用
我使用RT-Thread官方提供的IDE RT-Thread Studio一站式配置软件包,并且可以进行调试和烧写。
使用软件包情况:
1.cjson,pahomptt:用于物联网相关的相关操作。cjson
用于解析json格式mqtt数据包。
2.netutils:一些网络相关小工具,使用其中的ntp协议用于开机联网校准时间。
3.ds3231,at_device:分别用于驱动ds3231实时时钟芯片和esp8266模块。
5.2 硬件设备端软件架构设计
程序首先执行各外设初始化,首先初始化的是HV57708,因为HV57708控制辉光管且电压为170V,操作不当就会导致同一根管子多个数字同时点亮电流过大烧坏电源。之后初始化DS3231,ESP8266.然后使用ESP8266连接网络,在线更新时间并使用IIC协议存入DS3231中,之后使用MQTT协议登录阿里云物联网平台,订阅控制话题,并开启显示线程。显示线程以200ms为一个周期,先通过DS3231获取当前时间,再通过云端传来的控制信号决定当前显示的是小时分钟模式或者是分钟秒模式。同时加入了阴极保护功能,每隔一段时间就让辉光管所有数字按顺序显示一遍,提高辉光管的寿命。
软件流程图
5.2.1 NTP协议
NTP(Network Time Protocol)网络时间协议基于UDP,用于网络时间同步的协议,使网络中的计算机时钟同步到UTC,再配合各个时区的偏移调整就能实现精准同步对时功能。提供NTP对时的服务器有很多,比如微软的NTP对时服务器,利用NTP服务器提供的对时功能,可以使我们的设备时钟系统能够正确运行。
本系统通过使用RT-Thread提供的NTP协议中间件,在联网的状态下,通过调用相关函数,很方便的将设备时间和网络时间同步,保证时间的准确性。同时使用高精度时钟芯片DS3231,可保证时钟的精确走时。
5.2.2 MQTT协议
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。
MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。其在,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。
实现MQTT协议需要客户端和服务器端通讯完成,在通讯过程中,MQTT协议中有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。
在本系统中,物联网辉光钟作为客户端,既作为发布者也作为订阅者,发布当前辉光钟的状态,订阅云端发布的控制信息。信息的载体为JSON格式,所以发送和接收消息后都需要对消息进行一定的加工和利用。
5.2.3 HV57708和ESP8266,DS3231驱动
ESP8266,DS3231驱动均使用物联网操作系统提供的中间件驱动程序,使用较为简单,这里不再赘述。
HV57708使用场景较少,资料较少,于是查阅数据手册,通过研究数据手册中的芯片操作时序。编写调试驱动代码,最终实现了对HV57708的驱动。
5.3 云服务器端软件架构设计
阿里云物联网平台端
云端设备的定义
连接物联网平台需要先创建设备,根据这个设备的证书信息,和密码。设备可通过一个三元组证书信息连接到云服务器。阿里云物联网服务器作为设备的接收和中转站,管理所有通过MQTT协议发送和接收的信息。将Web服务器和硬件设备定义成两个设备,通过设置规则引擎,完成数据的接收和转发。
通过设计规则引擎,将WEB服务器和辉光钟之间的消息进行转发,实际上将阿里云物联网平台看做一个消息中转站的作用。
规则引擎设计
阿里云服务器端
技术架构
原生Linux系统加宝塔面板,对小白用户友好
使用node.js框架作为网站后端
使用node.js软件包中的node-red数据流处理工具
具体步骤
使用node-red,node-red是一种图形化的后端处理工具,适用于物联网服务等小型服务端应用搭建,不需要写代码,部署比较快捷。
使用node-red主要完成以下几个功能
1.作为MQTT协议中的客户端,连接阿里云物联网平台,订阅相关话题,接收上传的JSON格式MQTT报文
2.对JSON格式的报文进行处理
3.下发控制信息到物联网辉光钟端
下图为在node-red上完成的配置,没有写一点代码,点击部署后完成部署,便可以在网页上看到
打开硬件设备,待其连接到阿里云物联网平台,然后进入以下网址
http://39.99.247.63:1880/ui/
就可以完成对辉光钟的显示模式的控制,并且可以设置闹钟,因为没有在硬件上设计蜂鸣器,于是想到了让网页端发声的解决方案。
六、拓展功能
增加时钟功能,增加闹钟和倒计时和正计时的功能。因为板子上没有画蜂鸣器模块,于是就使用在网页端发声的方式,可以灵活地更改音乐种类。
心得体会
本次项目设计初步打通了物联网的整个数据链路,通过该实验,下一步可以完成更加复杂智能的物联网应用,比如实时操控家里的家电,家中电器通过检测环境变化自动开关机。添加微信小程序访问Web服务器,从而监控物联网设备等功能。同时还锻炼了通过查找数据手册完成对芯片的驱动,完成开关稳压的设计,很好的将课堂学习到的知识运用到实际中去。
本次项目从原理图出发,到PCB,到焊接装配和代码的编写。完整熟悉了开发嵌入式设备的全过程,是一次很好的历练,通过一个项目,使得课堂学习到的知识运用到实际,使我收获颇多。
总体开支
把备用原件的开支也算上了