[可进入原文获取智能窗帘机器人软硬件开源资料包]( 智能窗帘机器人_三明治开发社区的博客-CSDN博客)
家中窗帘太多,费事费力;平时家中老人腿脚不便,开窗帘困难;想关闭窗帘,却因忙碌腾不开手; 家中有多个窗帘,费时费力!
如果安装电动窗帘,需要结合户型、门窗大小预留安装空间和电源接口,往往需要专业人员上门丈量确认是否符合改装要求,大大增加了安装成本。有没有不用拆?改?换?就能随心掌控家中窗帘的“神器”!
灵光一现,目前市场上出现的小型的窗帘机器人,能让普通窗帘秒变智能窗帘。何不自己动手 DIY 一个~
一.功能介绍
| 功能 | 功能说明 |
|---|---|
| App控制 | 支持普通控制模式和百分比控制模式。 普通模式:支持打开、关闭和停止控制功能 百分比控制:按照窗帘长度的百分比来控制 |
| 光照控制 | 支持设置最低光照值和最高光照值,当光照强敌低于最低值,或高于最高值时,窗帘自动关闭 |
| 光照检测功能 | 可显示当前光照强度专业人员不知道 |
| 自启动功能 | 检测到手动开,将窗帘全部打开;检测到手动关,将窗帘全部关闭 |
| 电量显示 | 显示电机当前电量 |
二.硬件方案介绍
利用涂鸦智能低功耗嵌入式 Bluetooth LE 模组作为控制单元和无线连接单元。通过照度传感器检测当前环境的光照强度,加速度传感器识别手动拽拉窗帘的状态以及电机带动窗帘运动来实现窗帘智能化开启和关闭。
- 核心控制单元
涂鸦智能低功耗嵌入式 Bluetooth 模组基于 SoC 开发,能够实现 Bluetooth LE 直连,电机控制和传感器数据采集。
2.电源管理单元
选用 4000mHA 的可充电锂电池(3.7V)作为主供电源,在提供稳定运行保障的同时,无需另外再布电线,且当电量不足时,还可以拆卸充电。
3.照度传感器
可感应光照强度的器件主要有光敏电阻、光敏二极管和照度传感器芯片。光敏电阻和光敏二极管采集的是模拟量。光照传感器选择 TI 的 OPT3004 传感器芯片,可通过数字接口直接输出当前的光照强度值,适合在 App端实时显示光照强度值。
4.加速度传感器
ST的LIS2DW12加点速度传感器为3轴加速度传感器,能够在比较精准识别完成啦窗帘动作水平方向的力。
5.点击驱动
窗帘机器人的动力原理是通过转轮和窗帘导轨的摩擦力带电机器人和窗帘运动,需要比较大的扭矩而对运动速度要求没有很高。利用高速低扭矩通过齿轮减速增扭以后带动发动机,不仅能够产生很大的扭矩,而且功耗较小,符合窗帘机器人的动力需求。
窗帘机器人原理图:
窗帘机器人PCB图:
三.软件实现方案
下面一一对各功能的实现原理作简单说明:
1.功能实现:普通控制和百分比控制
普通控制和百分比控制都需要在已经知道窗帘长度的情况下进行。由于电机的转速是一定的,在测量窗帘长度的时候其实是测试从 0% 到 100% 需要多少时间,然后根据电机当前所处位置和要到达的位置来计算需要运行的时间,以此来实现控制窗帘机器人移动到指定位置。
实现方法:百分比控制在接收到app下发的DP点后先调用void curtain_percent_control(unsigned char current_position, unsigned char target_position) 函数使窗帘机器人向对应的方向运行,将需要运行的时间存入全局变量中,供停止任务函数使用。void
curtain_percent_control_stop_task(void)函数需要被一直执行,当检测到运行时间已达到的时候,停止电机运行,将当前位置存入到FLASH中,上报当前电机位置。
百分比控制部分代码示例:
```c void curtainpercentcontrol(unsigned char current_position, unsigned char targetposition) { unsigned long totaltime;
2.功能实现:自动测量窗帘长度
自动测量窗帘长度实际上是测量窗帘杆子的长度,那么如何判断窗帘机器人是否到达终点是两端是测量的关键。控制电机运动的功能实现是通过获取测量得到的总时长来实现的。
判断窗帘机器人到达终点,在该硬件上有两种方法来判断:
一是通过测量电机驱动芯片中的 MOCUR 引脚,当电机堵转的时 MOCUR 引脚将会比正常运行时的电压高,通过判断该引脚电压是否发生变化可以知道电机是否发生堵转,从而确认是否到达终点。
二是通过三轴加速度传感器 lis2dw12 来判断是否到达终点。根据 lis2dw12 在硬件上的放置位置来看,判断窗帘机器人的运行状态主要依靠三轴加速度传感器中的x轴来判断。
下图为窗帘机器人在运行过程中三轴加速度传感器 x 轴的数据,静止状态基本无波动,启动后到到达终点前上下波动较大,在到达终点撞击的那一刻x轴数据明显的一个凸起的上升,到达终点后电机未停止运行可以看到x轴的数据比静止时平均要高,且数据上下浮动比运行过程中要较小。
通过上面的两种方式可以看到,使用电压比较的方式来判断是否到达终点相较于使用 lis2dw12 来判断来看是较为简单。但使用三轴加速度计 lis2dw12 可以清晰的知道当前电机处于何种运行状态。
3.功能实现:动作检测
通过观察波形可以知道,当你向某一方向拉窗帘时,总体来看虽呈波动状态,但最开始时的值与拉取的方向有关,所以该部分功能的实现是通过判断窗帘机器人被拉动后最开始的一部分数值来确定将要跑动的方向。
示例代码:
```c short xdatabuf[100] = {0}; unsigned int cleanxbufcount = 0; unsigned char xdata_index = 0;
void autopowertask(void) { short xaxisdata = 0; unsigned char i = 0; unsigned char opencount = 0, closecount = 0;
4.功能实现:光照强度显示
检测光照强度的传感器使用的是 opt3004,通过 IIC 协议,通过读取 opt3004 的 result 寄存器获取当前的光照值。
示例代码:
```c
define I2CCLKSPEED 200000
short lsbsizetab[] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048};
unsigned char opt3004init(void) { unsigned char deviceiddatabuf[2] = {0}; unsigned char manufactureriddata_buf[2] = {0};
5.面板 UI
App 面板使用可以涂鸦 IoT 平台提供的公版单开帘面板。
让家中普通窗帘秒变智慧窗帘,你可远程控制开关,还能根据光照强度自动开启关闭,为家人送去便捷生活~
上期精彩回顾(【内含实物图】一款可独立行走且支持远程对话的微型巡逻摄像头 - 掘金 (juejin.cn))