
【涂鸦智能】智能电机(窗户)控制器+272650A
简介
基于涂鸦平台的智能电机(窗户)控制器, 底板采用基于STM32H750的ART-Pi。含电机驱动、板载温湿度传感器、OLED显示屏,外置雨滴传感器接口。
简介:基于涂鸦平台的智能电机(窗户)控制器, 底板采用基于STM32H750的ART-Pi。含电机驱动、板载温湿度传感器、OLED显示屏,外置雨滴传感器接口。开源协议
:CC-BY-NC 3.0
描述
简介
点击查看本项目的前世。
本项目迭代了两个硬件版本。
第一版: L298N H桥芯片+钮子开关双电源切换+温湿度传感器+光照传感器+双光耦。
第二版: AT8870 H桥芯片,移除钮子开关,增加OLED接口和位置,移除光照传感器。移除一个光耦。增加三个按键。
本项目包含了一个AT8870 H桥驱动,用于驱动电机。以及外置一个雨滴传感器接口,板载一个温湿度传感器。ART-Pi板载的AP6212无法接入涂鸦,所以改为使用涂鸦WB3S模块,通过MCU接入方式连接涂鸦云,操作系统采用RT-Thread,将涂鸦MCU SDK集成到RT-Thread项目中。MCU开发IDE使用RT-Thread Studio。
硬件是基于ART-Pi的扩展板,排针根据ART-Pi扩展引脚设计,本项目的软件必须配合本硬件以及ART-Pi使用才能连接涂鸦云。脱离ART-Pi单独使用时也可以作为外接的电机驱动板来用。
使用RT-Thread接入涂鸦的,大概我这个项目是本站(全网)第一个?
硬件设计
1. 电源
因为电机需要24V输入,电源方案: 电源从扩展板输入24V,通过扩展板的板载TPS54331将24V转为5V,然后通过P1的+5V_USB引脚向ART-Pi供电。24电源DC口设计了过压、过流保护电路。
2. 电机驱动
电机驱动使用了单通道H桥电流控制电机驱动器AT8870。特点:
●宽电压供电,6.5V-38V
●低RDS(ON)电阻
●PWM电流整流/限流
●支持低功耗休眠模式
●过温关断电路
●短路保护
●欠压锁定保护
●自动故障恢复
●3.6A峰值驱动输出,2A持续输出能力
原计划使用了电子推杆,直接给24V即可驱动,正负极换向即可反方向运动。结果测试过程中Boom了一个AT8870,看来AT8870驱动能力不够,所以demo改为驱动小电流的电机,用来拉个窗帘或者卷帘还是OK的。
3. 雨滴检测
外置雨滴检测模块,原计划通过板载LM393比较器来判断是否下雨。 最后决定直接使用ART-Pi的ADC来检测。由于不需要太高的速度,所以就没有使用DMA了,而且似乎RTT框架也没有封装ADC的DMA?所以就直接使用一个任务循环检测就好了。 雨滴检测接口也预留了数字输入,也通过外置模块高低电平产生的中断来判断是否下雨。
4. 温湿度检测
没有使用常见的SHT31,而是使用TI的HDC1080DR,而且它更便宜啊。最终把它设计到板子右上角,通过槽孔隔离,底层通孔开窗,尽量减少板子自身发热对温度测量的影响。
5. 按键
- 配网按键:按键进入配网状态,可以在smartconfig和ap config之间切换。
- 关窗按键:按下会进入关窗操作(旋转电机),中间再按可以暂停,然后再按继续完成余下关窗操作。同时屏幕会显示正在关窗。
- 开窗按键:按下会进入开窗操作(反向旋转电机)。操作逻辑同上。同时屏幕会显示正在开窗。
6. OLED 显示
显示内容:
- 时钟(软件RTC,使用了涂鸦模块NTP功能定期同步时钟)。
- 窗户状态
- 开关状态
- 实时天气(使用了涂鸦模块天气预报功能)
- 室内温湿度(板载HDC1080提供)
- 按键的时候提示正在开窗还是关窗
OLED驱动芯片为SSD1315,全局刷新模式。初始化代码和网上流行的的略有差别。
Note:
>RTT和RTT Studio第一次接触,希望能一次性搞定所有代码。已有freeRTOS和CubeMX的基础,想来应该不是问题吧。
>第一次尝试使用多页原理图。还算顺利。
原理图所有阻容均支持嘉立创SMT基础库。
软件设计
- 软件工程由RT-Thread Studio中创建,由于涂鸦模块的MCUSDK处理了所有网络请求,所以没有使用任何RT-Thread软件包。项目使用了RT-Thread软件RTC。NTP时间同步以及天气信息获取都从MCU SDK实现。
- 项目充分利用了RT-Thread的多线程特性,使用事件来实现线程之间的相互通讯。
- 项目使用了RT-Thread自动初始化的特性,所以在main()中基本看不到其他初始化函数。
- RT-Thread 版本: 4.0.3
- RT-Thread Studio 版本: 2.0.0
关于OLED驱动和硬件I2C
一开始先尝试了RT-Thread的u8g2软件包,确实能很快驱动OLED屏幕。但是它使用了GPIO模拟I2C,却没有使用RT-Tread的软件I2C框架,而我的两个I2C设备都挂在这个I2C总线上,修改起来很麻烦。于是放弃软件I2C,改用硬件I2C,然后毫不意外遇上了传说中的STM32 I2C锁死问题,通过重新初始化解决。
驱动OLED遇到了很多问题,一开始使用局部刷新方式,但是会随机出现一些部分错位。然后改用全局刷新,却在开机的时候垂直错位4个bit。然后debug了很久,通过修改offset设置修复。但是发现运行久了还是会逐渐发生错位。这是一个很奇怪的现象,在其他芯片上没出现过这种问题。可能与I2C锁死的处理方式有关?需要进一步检查。
我还曾经尝试使用硬件I2C + DMA,折腾了2天之后才发现ART-Pi引出的I2C4只支持BDMA,而BMDA只能访问SRAM4,如果要使用DMA就要把buffer存放或者映射到SRAM4,这个...在CubeMX里面操作还比较麻烦,需要修改LD文件。于是暂时放弃。
关于HDC1080
HDC1080的调试也花了不少时间,最开始也曾经尝试使用RT-Thread的HDC1000软件包(与HDC1080兼容)。但是RTT注册了软件I2C1之后,软件包在初始化设备的时候却提示找不到i2c1。于是放弃。软件包使用了传感器框架反而使得初始化和访问变得很复杂。
改用硬件I2C之后,由于HAL进行了I2C读写封装,如果HDC1080直接使用HAL_I2C_MEM_Write()会导致测量命令发送失败,读取温湿度也失败。网上资料很少,最后终于从国外网友的一篇帖子里面找到灵感,解决了它的读取问题。
源文件简要说明:
├─applications
│ │ app_event.c //事件和全局变量
│ │ app_event.h
│ │ app_gpio.c //配网按键相关
│ │ app_oled_hwi2c.c //oled显示相关
│ │ app_ti_hdc1080.c //温湿度传感器相关
│ │ app_uart.c //串口及天气相关
│ │ app_uart.h
│ │ app_window_control.c //电机控制相关
│ │ main.c //入口文件
│ │ oled.c //OLED驱动相关
│ │ oled.h
│ │ oledfont.h //OLED字体相关
| |--mcusdk //tuya MCU SDK
> 注:源码中的真实PRODUCT_KEY已移除。
>
Github地址
图片
第二版实物 | 第一版3D预览 |
---|---|
![]() | ![]() |
最后的建议
- 尽量还是做一个电机部分的电源隔离,否则可能会对OLED显示产生干扰。
- 如果不隔离,至少要增加一个扩展板5V输出防倒灌二极管。
- 如果使用推杆这类无需调速的应用,还是继电器最佳。
设计图
BOM
ID | Name | Designator | Footprint | Quantity |
---|---|---|---|---|
1 | 220uF/50V | C16 | 10X10.5_JX | 1 |
2 | 16K | R6 | R0603 | 1 |
3 | TPS54331DR | U1 | SOIC-8_L5.0-W4.0-P1.27-LS6.0-BL | 1 |
4 | 8.2nF | C4 | C0603 | 1 |
5 | mts203 | K1 | MTS-203 | 1 |

评论