项目介绍
使用得捷scheme-it绘制框图与原理图,主控使用ESP8266设计,利用PD诱骗器获取12V电压,利用7805和ST的LD1117得到3.3V。MCU通过双路栅极驱动可同时控制4路水泵,并连接Home assistent服务器,上传传感器数据,实现实现集中化控制。
选择产品的功能描述和性能指标介绍
1,STMicroelectronics的LD1117S33TR:
LD1117是一种低压差稳压器,能够提供高达800毫安的输出电流,甚至还有可调版本(VREF = 1.25 V)。对于固定版本,提供以下输出电压:1.2 V、1.8 V、2.5 V、2.85 V、3.3 V和5.0 V。该器件供应的封装有:SOT-223、DPAK、SO-8和TO-220。SOT-223和DPAK表面安装封装优化了热特性,甚至具有显著的节省空间的效果。NPN晶体管确保高效率。事实上,在这种情况下,与PNP晶体管不同,静态电流主要流向负载。为了稳定,只需要一个非常常见的10微法最小电容。芯片修剪使稳压器能够在25℃时实现非常严格的输出电压容差,为±1%。可调LD1117与其他标准的可调电压稳压器兼容,在降压和容差方面保持最佳性能。
使用1117时一定要注意,输出电容要使用钽电容,不可以使用普通的陶瓷电容。而这一点在一般1117的规格书中也都有特别说明。但是我们可以看到,这款ST的LD1117为此做过优化,可以不使用钽电容,在典型电路应用中并没有提及:
项目设计思路
这个项目中尝试使用极低成本实现多路的水泵控制,并同时实现模拟及数字传感器的读取。目前预想的使用场景是将它作为Home Assistant的一个配件接入整个HA系统,传感器获取到的数据上传至HA服务器,由服务器来进行一系列的条件判断并最终控制水泵工作。当然,本项目中自带传感器与执行单元,并可以连接wifi。因此即使不通过HA,也可以自己实现自动化。
项目方案框图和原理图介绍
整个系统并不复杂,总体而言分为三个部分。
第一个部分是供电部分,这里面又包含了两块,一块是PD诱骗器,另一块是线性稳压电路。
第二个部分输出部分,通过两个栅极驱动来控制四个mos管,实现对电机的控制。
第三个部分是接口部分,固件烧写,传感器输入,与其它的输入输出,都是通过这里实现的。
为了实现功能的独立,PD电源部分独立出来做了一个单独的pcb模块,这样这个模块在其他地方也可以非常方便的使用。
模块非常简单,我们在Kicad中完成原理图和PCB的设计:
PD诱骗模块是由USB母座,PD诱骗芯片组成。选用的是CH224K这颗芯片仅需一颗电阻就可以实现诱骗电压的选择。电阻就是图中的R3,在这里我选择R3是24K,诱骗出的电压是12V。
图中剩余的R1, R2颗电阻是限流电阻。
对应的PCB非常小巧,仅为两个USB母座的大小,且元件全在单面,方便贴装在其他电路板上进行使用。
下面讲讲主电路板部分,设计与阶段一一致,先看下整体原理图:
ESP8266有Strapping 管脚的设计,也就是说会在上电时先检测这些管脚的电平,然后再确定启动模式。因此这些管脚需要做特别的处理。ESP8266的Strapping管脚是IO0, IO2. IO2需要外部上拉,IO0是启动模式选择引脚,如果上电的时候是上拉状态则正常启动;如果是下拉状态则进入下载模式。
MOS管驱动电路有两块部分组成。两个部分是一样的,都是由一个栅极驱动来驱动两个nmos管。栅极驱动的信号输入都加了下拉电阻以确保在电平不确定的时候不会出现误动作。
PD诱骗器诱骗出的12伏在这里输入7805,降压为5V后再输入LD 1117,输出3.3V。我们上面有提到过LD1117的输出电容并不需要使用钽电容。但在这里为了电路的兼容性还是使用了钽电容,实际操作中可以直接在焊盘上焊接普通的陶瓷电容。
最下面的不但包含了模拟传感器和数字传感器的接口,还包含了烧写的串口以及进入下载模式的控制引脚。还有一组I2C可供额外使用。
PCB布局稍微有点麻烦,因为这里面包含了一些大功率的回路,还有一些对散热要求较高的部分。同时我设计时尽量让板子保持紧凑小巧,兼顾一定的美观性。
为了确保紧凑,正反面都布置了元件,这对焊接的要求比较高,有一面无法使用加热台,需要手焊。为了确保大电流回路可以有足够的过流能力,内层除了承担部分信号线引出的功能外,还承担了大电流电源的载流:
最后导出Gerber送去打板就好。
成品功能测试
首先是板卡焊接之后装配完成的样子:
由于浇花器工作中可能会有水珠飞溅的情况,为了尽可能保护电路板,我还设计了一个3D打印的外壳:
安装上去的样子是这样:
接下来我们看下代码,代码非常简单,可以使用现成的esphome进行配置。ESPhome的烧写方法网上非常多,这里就不再赘述了,我这里提供一下写入ESP8266的esphome配置代码esp.yaml:
substitutions:
devicename: "esp12s"
devicepwd: "password"
update: "1s"
esphome:
name: $devicename
comment: $devicename controller
esp8266:
board: esp12e
# Enable logging
logger:
# Enable Home Assistant API
api:
password: $devicepwd
ota:
password: $devicepwd
web_server:
port: 80
# auth:
# username: user
# password: user
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
# Enable fallback hotspot (captive portal) in case wifi connection fails
ap:
ssid: $devicename
password: $devicepwd
captive_portal:
# Start from here
sensor:
- platform: wifi_signal
name: "$devicename WiFi Signal Sensor"
id: "RSSI"
update_interval: $update
- platform: uptime
name: $devicename Uptime Sensor
id: "Uptime"
update_interval: $update
- platform: adc
name: "$devicename adc"
id: "sensor_1"
device_class: "power_factor"
pin: GPIO17
state_class: "measurement"
unit_of_measurement: "%"
update_interval: $update
accuracy_decimals: 1
filters:
- lambda: |-
return x * 100.0;
binary_sensor:
- platform: gpio
pin:
number: GPIO0
inverted: true
mode:
input: true
pullup: true
name: "$devicename binary 1"
id: "binary_1"
device_class: opening
filters:
- delayed_on_off: 100ms
light:
- platform: monochromatic
name: "$devicename led"
id: "output_led"
default_transition_length: 500ms
output: output_component_led
- platform: monochromatic
name: "$devicename 12"
id: "output_1"
default_transition_length: 500ms
output: output_component1
- platform: monochromatic
name: "$devicename 13"
id: "output_2"
default_transition_length: 500ms
output: output_component2
- platform: monochromatic
name: "$devicename 14"
id: "output_3"
default_transition_length: 500ms
output: output_component3
- platform: monochromatic
name: "$devicename 15"
id: "output_4"
default_transition_length: 500ms
output: output_component4
output:
- platform: esp8266_pwm
id: output_component_led
inverted: true
pin: GPIO2
- platform: esp8266_pwm
id: output_component1
pin: GPIO12
- platform: esp8266_pwm
id: output_component2
pin: GPIO13
- platform: esp8266_pwm
id: output_component3
pin: GPIO14
- platform: esp8266_pwm
id: output_component4
pin: GPIO15
另外需要一个单独文件secrets.yaml存放wifi的账号密码:
# Your Wi-Fi SSID and password
wifi_ssid: "SSID"
wifi_password: "PASSWORD"
利用引出的TX 和 RX引脚,将编译好的ESPHOME固件刷入即可。刷完固件后重置开发板,开发板会自动连接到wifi,这时候我们访问ESP8266的ip地址就可以进入直接管理页面:
我们在另外一台linux服务器上配置好home assistant,可以看到也可以把这个设备纳入HA统一管理,成为家庭整个物联网的多个结点。HA的配置网上有非常多的教程,这里就不再赘述:
而且我们可以看到,无论是HA还是直接控制,两边的控制面板都是可以实时反馈当前状态的,因此当我在一边打开板载LED时,另一边也会显示开启状态:
接通整套系统,接上土壤湿度传感器,水泵,就可以演示整个工作流程。整套演示系统如下:
遇到的问题和解决方法
细心的小伙伴可能注意到我在pd模块那里飞了2根线,飞线并不是因为电路板设计上有什么错误,而是因为一些PD诱骗芯片的问题。CH334K有多种配置诱骗电压的方式,最方便的是用电阻配置,就是我电路板上的电路。但我发现有部分芯片用电阻配置时会出现结果不稳定,可能是芯片内部的分压电阻出现了什么问题,或者ADC有什么问题,因此飞线是使用高低电平方式配置,可以解决问题。
活动总结
很感谢硬禾学堂举办的FastBond2活动,让我有机会通过这个活动来尝试从选型与设计一直到做出成品这么一个完整的流程,走完整个流程后顿时觉得以前一些不太明白的问题就茅塞顿开,学到了很多。希望以后能有更多这样的活动。