侵权投诉

完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>

3天内不再提示

如何使用检测模型进行唤醒词检测模型的部署

tensorflowers 来源:HaaS技术社区 作者:罗奎 2021-09-30 11:22 次阅读

随着机器学习的发展,TinyML(微型机器学习)已在你的家里、车里、甚至口袋里工作了。什么是 TinyML 呢?它是属于机器学习的一个子领域,包含了算法、硬件和软件,能够基于传感器数据分析,并在极低功耗的设备上运行。比如家里的天猫精灵、苹果的 Siri 和亚马逊的 Alexa 等语音助手,都属于 TinyML 的应用,它们提供了语音用户接口 (AUI),让用户不需要操作屏幕、鼠标或键盘就可以进行交互,给用户提供了一种全新的交互方式,这些语音助手几乎无处不在。从独立的智能音箱到几乎所有手机都内置了某种语音助手。

在大部分情况下,语音识别、自然语言处理以及语音合成等繁重工作都是在云端完成的,由性能强大的服务器运行大型机器学习模型。当用户提出问题时,将以 wav 或其他音频流的形式被发送到云端。云端识别出音频流的含义并进行回复响应。语音助手真正需要的音频是唤醒设备后的数据。如果能在不发送数据的情况下检测到这个唤醒词,并在听到唤醒词之后才开始音频流的传输,这样既能够保护用户的隐私、节省电池电量和带宽,而且可以在没有网络的情况下唤醒。

这也是 TinyML 的用武之地。要在低功耗的芯片上运行,意味着要训练一个监听唤醒词的微型模型,嵌入到微控制设备中,它就可以一直监听唤醒词,当检测到唤醒词后通知操作系统开始捕获音频并发送到云端。

在本文章中,将教大家如何使用预先训练的检测模型,在 HaaS EDU K1 上进行唤醒词检测模型的部署,并使用 Tensorflow Lite Micro 推理引擎进行推理。随后将教大家如何使用 Tensorflow 训练脚本训练一个自己的唤醒词,再进行设备端部署。本案例主要由三个部分组成:

1. 语音采集:接入模拟麦克风(Mic1 输入);

2. 语音识别:说出“打开”和“关闭”识别后,OLED 将显示 “Turn on.。.” 和 “Turn off”;

3. 语音播报:执行指令的同时,播报本地 TTS (mp3)。

涉及知识点

唤醒词数据采集、模型训练、模型部署

设备端模拟 MIC 声音采样

设备端音频特征提取

TFLite-Micro 推理引擎应用

设备端命令识别、响应

设备端喇叭播放 mp3 文件

文件系统应用

OLED 显示字符

方案介绍

整个方案的框架如下:

提供批量音频录制工具进行数据收集;

提供 TF 模型训练脚本进行唤醒词训练;

提供完整设备端模型部署方案;

基于该方案,你将学习到 TinyML 的整个生命周期:

开发环境搭建

1. 硬件准备

如果有 HaaS 语音扩展板,直接插入即可:

如果没有 HaaS 语音扩展板,请按照如下步骤接入麦克风和喇叭:

HaaS EDU K1 硬件排线图请参考

HaaS EDU K1 说明书 - IoT 物联网操作系统 - 阿里云

HaaS EDU K1 说明书 - IoT 物联网操作系统 - 阿里云

https://help.aliyun.com/document_detail/205267.html

2. 环境搭建

参考《HaaS EDU K1 快速开始》中 HaaS Studio 章节完成 AliOS Things 开发环境搭建。

《HaaS EDU K1 快速开始》

https://blog.csdn.net/HaaSTech/article/details/119674142

2.1 案例代码下载

该案例相关的源代码下载可参考《创建工程》,该案例是 C++/C++ 案例。

《创建工程》

https://g.alicdn.com/alios-things-3.3/doc/haas-studio.html?spm=a2cti.24227744.0.0.696b40faTNQpKM#autotoc_md1867

其中:

选择解决方案: “TFLite-Micro 离线语音快捷词唤醒案例”或者 “tflite_micro_speech_demo”

选择开发板: HaaS EDU K1

2.2 代码编译、烧录

参考《HaaS EDU K1 快速开始》完成代码的编译及烧录,在烧录前,请先完成 2.1 的步骤,再进行编译烧录。

《HaaS EDU K1 快速开始》

https://blog.csdn.net/HaaSTech/article/details/119674142

文件件系统烧录

本组件例子中使用到的本地语料存放在代码中 hardware/chip/haas1000/prebuild/data/ 目录下 mp3 目录,除烧录 tflite_micro_speech_demo image 外,需烧录 littlefs 文件系统,请将 hardware/chip/haas1000/package.yaml 文件中以下代码段的注释打开后重新编译:

program_data_files:

- filename: release/write_flash_tool/ota_bin/littlefs.bin

address: 0xB32000

2.3 打开串口

参考《HaaS EDU K1 快速开始》打开串口进行 LOG 查看。

《HaaS EDU K1 快速开始》

https://blog.csdn.net/HaaSTech/article/details/119674142

软件架构

KWS Demo 应用程序: 主要打通实现 AI 语音引擎的初始化,欢迎语播报。

ai_agent 组件:是 AliOS Things 上的 AI 引擎核心模块,后端接入不同的推理引擎,本案例中使用了 TFLite-Micro 推理引擎。

uVoice 组件:是 AliOS Things 上智能语音解决方案的核心组件,提供了本地音频,URL 音频,TTS 合成等基础功能,音频格式支持 mp3, m4a, wav, opus 等主流格式,本案例中使用它来进行本地 mp3 语料的响应播报。

A2SA 组件:是 AliOS Things 上音频服务框架,兼容 ALSA 应用接口访问,支持音频硬件驱动抽象,多音频驱动加载/卸载,VFS 接口支持等功能。

1. 代码结构

├── cp_resources.py # 拷贝本地语料到/prebuild/data目录,编译进文件系统

├── main.c

├── maintask.c

├── Makefile

├── micro_speech # 语音识别程序

├── oled # OLED显示程序

│ ├── oled.c

│ └── oled.h

├── package.yaml # 编译系统配置文件

├── player # 播放器程序

│ ├── player.c

│ └── player.h

├── README.md

├── recorder # 录音程序

│ ├── recorder.c

│ └── recorder.h

├── resources

│ └── mp3 # 本地mp3语料

├── SConstruct

2. 设备端工作流程

在 HaaS EDU K1 上的整个工作流程如下图:

3. 程序主体

以下代码是执行唤醒词识别主体,setup 对 TFLite-Micro 模型推理引擎进行初始化,loop 中执行上图中整个流程,从音频采集到命令响应的全部流程在该函数中实现,详细逻辑请参考代码。

// The name of this function is important for Arduino compatibility.

void setup()

{

// tflite::InitializeTarget();

//RegisterDebugLogCallback(callback);

// Set up logging. Google style is to avoid globals or statics because of

// lifetime uncertainty, but since this has a trivial destructor it‘s okay.

// NOLINTNEXTLINE(runtime-global-variables)

static tflite::MicroErrorReporter micro_error_reporter;

error_reporter = µ_error_reporter;

// Map the model into a usable data structure. This doesn’t involve any

// copying or parsing, it‘s a very lightweight operation.

model = tflite::GetModel(g_model);

if (model-》version() != TFLITE_SCHEMA_VERSION)

{

TF_LITE_REPORT_ERROR(error_reporter,

“Model provided is schema version %d not equal ”

“to supported version %d.”,

model-》version(), TFLITE_SCHEMA_VERSION);

return;

}

// Pull in only the operation implementations we need.

// This relies on a complete list of all the ops needed by this graph.

// An easier approach is to just use the AllOpsResolver, but this will

// incur some penalty in code space for op implementations that are not

// needed by this graph.

//

// tflite::AllOpsResolver resolver;

// NOLINTNEXTLINE(runtime-global-variables)

static tflite::MicroMutableOpResolver《4》 micro_op_resolver(error_reporter);

if (micro_op_resolver.AddDepthwiseConv2D() != kTfLiteOk)

{

return;

}

if (micro_op_resolver.AddFullyConnected() != kTfLiteOk)

{

return;

}

if (micro_op_resolver.AddSoftmax() != kTfLiteOk)

{

return;

}

if (micro_op_resolver.AddReshape() != kTfLiteOk)

{

return;

}

// Build an interpreter to run the model with.

static tflite::MicroInterpreter static_interpreter(

model, micro_op_resolver, tensor_arena, kTensorArenaSize, error_reporter);

interpreter = &static_interpreter;

// Allocate memory from the tensor_arena for the model’s tensors.

TfLiteStatus allocate_status = interpreter-》AllocateTensors();

if (allocate_status != kTfLiteOk)

{

TF_LITE_REPORT_ERROR(error_reporter, “AllocateTensors() failed”);

return;

}

// Get information about the memory area to use for the model‘s input.

model_input = interpreter-》input(0);

if ((model_input-》dims-》size != 2) || (model_input-》dims-》data[0] != 1) ||

(model_input-》dims-》data[1] !=

(kFeatureSliceCount * kFeatureSliceSize)) ||

(model_input-》type != kTfLiteInt8))

{

TF_LITE_REPORT_ERROR(error_reporter,

“Bad input tensor parameters in model”);

return;

}

model_input_buffer = model_input-》data.int8;

// Prepare to access the audio spectrograms from a microphone or other source

// that will provide the inputs to the neural network.

// NOLINTNEXTLINE(runtime-global-variables)

static FeatureProvider static_feature_provider(kFeatureElementCount,

feature_buffer);

feature_provider = &static_feature_provider;

static RecognizeCommands static_recognizer(error_reporter);

recognizer = &static_recognizer;

previous_time = 0;

RespondCommandThreadInit();

}

// The name of this function is important for Arduino compatibility.

void loop()

{

// Fetch the spectrogram for the current time.

const int32_t current_time = LatestAudioTimestamp();

int how_many_new_slices = 0;

TfLiteStatus feature_status = feature_provider-》PopulateFeatureData(

error_reporter, previous_time, current_time, &how_many_new_slices);

// LOG(“current_time: %d, previous_time: %d, how_many_new_slices: %d

”, current_time, previous_time, how_many_new_slices);

if (feature_status != kTfLiteOk)

{

TF_LITE_REPORT_ERROR(error_reporter, “Feature generation failed”);

return;

}

previous_time = current_time;

// If no new audio samples have been received since last time, don’t bother

// running the network model.

if (how_many_new_slices == 0)

{

//LOG(“[lk added]how_many_new_slices is 0

”);

return;

}

// Copy feature buffer to input tensor

for (int i = 0; i 《 kFeatureElementCount; i++)

{

model_input_buffer[i] = feature_buffer[i];

}

// Run the model on the spectrogram input and make sure it succeeds.

TfLiteStatus invoke_status = interpreter-》Invoke();

if (invoke_status != kTfLiteOk)

{

TF_LITE_REPORT_ERROR(error_reporter, “Invoke failed”);

return;

}

// Obtain a pointer to the output tensor

TfLiteTensor *output = interpreter-》output(0);

// Determine whether a command was recognized based on the output of inference

const char *found_command = nullptr;

uint8_t score = 0;

bool is_new_command = false;

TfLiteStatus process_status = recognizer-》ProcessLatestResults(

output, current_time, &found_command, &score, &is_new_command);

if (process_status != kTfLiteOk)

{

TF_LITE_REPORT_ERROR(error_reporter,

“RecognizeCommands::ProcessLatestResults() failed”);

return;

}

// Do something based on the recognized command. The default implementation

// just prints to the error console, but you should replace this with your

// own function for a real application.

RespondToCommand(error_reporter, current_time, found_command, score,

is_new_command);

}

案例体验

当程序烧录完成后,直接喊出“打开“/“关闭”,就可以看到视频所示的效果。目前只支持近场唤醒,唤醒距离 1 米左右。由于这个“打开”/“关闭”唤醒的语料有限,唤醒效果因人不同有差异。建议按照章节 6 中自己训练一个唤醒词或者使用数据集中的英文语料 “on/off” 试试。

自训练唤醒词

本案例是自训练了一个“打开”/“关闭”快捷唤醒词。本小节将带你训练一个新的快捷唤醒词。

从录音采集到部署到 HaaS EDU K1 的整个详细流程如下:

1. 语料采集

语料采集是一个比较耗费人力的事情,通常商业化工程中语料收集有专人或专门的数据公司收集整理,这里提供了一个使用 Python 写的录音工具,方便你快速录音。

依赖项安装

#pip install pyaudio或者#conda install pyaudio

录音配置

语音文件长度一秒

单声道、16KHz、wav 格式

快、中、慢三种不同速度进行录制

录制次数 100 次以上,次数越多效果越好

相对安静环境

1.1 唤醒词录制

录制时看到“开始录音,请说话。..。..”即可立即说出唤醒词,比如“打开”、“关闭”。由于我们检测一秒的唤醒词,所以注意要在一秒内说完整整个唤醒词,录制一次后会自动回放确认是否录制完整,如果录制完整,按回车键继续下一次录制,如果录制不完整或有其他杂音,按其他任意键删除刚才的录音再继续下一次录制。

执行命令:

#python micro_speech/train/record.py

毫无疑问,这个教学案例是教你如何录制一个人的声音,如果想要达到商业化的识别率,就至少需要 500 人以上的声音录制。如果仅仅录制你一个人的唤醒词,那么仅识别你的声音是可以的,但其他人在唤醒时的成功率就会低很多。这个案例重点是教你了解唤醒词训练部署的原理。

1.2 背景噪音录制

为了更好的识别,需要录制一些背景噪音,模型训练时会学习唤醒词和背景噪音的差别。背景噪音可以录制 1~2 分钟。模型训练时会自动从中随机选择片段作为背噪加入唤醒词中进行学习。

执行命令:

#python micro_speech/train/record_noise.py

录制背景噪音,放到 dataset/_background_noise_ 目录。

1.3 创建自己的数据集

训练脚本中默认采样的预训练数据集是 Google 发布的 Speech Commands(语音命令)数据集,该数据集是英文数据集。这里我们以录制中文的“打开”/“关闭”为例,每个词录制 100 次。录制完成后分别命名为 dakai 和 guanbi 两个文件夹放入自定义的 my_dataset 目录,然后从 Speech Commands 中选择几个单词 house、marvin、wow 等唤醒词作为“未知”类别放入到 my_only_dataset 目录,它的作用是模型训练时能够从这些唤醒词中识别想要的 dakai 和 guanbi 命令,dakai 和 guanbi 可以理解为正面示例,“未知”类别为反面示例。整个命令词个数尽量限制在十个以下,这样训练的时间不会过久。如果你有其他同样长度且与录音配置中格式一样的唤醒词,也可以加入进来。另外如果录制的是 100 次唤醒词,那么其他作为“未知”类别的唤醒词的录音示例个数也尽量在 100 左右。录制的背景噪音放入到 _background_noise_ 目录,训练时脚本将自动从中随机选取一秒片段作为背景噪音加入到“无声”类别中。

2. 模型训练

2.1 PC 端训练

PC 上在 VSCode 中使用 jupyter notebook 插件打开 tflite_micro_speech_demo/micro_speech/train/train_micro_speech_model.ipynb

进行其他唤醒词的训练。

前提:

参考《HaaS AI 之 VSCode 中搭建 Python 虚拟环境》搭建完开发环境后,安装 tensorflow 1.15 版本:

《HaaS AI 之 VSCode 中搭建 Python 虚拟环境》

https://f.cp46.cn/q5zd

#conda create --name tf python=3.6#conda activate tf#conda install tensorflow=1.15

2.2 阿里云 PAI 平台训练

如果 PC 性能有限,使用阿里云 PAI 平台进行训练也是一个不错的选择,PAI-DSW 是一款云端机器学习开发 IDE,为您提供交互式编程环境,适用于不同水平的开发者。你可以根据需要选择个人版、GPU 特价版或探索者版(免费),相关使用手册 DSW 新手使用手册。

探索者版(免费)

https://dsw-dev.data.aliyun.com/#/

DSW 新手使用手册

https://tianchi.aliyun.com/forum/postDetail?spm=TODO.TODO.header.2.21864825A5pdfB&postId=121050

以使用 DSW 个人版为例:

1. 登录 PAI 控制台。

登录 PAI 控制台

https://pai.data.aliyun.com/console

2. 在左侧导航栏,选择模型开发和训练 》 交互式建模 (DSW)。

3. 在页面左上方,选择目标地域。

4. 在 Notebook 建模服务页面,单击创建实例。

5. 在配置实例向导页面,配置参数,镜像选择 tensorflow1.15-gpu-py36-cu101-ubuntu18.04 版本。

2.3 模型配置

无论在什么平台上进行训练,脚本中需要对训练的参数进行一定的配置:

唤醒词配置

WANTED_WORDS 就是你训练的唤醒词。比如:

WANTED_WORDS=”yes, on“,yes/on 对应于数据集 dataset 目录的唤醒词语料文件夹。这里根据你要训练的唤醒词修改。

训练步数配置

如果你的唤醒词仅仅数百条甚至数 10 条,那么训练的步数不用太久,修改:

TRANINGS_STEPS=”1200, 300“

如果你有上千条以上,训练的步数可以增加。

TRANINGS_STEPS=”15000, 3000“

为了防止训练欠拟合或者过拟合,训练的时间长短需要反复验证,找到最优的结果。

数据集配置

如果使用自己的数据集,请修改:

DATASET_DIR = ‘。/dataset/’

3. 模型部署

模型部署在 HaaS EDU K1 上,主要有三个步骤:

1. 模型替换:将生成的模型文件 model.cc 替换 micro_speech/micro_features/model.cc 文件

2. 标签更新:在 micro_speech/micro_features/micro_model_settings.cc 中修改 kCategoryLabels 标签内容,将标签名更换为你训练的快捷词,比如“打开”、“关闭”。由于标签与模型的输出张量元素是按照顺序进行匹配的,因此,需要按照将标签提供给训练脚本的顺序列出这些标签。

3. 业务逻辑更新:在 micro_speech/command_responder.cc 中根据标签更新相应的业务逻辑。目前在听到“打开”后,会打开 HaaS EDU K1 上 R/G/B LED 灯。你也可以修改逻辑比如通过 WiFi 打开远程的风扇或灯。这里可以充分发挥你的想象力打造一些比较有意思的场景应用。

总结

本案例在 HaaS EDU K1 上基于 TFLite-Micro 推理引擎进行语音唤醒词的部署。也提供了从唤醒词采集到模型训练、模型部署的全链路开发流程,帮助您深入理解在低功耗 MCU 上如何进行离线语音识别的开发部署,期待您打造更多属于你的离线唤醒词应用。

责任编辑:haq

原文标题:社区分享 | 基于TensorFlow Lite Micro在HaaS EDU K1物联网开发板上玩转TinyML之离线语音唤醒

文章出处:【微信号:tensorflowers,微信公众号:TensorFlow】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    突破传统“超算”加速新药研发

    Alveo 加速器卡为打造Yaddle MD提供了独特的可重配置加速功能,不仅能够支持其灵活适应算法....
    发表于 01-19 13:47 33次 阅读
    突破传统“超算”加速新药研发

    首届边缘计算开发者大赛获奖名单公布

    近日,首届边缘计算开发者大赛全国总决赛在北京成功举办。本次大赛,华为承办的“边缘智能”赛道诞生了一等....
    的头像 华为计算 发表于 01-19 09:02 145次 阅读

    智能小车PCB底板的相关资料推荐

    说起亚克力板智能小车,大家肯定都见过,用过三轮式两个前驱动轮,加一个后万向轮,通过两前驱动轮差速进行转向,比如左轮前进,...
    发表于 01-19 07:58 0次 阅读

    分享一个不错的Jlink下载器设计方案

    分享一个不错的Jlink下载器设计方案
    发表于 01-19 07:35 0次 阅读

    物联网设备联网方式有哪几种?

    物联网设备联网方式有哪几种?
    发表于 01-19 07:27 0次 阅读

    STM32写PWM四路输出St_link突然就不能用了是为什么?

    STM32写PWM四路输出St_link突然就不能用了是为什么?...
    发表于 01-19 07:25 0次 阅读

    树莓派3b引脚图分享

    如上图所示,我们可以很清楚的看到各个引脚的功能。例如我们想使用pwm引脚来控制舵机,则我们可以考虑使用其中的BCM18(PWM...
    发表于 01-19 07:14 0次 阅读

    如何利用寄存器在stm32开发板上点亮一个LED灯呢

    如何利用寄存器在stm32开发板上点亮一个LED灯呢?其原理是什么?...
    发表于 01-19 07:05 0次 阅读

    在KEIL下怎样去创建一种汇编语言STM32工程呢

    在KEIL下怎样去创建一种汇编语言STM32工程呢?有哪些操作步骤?...
    发表于 01-19 07:02 0次 阅读

    UART通信模块的类型

    单片机之串口通信2三种基本类型通信UART通信模块串口通信的基本步骤三种基本类型通信单工通信      &nb...
    发表于 01-19 06:50 0次 阅读

    在VSCode怎样去安装RT-Thread MicroPython插件呢

    micropython是什么? esp32刷入micropython固件该如何去实现呢? 在VSCode怎样去安装RT-Thread MicroPython插件呢? ...
    发表于 01-19 06:15 0次 阅读

    shineblink数码管显示的相关资料推荐

    数码管和矩阵键盘一、实现功能二、接线图三、完整代码四、代码运行结果一、实现功能本篇章实现了Core外接一个包含8位数码管和16...
    发表于 01-19 06:12 0次 阅读

    海尔成立五大委员会:聚焦实体产业,发力科技创新

    1月17日,海尔集团举行了创新年会,海尔集团董事局主席、首席执行官周云杰发表了题为《执一不失,开创未....
    发表于 01-18 19:08 12次 阅读
    海尔成立五大委员会:聚焦实体产业,发力科技创新

    物联网网关如何对PLC设备进行数据采集

    物联网网关是如何对PLC设备进行数据采集的?物联网网关在完整成套的物联网体系之中有着相当突出明显的作....
    发表于 01-18 17:54 21次 阅读

    开关量模块在报警系统中的应用

    如今现在社会的高楼大厦如雨后春笋般,一个个拔地而起,楼越建越高,内部系统越来越精细复杂,对于楼宇的安....
    发表于 01-18 16:59 6次 阅读

    贸泽电子2021年新增110家制造商合作伙伴 产品分销阵容再升级

    贸泽与其1200多家制造商合作伙伴密切合作,让客户能轻松便捷的快速获取新型元器件。在整个2020和2....
    发表于 01-18 15:52 139次 阅读

    智芯原动入选毕马威中国领先地产科技企业50榜单

    《毕马威中国领先地产科技企业50》报告发布会在线上隆重举行。作为全球全栈式智慧停车解决方案提供商的智....
    的头像 智芯原动ICETech 发表于 01-18 15:07 196次 阅读

    MediaTek发布《6G愿景白皮书》,定义三大基本设计原则S.O.C.

    MediaTek认为,伴随全球范围6G技术研究不断深入,移动性能增强、网络架构设计、频谱资源使用效率....
    发表于 01-18 14:53 61次 阅读

    2022物联网4大行业趋势

    物联网使公司能够从其资产、人员和流程中获取大量关键数据。这些数据是降低成本、提高效率和为员工提供更安....
    的头像 SJK16688 发表于 01-18 13:39 8次 阅读
    2022物联网4大行业趋势

    物联网系列⑤——基于ESP8266与点灯科技平台的氛围灯设计(接入小爱同学)

    物联网系列⑤——基于ESP8266与点灯科技平台的氛围灯设计(接入小爱同学)一、设计目标二、电路设计....
    发表于 01-18 11:29 15次 阅读
    物联网系列⑤——基于ESP8266与点灯科技平台的氛围灯设计(接入小爱同学)

    [rsp8266]疫情期间我开发了小黑,很多人却说他看不懂

    --------------------------------------------------....
    发表于 01-18 11:25 7次 阅读
    [rsp8266]疫情期间我开发了小黑,很多人却说他看不懂

    智能家居系统设计(监测+控制)

    智能家居系统模型设计引言实现的功能硬件选型主控模块无线通信模块数据采集模块温湿度监测空气质量监测光照....
    发表于 01-18 11:23 9次 阅读
    智能家居系统设计(监测+控制)

    led矩阵循环显示多个汉字

    #单片机led矩阵显示多个汉字首先:我使用的是普中的单片机,用到了74HC595芯片(这是一个串行输....
    发表于 01-18 11:21 6次 阅读
    led矩阵循环显示多个汉字

    学习笔记(08):单片机到底是个什么东西-1.2.第1季第2部分-1.2.6.外设与内部外设

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第2个课程,用通俗易懂的语言讲了很多和单片机有关的....
    发表于 01-18 11:14 6次 阅读
    学习笔记(08):单片机到底是个什么东西-1.2.第1季第2部分-1.2.6.外设与内部外设

    结合 RT-Thread 了解 PCA9685 扩展 I/O 的应用(带 PWM 功能,I2C 通信)

    背景介绍:上一篇《看 Sugar 如何说 I2C 通信》中 Sugar 从硬件角度说了 I2C 总线....
    发表于 01-18 11:11 5次 阅读
    结合 RT-Thread 了解 PCA9685 扩展 I/O 的应用(带 PWM 功能,I2C 通信)

    使用下一代的嵌入式IDE-PlatformIO 教程

    1.生成工程1.1 打开STM32CubeMX:选择你的MCU,这里我用的是STM32F103RCR....
    发表于 01-18 11:03 14次 阅读
    使用下一代的嵌入式IDE-PlatformIO 教程

    PlatformIO开发环境搭建

    文章目录前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结简介对于嵌入....
    发表于 01-18 10:54 5次 阅读
    PlatformIO开发环境搭建

    IO扩展芯片PCA9557

    项目上用到的一款蓝牙芯片引脚太少,选择了PCA9557扩展IO,通过一路i2c可以扩展出8个IO。这....
    发表于 01-18 10:47 9次 阅读
    IO扩展芯片PCA9557

    单片机实验四:定时器控制发光二极管的亮灭+简单输出连续矩形脉冲

    此文转载自:https://blog.csdn.net/Cyril_KI/article/detai....
    发表于 01-18 10:12 3次 阅读
    单片机实验四:定时器控制发光二极管的亮灭+简单输出连续矩形脉冲

    《自动化学报》—多Agent深度强化学习综述

    多Agent 深度强化学习综述 来源:《自动化学报》,作者梁星星等 摘 要 近年来,深度强化学习(D....
    发表于 01-18 10:08 4次 阅读
    《自动化学报》—多Agent深度强化学习综述

    ESP32使用PCF8563时钟模块进行网络校时

    ESP32使用PCF8563时钟模块获取网络校时关于PCF8563时钟模块的介绍接线下载Arduin....
    发表于 01-18 09:55 5次 阅读
    ESP32使用PCF8563时钟模块进行网络校时

    行稳致远 进而有为 | 美格智能2021年年度经营管理会议顺利召开

    2022年1月15日-16日,美格智能核心管理和业务团队以高清视频会议方式,举行了2021年第4季度....
    的头像 吴振波 发表于 01-18 09:53 12次 阅读
    行稳致远 进而有为 | 美格智能2021年年度经营管理会议顺利召开

    M-Arch(10)第九个示例:SPI与DS1302

    前言回顾下之前的章节:第一章节中我们描述了整个框架的核心设计思路以及主要的文件架构第二章节中我们基于....
    发表于 01-18 09:50 4次 阅读
    M-Arch(10)第九个示例:SPI与DS1302

    DS1302时钟芯片读写操作(基于普中A2开发板)

    一、命令字讲解命令字为一个字节,由八个位组成。1、位7固定位1;否则不可对DS1302进行操作;2、....
    发表于 01-18 09:43 5次 阅读
    DS1302时钟芯片读写操作(基于普中A2开发板)

    海尔集团董事局主席周云杰:执一不失,开创未来

    1月17日,在海尔集团创新年会上,海尔集团董事局主席、首席执行官周云杰发表了题为《执一不失,开创未来....
    的头像 科讯视点 发表于 01-18 09:27 279次 阅读
    海尔集团董事局主席周云杰:执一不失,开创未来

    蓝桥杯 模板Template Part8:DS1302 时钟芯片

    8421BCD码与二进制原码的相互转换。九层妖塔 起于垒土【蓝桥杯】—{模板Template}—{P....
    发表于 01-18 09:22 6次 阅读
    蓝桥杯 模板Template Part8:DS1302 时钟芯片

    DS1302电子时钟

    DS1302电子时钟DS1302如上图所示,它是由美国DALLAS公司推出的具有涓细电流充电能力的低....
    发表于 01-18 09:02 3次 阅读
    DS1302电子时钟

    智能避障小车学习笔记(基于Wemos的避障小车)

    智能避障小车一、开发环境ArduiNo平台网盘地址:https://pan.baidu.com/s/....
    发表于 01-18 08:41 6次 阅读
    智能避障小车学习笔记(基于Wemos的避障小车)

    电气防火安全用电运维管理系统和设备方案

    1、概述 安科瑞Acrelcloud-6000安全用电管理平台是针对我国当前电气火灾事故频发而创新的....
    发表于 01-17 21:49 6次 阅读
    电气防火安全用电运维管理系统和设备方案

    智慧消防技术是在物联网概念上发展的一种新型技术

    1、前言 随着物联网的飞速发展,智慧消防的概念已经逐渐成为消防行业的热点话题,也成为一种新的趋势。近....
    发表于 01-17 14:04 10次 阅读
    智慧消防技术是在物联网概念上发展的一种新型技术

    ESP8266学习笔记01

    1主板引脚1、蓝底白字部分为芯片引脚,引脚输出高电平为3.3V。引脚工作电压为3.3V。2、浅蓝色背....
    发表于 01-17 13:44 19次 阅读
    ESP8266学习笔记01

    详细讲解如何使用STM32驱动LT3746(32路带降压控制的LED驱动)

    详细讲解如何使用STM32驱动LT3746【32路带降压控制的LED驱动】什么是LT37461. L....
    发表于 01-17 13:04 4次 阅读
    详细讲解如何使用STM32驱动LT3746(32路带降压控制的LED驱动)

    非常好用的上位机软件(功能强大)——匿名四轴上位机

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言 一、pandas是什么....
    发表于 01-17 13:02 9次 阅读
    非常好用的上位机软件(功能强大)——匿名四轴上位机

    GD32F303课程【4】串口开发

    目录如下,持续更新~~【1】星空派GD32F303开发板介绍 与 文章目录1. 串口基础概念USAR....
    发表于 01-17 12:58 5次 阅读
    GD32F303课程【4】串口开发

    Uart协议介绍

    文章目录前言一、Uart协议(即串口)的基本概念二、Uart配置基本属性1.波特率2.起始位3.数据....
    发表于 01-17 12:56 5次 阅读
    Uart协议介绍

    Stduino学习(一)3色LED模块

    *37种传感器(一)之3色LED模块+Stduino Nano&UNO*本文转载自: www.std....
    发表于 01-17 12:00 4次 阅读
    Stduino学习(一)3色LED模块

    STM32F1驱动超声波模块实验

    STM32驱动超声波模块实验开篇闲篇:耀风(鄙人)是一个STM32才入门的小白所以文章写的不是很严谨....
    发表于 01-17 11:55 6次 阅读
    STM32F1驱动超声波模块实验

    【更好用的单片机】Stduino学习(三十)DS18B20模块

    37种传感器(三十)DS18B20模块+Stduino Nano&UNO本文转载自:http://w....
    发表于 01-17 11:46 11次 阅读
    【更好用的单片机】Stduino学习(三十)DS18B20模块

    【更好用的单片机】Stduino学习(三十二)DS1302模块

    37种传感器(三十二)DS1302模块+Stduino Nano&UNO本文转载自:http://w....
    发表于 01-17 11:45 7次 阅读
    【更好用的单片机】Stduino学习(三十二)DS1302模块

    STM32CubeMX | | 使用小熊派玩转颜色识别传感器(纯手工打造E53传感器模块)

    关注、星标嵌入式云IOT技术圈,精彩及时送达我买来做颜色识别传感器的模块是TCS34725,如下图所....
    发表于 01-17 11:44 10次 阅读
    STM32CubeMX | | 使用小熊派玩转颜色识别传感器(纯手工打造E53传感器模块)

    2021蓝桥杯单片机组个人总结

    前言: 距离单片机国赛已经结束两个多月了,国二(自己也没想到),证书现在还没到手,应该在老师那里。因....
    发表于 01-17 11:43 3次 阅读
    2021蓝桥杯单片机组个人总结

    【更好用的单片机】Stduino拓展学习(二)SG90舵机

    【基于STM32】Stduino拓展学习(二)SG90舵机本文转载自:http://www.stdu....
    发表于 01-17 11:40 5次 阅读
    【更好用的单片机】Stduino拓展学习(二)SG90舵机

    实现(3)-----感知层的实现的学习之ZigBee协议栈实验----无线点灯

    1.为什么使用cc2530ZigBee板来实现感知层?为什么不能直接使用单片机采集数据呢?因为单片机....
    发表于 01-17 11:39 5次 阅读
    实现(3)-----感知层的实现的学习之ZigBee协议栈实验----无线点灯

    【正点原子FPGA连载】第八章LED灯流水实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1

    第八章LED灯流水实验LED灯流水作为一个经典的入门实验,其地位堪比编程界的“Hello,World....
    发表于 01-17 11:38 4次 阅读
    【正点原子FPGA连载】第八章LED灯流水实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1

    STM32入门学习经验总结

    STM32系列基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的ARMCortex-M3内核。....
    发表于 01-17 11:36 3次 阅读
    STM32入门学习经验总结

    EDA技术试验一:Quartus II 软件和 DE2-115 开发板使用入门

    实验目的熟悉 Quartus II 开发环境,掌握原理图输入方式、文本输入方式和波形仿真;熟练掌握在....
    发表于 01-17 11:27 3次 阅读
    EDA技术试验一:Quartus II 软件和 DE2-115 开发板使用入门

    基于三维激光点云的目标识别与跟踪研究

    基于三维激光点云的目标识别与跟踪研究 来源:《汽车工程》 ,作者徐国艳等 [摘要] 针对无人车环境感....
    发表于 01-17 11:22 12次 阅读

    STM32F103-入门基础实验-GPIO输出控制LED核心代码(固件库版)

    上次我们讲了如何配置寄存器使用GPIO-输出-控制LED灯,与我们之前学的51单片机的方法是一样的,....
    发表于 01-17 11:19 5次 阅读
    STM32F103-入门基础实验-GPIO输出控制LED核心代码(固件库版)

    利尔达全球首发基于移芯EC618平台的Cat1模组

    市场研究公司Counterpoint近日公布了全球蜂窝物联网模块芯片最新研究报告。2021年第三季度....
    的头像 物联网观察 发表于 01-17 11:09 145次 阅读

    STM32F103-入门基础实验-USART(输入/输出)实验核心代码(固件库版)

    1、USART简介USART(Universal Synchronous /Asynchronous....
    发表于 01-17 11:06 5次 阅读
    STM32F103-入门基础实验-USART(输入/输出)实验核心代码(固件库版)

    EV_ICS-51360-FX TDK InvenSense ICS多模MEMS麦克风

    venSense ICS多模MEMS麦克风具有230µA至590µA电流范围、-98dB FS高电源抑制,采用3.5mm × 2.65mm × 0.98mm表面贴装封装。ICS-51360模块具有50Hz至>20kHz的扩展频率响应和数字脉冲密度调制 (PDM) 输出。该MEMS麦克风兼容无锡/铅和无铅焊接工艺。TDK InvenSense ICS多模MEMS麦克风非常适合用于智能手机、麦克风阵列、平板电脑和相机应用。 特性 四阶Σ-Δ调制器 数字脉冲密度调制 (PDM) 输出 兼容无锡/铅和无铅焊接工艺 符合RoHS指令/WEEE标准 规范 −36dB FS ±1...
    发表于 11-11 09:07 233次 阅读

    SDE1B016GTKDWBA0ESA0 TDK Solid State Drives

    态驱动器满足工业应用中对SSD的要求,速度可达180MB/s。 这些设备使用最新的MLC型NAND闪存,具有读取重试功能,对于提高数据可靠性是必不可少的。 SSD具有自动恢复、数据随机化和自动刷新功能。
    发表于 10-23 19:06 159次 阅读

    P-NUCLEO-WB55 STMicroelectronicsPNUCLEOWB55STM32WBNucleo68数据包

    oelectronics P-NUCLEO-WB55 STM32WB Nucleo-68数据包是一套经济划算的方案,能够基于STM32WB双核多协议 超低功耗2.4GHz MCU 片上系统 (SoC) 快速开发WLAN和蓝牙应用。  STM32 Nucleo包含NUCLEO-68板(预装STM32WB55RG MCU)和USB加密狗(采用 STM32WB55CG MCU)。 NUCLEO-68板和USB加密狗配置为2.4GHz射频收发器蓝牙规格v5.0和IEEE 802.15.4-2011 PHY和MAC。NUCLEO-68板还包含Arduino Uno V3和 史多福连接器,可轻松集成到应用原型中。集成式ST-LINK/V2-1调试器/编程器,无需使用单独的探针。...
    发表于 10-23 16:06 227次 阅读

    STM32MP157A-DK1 STMicroelectronicsSTM32MP157ADK1探索套件

    oelectronics STM32MP157A-DK1探索套件支持利用STM32 MPU OpenSTLinux分布软件轻松开发应用程序。OpenSTLinux软件用于主处理器和协同处理器的STM32CubeMP1软件。该套件包含ST-LINK嵌入式调试工具、LED、按钮和一个以太网1Gbps连接器。它还包含一个USB Type-C™ OTG连接器、四个USB Type-A主机连接器和一个HDMI®收发器。它还包含一个立体声耳机插孔(带模拟麦克风)和一个microSD™连接器。为了扩展STM32MP157A-DK1探索套件的功能,提供两个GPIO扩展连接器,用于Arduino™和Raspberry Pi®屏蔽。 特性 基于STM32MP157 Arm®的双Cortex®-A7 32位 + Cortex®-M4 32位MPU,采用TFBGA361封装 圣普米克stpmic1a 4GbitDDR3L,16位,533MHz 1GB以太网 (RGMII),符合IEEE-802.3ab USBOTGHS 音频编#...
    发表于 10-23 15:06 720次 阅读

    NUCLEO-H743ZI2 STMicroelectronics搭载STM32H743ZIMCU的STM32Nucleo144开发板

    oelectronics搭载STM32H743ZI MCU的STM32 Nucleo-144开发板用于测试STM32H743ZI微控制器的各种性能以及与之相对应的功耗情况。开关模式电源 (SMPS) 可显著降低运行模式下的功耗。该开发板设有用于实现Arduino® Uno V3连接功能的ST Zio连接器,以及用于通过各种扩展板扩展Nucleo开放式开发平台的 ST吗啡排针。STM32 Nucleo-144开发板无需单独的探头,因其已集成ST-LINK/V2-1调试器/编程器。STM32 Nucleo-144开发板随附STM32Cube MCU软件包中提供的STM32全面免费软件库和示例。 特性 采用LQFP144封装的STM32微控制器 外部SMPS,生成Vcore逻辑电源(仅可用于“-P”结尾的板) 符合IEEE-802.3-2002的以太网(取决于STM32支持) USB OTG或全速设备(取决于STM32支持) 3个用户LED 两个按钮(用户和复位) 32.768 kHz晶体振荡器 板连接器: 微型USB接口 SWD 以太网RJ...
    发表于 10-21 10:09 346次 阅读