电子发烧友App

硬声App

0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

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

3天内不再提示

电子发烧友网>今日头条>戒烟不难 使用电子烟轻松戒烟替烟

戒烟不难 使用电子烟轻松戒烟替烟

收藏

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

评论

查看更多

相关推荐

模数转换器 SIG5531A 国产平 CS5531AS

https://www.hqchip.com/gongsi/73622.html 信格勒微电子 携手 华秋商城 共创国产高精度模数转换器芯片平新生态 因为 fully compatible.
2024-03-11 12:56:53

PMIC For E Ink®Vizplex™-启用电子纸显示器TPS65182x数据表

电子发烧友网站提供《PMIC For E Ink®Vizplex™-启用电子纸显示器TPS65182x数据表.pdf》资料免费下载
2024-03-07 13:49:260

模数转换器 SIG7793 国产平 AD7793

https://www.hqchip.com/gongsi/73622.html 信格勒微电子 携手 华秋商城 共创国产高精度模数转换器芯片平新生态 因为 fully compatible.
2024-03-06 14:12:13

模数转换器 SIG5530 国产平 CS5530

https://www.hqchip.com/gongsi/73622.html 信格勒微电子 携手 华秋商城 共创国产高精度模数转换器芯片平新生态 因为 fully compatible.
2024-02-22 09:25:41

宿舍用电智能监控系统设计

电子发烧友网站提供《宿舍用电智能监控系统设计.docx》资料免费下载
2024-01-11 16:04:501

使用LT3081/3091组合来为DAC提供精密度较高的供电电压,可否使用ADR5045代其R set电阻?

我希望使用LT3081/3091组合来为DAC提供精密度较高的供电电压,可否使用ADR5045代其R set电阻,还有在这种情况下是否需要并联电容。 似乎3081/3091的内置50μA电流源对于
2024-01-04 06:14:30

宿舍用电智能监控系统设计

电子发烧友网站提供《宿舍用电智能监控系统设计.docx》资料免费下载
2024-01-03 10:28:320

OC5220原厂降压恒流IC芯片

电子工程领域,降压恒流IC芯片是一种非常重要的电子元器件。它们被广泛应用于各种电子设备中,如LED照明、电动汽车、电子等。其中,OC5220原厂降压恒流IC芯片是一款非常优秀的降压恒流IC芯片
2023-12-21 19:08:01

电子电路,求分析短路保护怎么能做到芯片不复位

如下图,当H+接一个1欧姆发热丝短路时,我程序能识别到短路也能关断MOS管,但是芯片会低电复位,有没有什么解决方法吗?有做过电子的这块的大佬能不能指点一下啊! (pcb已经量产,小白在实习,拿着它学习程序)
2023-12-20 08:58:17

M31谈MIPI在车用电子的需求与挑战

MIPI 是Mobile Industry Processor Interface(行动产业处理器界面)的简称。本文将说明MIPI在新兴车用电子领域之地位与发展,接着针对MIPI在车用设计及测试上的标准与规范提出观点、并接续M31的MIPI产品线介绍,末节为MIPI技术服务之说明。
2023-12-18 10:07:45537

电子烟单片机方案开发,32位单片机PY32F030电子烟解决方案

传统香烟和戒烟,与传统盒装烟相比性价比高,且不含焦油。电子烟中最核心的器件是MCU,选择一款合适的MCU是很关键的。 电子烟单片机方案介绍: 芯岭技术的电子烟解决方案的MCU选择的是国产单片机PY32F030 QFN32封装,可以 满足电子烟应用小
2023-12-15 16:45:01500

用电子元器件的作用及原理是什么

用电子元器件的作用及原理 一、电阻 电阻是电子电路中最常用的元件之一,其主要作用是限流和分压。电阻的原理是基于欧姆定律,即通过电阻的电流与电压成正比,与电阻的阻值成反比。电阻的阻值通常用欧姆
2023-12-13 15:36:46810

用电子元器件介绍

用电子元器件介绍
2023-12-06 09:34:017298

学会这4招,轻松搞定开关电源EMI

学会这4招,轻松搞定开关电源EMI
2023-12-05 16:57:32226

电子烟方案开发说明

电子烟是一种 用于戒烟和替代香烟的 电子 科技产品 。它通常由 雾化器、锂电池和烟油, 过滤嘴 器件 组成。电子烟和传统香烟在很多方面都有所不同。电子烟的烟雾是通过加热液体产生的蒸汽,而传统香烟
2023-12-04 15:45:01409

目前市面上最火的电子烟方案单片机,XL32F001 QFN20封装。

电子烟是一种用于戒烟和替代香烟的电子科技产品。它通常由雾化器、锂电池和烟油,过滤嘴器件组成。电子烟和传统香烟在很多方面都有所不同。电子烟的烟雾是通过加热液体产生的蒸汽,而传统香烟是通过燃烧烟草产生
2023-12-01 13:33:35316

实现USB与传统工业接口之间的轻松桥接解决方案

电子发烧友网站提供《实现USB与传统工业接口之间的轻松桥接解决方案.pdf》资料免费下载
2023-11-28 10:40:090

国产平ADS1230

本帖最后由 jf_01750610 于 2023-11-27 09:20 编辑 https://www.hqchip.com/gongsi/73622.html 信格勒微电子 携手 华秋商城
2023-11-26 16:18:34

零漂移放大器:现可轻松用于高精度电路中

电子发烧友网站提供《零漂移放大器:现可轻松用于高精度电路中.pdf》资料免费下载
2023-11-24 11:13:050

资深工程师教你轻松掌握差分放大电路

资深工程师教你轻松掌握差分放大电路
2023-11-23 18:20:46511

如何轻松调节回路电阻?

如何轻松调节回路电阻? 调节电路中的电阻是一项基本的电子技术技能。通过改变电路中的电阻值,我们可以改变电流和电压的大小,从而控制电路的运行状态。在本文中,我们将详细介绍如何轻松调节回路电阻。 首先
2023-11-23 10:33:10376

如何正确使用电烙铁

电子发烧友网站提供《如何正确使用电烙铁.pdf》资料免费下载
2023-11-20 09:55:535

如何使用电子负载装置进行0V的放电呢?

如何使用电子负载装置进行0V的放电呢? 标题:电子负载装置的应用:实现高效0V放电 引言: 电子负载装置是一种用于模拟和测试负载的电器装置,可以模拟各种负载条件,并通过控制电流和电压实现对电源的可靠
2023-11-17 14:49:17399

轻松入门开发ARM程序分享

电子发烧友网站提供《轻松入门开发ARM程序分享.pdf》资料免费下载
2023-11-17 11:39:350

MOS管的特性、驱动以及应用电

电子发烧友网站提供《MOS管的特性、驱动以及应用电路.doc》资料免费下载
2023-11-14 10:18:270

看完这篇文章,汇编也不难

为了解决二进制指令的可读性问题,工程师将那些指令写成了八进制。二进制转八进制是轻而易举的,但是八进制的可读性也不行。很自然地,最后还是用文字表达,加法指令写成 ADD。内存地址也不再直接引用,而是用标签表示。
2023-11-12 11:13:38399

国产平AD7190

https://www.hqchip.com/gongsi/73622.html 信格勒微电子 携手 华秋商城 共创国产高精度模数转换器芯片平新生态 SIG7190 国产平 AD7190 pin
2023-11-08 15:59:50

PC3221单节锂电流充电管理芯片高耐压输入28V外围元件少

时, 自动进入一个低功耗状态,连接电池的端口漏电流降至 1μA 以下。其他功能包括充电电流监测器、欠压锁定、自动充电和状态引脚。应用场景 电子 玩具 蓝牙应用 锂离子电池供电设备
2023-11-08 10:12:35

PL7501E 双节锂电升压充电管理电路IC 技术支持

,过压保护 ●IC过温保护,IC温度自适应调节功能 ●ESD 2KV 应用范围 ● 锂电池包 ● 对讲机 ● 玩具 ● 蓝牙音箱 ●电子 ● POS机
2023-11-06 14:42:35

PL7501CL 5V输入升压型双节锂电池充电管理芯片

·600KHz 开关频率 ·输出过压,输出短路保护 ·输入欠压,输入过压保护 ·过温保护 应用 ·移动电源 ·蓝牙音箱 ·电子 ·对讲机
2023-11-04 14:57:46

PL7501C 5V输入升压型双节锂电池充电管理芯片

·600KHz 开关频率 ·输出过压,输出短路保护 ·输入欠压,输入过压保护 ·过温保护 应用 ·移动电源 ·蓝牙音箱 ·电子 ·对讲机
2023-11-04 12:12:49

用电控单元散热器的设计测试

电子发烧友网站提供《车用电控单元散热器的设计测试.pdf》资料免费下载
2023-11-02 09:11:250

用电器常见的电子元器件

用电器中使用的电子元器件种类繁多,以下是一些常见的电子元器件: 电阻器:用于限制电流、分压、调整电路的电阻值等。 电容器:用于存储电荷、滤波、隔离直流和交流信号等。
2023-10-27 11:19:09499

电子发热丝推力测试攻略:掌握博森源推拉力测试机关键步骤

推拉力测试机
博森源推拉力机发布于 2023-10-25 16:55:50

两种保护用电流采样电路的比较及应用

电子发烧友网站提供《两种保护用电流采样电路的比较及应用.pdf》资料免费下载
2023-10-25 10:19:140

用电子元器件分类

电子发烧友网站提供《常用电子元器件分类.pdf》资料免费下载
2023-10-20 14:52:531

用电子元器件参考资料指南

用电子元器件参考资料.pdf
2023-10-17 09:43:428

用电子元器件手册指南

用电子元器件手册.pdf
2023-10-17 09:42:2424

51单片机轻松入门一基于STC15W4K系列

电子发烧友网站提供《51单片机轻松入门一基于STC15W4K系列.rar》资料免费下载
2023-10-09 15:56:4211

二总线技术为什么下行采用电压信号上行采用电流信号?

二总线技术为什么下行采用电压信号,上行采用电流信号?是什么传输的
2023-10-08 08:37:35

修复 PCB 板擦花,轻松拯救你的电子设备

修复 PCB 板擦花,轻松拯救你的电子设备
2023-09-25 09:57:14766

光耦817应用电路图

光耦817应用电路图  光耦817是一种集成了发光二极管和光敏二极管的电子元器件,它可以将输入的电信号通过光学隔离传递到输出端。它具有隔离性能、耐高压能力和防电磁干扰等特点,因而在电路设计中被
2023-09-22 17:50:174805

电子元器件与实用电路基础

全书从认识电子元件和半导体器件起步,到各种实用电路的结构,性能和工作原理,由浅入深地进行了详细的讲解。特别是以大量的实用单元电路为例进行了图解,使读者易懂易学。本书的重点是对各种常用电路的工作原理
2023-09-22 07:26:39

STM8S和STM32 MCU:一致的8/32位产品线实现轻松移植

电子发烧友网站提供《STM8S和STM32 MCU:一致的8/32位产品线实现轻松移植.pdf》资料免费下载
2023-09-21 11:33:560

tcs230原理及应用电

电子发烧友网站提供《tcs230原理及应用电路.pdf》资料免费下载
2023-09-18 17:58:110

ADM130单相电子式电能表宿舍用电管理终端

ADM130单相电子式电能表(宿舍用电管理终端)主要用于计量单相交流用电,适合于学生宿舍(公寓)用电管理。终端可以一路火线进线,三路火线并联输出分别计量照明、插座、空调回路,可进线预付费控制,并可
2023-09-08 17:02:400

CLM32L003 最新规格书

CLM32L003应用:小家电、充电器、遥控器、电子、燃气报警器、数显表、温控器、记录仪、电机驱动、智能门锁、迷你手电筒 ,手持电风扇。详细内容请查看规格书。
2023-09-05 10:38:21

Mini54FDE做RS485通讯是否可以用P1.3代RTX?

Mini54FDE 做 RS485 通讯 它只有 RX TX 脚位 没有RTX输出 是否可以用P1.3代RTX 如果可程式要如何修改
2023-08-31 06:29:45

产品推荐 | Abracon 的射频电感

:蓝牙音箱、电子、无人机、便携式游戏机、数码相机、手持GPS设备 通信:电信设备、无线LAN、电缆调制解调器 医疗:医疗监测设备:血糖-葡萄糖仪、温度计、手指血氧仪 可穿戴设备:智能手表、健身追踪
2023-08-22 09:29:59

用电子元件

电路电子技术
学习电子知识发布于 2023-08-08 00:02:26

电杆上为何发着光?为何冒着?为何吱吱作响?

电源电路元器件
学习电子知识发布于 2023-08-01 21:32:50

轻松使用STM32MP13:如MCU般在Cortex-A核上裸跑应用程序

电子发烧友网站提供《轻松使用STM32MP13:如MCU般在Cortex-A核上裸跑应用程序.pdf》资料免费下载
2023-07-29 11:37:553

Pericom通用电平转换器应用说明

电子发烧友网站提供《Pericom通用电平转换器应用说明.pdf》资料免费下载
2023-07-26 09:19:320

制作了一个刹车带的直流电机调速器

电子diy
学习电子知识发布于 2023-07-24 22:35:42

使用4017以更少的组件轻松制作LED灯罩

电子发烧友网站提供《使用4017以更少的组件轻松制作LED灯罩.zip》资料免费下载
2023-07-12 10:05:440

如何轻松的将电源集成到项目中

电子发烧友网站提供《如何轻松的将电源集成到项目中.zip》资料免费下载
2023-07-12 10:00:580

看完后,搞懂开关电源设计的这些指标一点都不难

中国一般是220V,由于电网电压的不稳定,很多时候要求宽电压输入,所以会设计成90-270V都能正常工作。通常美国用电范围为110-130V,日本用电范围为100V。
2023-07-11 16:49:22853

LoRa ESP32无线电-轻松入门教程

电子发烧友网站提供《LoRa ESP32无线电-轻松入门教程.zip》资料免费下载
2023-07-11 10:14:291

使用电位器和Arduino控制LED亮度

电子发烧友网站提供《使用电位器和Arduino控制LED亮度.zip》资料免费下载
2023-07-06 09:50:420

轻松拾取无需触摸的开源项目

电子发烧友网站提供《轻松拾取无需触摸的开源项目.zip》资料免费下载
2023-07-05 10:49:280

如何使用电位器控制LED闪烁脉冲

电子发烧友网站提供《如何使用电位器控制LED闪烁脉冲.zip》资料免费下载
2023-07-05 10:00:580

如何用电子元件和ESP32-CAM制作AI机器人

电子发烧友网站提供《如何用电子元件和ESP32-CAM制作AI机器人.zip》资料免费下载
2023-07-04 14:29:582

干货专栏 | 这么做让电池耗电分析更轻松电子测试工程师必备技能,建议收藏!

找仪器、选仪器、用仪器一站解决,很省心在日常工作中,电子测试工程师们经常会遇到电池耗电分析和直流至直流转换器效率测量之类的问题,此时使用电子负载生成任意波形,就可以更轻松地完成测试。那么今天我们
2023-07-03 10:00:21381

程斯-电线电缆密度测试仪 符合技术要求

工业自动化
csizhineng发布于 2023-07-01 14:54:06

如何使用电位器控制LASER亮度

电子发烧友网站提供《如何使用电位器控制LASER亮度.zip》资料免费下载
2023-06-27 15:16:070

这样做,轻松拿捏阻焊桥!

PCB阻焊桥是什么?如何轻松完成阻焊要求顺利投产,本文为大家提供一份参考答案。
2023-06-27 11:07:00634

使用Teachable Machine和Python轻松进行对象检测

电子发烧友网站提供《使用Teachable Machine和Python轻松进行对象检测.zip》资料免费下载
2023-06-27 09:26:250

如何轻松构建基于LED的强大障碍灯系统

在本文中,我们将讨论如何轻松构建基于LED的强大障碍灯系统,使用最少的零件和高效的工作。
2023-06-25 17:25:27528

#智慧用电 监控安科瑞AcrelCloud-6000电气安全用电管理云平台系统

用电管理
安科瑞万佳芬发布于 2023-06-14 14:26:02

MOS管基础知识:轻松理解MOS管工作原理

MOS管基础知识:轻松理解MOS管工作原理。MOS管是一种利用电场效应来控制其电流大小的半导体三端器件,很多特性和应用方向都与三极管类似。这种器件不仅体积小、质量轻、耗电省、寿命长、而且还具有输入阻抗高、噪声低、热稳定性好、抗辐射能力强等优点,应用广泛,特别是在大规模的集成电路中。
2023-06-13 09:46:11670

用电阻和电容去除直流偏置电压

电子发烧友网站提供《用电阻和电容去除直流偏置电压.zip》资料免费下载
2023-06-12 09:49:341

过滤件滤性能试验仪视频# 厂家实拍

仪器仪表测量仪器工业自动化
sinceritysmart发布于 2023-06-09 13:21:25

SW3526料XPD911 100W和100W以内降压多口互联互通协议芯片

供应SW3526料XPD911 100W和100W以内降压多口互联互通协议芯片,提供XPD911关键参数 ,广泛应用于AC-DC 适配器、车载充电器等设备的 USB Type-C 端口充电解决方案,更多产品手册、应用料资请向深圳富满微代理骊微电子申请。>>
2023-06-05 14:14:55

husb350芯片料XPD701 100w单C口协议芯片带LINK外置VBUS MOS

供应husb350芯片料XPD701 100w单C口协议芯片带LINK外置VBUS MOS,提供XPD701关键参数 ,广泛应用于AC-DC 适配器、车载充电器等设备的 USB Type-C 端口充电解决方案,更多产品手册、应用料资请向深圳富满微代理骊微电子申请。>>
2023-06-05 11:11:23

SW3526料XPM52C 35W双C市场pd快充降压芯片

供应SW3526料XPM52C 35W双C市场pd快充降压芯片,提供XPM52C关键参数 ,广泛应用于AC-DC 适配器、车载充电器等设备的 USB Type-C 端口充电解决方案,更多产品手册、应用料资请向深圳富满微代理骊微电子申请。>>
2023-06-05 11:03:26

IP6537芯片料XPM52C 35W 双C市场内置DCDC

供应IP6537芯片料XPM52C 35W 双C市场内置DCDC,提供XPM52C 关键参数 ,广泛应用于AC-DC 适配器、车载充电器等设备的 USB Type-C 端口充电解决方案,更多产品手册、应用料资请向深圳富满微代理骊微电子申请。>>
2023-06-05 10:53:38

天钰快充fp6606ac料XPD738/XPD938 双口usb协议芯片

供应天钰快充fp6606ac料XPD738/XPD938 双口usb协议芯片,提供XPD738/XPD938 关键参数 ,广泛应用于AC-DC 适配器、车载充电器等设备的 USB Type-C 端口充电解决方案,更多产品手册、应用料资请向深圳富满微代理骊微电子申请。>>
2023-06-01 17:30:41

快充协议芯片SW2305料XPD738/XPD938双口协议芯片

供应快充协议芯片SW2305料XPD738/XPD938双口协议芯片,提供XPD738/XPD938关键参数 ,广泛应用于AC-DC 适配器、车载充电器等设备的 USB Type-C 端口充电解决方案,更多产品手册、应用料资请向深圳富满微代理骊微电子申请。>>
2023-06-01 17:09:32

十大最常用电子元器件(一)

电子元器件是电子技术中的基础组成部分,是电子电路的基本构件。电子元器件的种类繁多,但其中一些元器件的应用非常广泛,被称为十大最常用电子元器件。本文将介绍这些元器件的基础知识。
2023-06-01 08:52:401690

具有负载断开控制的20V同步升压转换器PL30502

· QFN13-FC 3 * 3.5封装 应用范围: · 便携式POS终端 · 蓝牙扬声器 · 电子 · Thunderbolt接口 · USB Type-C电源传输
2023-05-30 14:54:09

智能充电桩电子设计图

汽车用电子充电桩电子设计方案,包括4G、WIFI、电流测量、用电量计量等。用于充电装设计参考,完整的电子设计电路图。
2023-05-30 14:30:0011

CAN比UART难不难

最近看到有网友在技术群讨论关于『CAN比UART难不难的话题』,有的网友说CAN很简单,也有的网友说CAN很难。
2023-05-20 14:38:20426

5v转3.3v常用稳压芯片 单片机5v转3.3v

输入电压下将电压转换为3.3V输出的能力。该芯片拥有出色的电源抗干扰能力,同时也具有高-精度、高-稳定性和低功耗等特点。AH53XX适用于很多电池供电设备,如烟雾传感器、微控制器、家用电器与仪器等。 在
2023-05-18 16:01:10

德普dp2525jb料PL3366A/B/C内置高压功率BJT管原边pwm控制芯片

供应德普dp2525jb料PL3366A/B/C内置高压功率BJT管原边pwm控制芯片,提供PL3366A/B/C关键参数 ,更多产品手册、应用料资请向聚元微代理商骊微电子申请。>>
2023-05-17 10:15:03

S9111芯茂微料PL3365A/B/C恒流/恒压原边控制器-苏州聚元微代理

供应S9111芯茂微料PL3365A/B/C恒流/恒压原边控制器,是苏州聚元微代理,广泛应用于手机充电器、小功率率电源适配器、LED驱动、消费类的备用电源等领域,更多产品手册、应用料资请向苏州聚元微代理骊微电子申请。>>  
2023-05-16 16:47:14

德普dp2525a料PL3365A/B/C高精度恒流/恒压原边控制PWM功率开关

供应德普dp2525a料PL3365A/B/C高精度恒流/恒压原边控制PWM功率开关,广泛应用于手机充电器、小功率率电源适配器、LED驱动、消费类的备用电源等领域,更多产品手册、应用料资请向苏州聚元微代理骊微电子申请。>> 
2023-05-16 16:39:54

PD诱骗芯片 QC诱骗芯片 PD QC快充取电芯片

取电芯片,支持从手机充电器/车充等电源上取电给产品供电。 2.应用  小家电、电子  智能家居、音响  卷发器、无线充电  筋膜枪、吸尘器等 3.特性  集成 USB PD 快充协议
2023-05-11 15:40:45

直流交换电路是利用电子开关器件什么来改变输出电压的大小呢?

直流交换电路是利用电子开关器件什么来改变输出电压的大小呢?
2023-05-05 18:04:49

圈圈画画,轻松分析照明结果

    原文标题:圈圈画画,轻松分析照明结果 文章出处:【微信公众号:新思科技】欢迎添加关注!文章转载请注明出处。
2023-04-12 23:25:02328

G30导热凝胶轻松打进车载AR散热市场

G30导热凝胶轻松打进车载AR散热市场
2023-04-10 15:30:36402

如何解决智慧用电探测器没有信号的问题?

  智慧用电似乎已经成为我们生活中不可或缺的一部分,一系列烦恼也接踵而至,其中最常见的就是安装智慧用电探测器信号不好。  遇到这种情况该如何解决?3个简单实用的方法,让你轻松解决智慧用电探测器没有
2023-04-10 09:49:50

如何轻松实现MQTT接入阿里云IoT平台

教你轻松实现使用MQTT协议接入阿里云平台
2023-03-29 11:05:437

基于Arduino单片机的便携式智能戒烟助手

单片机DIY
jf_06209345发布于 2023-03-28 22:42:17

【鲁班猫创意氛围赛】 有无害环境卫士

大佬们好,分享一下我用鲁班猫做ros主控,stm32f407做底层驱动的一个ros小车。 目的是识别烟雾并净化:净化是用的负离子发生器(效果如文章顶部视频,净化还是很顶的),外加扇叶将其扩散出去。同时也具有环境气体浓度(质量)检测的功能。 b站链接: https://www.bilibili.com/video/BV1hh4y1n7Fz/?vd_source=4fa660ff7e4423139e6ebdbd4dece6c7 这是我去年12月底开始做的,入坑鲁班猫算是比较早了。在读大三学生。正奥里给考研中。。。 最底下还塞了一块vet6和一块esp32. 板子上加了个风扇,为了散热快。 鲁班猫1s做ROS主控用于ros建图(gmapping)和导航,同时接入NPU做抽烟监测,模型是yolov5自己训练的模型转化成rknn部署在板子上。 功能部分即功能层的stm32与串口屏、esp32通信部分。功能层的主要目的是获取传感器数据和通过继电器控制小车前端的负离子发生器和两个加快负离子扩散的风扇。这里的stm32相当于一个中转,用的是rt—thread实时操作系统,版本是4.0.2(写的比较早,当时的rtt还有小bug,现在已经很好用了。) 开启三个串口:一个用于读取传感器,一个用于接收和发送指令给串口屏,一个用于给esp32传输数据,通过esp32将数据发送到巴法云平台,做接入小程序中转。 篇幅有限,代码放在了网盘上。 链接:https://pan.baidu.com/s/1ltgypPMq9heezk412r4IKw?pwd=jhzs 提取码:jhzs 因为用的是rtt,移植性很高,故只写了应用层的main.c函数。如下: 气体传感器如下(所用的是串口协议) #include <rtthread.h> / *串口1用来调试* / #define DBG_TAG \"main\" #define DBG_LVL DBG_LOG #include <rtdbg.h> #include <string.h> #include <serial.h>//此处有坑,要改头文件路径为rt-thread/components/drivers/include/drivers #include <stdio.h> #include \"stdlib.h\" #defineleft_motor_run{rt_pin_write(6,PIN_LOW );rt_pin_write(7,PIN_HIGH);} #defineleft_motor_back{rt_pin_write(6,PIN_HIGH );rt_pin_write(7,PIN_LOW);} #definestoping{rt_pin_write(6,PIN_HIGH );rt_pin_write(7,PIN_HIGH);rt_pin_write(16,PIN_HIGH );rt_pin_write(17,PIN_HIGH);} #defineright_motor_run{rt_pin_write(16,PIN_LOW );rt_pin_write(17,PIN_HIGH);} #defineright_motor_back{rt_pin_write(16,PIN_HIGH );rt_pin_write(17,PIN_LOW);} #define key1_openrt_pin_write(51,PIN_LOW );//d3 #define key1_closert_pin_write(51,PIN_HIGH ); #define key2_openrt_pin_write(52,PIN_LOW );//d4 #define key2_closert_pin_write(52,PIN_HIGH ); #define key3_openrt_pin_write(53,PIN_LOW );//d5 #define key3_closert_pin_write(53,PIN_HIGH ); /*micropython esp32与rtt串口DMA传输数据时有坑, * 需在drv_usart.c找到HAL_UART_RxCpltCallback和HAL_UART_RxHalfCpltCallback将dma_isr(&uart->serial)注释掉, * 能降低数据错误率*/ / *串口2的变量 115200* / struct serial_configureuar2_configs = RT_SERIAL_CONFIG_DEFAULT; rt_sem_t sem2; rt_device_t uar2_dev; rt_thread_t uar_2_th; rt_thread_t uar_2_deal; char buffer[128] = {0}; rt_size_t rxlen2 = 0; / *串口3的变量 9600* / struct serial_configureuar3_configs = MY_SERIAL_CONFIG_DEFAULT; rt_sem_t sem3; rt_device_t uar3_dev; rt_thread_t uar_3_th; uint8_t buffer3[17] = {0}; rt_size_t rxlen3 = 0; / *串口4的变量 115200* / struct serial_configureuar4_configs = RT_SERIAL_CONFIG_DEFAULT; rt_sem_t sem4; rt_device_t uar4_dev; rt_thread_t uar_4_th; rt_uint8_t buffer4[256] = {0xff}; rt_size_t rxlen4 = 0; //char deal; rt_uint8_t deal ; char wheater[8]; char humidity[4]; char temperature[4]; char wind_speed[4]; char shi[3]; char miao[3]; char fen[3]; char wheater_deal[23]=\"main2.g3.txt=\"\"; char humidity_deal[18]=\"main2.g1.txt=\"\"; char temperature_deal[17]=\"main2.g0.txt=\"\"; char wind_speed_deal[19]=\"main2.g2.txt=\"\"; char shi_deal[15] = \"main.z1.val=\"; char miao_deal[15] = \"main.z0.val=\"; char fen_deal[15] = \"main.z2.val=\"; char end[2]=\"\"\"; char xf_end[3];//串口屏控制帧尾 void uar2_thread_entry(void *parameter)//串口2DMA线程入口 { rt_size_t len = 0; /*发送ch2o数据*/ rt_device_write(uar4_dev,0,ch2o_date,sizeof(ch2o_date)); rt_device_write(uar4_dev,0 ,xf_end,sizeof(xf_end)); /*end*/ /*发送tvoc数据*/ rt_device_write(uar4_dev,0 ,tvoc_date,sizeof(tvoc_date)); rt_device_write(uar4_dev,0 ,xf_end,sizeof(xf_end)); /*end*/ /*发送pm2.5数据*/ rt_device_write(uar4_dev,0 ,pm2_5_date,sizeof(pm2_5_date)); rt_device_write(uar4_dev,0 ,xf_end,sizeof(xf_end)); /*end*/ /*发送pm10数据*/ rt_device_write(uar4_dev,0 ,pm10_date,sizeof(pm10_date)); rt_device_write(uar4_dev,0 ,xf_end,sizeof(xf_end)); /*end*/ /*发送temp数据*/rt_device_write(uar4_dev,0,temp_date,sizeof(temp_date)); rt_device_write(uar4_dev,0 ,xf_end,sizeof(xf_end)); /*end*/ /*发送humi数据*/ rt_device_write(uar4_dev,0,humi_date,sizeof(humi_date)); rt_device_write(uar4_dev,0 ,xf_end,sizeof(xf_end)); /*end*/ memset(buffer4, 0, sizeof buffer4); // } } } rt_err_t uar3_rxback(rt_device_t dev, rt_size_t size)//串口3接收//回调函数9600 { rxlen3 = size; rt_sem_release(sem3); return RT_EOK; } void uar4_thread_entry(void *parameter)//串口4DMA线程入口 { rt_size_t len = 0; while(1) { rt_sem_take(sem4, RT_WAITING_FOREVER); len = rt_device_read(uar4_dev, 0, buffer4, rxlen4); buffer4[len] = \'\\\\0\'; rt_kprintf(\"%c\\\\n\",len); if (buffer4[0] == 0x02) { deal=0x02; rt_device_write(uar2_dev,0 ,&deal,16); rt_kprintf(\"uart4\"); deal=0; } if (buffer4[0] == 0x01) { deal=0x01; rt_device_write(uar2_dev,0 ,&deal,16); rt_kprintf(\"uart4\"); deal=0; } if (buffer4[0] == 0x03) { deal=0x03; //memset(buffer,0,sizeof(buffer)); rt_device_write(uar2_dev,0 ,&deal,16); rt_kprintf(\"uart4\"); deal=0; } switch(buffer4[0]) { case 0x44: key1_open;break; case 0x55: key1_close;break; case 0x66: key2_open;break; case 0x77: key2_close;break; case 0x88: key3_open;break; case 0x99: key3_close;break; } } } rt_err_t uar4_rxback(rt_device_t dev, rt_size_t size)//串口4接收回调函数 { rxlen4 = size; rt_sem_release(sem4); return RT_EOK; } void clearmachine_and_motor_pin_init() { rt_pin_mode(6,PIN_MODE_OUTPUT );//a6 rt_pin_mode(7,PIN_MODE_OUTPUT );//a7 rt_pin_mode(16,PIN_MODE_OUTPUT );//b0 rt_pin_mode(17,PIN_MODE_OUTPUT );//b1 rt_pin_mode(28, PIN_MODE_INPUT);//b12 left rt_pin_mode(29,PIN_MODE_INPUT);//b13right rt_pin_mode(51,PIN_MODE_OUTPUT );//d3 rt_pin_mode(52,PIN_MODE_OUTPUT );//d4 rt_pin_mode(53,PIN_MODE_OUTPUT );//d5 key1_close; key2_close; key3_close; } int main(void) { clearmachine_and_motor_pin_init();//引脚初始化 /*串口2 DMA初始化*/ uar2_dev = rt_device_find(\"uart2\"); if (uar2_dev == NULL) { LOG_E(\"rt_device_find[uart2] FAILED...\\\\\\\\\\\\\\\\n\"); return -EINVAL; } rt_device_open(uar2_dev, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_DMA_RX); rt_device_control(uar2_dev, RT_DEVICE_CTRL_CONFIG, (void *)&uar2_configs); rt_device_set_rx_indicate(uar2_dev, uar2_rxback); uar_2_th = rt_thread_create(\"uar2_rx_thread\", uar2_thread_entry, NULL, 4096, 10, 5); rt_thread_startup(uar_2_th); sem2 = rt_sem_create(\"sem2\", 1, RT_IPC_FLAG_FIFO); if(sem2 == RT_NULL){ LOG_E(\"sem2 rt_sem_create failed...\\\\\\\\\\\\\\\\n\"); return -ENOMEM; } LOG_D(\"sem2 rt_sem_create successed...\\\\\\\\\\\\\\\\n\"); /*串口2 DMA初始化结束*/ //uar_2_deal = rt_thread_create(\"uar2_deal\", uar2_deal_entry, NULL, 512, 13, 5); //rt_thread_startup(uar_2_deal); /*串口3 DMA初始化9600*/ uar3_dev = rt_device_find(\"uart3\"); if (uar3_dev == NULL) { LOG_E(\"rt_device_find[uart3] FAILED...\\\\\\\\\\\\\\\\n\"); return -EINVAL; } rt_device_open(uar3_dev, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_DMA_RX); rt_device_control(uar3_dev, RT_DEVICE_CTRL_CONFIG, (void *)&uar3_configs); rt_device_set_rx_indicate(uar3_dev, uar3_rxback); uar_3_th = rt_thread_create(\"uar3_rx_thread\", uar3_thread_entry, NULL, 4096, 12, 5); rt_thread_startup(uar_3_th); sem3 = rt_sem_create(\"sem3\", 1, RT_IPC_FLAG_FIFO); if(sem3 == RT_NULL){ LOG_E(\"sem3 rt_sem_create failed...\\\\\\\\\\\\\\\\n\"); return -ENOMEM; } LOG_D(\"sem3 rt_sem_create successed...\\\\\\\\\\\\\\\\n\"); /*串口3 DMA初始化结束*/ /*串口4 DMA初始化*/ uar4_dev = rt_device_find(\"uart4\"); if (uar4_dev == NULL) { LOG_E(\"rt_device_find[uart4] FAILED...\\\\\\\\\\\\\\\\n\"); return -EINVAL; } rt_device_open(uar4_dev, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_DMA_RX); rt_device_control(uar4_dev, RT_DEVICE_CTRL_CONFIG, (void *)&uar4_configs); rt_device_set_rx_indicate(uar4_dev, uar4_rxback); uar_4_th = rt_thread_create(\"uar4_rx_thread\", uar4_thread_entry, NULL, 4096, 11, 5); rt_thread_startup(uar_4_th); sem4 = rt_sem_create(\"sem4\", 4, RT_IPC_FLAG_FIFO); if(sem4 == RT_NULL){ LOG_E(\"sem4 rt_sem_create failed...\\\\\\\\\\\\\\\\n\"); return -ENOMEM; } LOG_D(\"sem4 rt_sem_create successed...\\\\\\\\\\\\\\\\n\"); /*串口4 DMA初始化结束*/ return RT_EOK; } 最后是串口屏显示,同时数据也能在微信小程序上查看 接下来是鲁班猫1s做ros主控的部分。 1、移植轮趣大佬的ros源码: 根据我现有的硬件:思岚a1雷达、一个usb rgb摄像头选择合适的功能包,然后开始移植。 中途会出现很多错误。例如缺少部分功能包,sudo apt install ros-noetic-(包名)【我的ros版本是noetic】。 2、移植完毕后发现大佬们并没有使用鲁班猫上的npu。所以我尝试了用npu跑yolov5在debain10的环境下用python接口效果如下: Python与c++接口将图片监测改成实时摄像头的代码: 只需更改cv.Capture()函数的摄像头设备号即可。 链接:https://pan.baidu.com/s/1gauOezF-X8ZuvU4b0I4v4A?pwd=jhzs 提取码:jhzs Python接口的yolov7只需更改yolov5代码的锚点即可 以下只列出主函数部分,完整的在链接里。 import urllib import time import sys import numpy as np import cv2 from rknnlite.api import RKNNLite #from PIL import Image RKNN_MODEL = \'mask.rknn\' IMG_PATH = \'./test.jpg\' OBJ_THRESH = 0.25 NMS_THRESH = 0.45 IMG_SIZE = 640 ......(省略中间部分) if __name__ == \'__main__\': # Create RKNN object rknn = RKNNLite() # init runtime environment print(\'--> Load RKNN model\') ret = rknn.load_rknn(RKNN_MODEL) #ret = rknn.init_runtime(target=\'rv1126\', device_id=\'256fca8144d3b5af\') if ret != 0: print(\'Load RKNN model failed\') exit(ret) print(\'done\') ret = rknn.init_runtime() if ret != 0: print(\'Init runtime environment failed!\') exit(ret) print(\'done\') capture = cv2.VideoCapture(9) ref, frame = capture.read() if not ref: raise ValueError(\"error reading\") fps = 0.0 while(True): t1 = time.time() # ref, frame = capture.read() if not ref: break # BGRtoRGB frame = cv2.cvtColor(frame,cv2.COLOR_BGR2RGB) ############# img = frame img, ratio, (dw, dh) = letterbox(img, new_shape=(IMG_SIZE, IMG_SIZE)) img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # Inference print(\'--> Running model\') outputs = rknn.inference(inputs=[img]) input0_data = outputs[0] input1_data = outputs[1] input2_data = outputs[2] input0_data = input0_data.reshape([3, -1]+list(input0_data.shape[-2:])) input1_data = input1_data.reshape([3, -1]+list(input1_data.shape[-2:])) input2_data = input2_data.reshape([3, -1]+list(input2_data.shape[-2:])) input_data = list() input_data.append(np.transpose(input0_data, (2, 3, 0, 1))) input_data.append(np.transpose(input1_data, (2, 3, 0, 1))) input_data.append(np.transpose(input2_data, (2, 3, 0, 1))) boxes, classes, scores = yolov5_post_process(input_data) img_1 = cv2.cvtColor(img, cv2.COLOR_RGB2BGR) #img_1 = img_1[:,:,::-1] if boxes is not None: draw(img_1, boxes, scores, classes) fps= ( fps + (1./(time.time()-t1)) ) / 2 print(\"fps= %.2f\"%(fps)) #img_1 = cv2.putText(frame, \"fps= %.2f\"%(fps), (0, 40), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2) cv2.imshow(\"video\",img_1[:,:,::-1]) c= cv2.waitKey(1) & 0xff if c==27: capture.release() break print(\"Video Detection Done!\") capture.release() cv2.destroyAllWindows() 但这还没有接到ros中,为此我去翻rknn的github找到了接入ros的方法。 Ros功能包如下: Launch文件: Yolov5.launch <param name=\"model_file\" value=\"yolov5s-640-640.rknn\"/> <param name=\"display_output\" value=\"$(arg display_output)\"/> <param name=\"prob_threshold\" value=\"0.35\"/> <param name=\"chip_type\" value=\"$(arg chip_type)\"/> <remap from=\"/camera/image_raw\" to=\"$(arg camera_topic)\"/> Camrea.Launch <param name=\"video_device\" value=\"/dev/$(arg device)\" /> <param name=\"image_width\" value=\"640\" /> <param name=\"image_height\" value=\"480\" /> <param name=\"framerate\" value=\"30\" /> <param name=\"pixel_format\" value=\"yuyv\" /> <param name=\"camera_frame_id\" value=\"usn_cam\" /> <param name=\"io_method\" value=\"mmap\"/> <param name=\"camera_name\" value=\"usn_cam\"/> 启动摄像头 默认的摄像头设备号为video0 鲁班猫为video9 1、roslaunch rknn_ros camera.launch 2、roslaunch rknn_ros camera.launch device:=video9(可传参或者改launch) 3、roslaunch rknn_ros yolov5.launch chip_type:=RK3566 链接: 链接:https://pan.baidu.com/s/1QhfRjDs1sftAB0Q-TS5dBA?pwd=jhzs 提取码:jhzs 不出意外改好板子型号和对应的video就能用了。 可打开rviz或者rqt_image_view查看。 模型是我自己训练的,链接如下: 链接:https://pan.baidu.com/s/1FSJyW6kp4cy3-yakTq_Q4g?pwd=jhzs 提取码:jhzs YOLOV5配置和使用: 官方的源码是不建议的: 用这个: https://gitcode.net/mirrors/airockchip/yolov5?utm_source=csdn_github_accelerator 这是瑞芯微官方推荐的源码,但是也需要更改。 yolov5-master\\\\models下的yolo.py 找到 def forward(self, x): 函数,更改为: def forward(self, x): z = []# inference output for i in range(self.nl): if os.getenv(\'RKNN_model_hack\', \'0\') != \'0\': z.append(torch.sigmoid(self.m[i](x[i]))) continue x[i] = self.m[i](x[i])# conv \'\'\' bs, _, ny, nx = x[i].shape# x(bs,255,20,20) to x(bs,3,20,20,85) x[i] = x[i].view(bs, self.na, self.no, ny, nx).permute(0, 1, 3, 4, 2).contiguous() if not self.training:# inference if self.onnx_dynamic or self.grid[i].shape[2:4] != x[i].shape[2:4]: self.grid[i], self.anchor_grid[i] = self._make_grid(nx, ny, i) y = x[i].sigmoid() if self.inplace: y[..., 0:2] = (y[..., 0:2] * 2 + self.grid[i]) * self.stride[i]# xy y[..., 2:4] = (y[..., 2:4] * 2) ** 2 * self.anchor_grid[i]# wh else:# for YOLOv5 on AWS Inferentia https://github.com/ultralytics/yolov5/pull/2953 xy, wh, conf = y.split((2, 2, self.nc + 1), 4)# y.tensor_split((2, 4, 5), 4)# torch 1.8.0 xy = (xy * 2 + self.grid[i]) * self.stride[i]# xy wh = (wh * 2) ** 2 * self.anchor_grid[i]# wh y = torch.cat((xy, wh, conf), 4) z.append(y.view(bs, -1, self.no)) if os.getenv(\'RKNN_model_hack\', \'0\') != \'0\': return z return x if self.training else (torch.cat(z, 1),) if self.export else (torch.cat(z, 1), x) \'\'\' return x[0],x[1],x[2] 这样就可以在pt权重转onnx时去掉最后一个Detect层。 pt转onnx指令 python export.py --weights yolov5s.pt --img 640 --batch 1 --opset 11 --include onnx 红色字体部分换成要转换的权重文件例如我的就是: **python export.py --weights ** **weights/best.pt ** --img 640 --batch 1 --opset 11 --include onnx opset选择11。 这样出来的模型是有三个节点的模型,才是可用的。 可用netron查看: netron:https://netron.app/(浏览器网址) 将模型拖到页面可查看。 有三个输出节点。 且要记好三个节点的名字。 在官方要求的ubuntu pc端上进行模型转换。 我这里有个改好的yolov5源码(里面是我训练的抽烟监测模型) 网盘链接如下: 链接:https://pan.baidu.com/s/1fXKNoXhu4m1SmTr4fc-afg?pwd=jhzs 提取码:jhzs Chatgpt部分是b站机器人阿杰github开源项目。 https://www.bilibili.com/video/BV12M4y1R76M/?spm_id_from=333.788 效果如图: 呜。。。不要看问得什么 整车的sw模型链接:soildwork2020及以上版本可直接打开 链接:https://pan.baidu.com/s/1KqB1SOD418dCvyDaZFMgpg?pwd=jhzs 提取码:jhzs当时还理想化的撸了个履带,可后来发现打印出来根本用不了,故放弃,换成了轮子。 放链接是希望能够帮到像我一样步步踩坑的菜鸟级选手。我是老踩坑怪了。 有不当的地方,还望大佬们海涵。
2023-03-24 20:05:14

已全部加载完成