FireBeetle 2 ESP32-E - TinyML 语音识别开关灯
FireBeetle 2 ESP32-E - TinyML 语音识别开关灯
标签
嵌入式系统
Funpack活动
接口
cjmf
更新2023-01-03
中国计量大学
554

硬件介绍

FireBeetle ESP32-E是一款基于ESP-WROOM-32E双核芯片的主控板,它专为IoT设计。

它支持WIFI和蓝牙双模通信并具有体积小巧、超低功耗、板载充电电路、接口易用等特性。可灵活的用于家庭物联网改装、工业物联网改装、可穿戴设备等等。

通过和IFTTT等物联网平台的连接,你可轻松制作出你独有的特色物联网智能家居系统。

FireBeetle ESP32-E深度支持ArduinoIDE编程,并且即将支持Scratch图形化编程及MicroPython编程。 我们提供了详细的在线教程和应用案例,以及上千种免焊接的Gravity接口传感器与执行器,可轻松上手制作,大幅度降低你的学习时间。邮票孔的设计,让它可以方便的嵌入你设计的PCB上,大大缩减你的原型开发成本以及原型测试时间。

我们生产了两种版本的FireBeetle ESP32-E,未焊接版本与预焊接排母的版本,如果您打算使用Firebeetle盾板,FireBeetle Board ESP32-E(预焊排母版)更加适合您。

  • Type-C: USB接口:4.75v-5.5v
  • pH2.0锂电池接口:3.5-4.2v
  • 2/D9 LED灯:使用2/09号脚控制的LED灯
  • 充电指示灯:指示充电方式的红色LED,通过三种方式指示充电状态:1充满电或末充电时熄灭2、充电时常亮3、USB供电,末连接锂电池时高频闪烁
  • RST复位引脚:单击复位按钮,将程序复位
  • 5/D8 WS2812指示灯:使用5/D8引脚控制的WS2812RGB灯珠
    低功耗焊盘:此焊盈专为低功耗设计,默认为连接状态,使用小刀轻轻刮粉中间的细线即可断开,断开后可降低500u4静态功耗,通过程序控制主控进入睡眠模式后可将功耗降低至131A。注意:焊盘断开后仅UsE方式供电可驱动RGE灯
  • GD显示接口:DFRobot专用显示屏接口,详情后文GD显示接口
  • ESP32模组:乐鑫公司推出的最新ESP32-E模组
  • 按钮:连接27/D4的按钮

任务介绍

用FireBeetle ESP32-E开发板作为控制单元,结合DFRobot公司的Gravity接口传感器完成一项用TinyML实现的项目,例如TinyML完成语音识别控制家电或其他TinyML为主要内容的项目。

建议搭配:声音传感器/加速度传感器等硬件配合完成。

设计思路及细节

一、数据采集

Fkcr1NIWana2u2Set7kzwu0E_LM_

先将 DFR0034 麦克风插到模拟通道 0 上。由于麦克风是模拟麦克风,所以直接使用 digitalRead 函数就可以读取。

void setup() {
  Serial.begin(115200);
}

void loop() {
  int volume = digitalRead(A0);
  Serial.println(volume);
}

在串口中就可以获得一段时间内的音量数据。

二、TensorFlow 训练

import os
import numpy as np
from tensorflow.keras import Sequential, layers
from tensorflow.keras.utils import to_categorical
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
from tinymlgen import port
from decimal import Decimal
import tensorflow as tf

X = np.loadtxt('voice.csv', dtype=np.float32, delimiter=',')
y = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
y = np.array(y)
y = to_categorical(y)

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
X_train, X_valid, y_train, y_valid = train_test_split(
    X_train, y_train, test_size=0.3)

input_dim = X_train.shape[1:]
output_dim = y.shape[1]

nn = Sequential()
nn.add(layers.Dense(units=50, activation='relu', input_shape=input_dim))
nn.add(layers.Dense(units=15, activation='tanh'))
nn.add(layers.Dense(units=15, activation='relu'))
nn.add(layers.Dense(output_dim, activation='softmax'))

nn.compile(loss='categorical_crossentropy',
           optimizer='adam', metrics=['accuracy'])
nn.fit(X_train, y_train, validation_data=(
    X_valid, y_valid),  epochs=10, verbose=1)

print('Accuracy: %.1f' % nn.evaluate(X_test, y_test)[1])
with open('model.h', 'w+') as f:
    f.write(port(nn, variable_name='lq', pretty_print=True, optimize=True))

将每组数据转换为 1 行,使用 Python 进行导入。在 TensorFlow 中提供了完整的导入、训练、导出流程。这里,最后的导出文件为 model.h。在 Arduino IDE 中可以直接进行引用。

三、模型部署

1. 初始化及头文件引用

TensorFlow Lite 库可以使用 Arduino IDE 进行安装,直接在“库管理器”中搜索即可。

安装完成后引入相关头文件进行初始化。

#include <arduinoFFT.h>
#include <TensorFlowLite_ESP32.h>
#include <tensorflow/lite/experimental/micro/kernels/all_ops_resolver.h>
#include <tensorflow/lite/experimental/micro/micro_error_reporter.h>
#include <tensorflow/lite/experimental/micro/micro_interpreter.h>
#include <tensorflow/lite/schema/schema_generated.h>
#include <tensorflow/lite/version.h>
#include "model.h"

这里需要引入 model.h 文件才可以部署模型。

2. 模型加载

模型加载可以直接使用 TensorFlow Lite 进行。这里放在 setup 函数中。

void setup() {
  Serial.begin(115200);
  tflModel = tflite::GetModel(model);
  if (tflModel->version() != TFLITE_SCHEMA_VERSION) {
    Serial.println("Model schema mismatch!");
    while (1);
  }
  tflInterpreter = new tflite::MicroInterpreter(tflModel, tflOpsResolver, tensorArena, tensorArenaSize, &tflErrorReporter);
  tflInterpreter->AllocateTensors();
  tflInputTensor = tflInterpreter->input(0);
  tflOutputTensor = tflInterpreter->output(0);
  delay(1000);
}

3. 语音识别及动作

这里直接识别“打开”和“关闭”的可能性。如果大于 0.6 则直接执行相关的动作。

这里打开将灯置为高电平,关闭将灯置为低电平。

void application() {
  float open = tflOutputTensor->data.f[0];
  float close = tflOutputTensor->data.f[1];
  if (open > close && open > 0.6) {
    Serial.print("open");
    Serial.println(open);
    Serial.println(close);
    digitalWrite(LED_BUILTIN, HIGH);
  } else if (close > open && close > 0.6) {
    Serial.print("close");
    Serial.println(close);
    Serial.println(open);
    digitalWrite(LED_BUILTIN, LOW);
  }
}

当然,也可以直接使用网络请求实现智能家居的控制。

实物展示

Fl_kHCBGwFEXRoIl5X5zkxTBEGFh

FiTvRz8N1nd1usRtdkMuF8nDCkgt

结尾

TinyML 使用非常方便,可以实现多样的人工智能功能,非常适合于智能家居场合,在此感谢硬禾团队的技术支持。

附件下载
sketch_nov17a.zip
团队介绍
中国计量大学
团队成员
cjmf
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号