早就耳闻RTT大名,但是一直没有机会接触。趁着这次机会,正好能够增加一项技能。据说RTT的软件包可以很方便的接入阿里云等平台,于是决定顺便抱着学习RTT的态度参加这次活动。 计划使用RT-Thread的软件包接入阿里云,并且控制推窗器推杆电机正反转,实现窗户智能化控制。实测之后发现AT8870能提供的电流还是太小,即便是在无负载的情况下也无法完全驱动推杆,所以视频演示只能用一个小电机来做了。有机会再做一个继电器版本的来控制推杆。
原本就设计了温湿度传感器,结果涂鸦第二期训练营正好同时开营,而且还是主推MCU开发模式,真是太巧了,和ART-Pi活动配合的天衣无缝。于是临时更改设计,预留了涂鸦模块的位置,一个板子参加两个训练营吧,两边侧重点不同。
本项目迭代了两个硬件版本。 第一版: L298N H桥芯片+钮子开关双电源切换+温湿度传感器+光照传感器+双光耦。 第二版: AT8870 H桥芯片,移除钮子开关,增加OLED接口和位置,移除光照传感器。移除一个光耦。增加三个按键。
因为电机需要24V输入,电源方案: 电源从扩展板输入24V,通过扩展板的板载TPS54331将24V转为5V,然后通过P1的+5V_USB引脚向ART-Pi供电。24电源DC口设计了过压、过流保护电路。 电源方案也有较大的改动,由于取消了原先的钮子开关,后来发现还是应该在5V增加一个防倒灌二极管,这样才能单独使用底板供电。于是飞了一个上去。 24-5V电源芯片介绍:
电机驱动使用了单通道H桥电流控制电机驱动器AT8870。特点:
原计划使用了电子推杆,直接给24V即可驱动,正负极换向即可反方向运动。结果测试过程中Boom了一个AT8870,看来AT8870驱动能力不够,所以demo改为驱动小电流的电机,用来拉个窗帘或者卷帘还是OK的。 最重要的是,当无底板的时候,也可以把它当作一个独立的电机驱动板来用!!
板子到了以后发现我选错了封装,用了一个1.5间距的排针...这个货就是比2.54mm间距的贵很多,手头还没有这个间距的排针。暂时就不做雨滴检测测试了。
没有使用常见的SHT31,而是使用TI的HDC1080DR,而且它更便宜啊。最终把它设计到板子右上角,通过槽孔隔离,底层通孔开窗,尽量减少板子自身发热对温度测量的影响。
显示内容:
Note:
此版本与涂鸦版本在软件上有很大的区别。天气信息获取、时钟同步、云平台等都有很大的不同,这个版本更多利用了RT-Thread操作系统自身的线程来访问网络以及相互协同工作。
本项目使用了STM32H750的硬件RTC,通过NTP进行时钟同步。而且我发现了一个奇怪的现象,一旦我操作电机之后,drv_rtc.从里面的return mktime(&tm_new);
会返回一个错误的数据,寄存器出来的值是对的,但是mktime返回的时间戳就不对了!后来我只好重写了一个函数:void app_read_rtc(struct tm *timeinfo)
,直接传指针进去,反正我不需要时间戳,我需要的是日期和时间。
天气免费API其实有很多,免费的比较推荐和风天气和高德。本项目最后采用了高德的免费天气API。使用的时候请自行使用源代码中的宏定义写入自己的API KEY。 关于天气归属地,我还是用了一个免费的API来获取IP地址的归属地,然后根据归属地自动获取当地天气,缺点是只能精确到市一级。代码中还可以自定义默认的归属地(本例中是余杭区),在归属地API无法获得信息情况下,根据默认的归属地查询天气。
RT-Thread的一大特点是有各种软件包。但是阿里云的软件包虽然可以连上服务器,但是配网部分我的测试结果是那部分没有移植完成,如果启用了配网,是无法通过编译的。所以设备就无法通过阿里的“云智能”进行配网和绑定设备,无法接入智能生活平台使用。最后只能绕道使用阿里物联网平台和IoT Studio,做了一个手机H5页面来进行控制,速度响应会比app控制慢一些,但是仍然完成了本项目所需要的显示和控制。
一开始先尝试了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的调试也花了不少时间,最开始也曾经尝试使用RT-Thread的HDC1000软件包(与HDC1080兼容)。但是RTT注册了软件I2C1之后,软件包在初始化设备的时候却提示找不到i2c1。于是放弃。软件包使用了传感器框架反而使得初始化和访问变得很复杂。 改用硬件I2C之后,由于HAL进行了I2C读写封装,如果HDC1080直接使用HAL_I2C_MEM_Write()会导致测量命令发送失败,读取温湿度也失败。网上资料很少,最后终于从国外网友的一篇帖子里面找到灵感,解决了它的读取问题。
├─applications
│ ├── amap_weather.c //高德天气API相关
│ ├── amap_weather.h
│ ├── app_event.c //事件和全局变量
│ ├── app_event.h
│ ├── app_oled_hwi2c.c //OLED硬件I2C驱动
│ ├── app_window_control.c //电机控制相关
│ ├── linkkit_solo.c //阿里云相关
│ ├── main.c
│ ├── oled.c //OLED显示相关
│ ├── oledfont.h //OLED字体相关
│ ├── oled.h
│ ├── sensor_hdc1080.c //温湿度传感器相关
│ └── SConscript
|
Github项目地址
第二版实物 | 手机APP |
---|---|
!注意:请使用浏览器自带下载,迅雷等下载软件可能无法下载到有效资源。
欢迎加入EEWorld参考设计群,也许能碰到搞同一个设计的小伙伴,群聊设计经验和难点。 入群方式:微信搜索“helloeeworld”或者扫描二维码,备注:参考设计,即可被拉入群。 另外,如您在下载此设计遇到问题,也可以微信添加“helloeeworld”及时沟通。
EEWorld Datasheet 技术支持