硬件介绍
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为主要内容的项目。
建议搭配:声音传感器/加速度传感器等硬件配合完成。
设计思路及细节
一、数据采集
先将 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);
}
}
当然,也可以直接使用网络请求实现智能家居的控制。
实物展示
结尾
TinyML 使用非常方便,可以实现多样的人工智能功能,非常适合于智能家居场合,在此感谢硬禾团队的技术支持。