自调节窗帘

嵌入式系统   作者:Alexander Lee(AWL9);Henry Chan(HC352) 时间:2025-02-08来源:

介绍

自动调节窗帘会自动升高、降低、打开和关闭您的百叶窗。计算机终端充当遥控器,通过 RF 向窗帘广播指令。这些手动调整与房间当前的环境光和温度设置一起存储在微控制器系统中。当在房间内找到这些照明和温度条件时,窗帘会自动重新调整到之前的水平。

高级设计

理由

我们的设计基于 Lutron 的 Sivoia 遮阳解决方案(在此处找到 youtube 视频)。我们特别感兴趣的 Lutron 系统功能是远程功能和遮阳帘的自动功能。我们注意到,在窗帘内创建一个内存系统也可能是有利的,该系统将允许它记住用户以前的设置并根据环境中的当前条件自动调整。此外,我们还创建了一个射频装置,将窗帘连接到计算机系统,该系统不仅能够手动调整窗帘设置,还可以控制家中的整个系统。

背景数学

内存表组织

内存表中的节点是使用切比雪夫节点设置的。切比雪夫节点沿单位圆采用均匀的距离,使端点的点彼此更接近,而中间的点则更远。我们之所以使用这种设计,是因为我们认为在中间范围的阴影条件下比在极端范围内有更多的容忍度。

切比雪夫节点由以下公式定义:对于 n+1 个节点,x_i = (a+b)/2 + (b-a)/2*cos((2*i+1)/(2*n+2)*pi),其中 (a,b) 是范围,0 = i = n。为了确定轻节点,我们设置 n = 7(8 个节点)以获得 0 到 255 之间的 9 个区域。为了获得温度节点,我们设置 n = 3(4 个节点)以获得 100 到 180 之间的 5 个区域。我们选择这些边界点是因为,当房屋温度低于 50 F 或高于 90 F 时,我们预计阴影设置不会发生变化。即使这些也可能是光照设置的情况,我们决定保留它们,因为引用的光照设置是基于光照的差异。

光的切比雪夫公式中的节点如下:
[2.4499 21.876 56.6648 102.6260 152.3740 198.3352 233.5124 252.5501]

温度的切比雪夫公式中的节点如下:
[51.7127 63.8896 81.1104 93.2873]

这些节点被四舍五入为整数值,以节省内存使用量并使其更易于比较。

逻辑结构

我们的设计包含两个 ATMEL Mega644 微控制器:一个用于控制计算机接口,另一个用于作窗帘。第一个 ATmega644 连接到计算机终端。Hyperterm 允许用户向 MCU 输入命令以发送和/或接收数据。然后,它们通过 RCT433 传输到另一个 MCU 上的接收器

图 2.计算机终端 MCU 设置

第二个 MCU 包含两种作模式:自动和手动。在手动模式下,MCU 接收从第一个 MCU 传输的数据并处理指令,将窗帘移动到所需位置。当它没有收到指令时,MCU 切换到自动模式,根据房间内的照明和温度条件将百叶窗调整到用户之前的设置。然后,MCU 向电机发送信号,使其旋转正确的量以调整阴影。

图 3.窗帘 MCU 设置

这些设计的详细原理图可在附录中找到。

硬件/软件权衡

电机可以采用半步或全步配置驱动。半步是首选,因为它提供了更多的驱动力。不幸的是,这增加了功耗。由于功耗不是该项目的指标,因此这是提高弱步进电机强度的可接受解决方案。

百叶窗和挡板位置的分辨率必须与内存大小相平衡。该位置将针对特定配置存储在表中。位置的大小为一个字节,允许 256 个可能的位置。如果位置的大小为 int,允许 65536 个位置,则将配置映射到可能位置所需的内存将增长大约是表长度的 256 倍。存储可能的配置选项的表的长度由设置自动点所需的调整程度决定。为了对条件做出更精细的响应,需要更多的条目。虽然当前配置没有充分利用数据空间,但它也提供了对条件的充分响应。

在讨论实现第二个 UART 的方法时,ATMega644P 上的辅助硬件 UART 的解决方案被忽略了。虽然硬件解决方案更有利,但由于实现简单,软件 UART 允许对传输速率进行更精细的控制。为了降低由于波特率接近其规格而导致射频发射器/接收器对发生故障的风险,可以选择较低的波特率。由于定时器的性质,此波特率不需要通过硬件 USART 控制寄存器的分辨率进行量化(即不限于微控制器的有限波特率选择)。由于 RF 通道的共享总线特性和没有任何频率多路复用,因此还需要半双工通信。

由于各种中断之间的交互,尤其是通过 RF 链路发送/接收数据的关键区域,电机更新中断和软件 UART 中断的时序必须足够长,以避免数据丢失。例如,软件 UART 采样率必须足够长,以便电机中断的延迟完成处理,因此在正确的时间一致地采样位。此断言将限制波特率,但由于波特率已经受到 RF 模块的限制,因此可以安全地忽略此因素。

窗帘的可控性带来了可用性的权衡。虽然应该让用户可以自由输入任何任意的调整值,但高估调整值会导致阴影做出剧烈调整,用户感到恐慌。从交互的角度来看,将调整范围限制为常数可以让用户看到足够的反馈,而不会削弱立即响应剧烈变化的能力。

现有专利

电动窗帘的概念在当前的节能策略中并不是什么新鲜事。专利 7389806 讨论了一种电动窗帘和用于升高和降低窗帘的通信系统。电动窗帘的想法已经被 Lutron 和 Draper 等几家公司实施。然而,这些公司都没有实施允许窗帘独立于人工控制运行的内存系统

硬件

RF 通信网络

从一开始,该项目的目标之一就是提供一种与多个远程设备连接的方法。用于此目的的最简单的网络拓扑之一是星形拓扑。

图 4.射频连接到基站

由于远程设备之间缺乏交互,因此这种拓扑结构是合理的。基站控制所有远程设备,因此它是网络上最权威的节点,位于星形的中间。为了减轻基站的负载,从而减轻控制基站的网关设备(例如计算机)的负载,当基站正在接收时只有一个远程设备在发射,而当基站正在发射时,所有远程设备都在接收,这一断言必须成立。RF 通信链路本质上是一条共享总线。因此,频率多路复用(允许多个远程设备与基站通信)对于本项目来说太复杂了。

图 5.RF 发射器和接收器电路。

盲区移动

百叶窗使用 2 个 PF35T-48L 步进电机上下移动。电机使用 4N35 隔离器进行光隔离,并由 ULN2003A 达林顿阵列供电。使用步进电机是因为它们的准确性,因为预计百叶窗会根据用户以前的偏好停在特定位置。它们都驱动一个齿轮,增加系统中的扭矩,从而可以平稳地调整窗帘。线轴用于卷起固定窗帘的绳子。滑轮用于重定向拉力,以便单个齿轮和杆能够升高和降低阴影。该字符串穿过原始窗帘框架的孔,使其外观看起来与普通窗帘完全一样。

图 6.光隔离器和达林顿阵列电路

图 7.用于升高和降低阴影的线轴。

图 8.滑轮用于调整拉力的方向。

传感器输入

温度输入通过使用 LM34 传感器(与实验室 5 中使用的传感器相同)完成。在进入 MCU 中的 ADC 之前,使用 LM358 将其放大增益 2 以获得更高的精度。温度传感器输入进入 MCU 的端口 A.0。然后根据 ADC 值计算当前室温,并用于确定阴影的设置。

我们使用的光传感器是 TI 的单片光电二极管和单电源跨阻放大器 OPT101。光输出随光强度线性增加。光电二极管有一个内部放大器,电阻为 1MO,当引脚 4 和 5 连接在一起时使用。由于这个放大器,我们可以将光电二极管的输出直接插入 MCU 中的 ADC。光传感器进入端口 A.1(传感器内部)和 A.2(传感器外部)。我们使用了来自 MCU 的 5V 稳压输入。在强光下,传感器在电压表上的读数高达 4.27V,而在遮盖时读数为 .06V。

图 9.内部传感器电路。

硬件复杂功能

我们的第一个硬件复杂化问题来自拉起窗帘。我们创建了初始设计和测试代码,以作电机来升高和降低窗帘的一侧,而一个人则手动抬起另一侧。我们很快意识到电机的强度不足以抬起它的阴凉处。然后,我们购买了滑轮并创建了一个滑轮系统来帮助抬起遮阳伞。这也失败了,因为在电机不再有足够的扭矩之前,阴影只上升了大约一半。最后,我们购买了一个齿轮,以显着增加系统的扭矩。这提供了足够的扭矩来抬起阴影。我们希望购买第二个齿轮来为阴影的另一侧实施对称系统,但我们无法找到另一个,因为供应商只有一个齿轮具有正确的齿。因此,我们连接了第二个电机并对其进行了测试,发现这提供了足够的扭矩,可以用一个轴和齿轮抬起窗帘的两侧。

软件

用于 RF 通信的辅助 UART

为了方便使用 RCR/T-433 进行通信,使用 UART 连接似乎尤为突出。遗憾的是,在基站上,硬件 UART 已经用于与网关设备通信。由于缺乏对替代微控制器(如 ATMega644P)的研究,并且预算有限,因此实施了中断驱动的软件 UART。虽然软件解决方案的效率远不如硬件解决方案,但它便宜、成本低,并且在概念上易于理解。

软件实现大致基于 AVR304,它描述了使用定时器的半双工中断驱动 UART 和基于位拆解方法的外部中断。正如 RF 网络设计中所指出的,由于基带频率的共享性质,半双工串行通信方法对于该项目来说是足够且理想的。此实现的唯一硬件成本是使用两个 GPIO 引脚。在软件成本方面,使用了外部中断和定时器。

软件实现涉及通过多个控制状态转换软件 UART。

图 10.软件 UART 状态机

SW_UART_IDLE_S 通道空闲或刚刚接收或发送了一个字节。
SW_UART_RX_S 通道被占用,等待接收字节。
SW_UART_TX_S 通道被占用,正在传输一个字节。

sw_uart_send_byte 激活一个定时器中断,该中断以波特率发送一个起始位(传输下降沿),后跟一个字节的数据和一个停止位(传输上升沿)。由于子例程仅启用中断,因此它是非阻塞的,并且可以在传输字节时执行其他作。传输完整字节后,通道是空闲的。

sw_uart_receive_byte 激活外部中断以捕获状态位 (下降沿)。触发中断后,计时器开始以连接的波特率对传入的数据流进行采样。同样,此 sub 例程仅启用相关的 interrupts。它是非阻塞的,可以在未接收到字节时执行其他作。收到完整字节后,将释放通道。捕获字节后,接收到的数据将存储到变量中。

RF 数据封装

传输的帧由连续传输的 15 个字节组成。

[0][1...4][5][6...13][14]
0x00同步序列开始编码的有效负载


第一个字节(索引 0)是调整接收器增益和清除接收器捕获的任何噪声触发的中断字节所必需的。同步序列用于允许接收器将即将到来的帧确认为实际帧,而不是噪声。起始字节用于向接收方发出信号,以便在后续字节捕获期间开始存储编码的有效负载。最后,虽然项目中未使用停止字节,但它既可以用作终止符标记,也可以用作错误检查。

必须对有效负载进行编码才能提供 DC 规范化。在 Meghan Desai 完成工作之后,以下方案用于对有效负载进行编码,有效负载字节首先发送有效字节最少。

编码字节编码字节编码字节编码字节
0x00b100010110x4编号:0b100101100x80b101000110xC0b10101100
0x1编号 0b100011010x50b100110010x9编号:0b101001010xD0b10110001
0x20b100100110x60b100110100xA编号:0b101001100xE0b10110010
0x3编号 0b100101010x70b100111000xB编号:0b101010010xF0b10110100


有效载荷的格式可支持 254 台设备,每台设备有 254 个可能的传感值/命令。发射器解码的 payload 格式遵循此格式。

[0][1][2][3]
设备地址命令参数 1参数 2


0x00保留在基站的地址空间和传感器 ID 空间中以供确认。在自调节百叶窗的特定情况下,支持以下命令并从基站传输。

命令代码参数 1参数 2描述
'O'相对数量不在乎将翻盖打开相对量。
'C'相对数量不在乎将挡板关闭相对量
'U'相对数量不在乎相对程度地提高盲注
'D'相对数量不在乎将盲注降低相对量
'A'绝对盲区绝对翻盖位置将百叶窗定位到绝对盲板和翻盖位置。
'R'传感器 ID不在乎使用传感器 ID 轮询传感器以获取值


相比之下,远程设备仅传输以下有效负载格式。

[0][1][2][3]
0x00远程设备地址传感器 ID价值


对于非值返回作(如盲注调整),值 0x00 保留给传感器 ID,“A”用作确认收到命令的值。对于值返回作(如“R”),传感器 ID 对应于请求的信息,值是返回的值。故障检测和错误处理(例如在超时时重新发送命令)由网关设备驱动程序处理。以下从基站到网关设备的信息编码有助于这种交换。

法典意义
'W'正在向远程设备发送命令。
'D'完成命令处理
'F'处理命令时出错。可能未被识别
对远程设备的命令超时。未收到 ACK。
Rxyzx 为远端设备地址,y 为信息 ID,z 为返回值。(0x00 保留给 y 用于确认没有返回值的命令。z 将为 'A' 表示确认。


射频通信链路控制

RF 控制组件有助于发送和接收整个数据包。RF 控制必须与串行通信保持非阻塞性,但由于在工程的其余部分大量使用中断,因此将使用来自主 while 循环的非中断驱动控制。通过此实现,必须断言控制过程将被调用得足够快,而不会错过任何数据包。

图 11.射频连接到基站

RF_IDLE_S RF 信道被清除或刚刚发送或接收到有效帧。
RF_TX_S RF 通道用于通过软件 UART 爆破帧。
RF_RX_S RF 通道正在等待接收有效帧。
Rf_payload Valid ( Valid) 接收到的帧已经解码完毕,rf_payload 变量中包含了解码后的数据。

rf_transmit_msg() 对有效负载进行编码并将其加载到传输缓冲区中。未启用任何中断,并且实际上不会处理该帧。
rf_receive_msg() 启用软件 UART 字节捕获并重置接收帧缓冲区的条件。
rf_process_byte() 要么在准备好时从软件 UART 中读取字节,要么通过软件 UART 传输字节。这将调用 sw_uart_receive_byte() 或 sw_uart_send_byte()。承认从接收到的字符串中处理一个字节与及时启动软件 UART 以捕获下一个字节之间的争用条件。但是,接收到的停止字节的停止位和同步序列的长度应提供足够的时间,以便在任何编码的有效负载数据丢失之前再次调用 process_byte()。

施加超时是为了处理远程设备可能关闭或超出范围的情况。基站在发送命令后等待确认消息。如果在超时持续时间内未收到确认,则会向网关发送错误消息。

电机控制

步进电机通过按顺序给线圈通电来运行,以便转动电枢并产生旋转。在单步配置中,一次只有一个线圈通电。然而,在该项目中,步进电机被配置为以半步为增量转动。以半步驱动电机提供额外的驱动功率,同时消耗更多的电力。此外,它还提供两倍于全步配置的精度。用于驱动步进电机旋转的顺序如下图所示。

图 12.步进电机状态机

为了以特定速度驱动电机,使用了计时器。电机的转动速率由步长(使用半步配置)的一半乘以计时器的频率决定。增加频率并更快地完成电机控制序列将导致更快的旋转。以恒定速度驱动电机是平稳盲动的重要因素。因此,电机控制被降级为定时器,该定时器触发中断以每秒约 2 转的速度改变电机输出。电机中断部分由当前电机输出决定。为了确保实现平稳移动,在 timer 的单个周期内只能进行一次到相邻状态的转换。

timer interrupt 通过缩放因子处理将步长转换为位置。位置描述遮板的垂直位置或翻盖的角度。位置的分辨率是阴影的高度除以 256(以一个字节表示)。缩放因子由移动一个位置所需的步骤数决定。通过仔细记账,可以准确地保持绝对空间的位置。对阴影的调整仅限于这些位置,同时权衡内存大小和微调控制。完成每个位置的步数后,调整位置簿记并递减调整变量。

定时器根据四个调整变量将电机连续调整到相邻状态:

通过将调整变量设置为非零正数,计时器将自动控制物理电机运动以完成调整,而不会阻止通信组件的任何控制。最初,使用两个变量允许我们将走势向上和向下排队,这样它就会在向下走势之前完成所有向上的走势(或在收盘前完成所有开仓)。然而,经过进一步考虑,这个理想似乎很新颖,并不是特别有用。因此,在设置调整变量时,互补调整(例如,设置 adjup_pos 时为 adjdown_pos)应归零。在某个点将 configuration 存储到内存中的能力比在 movement 结束时存储位置更有利。

结果

执行速度

运行遮阳帘的电机是非阻塞的,可以随时被手动命令覆盖。输入手动命令时,将擦除先前的命令并执行新命令。这非常适合快速和即时调整,当用户可能希望停止自动调整阴影并将该点作为存储值时。这也消除了以前的闪烁,该闪烁是由于阴影具有同时上下移动的命令而导致的,这会导致阴影着色并经常在旋转中丢失步骤,从而降低阴影的准确性。现在只有一个命令,因此阴影没有冲突的调整。

阴影的两个调整都会闪烁,然后传感器值会生成一个非常接近节点的值。这是因为节点处的数据连接不顺畅,而是设置被分割成段。因此,如果传感器值悬停在某个节点周围,则当传感器高于和低于时,它将尝试在两个范围设置之间来回调整。电机不断尝试重新调整,但从未关闭。为了解决这个问题,我们需要为内存系统实现一种新的方法,也许使用双线性插值函数并创建一条连续曲线。我们没有实现这个内存模型的原因是实现 smooth 函数所需的计算。每个变量 (高度或角度) 的计算都需要 8 次乘法。这意味着我们在整个代码中每个循环都需要 16 次乘法。

准确性

步进电机为系统提供了非常好的精度,使其能够获得窗帘水平的精确点。我们将阴影分成 255 个步骤,或阴影可以停止的位置。这些步骤中的每一个都需要一定的旋转次数,这在 steps_per_position 中给出。当电机没有足够的扭矩来旋转窗帘或打开百叶窗并且电机滑动或发出咔嗒声时,窗帘精度的唯一缺陷就会出现。这种情况更多地发生在阴凉处顶部附近,此时电机必须举起阴凉处的全部重量。发生这种情况时,台阶将被丢弃,并且阴影现在位于不正确的位置。为了解决这个问题,我们有一个 calibrate 函数,它将阴影一直带到顶部(无需点击或跳过),然后将位置重置为零。

安全

步进电机通常会大量发热,因为运行电机需要大量的功率。为了解决这个问题,当电机不移动窗帘时,我们会关闭电机。我们通过向电机发送一个字节的低位来实现这一点,这意味着没有电压进入任何电机输入。这不仅可以防止电机过热,还可以降低功耗。除此之外,我们的窗帘与家中常见的另一种窗帘一样安全。

干扰

发射机以 433 MHz 的频率发出射频信号。这将干扰以该频率发射或接收的任何其他设备。我们的项目通过为每个接收器关联一个地址来对干扰进行分类。如果存在多个远程设备,则使用地址字节来确定哪些数据对该特定设备有用。任何不包含设备地址的信号都将被忽略。

可用性

我们的项目在现实世界中非常实用。尽管在每个窗口阴影中都有内存可能不是最好的情况(非常取决于位置和内存设计),但它在大多数情况下非常有用。整个设备安装在一个小框架中,可以很容易地被窗帘覆盖,就像普通的窗帘一样。此工程可以应用于多个窗帘,以使用单个控制源控制所有窗帘。

另一个可用性功能是我们的计算机界面。如前所述,它不仅能够处理到窗帘的传输,还能够处理到任意数量的远程设备的传输(只要有足够的地址)。这意味着单个基站最多可以控制 256 个远程设备。基站可以扩展以作照明、风扇和许多其他家用组件。

结论

期望值

我们很惊讶预算对我们的项目影响如此之大。最初,我们计划使用太阳能和电池来实施窗帘,以使其更加环保。然而,经过一番研究,我们意识到,买得起能够持续运行电机并同时为电池充电的电池和面板太昂贵了。因此,我们采用了典型的壁式插座电源。

我们在抬起和调整窗帘的极端点(将窗帘一直抬高或完全朝一个方向旋转)时遇到了一些麻烦。然而,当我们尝试使用功率较小的步进电机来创建内存系统时,我们预料到会遇到一些困难。最后,我们最好使用更坚固的电机,并使用更坚固的材料(如木材)设计我们的框架。但是,由于时间和资源限制,我们无法完成这些任务。

知识产权注意事项

产品唯一不是从头开始创建的部分是窗帘本身。除了窗帘,我们用原材料制造了所有东西。

我们软件 UART 的一部分代码来自 Atmel 给出的基本代码。除此之外,我们所有的代码都是在我们小组内部自行编写和设计的。

道德考虑

在整个项目中,我们尽最大努力维护 IEEE 道德准则,以创造一种安全且有用的产品来推动技术进步。我们在设计项目时高度重视公益和安全。在项目过程中,我们没有遇到任何冲突。我们尽我们所能设计了这款产品的电路和布线。没有贿赂案件,如果有,我们不会接受。我们采用了我们熟悉的技术,并尝试以有用的方式将它们结合起来。我们不仅得到了 Land 教授和助教的帮助,还得到了一些以前参加过 ECE 476 的朋友的帮助。我们经常与其他团体或不同的种族、性别、宗教和其他各种不同的人讨论他们的项目,并收到关于我们项目的反馈。

法律注意事项

我们以 433MHz 的速度传输,这在自由传输范围内。除了传输之外,我们的窗帘还充当完全可作的普通手动窗帘。没有其他法律问题需要考虑。

附录

源代码

程序文件

main.c
rfcomm.c
serial.c
softuart.c
stepper.c
uart.c

头文件

main.h
ops.h
端口声明.h
rfcomm.h
serial.h
softuart.h
步进器.h
uart.h

图表

图 13.Base Station Schematic 全尺寸 sch 文件

图 14.远程站原理图全尺寸 sch 文件

图 15.Motor Driver Schematic 全尺寸 sch 文件

图 16.传感器原理图 sch 文件

图 17.OPT101 光电二极管原理图

成本

部分项目数量价格



72.45
电机PF35T-48L 步进电机31.003.00
电机ULN2003达林顿阵列20.641.28
电机4N35 光隔离器80.252.00
电机/RF/传感器小型 PC 板51.005.00
电机滑轮22.755.50
电机线轴2报废--
电机橡皮筋4二手--
电机筷子1报废--
电机齿轮14.004.00
单 片 机ATmega6442采样--
单 片 机DIP 插座30.501.50
单 片 机MCU 焊锡板21.002.00
单 片 机最大 2331采样--
单 片 机RS232 接口11.001.00
射频RCR-433 射频接收器24.008.00
射频RCT-433 射频发射器24.008.00
MCU/电机电源35.0015.00
传感器OPT101 光电二极管25.5011.00
传感器LM34 温度传感器12.512.51
阴影窗帘12.662.66
阴影纸板好多报废--


关键词:

加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW

或用微信扫描左侧二维码

相关文章

查看电脑版