嘉立创产业服务站群
发作品签到
标准版

【涂鸦智能】智能电机(窗户)控制器+272650A

工程标签

3.0k
0
0
0

简介

基于涂鸦平台的智能电机(窗户)控制器, 底板采用基于STM32H750的ART-Pi。含电机驱动、板载温湿度传感器、OLED显示屏,外置雨滴传感器接口。

简介:基于涂鸦平台的智能电机(窗户)控制器, 底板采用基于STM32H750的ART-Pi。含电机驱动、板载温湿度传感器、OLED显示屏,外置雨滴传感器接口。

开源协议

CC-BY-NC 3.0

创建时间:2021-01-18 14:19:16更新时间:2021-08-19 03:01:14

描述

简介

点击查看本项目的前世
本项目迭代了两个硬件版本。
第一版: 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口设计了过压、过流保护电路。
image.png

2. 电机驱动

电机驱动使用了单通道H桥电流控制电机驱动器AT8870。特点:
●宽电压供电,6.5V-38V
●低RDS(ON)电阻
●PWM电流整流/限流
●支持低功耗休眠模式
●过温关断电路
●短路保护
●欠压锁定保护
●自动故障恢复
●3.6A峰值驱动输出,2A持续输出能力
原计划使用了电子推杆,直接给24V即可驱动,正负极换向即可反方向运动。结果测试过程中Boom了一个AT8870,看来AT8870驱动能力不够,所以demo改为驱动小电流的电机,用来拉个窗帘或者卷帘还是OK的。
AT8870.png

3. 雨滴检测

外置雨滴检测模块,原计划通过板载LM393比较器来判断是否下雨。 最后决定直接使用ART-Pi的ADC来检测。由于不需要太高的速度,所以就没有使用DMA了,而且似乎RTT框架也没有封装ADC的DMA?所以就直接使用一个任务循环检测就好了。 雨滴检测接口也预留了数字输入,也通过外置模块高低电平产生的中断来判断是否下雨。

4. 温湿度检测

没有使用常见的SHT31,而是使用TI的HDC1080DR,而且它更便宜啊。最终把它设计到板子右上角,通过槽孔隔离,底层通孔开窗,尽量减少板子自身发热对温度测量的影响。
image.png

5. 按键

  1. 配网按键:按键进入配网状态,可以在smartconfig和ap config之间切换。
  2. 关窗按键:按下会进入关窗操作(旋转电机),中间再按可以暂停,然后再按继续完成余下关窗操作。同时屏幕会显示正在关窗。
  3. 开窗按键:按下会进入开窗操作(反向旋转电机)。操作逻辑同上。同时屏幕会显示正在开窗。

6. OLED 显示

image.png
显示内容:

  • 时钟(软件RTC,使用了涂鸦模块NTP功能定期同步时钟)。
  • 窗户状态
  • 开关状态
  • 实时天气(使用了涂鸦模块天气预报功能)
  • 室内温湿度(板载HDC1080提供)
  • 按键的时候提示正在开窗还是关窗
    OLED驱动芯片为SSD1315,全局刷新模式。初始化代码和网上流行的的略有差别。

Note:
>RTT和RTT Studio第一次接触,希望能一次性搞定所有代码。已有freeRTOS和CubeMX的基础,想来应该不是问题吧。
>第一次尝试使用多页原理图。还算顺利。

原理图所有阻容均支持嘉立创SMT基础库。

放射状流程图.png

软件设计

  • 软件工程由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地址

Github项目地址

图片

第二版实物第一版3D预览
IMG_5693-2.jpg3D_transparent.png

截图.png

最后的建议

  1. 尽量还是做一个电机部分的电源隔离,否则可能会对OLED显示产生干扰。
  2. 如果不隔离,至少要增加一个扩展板5V输出防倒灌二极管。
  3. 如果使用推杆这类无需调速的应用,还是继电器最佳。

设计图

原理图(1 / 3)
PCB

BOM

IDNameDesignatorFootprintQuantity
1220uF/50VC1610X10.5_JX1
216KR6R06031
3TPS54331DRU1SOIC-8_L5.0-W4.0-P1.27-LS6.0-BL1
48.2nFC4C06031
5mts203K1MTS-2031

附件

序号文件名称下载次数
1
涂鸦智能窗户演示.mp4
125
克隆工程
添加到专辑
0
0
分享
侵权投诉

评论

全部评论(1)
按时间排序|按热度排序
粉丝0|获赞0
相关工程
暂无相关工程

底部导航