【OpenEVSE 】汽车充电桩控制项目解析
- 1. 项目介绍
- 2. 项目硬件
- 3. 软件原理以及流程
- 4. 系统结构:
- ESP32
- RAPI API
- MQTT 上的 RAPI:
- 5. SAE J1772协议简析:
- 6. 专用充电接插件
- 7 . 源码解析:
此项目来源于openEnergyMonitor 的 openEVSE 部分,结合开源的软硬件系统,整理内容如下。
1. 项目介绍
社区博客介绍的比较详细: https://blog.openenergymonitor.org/2017/01/openevse-build/
Open EVSE是一种开放的硬件EVSE,允许人们构建自己的EVSE
EVSE : 是电动汽车供电设备的缩写,通常指的是充电桩。科普博文
RAPI:remote api ,表示远程API,允许远程硬件控制 openevse 使用串行端口的板,板上有FTDI/UART引脚。根据openevse源代码(open_evse.h
),默认波特率为115200。
2. 项目硬件
硬件介绍:EVSE_PLUS-5.5
控制器的2大主要部分:高压大电流继电器 和 低压控制电子设备 。主要芯片为微控制器(ATmega328p),更多细节,参考 这里
另外上图中还有两块扩展板组,一块是WiFi模块(esp8266 或者 esp32),另外一块是用于显示屏的扩展button模块(用于实现通过按键对显示屏内容的控制)
3. 软件原理以及流程
核心
OpenEVSE 控制器:基于arduino ,扩展 WiFi模块
OpenEVSE 控制器:主要芯片为微控制器 ATmega328p ,arduino IDE 开发环境
控制充电速率,OpenEVSE 通过改变pwm信号方波占空比来请求特定的充电速率
显示充电过程,外接扩展板,实现按键控制lcd显示模块显示充电的过程;
数据同步上传,外接WiFi模块实现数据的上传,可扩展web服务器,emoncms 开源网站等,实现数据上传,还可以扩展MQTT
实现远程控制,通过 RAPI 指令实现远程的监控和控制
WiFi模块:ESP32(老版本用的ESP8266)
**继电器模块:**不同的电压转换需要不同的型号,控制器控制继电器开关实现充电的开始与停止
扩展板:实现LCD屏幕显示充电状态,还可以通过button 控制,LCD屏的显示状态
数据记录:本质根据ESP32模块的不同分为2种方式
ESP32 配置为 AP模式,用户连接ESP32的WiFi,在ESP32的服务器 web端(暂且称为 openevse web)实现数据的记录和监控
ESP32 配置为STA模式,和本地的 emonpi 连接到同一路由下,用户可以访问emonpi,可以通过emonpi实现数据的监控记录
ESP32配置为STA模式,直接将数据发送至远程的服务器,例如emoncms.org,用户访问远程服务器实现数据的监控记录
注意:mqtt 服务器 和 emoncms 服务器不要是同一个服务器如emonpi,这会导致数据重复。
源代码理解:
源代码中是基于arduino的多任务框架编程的,将每个模块分为不用的 task ,去执行不同的动作,是以时间为划分标准,定期执行相应的任务,摒弃了耗费CPU资源的 delay函数,实现多任务轻量级实现,实现类似于操作系统的任务调度的功能。
多任务调度实现:在main函数的setup函数中,将每个模块的任务,如 eventLog、timeManager、evse、scheduler
这些模块,xxx.begin()函数中利用 MicroTask.startTask()
函数将任务添加进去,实现调度。在loop函数中利用 MicroTask.update();
函数,监控哪些任务触发到时了,然后执行相应任务。
4. 系统结构:
OpenEVSE 固件加载:
https://github.com/OpenEVSE/open_evse/blob/stable/firmware/open_evse/LoadingFirmware.md
平台:Platform IO Core或者Platform IDE (若使用 IDE 则不需在安装IO Core) 或者 Arduino IDE ,
可选 - 要将自定义板添加到 Arduino IDE,请将“boards.txt”复制到文件夹 ~\Arduino\hardware\openevse\avr。完成此操作(并重新启动 Arduino)后,您将在 Boards 菜单中找到一个名为“OpenEVSE”的新条目。准备上传固件时选择该选项。
open_evse.name=OpenEVSE
open_evse.bootloader.low_fuses=0xFF
open_evse.bootloader.high_fuses=0xDA
open_evse.bootloader.extended_fuses=0x05
open_evse.upload.using=avrispmkii
open_evse.upload.maximum_size=32768
open_evse.build.mcu=atmega328p
open_evse.build.f_cpu=16000000L
open_evse.core=arduino
open_evse.build.variant=standard
注意:使用 WATCHDOG 时要格外小心,如果添加的延迟超过了计时器,EVSE 板将在无限循环中重置。恢复可能非常困难或不可能。
平台的安装: 下载vscode,然后在扩展程序中安装platformIO IDE ,注意安装时间较长,它功能强大,可以支持集成大多数常用的芯片和模块的开发任务。
(物联网越来越成为炙手可热的领域,不过提到嵌入式IoT开发,最让人不舒服的一件事无疑就是不同厂家的芯片可能要使用不同的集成开发环境。例如:STM32要使用Keil,Arduino默认使用自家Arduino开发环境,而且Keil和Arduino都不够友好;ESP8266和ESP32要使用linux环境或者在windows下部署eclipse,涉及到交叉编译工具,所以操作起来也比较复杂)
设置: https://docs.platformio.org/en/latest/integration/ide/vscode.html#quick-start
OpenEVSE 的 WiFi V4 参考网站:
Wifi 模块 ESP32,通过串行 RAPI OpenEVSE 控制器通信,Web 界面直接从ESP32 的web服务器获取数据,并可通过网络上的连接设备进行控制。
硬件部分:
ESP8266 - 只能运行 V2.x 固件 ESP32 - 可以运行 V3.x 和 V4.x 固件
OpenEVSE V1 - 专为 V4.x 固件设计 ESP32网关-V3.x 和 V4.x
无线网络设置:首次启动时,OpenEVSE 应该广播一个 WiFi 接入点 (AP)OpenEVSE_XXXX
,默认密码: openevse
,连接后自动转到登录界面,若没跳转,则登录以下几个网址:http://openevse http://openevse.local 或 http://192.168.4.1
注意: 按住boot / GPIO0
ESP8266 模块上的按钮约 5 秒将强制 WiFi 接入点模式。这在尝试将设备连接到新的 WiFi 网络时很有用。如果设备无法连接到 WiFi 网络,它将在重试连接之前返回 AP 模式
充电模式,“生态”充电模式允许 OpenEVSE 根据 MQTT 自动启动/停止和调整充电电流。 > 1.4kW (6A) 时将开始充电, < 1.4kW (6A) 时,充电将暂停,可以通过 MQTT 启用/禁用 Eco 模式;环保模式,使用时启动 MQTT 服务,注意,EVSE 期望 MQTT 数据每 5-10 秒 更新一次,如果更新间隔太快或太慢,性能将会下降。两种模式可以通过 mqtt 来控制,主题:<base-topic>/divertmode/set
value:1=正常 2=生态模式
数据记录, 通过WiFi模块实现,(esp32 或者8266)OpenEVSE 可以使用 Emoncms 的 API 将数据发布到 Emoncms.org 网站上,或其他 Emoncms 服务器(例如emonpi),数据每30s 发布一次,可以使用HTTP 或者 HTTPS 发布。OpenEVSE 可以将其状态值(例如 amp、wh、temp1、temp2、temp3、pilot、status)发布到 MQTT 服务器。数据将作为基础主题的子主题发布。例如/amp。数据每 30 秒发布到 MQTT。
通俗的讲,自己理解,
(1)openevse 的 WiFi 模块可以配置为一个服务器,手机或者电脑连接openevse 的WiFi之后,可以在OPenevse的web端看到可视化界面,可以使用mqtt。(esp32 是 mqtt连接的服务器)
(2)openevse 的 WiFi 模块可以配置为一个客户端,连接服务器,该服务器可以是本地的emonpi,也可以是远程的emoncms,openevse可以通过mqtt 将数据发送至本地的emonpi,并使用emoncms将数据发布至emoncms远程服务器上,如emoncms.org。
MQTT,启动时发布以下消息,当连接设备节点时,应当订阅主题:openevse/announce/#
{
"state":"connected",
"id":"c44f330dxxad",
"name":"openevse-55ad",
"mqtt":"emon/openevse-55ad",
"http":"http://192.168.1.43/"
}
当断开连接时,将发布相同的消息,state 替换为 : state":"disconnected"
默认情况下,所有后续 MQTT 状态更新都将发布到设备 ID 的最后 4 个字符所在的openevse-xxxx
位置。xxxx
可以通过 MQTT 服务页面更改此基本主题。OpenEVSE 可以将其状态值(例如 amp、wh、temp1、temp2、temp3、pilot、status)发布到 MQTT 服务器。数据将作为基本主题的子主题发布,例如<base-topic>/amp
. 数据每 30 秒发布到 MQTT。默认<base-topic>
是设备 ID 的最后 4 个字符,openevse-xxxx
中的xxxx
注意:如果想将 OpenEVSE 的数据发布到 emonpi 的 emoncms 服务器上,则 base topic 应该为 emon/xxxx
固件升级,可以通过web界面实现,请参阅 OpenEVSE Wifi版本。
远程控制:通过 RAPI 命令,进行远程控制和监控,这些命令可以通过串行直接发出, 也可以添加 OpenEVSE WiFi 套件 (如ESP8266) 以允许通过 HTTP Web 界面远程发出 RAPI 命令。
可变充电速率: OpenEVSE 充电控制器可以改变充电速率,本质上是控制器“请求”改变充电速率,因为实际上改变充电速率的直接设备是汽车的充电站。OpenEVSE 通过改变导频信号方波占空比来请求特定的充电速率,充电速率可以6-28A,以1A为增量变化。汽车几乎立即响应来自 OpenEVSE 控制器的充电率调整请求。如果需要,还可以远程暂停和恢复充电。
OpenEVSE WiFi ESP32 网关 v4
WiFi模块使用的是ESP32,
如果通过WiFi不方便连接到OpenEVSE ,则可以通过 ESP32-Gateway 有线网连接,该模块是 ESP8266 / ESP32 WiFi 模块的替代品,兼容所有型号的 OpenEVSE / EmonEVSE。
ESP32
基本的配网流程:
AP模式:你是个路由器,别人连接你 station 模式:你是个客户端(如,手机),你需要连接别的路由
上电—>wifi初始化为ap模式—>开启http服务器—>用户连上esp32wifi—>浏览器输入esp网关地址默认是192.168.1.4—>在页面上输入要连接的wifi名称和密码—>点击页面上的发送按钮—>浏览器通过post请求将wifi名称和密码发送到esp32—>esp32解析出wifi名称和密码—>退出wifi-ap模式,关闭http服务器—>将wifi名称和密码作为参数,将wifi初始化为station模式
**说人话:**模块官方有配套的ble和smartconfig配网方式,优点是例程,开发方便。缺点是,需要在手机上装app,并且电脑还没办法配网,只能用手机
通过esp32自建web服务器实现配网。具体来说,可以是以下步骤:
1、esp32上电,手机/电脑/平板连上esp32的wifi。
2、用浏览器访问esp32的网址esp32默认是192.168.4.1
3、在web页面中输入需要esp32连接的wifi名称,和wifi密码
4、esp32自动连接上指定的wifi
ESP32 可以配置为服务器,去响应客户端的请求,可以由以下步骤:
- 将ESP32配置为STA模式,发出WiFi信号,电脑连接esp32 模块
- 开启网络服务器,开启之后,作为服务器要响应来自客户端的HTTP请求(有效响应、无效响应等)
【esp32的web服务器】
Web服务器是发送和接收信息,处理信息并存储信息的地方。 Web服务器还可以在网页上显示这些信息。服务器通过称为超文本传输协议(HTTP)的协议与用户通信。当请求发送到此服务器时(例如,在浏览器中搜索其地址),服务器返回代码作为响应(例如,代码200,表示连接已正确建立,或代码404,表示地址不正确)。注意:两台服务器要想实现简单通信,是要在同一网段之下才能进行的
RAPI API
RAPI 命令可用于控制和检查所有 OpenEVSE 函数的状态。RAPI 命令可以通过串口、Web 界面、HTTP 和 MQTT 发出。我们建议在 MQTT 上使用 RAPI。建议通过mqtt 协议 将RAPI 命令发出,参考视频:
MQTT 上的 RAPI:
RAPI 命令可以通过 MQTT 消息发送, RAPI 命令应该通过 MQTT 发布以下消息:
<base-topic>/rapi/in/<$ rapi-command> payload
如: openevse/rapi/in/$SC 13
将电流设置为13A
如果 RAPI 命令不需要 payload ,则有效负载可以留空,例如:openevse/rapi/in/$GC
可以通过订阅以下主题接收:<base-topic>/rapi/out/#
科普文章:
如何将 ESP32 以太网模块连接到电动汽车充电站
5. SAE J1772协议简析:
先科普一个ISO15118新能源汽车的协议
GFCI 或 GFI :接地故障电流
OpenEVSE 充电桩控制器遵循SAE J1772协议 和 IEC Type 1-2充电站
https://openev.freshdesk.com/support/solutions/articles/6000052074-basics-of-sae-j1772
https://www.zhihu.com/people/mai-ke-56-67/posts
它是一个 1Khz 的 ±12v 的方波,占空比决定了最大可用电流,EVSE设定占空比,电动汽车必须遵守原始设定或更改占空比。通俗的说,定义一个模拟的PWM通信协议使得充电桩(EVSE)可以将所支持的最大充电电流通知给电动汽车(EV)。该协议是通过对CP信号进行脉冲宽度调制(PWM)来实现的。1kHz 的PWM信号由充电桩产生,实际充电的电流大小由汽车(EV)来决定。CP线上的电压(和地线(PE)的电压差[V])用来区别不同的桩和车之间的连接状态:
State A (+12 V) | 电动汽车没有连接到充电桩 |
---|---|
State B (+9V) | 电动汽车连接到充电桩,但没有开始充电。 |
State C (+6V) | 电动汽车连接到充电桩上,准备好开始充电 (不需要通风 ventilation) |
State D (+3V) | 电动汽车连接到充电桩上,准备好开始充电 (需要通风 ventilation) |
State E (+0V) | 电网供电有问题或未连接到电网。 |
State F (-12 V) | 充电桩未准备好。 |
6. 专用充电接插件
检测引脚,Proximity Detection:防止连接到充电器时汽车移动,用来检查车辆是否插有充电插头
通讯引脚,Control Pilot :用于协调汽车和充电器之间的充电阶段的线路,决定了充电功率的大小。
7 . 源码解析:
首先,Arduino编程语言是没有main()函数的,主体函数有2个分别为,setup和loop函数。setup() 函数中完成Arduino的初始化设置,如配置I/O口状态,初始化串口等操作,在整个阶段只执行一次。setup()函数将只运行一次,loop函数体内的循环一直执行,每次loop结束后,都会进行串口事件判断。
OCPP:是电动载具(EV)和充电桩之间的应用层通讯协定,也是中央式的管理系统,也称为充电站网络,目前是要建立开放式的应用层协定,让不同制造商的充电桩和中央管理系统可以互相通讯