×

使用QuickFeather和SensiML识别家庭负荷

消耗积分:0 | 格式:zip | 大小:0.11 MB | 2022-11-14

远不及你

分享资料个

描述

概述

在这个项目中,我使用 Quickfeather 开发板和 SensiML Toolkit 构建了一个机器学习应用程序的概念验证。目前正在进行许多关于智能电网技术的研究和分析,这些技术有望有效缓解气候变化。非侵入式负载监控 (NILM) 被视为实现创新智能电网服务的关键技术。在这个项目中,我的目标是家庭能源消耗分析,但它同样适用于工业能源消耗。NILM 技术将能源消耗分解为其组件,并提供有关当前设备的信息,并可用于执行诊断。为什么我们需要 NILM?因为我们不想给每个家用电器都加一个传感器来监控。NILM 技术具有良好的可扩展性并提供积极的解决方案,没有任何电力危害,并且作为单点控制,可以方便地升级应用程序并与其他在线服务连接以提供有用和及时的信息。它还提高了对用户能源使用模式的认识,以便我们可以节省能源来拯救地球。

硬件和软件设置

我们将使用 QuickFeather 开发板。

poYBAGNxJNaAPZCTAACimj2mZLU972.png
 

QuickFeather 开发板有许多板载传感器,如上图所示,但对于当前项目,我们需要一个可以为我们提供有关电力特性信息的传感器。为此,我们使用了 M5Stack Atom Socket Kit,它具有 HL8032 电能表集成威廉希尔官方网站 ,可通过 UART 连接以 4800 bps 的速度提供数据。

M5Stack Atom 插座套件可安全使用高达 10A 的电流。它有一个连接到主电源的 3 针输入电源插座,它具有可用于从 HLW8032 IC 获取数据的针连接器。它还有一个内置继电器,可以使用 Grove 连接器来控制打开/关闭主电源。有两个输出插座。(2 针/3 针)连接到电源板,最多可为 4 台设备供电。对于这个项目,我只使用了两个电器;风扇(30W)和灯(90W)。对于数据收集,我们使用了 SensiML Data Capture Lab这是一个 Windows 应用程序,我们需要一台 Windows PC 来安装它。因为我有一台 Macbook,所以我使用 VirtualBox 来安装 Windows VM 和另一个用于 Linux 的 VM 来使用 QORK-SDK 构建固件。请按照此处的说明https://github.com/QuickLogic-Corp/qorc-sdk安装 QORK-SDK。此外,如果我们想使用 Wi-Fi 连接在 Data Capture Lab 中捕获数据,我们需要安装 SensiML Open Gateway应用程序。假设树莓派 4 安装了最新的树莓派操作系统。

我们需要许多 UART 连接才能使用。我们需要一个 UART 连接来将 QuickFeather 连接到 M5Stack Atom Socket Kit。我们需要另一个 UART 来向 Raspberry Pi 4 发送数据。我们还需要一个 UART 来查看也连接到 Raspberry Pi 4 的调试消息。由于 QuickFeather 只有一个硬件 UART,我们需要使用 eFPGA 来启用另外两个硬件UART。对于这个项目,我们使用来自 QORK-SDK 存储库的两个示例应用程序的混合:

1. qf_apps/qf_fpgauart_app (加载FPGA UART网关,启动FPGA时钟)

2. qf_apps/qf_ssi_ai_app (使用Simple Streaming Interface或识别的数据收集)

至少对我来说,将两个应用程序合并在一起是一项相当大的工作。最终应用程序可以在这里找到:https ://github.com/metanav/Challenge_Climate_Change

Atom Socket Kit 中有一个继电器和开关引脚连接,连接到 QuickFeather 以控制继电器。我们需要在 src/pincfg_table.c 中添加以下配置来初始化引脚。

{ // setup GPIO for External Button
  .ucPin = PAD_24,
  .ucFunc = PAD24_FUNC_SEL_GPIO_0,
  .ucMode = PAD_MODE_INPUT_EN,
  .ucPull = PAD_PULLUP,
  .ucDrv = PAD_DRV_STRENGTH_4MA,
  .ucSpeed = PAD_SLEW_RATE_SLOW,
  .ucSmtTrg = PAD_SMT_TRIG_DIS
},
{ // setup GPIO for Relay Switch
  .ucPin = PAD_23,
  .ucFunc = PAD23_FUNC_SEL_GPIO_7,
  .ucMode = PAD_MODE_OUTPUT_EN,
  .ucPull = PAD_NOPULL,
  .ucDrv = PAD_DRV_STRENGTH_4MA,
  .ucSpeed = PAD_SLEW_RATE_SLOW,
  .ucSmtTrg = PAD_SMT_TRIG_DIS
},

连接所有设备的原理图可以在原理图部分找到。我们可以在下面看到物理连接。

Atom Socket Kit (HLW8032) 使用低波特率 (4800) 甚至奇偶校验,因此我们需要相应地配置 FPGA UART。此外,另一个 FPGA UART 配置为 115200 波特率,无奇偶校验。main.c 中有一个“init_fpga_uart”函数调用来处理它。

void init_fpga_uart()
{
  UartBaudRateType brate;
  UartHandler uartObj;
  memset( (void *)&(uartObj), 0, sizeof(uartObj) );
  uartObj.baud = BAUD_4800;
  uartObj.wl = WORDLEN_8B;
  uartObj.parity = PARITY_EVEN;
  uartObj.stop = STOPBITS_1;
  uartObj.mode = TX_RX_MODE;
  uartObj.hwCtrl = HW_FLOW_CTRL_DISABLE;
  uartObj.intrMode = UART_INTR_ENABLE;
  uartHandlerUpdate(UART_ID_FPGA, &uartObj);
  // wait
  for (volatile int i = 0; i != 4000000; i++) ;
  uart_init(UART_ID_FPGA, NULL, NULL, &uartObj);
  uint32_t device_id = *(uint32_t *)FPGA_PERIPH_BASE ;
  if (device_id == 0xABCD0002)
  {
      uartObj.baud = BAUD_115200;
      uartObj.wl = WORDLEN_8B;
      uartObj.parity = PARITY_NONE;
      uartObj.stop = STOPBITS_1;
      uartObj.mode = TX_RX_MODE;
      uartObj.hwCtrl = HW_FLOW_CTRL_DISABLE;
      uartObj.intrMode = UART_INTR_ENABLE;
      uartHandlerUpdate(UART_ID_FPGA_UART1,&uartObj);
      uart_init(UART_ID_FPGA_UART1, NULL, NULL, &uartObj);
   }
}

我们将尝试对以下 4 个类别进行分类。

1. 风扇

2. 灯

3. 灯和风扇

4. 无负载

我们使用 4 个电气特性:

1.电压(伏)

2.电流(安培)

3. 真实功率(瓦特)

4. 视在功率(伏安)

在交流威廉希尔官方网站 中,有功功率(也称为有功功率或有功功率)是设备做有用功所消耗的实际功率。无功功率(仅在负载中吸收和返回的功率)与真实功率的组合称为视在功率,它是威廉希尔官方网站 电压和电流的乘积,与相角无关。对于给定的地理区域,电压几乎是恒定的,但传感器值有一些变化,我们稍后会看到 SensiML Toolkit 的 AutoML 是否会使用此功能。电气特性对于单个电器或电器组合具有非常具体的特征。正如我们在下图中所看到的,它描述了当灯关闭和风扇连续打开时的两个事件,延迟几秒钟。

pYYBAGNxJOiAJQqvAABYRRCL4cg996.png
 

闪存数据采集固件

假设 QORK-SDK 存储库已克隆到主目录中,并且所有构建工具链都已设置。

克隆存储库:

$ cd ~/qork-sdk
$ source envsetup.sh
$ cd qf_apps
$ git clone https://github.com/metanav/Challenge_Climate_Change.git
$ cd challenge_climate_change

确保在 inc/app_config.h 中将固件模式更改为数据收集。

#define S3AI_FIRMWARE_IS_COLLECTION  1		
#define S3AI_FIRMWARE_IS_RECOGNITION 0

我们需要 TinyFPGA-Programmer-Application 来刷新固件。请按照此处的说明进行安装:https ://github.com/QuickLogic-Corp/TinyFPGA-Programmer-Application

$ cd GCC_Project
$ make
$ qfprog --port /dev/ttyACM0 --m4app output/bin/Challenge_Climate_Change.bin --mode m4

设备插件

设备插件是描述数据捕获实验室 (DCL) 如何从设备收集数据的属性列表。Data Capture Lab 允许我们通过 SSF 文件导入设备插件。以下是用于导入 DCL 的 SSF 文件内容。

{
  "name": "QuickFeather Simple Stream [Custom]",
  "uuid": "a612edcc-58fe-a534-15d7-1255447308ee",
  "collection_methods": [
   {
      "name": "live",
      "display_name": "Live Stream Capture",
      "storage_path": null,
      "is_default": true
   }],
  "device_connections": [
  {
    "display_name": "Serial Port",
    "value": 1,
    "is_default": true,
    "serial_port_configuration": {
      "com_port": null,
      "baud": 115200,
      "stop_bits": 1,
      "parity": 0,
      "handshake": 0,
      "max_live_sample_rate": 3301
    }
  },
  {
    "display_name": "Wi-Fi",
    "value": 2,
    "is_default": true,
    "wifi_configuration": {
      "use_external_broker": false,
      "external_broker_address": "",
      "broker_port": 1885,
      "device_ip_address": "192.168.3.6",
      "device_port": 5555,
      "max_live_sample_rate": 1000000
    }
  }],
  "capture_sources": [
  {
    "max_throughput": 0,
    "name": "Energy_Meter",
    "part": "HWL8032",
    "sample_rates": [
        6,
        7,
        8
    ],
    "is_default": true,
    "sensors": [
    {
      "column_count": 4,
      "is_default": true,
      "column_suffixes": [
        "VA",
        "mA",
        "W",
        "V"
      ],
      "type": "Energy_Meter_IC",
      "parameters": [],
      "sensor_id": 1529804975,
      "can_live_stream": true
    }]
  }],
  "is_little_endian": true
}

建筑知识包

为设备生成的模型称为知识包。知识包包含用于推理的设备固件代码。

有标准步骤可以为边缘设备的每个机器学习项目构建模型。

1. 原始数据采集

2. 数据标注

3. 模型准备

4.模型训练

5. 设备上的推理

SensiML Toolkit 有助于自动化上述大部分步骤。

对于每个类,传感器数据被捕获 4 分钟。由于电力负荷是给定持续时间的连续事件,因此捕获的数据用单段注释。

数据收集演示

 

使用 SensiML Analytics Studio Demo 创建知识包

 

闪光识别固件

假设应用程序存储库已按照前面的步骤中所述进行了克隆。

$ cd qork-sdk/qf_apps/challenge_climate_change

确保在 inc/app_config.h 中将固件模式更改为识别。

#define S3AI_FIRMWARE_IS_COLLECTION  0		
#define S3AI_FIRMWARE_IS_RECOGNITION 1

构建并刷写固件:

$ cd GCC_Project
$ make
$ qfprog --port /dev/ttyACM0 --m4app output/bin/Challenge_Climate_Change.bin --mode m4

推理演示

演示中显示的推理速率似乎很慢,因为采样率为 6,我们使用 4 秒的样本(总共 24 个样本)进行推理。此外,应用程序中有一个消息队列缓冲来自 HLW8032 传感器的数据,因此知识包需要一些时间才能在当前事件更改时到达。

 

使用 SensiML Open Gateway 进行推理演示

 

结论

我们已经通过线路供电的 QuickFeather 演示了该应用程序。由于 QuickFeather 仅通过 UART 从传感器获取数据,因此可以使用电池供电。虽然我们只使用了 2 个电器使用了 4 个类别,但该应用程序是可扩展的,并且通过捕获更多数据并为许多其他电器训练模型,它可以轻松地对整个家用电器负载进行分类。另外,将来我想尝试分层模型来提高缩放版本的模型鲁棒性。QuickFeather 开发板和 SensiML Toolkit 具有为边缘设备构建和部署机器学习管道的巨大潜力。我希望在不久的将来看到适用于 MacOS 和 Linux 的数据采集实验室。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !

'+ '

'+ '

'+ ''+ '
'+ ''+ ''+ '
'+ ''+ '' ); $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code ==5){ $(pop_this).attr('href',"/login/index.html"); return false } if(data.code == 2){ //跳转到VIP升级页面 window.location.href="//m.obk20.com/vip/index?aid=" + webid return false } //是会员 if (data.code > 0) { $('body').append(htmlSetNormalDownload); var getWidth=$("#poplayer").width(); $("#poplayer").css("margin-left","-"+getWidth/2+"px"); $('#tips').html(data.msg) $('.download_confirm').click(function(){ $('#dialog').remove(); }) } else { var down_url = $('#vipdownload').attr('data-url'); isBindAnalysisForm(pop_this, down_url, 1) } }); }); //是否开通VIP $.get('/article/vipdownload/aid/'+webid,function(data){ if(data.code == 2 || data.code ==5){ //跳转到VIP升级页面 $('#vipdownload>span').text("开通VIP 免费下载") return false }else{ // 待续费 if(data.code == 3) { vipExpiredInfo.ifVipExpired = true vipExpiredInfo.vipExpiredDate = data.data.endoftime } $('#vipdownload .icon-vip-tips').remove() $('#vipdownload>span').text("VIP免积分下载") } }); }).on("click",".download_cancel",function(){ $('#dialog').remove(); }) var setWeixinShare={};//定义默认的微信分享信息,页面如果要自定义分享,直接更改此变量即可 if(window.navigator.userAgent.toLowerCase().match(/MicroMessenger/i) == 'micromessenger'){ var d={ title:'使用QuickFeather和SensiML识别家庭负荷',//标题 desc:$('[name=description]').attr("content"), //描述 imgUrl:'https://'+location.host+'/static/images/ele-logo.png',// 分享图标,默认是logo link:'',//链接 type:'',// 分享类型,music、video或link,不填默认为link dataUrl:'',//如果type是music或video,则要提供数据链接,默认为空 success:'', // 用户确认分享后执行的回调函数 cancel:''// 用户取消分享后执行的回调函数 } setWeixinShare=$.extend(d,setWeixinShare); $.ajax({ url:"//www.obk20.com/app/wechat/index.php?s=Home/ShareConfig/index", data:"share_url="+encodeURIComponent(location.href)+"&format=jsonp&domain=m", type:'get', dataType:'jsonp', success:function(res){ if(res.status!="successed"){ return false; } $.getScript('https://res.wx.qq.com/open/js/jweixin-1.0.0.js',function(result,status){ if(status!="success"){ return false; } var getWxCfg=res.data; wx.config({ //debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId:getWxCfg.appId, // 必填,公众号的唯一标识 timestamp:getWxCfg.timestamp, // 必填,生成签名的时间戳 nonceStr:getWxCfg.nonceStr, // 必填,生成签名的随机串 signature:getWxCfg.signature,// 必填,签名,见附录1 jsApiList:['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); wx.ready(function(){ //获取“分享到朋友圈”按钮点击状态及自定义分享内容接口 wx.onMenuShareTimeline({ title: setWeixinShare.title, // 分享标题 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享给朋友”按钮点击状态及自定义分享内容接口 wx.onMenuShareAppMessage({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 type: setWeixinShare.type, // 分享类型,music、video或link,不填默认为link dataUrl: setWeixinShare.dataUrl, // 如果type是music或video,则要提供数据链接,默认为空 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ”按钮点击状态及自定义分享内容接口 wx.onMenuShareQQ({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到腾讯微博”按钮点击状态及自定义分享内容接口 wx.onMenuShareWeibo({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); //获取“分享到QQ空间”按钮点击状态及自定义分享内容接口 wx.onMenuShareQZone({ title: setWeixinShare.title, // 分享标题 desc: setWeixinShare.desc, // 分享描述 link: setWeixinShare.link, // 分享链接 imgUrl: setWeixinShare.imgUrl, // 分享图标 success: function () { setWeixinShare.success; // 用户确认分享后执行的回调函数 }, cancel: function () { setWeixinShare.cancel; // 用户取消分享后执行的回调函数 } }); }); }); } }); } function openX_ad(posterid, htmlid, width, height) { if ($(htmlid).length > 0) { var randomnumber = Math.random(); var now_url = encodeURIComponent(window.location.href); var ga = document.createElement('iframe'); ga.src = 'https://www1.elecfans.com/www/delivery/myafr.php?target=_blank&cb=' + randomnumber + '&zoneid=' + posterid+'&prefer='+now_url; ga.width = width; ga.height = height; ga.frameBorder = 0; ga.scrolling = 'no'; var s = $(htmlid).append(ga); } } openX_ad(828, '#berry-300', 300, 250);