分享

牛人用MCU入学“霍格沃茨”:看看PCB和代码

 知芯世界 2023-09-25 发布于黑龙江

很多人都幻想自己到霍格沃茨入学,并希望能够亲身体验分院帽,而现在国外工程师The Electronic Engineer的Mark Donners利用32位MCU实现了大多数人的梦想,而这个作品也引发了EEworld工程师的讨论。(如果有任何其它想法与工程师沟通,可移步EEWorld原贴进行讨论:http://bbs./thread-1257134-1-1.html

 

付斌丨编译

电子工程世界(ID:EEworldbbs)丨出品

 麻瓜的赛博魔法 

虽然现实世界中,我们并不能施展魔法,但对工程师来说,PCB和各种半导体器件就是我们的魔杖。

从成品上来看,这顶巫师帽非常类似《哈利·波特与魔法石》中的分院帽,而它也不仅仅是像而已,这顶巫师帽不仅拥有一张可以开口说话的嘴巴,还有一只灵动的眼球。整个帽子遵循预先编写的程序而动,但用户可以使用遥控钥匙激活例程,就像用来解锁车门一样。

这顶巫师帽涉及的器件并不多,PCB上包括9V或12V电池、电压转换器、用于反极性保护的二极管、ESP32开发套件、MCU的连接器、microSD卡、放大器板、三个伺服器、用于显示眼睛的SSD1351驱动的OLED显示器(1.5英寸,分辨率128x128,每个像素为16位颜色)和用于远程控制的输入组件。

此外,组装涉及的材料还包括3D打印的口腔和眉毛、向MCU发送命令的遥控钥匙和接收器模块。

虽然看似很简单,但其实还是需要一些技巧,这顶帽子使用类似纸浆的技术,使用大量刷胶在纸、胶带和卡片纸上分层,灵活地将帽子雕刻成所需的形状,并构建了内部刚性的结构。

不止如此,虽然这顶帽子很重,但它是可穿戴的。

 怎么做的?来看详细步骤 

可别以为看起来简单,就没什么技巧,下面来看详细步骤。

第一步:从灵感,到设计

想法是好的,但把灵感转变为真实,仍然需要规划好整体的设计。

首先在眼睛上,为了让眼睛更加真实和灵动,不能只是单调的重复性眨眼,也不能只是一块简单的OLED显示,这就需要利用开发板控制程序。

眼睛其实比你想象的更奇怪,它们不是简单的足球形状,它们有两个眼睑,瞳孔和眼睑相互作用。因此,在设计中,要像必须按这样的顺序指定眼睛图像:巩膜、虹膜、对称上眼睑、对称下眼睑、不对称上眼睑、不对称下眼睑。当然,做眼睛并非没有例子,Adafruit上就有一个经典创意,是关于眼睛的。

嘴巴上,则需使用Autodesk Fusion 360创建模型,并使用3D打印打印出实物。

第二步:设计机械零件

这一步包括:

  • 为嘴巴的力学做草图;

  • 在伺服电机支架上为眉毛绘制草图;

  • 为移动帽顶部的伺服电机支架绘制草图;

  • 完成原型;

  • 3D打印机械装置;

  • 用伺服电机和嘴部分结构件做测试;

  • 对代码进行了第二次迭代,在ESP32上实现了两个内核;

  • 设计并订购了印刷电路板。

从PCB的BOM上来看,整体的成本控制得很好。

首先,设计机械安装座,包括一个可用于安装PCB的底板。设计嘴部结构以后,再创建2个机械部件用于其它两个伺服器。嘴巴成品图如下:

其次,是眉毛和帽子尖端的支架,在完成机械草图之后,使用在线打印服务3D打印所有的部件。

收到零件后,就是组装时间了:

过程中,有些螺丝钉不太合适,除此之外,其它一切都还好:

接下来,就是把一切都拼接在一起。如所见,ESP32板在主板上伸出,这是为了节省主PCB和3D打印机械安装底座的生产成本。

整体PCB的原理图如下:

PCB并不复杂,而且为了节省物料成本和空间,设计的非常紧凑:

软件部分,部分代码展示:

第三步:做个帽子

先用硬纸板创建一个底座,再用一支笔画上两个大圆圈,裁剪完毕后,使用超市卖的椎体纸板再将所有部件拼接在一起。

把之前做好的PCB粘在帽子里,在安装嘴部机构和其他部件之前,干燥了大约1周。

做一个快速测试,看看一切正常后,最后用棕色的布料将帽子完全盖住。

 坛友还有什么创意 


对于这个项目,EEWorld上工程师一致表示有趣,同时也有工程师表示,要是可以通过振动发电,并在非使用期间自动睡眠,就更好了,或者再加个手势采集,不同的动作说不同的话就更好的了。

值得注意的是,这个项目的MCU和STM32有一些区别,ESP32主要针对物联网应用,偏向体积小巧、速度超快、功能强大,通过Wi-Fi接入网络;STM32为消费电子、工业控制而生,虽然没有Wi-Fi和蓝牙,但管脚丰富、功能全面。

当然,EEWorld论坛上,也不乏许多关于ESP32有趣的项目:

使用ESP32做的加热杯垫 (原文地址:http://bbs./thread-1234258-1-1.html

先上张图看看整体效果:

原理:通电给线圈加热➡传感器监测温度是否达到预设温度➡到达指定温度后➡通过MCU的IO口输出和MOS管控制线圈停止加热➡传感器检测温度低于设定温度➡IO口和MOS管控制线圈开始加热➡循环。

刚开始为了验证一下可行性,使用JLC画了第一版PCB,画了大概4米10mil的线圈,使用一次免费打板,拿回来后发现测量电阻比理论值要偏大,而且同一批的5块板子,做工有误差,于是做了第二版,在线圈部分画了几个断点,可以方便通过调整线长来调整电阻。

由于功能比较简单,主控板使用的是ESP32-S2mini,这个完全够用,价格也不贵10RMB左右,其他的一些元件都是一些常用的元器件,几乎没有花费。

由于对温度的精度要求不高,所以用了一个常用的热敏电阻,插在提前在板子中间留的一个小孔里,刚好放下,通过这种方式让传感器采样的的温度尽量接近板子表层线圈发热的温度,通过查表或者计算,可以得到55°时的电阻值(想要多少度都可以查表),然后可以计算出ADC采样的临界点比较电压,这样然后写一个简单的代码,就可以实现了线圈在这个温度附近持续加热和停止,来实现恒温效果。

为了能更加直观的看到线圈的加热过程,还添加了4个WS2812,作为指示灯。还预留出了两个触摸引脚,可以用来做开关或者温度的挡位调节。

结构方面:使用四个铜螺柱,加8颗平头螺丝,通过预留的螺丝孔位,将两块一样的板子固定在一起,给中间的元件留出空间,也能使它能平整的摆放在桌面上,不过还是感觉有点轻,容易滑动,重心不够稳,后面打算在中间加一些重物来使他重心更稳定一些。

 

使用感受:升温的过程还是很快的,大概一分钟,温度也能达到很高的温度。目前感觉不足的地方,就是用来加热那种很小瓶的牛奶还行,换上大杯加热就有点带不动了,主要还是功率太小了,只用5W左右,后面打算换上PD芯片,增大功率来试试。

基于ESP32路标识别智能车(原文地址:http://bbs./thread-1221197-1-1.html

作者:王志远

一、作品简介

基于ESP32的路标识别智能车是ESP32为主控,控制麦克纳姆轮小车运动;OpenMV为从控,识别道路方向和道路交通标识,将道路方向和识别出的交通标识参数信息传输给ESP32,ESP32根据信息控制麦轮小车寻迹的同时,根据道路上的交通标识判定前进的方向,从而实现对小车的无人驾驶。

二、系统框图

三、各部分功能说明

OpenMV从控:

STM32H OpenMV-H7是低功耗的Python3可编程机器视觉硬件,结合摄像头可以支持一系列广泛的图像处理功能和神经网络。OpenMV-H7使用跨平台 IDE 进行编程,该 IDE 允许查看摄像机的帧缓冲器、访问传感器控件、通过 USB 串行(或 WiFi/BLE(如果可用)将脚本上传到摄像机。OpenMV-H7 基板基于在 400MHz 下运行的STM32H743 MCU,具有 1MB SRAM、2MB 闪存、FPU、DSP 和硬件 JPEG 编码器。基板采用模块化传感器设计,将传感器与摄像机分离。模块化传感器设计使摄像机能够支持多个传感器,包括 OV7725、MT9V03x 全球快门传感器和 FLIR Lepton 1、2 和 3 热传感器。

STM32H743是OpenMV-H7是OpenMV-H7基板的MCU,其是一款32位的,Cortex-M7内核的芯片,该内核具有双精度浮点处理单元FPU,最高频率达到400MHz,并且内置1M RAM, 2M Flash。图2所示是STM32H743芯片的架构。OpenMV-H7芯片的实物图:

图 1 OpenMV-H7芯片

ESP32主控:

ESP32 集成了传统蓝牙、低功耗蓝牙和 Wi-Fi,具有广泛的用途:Wi-Fi 支持极大范围的通信连接,也支持通过路由器直接连接互联网;而蓝牙可以让用户连接手机或者广播 BLE Beacon 以便于信号检测。ESP32 芯片包含两个硬件定时器组。每组有两个通用硬件定时器。它们都是基于 16 位预分频器和 64 位。自动重载功能的向上/向下计数器的 64 位通用定时器。ESP32的实物图:

图 2 ESP32主控

OV7725摄像头:

OV7725摄像头是一款30W像素的摄像头模块,支持最大VGA分辨率输出,帧率最大可达60fps。能配置输出RAW RGB、RGB(GRB422、RGB565/RGB444)、YVA422这几种格式的视频流。通俗点讲:OV7725像素是30W,虽然像素低,但是帧率高,应用在颜色追踪等应用上效果不错。

LM298N电机驱动:

LM298N包含4通道逻辑驱动电路,内含两个H桥的高电压大电流双全桥式驱动器,可以驱动两个直流电机。端口A、B接到ESP代码配置的PWM通道上,用来输出PWM波,从而控制电机的运行速度。麦轮小车2个电机驱动的4个逻辑输入引脚接单片机引脚,从而控制小车轮子的正转和反转。电机驱动的实物图:

图 3 电机驱动实物图

麦轮小车:

麦克纳姆轮比普通的轮胎结构更加的复杂,它是由很多斜着安装的纺锤形滚棒组成,这种滚棒的倾斜度是,所以行驶操作的时候,左右力度很均匀,滚棒的中间位置也比其它两边的要高,这才有了麦克纳姆轮随意改变行驶方向的特性45°,不同方向不同大小的摩擦力能实现小车的水平移动,下面是对小车运动时的受力分析图:

图 4 麦轮小车受力分析图

电路原理:

由于各组件体积较大,不方便固定在小车上,连接线多且冗杂,时不时连接松动,这里本人决定购买ESP32模组,用PCB代替连接线,精简化小车主板,小车的电路分析图和实物图如下图所示:

寻迹原理:

OPenMV识别的交通标识包括红灯,绿灯,直行,掉头,停车,左转,右转和背景,在小车行驶过程中,OpenMV对图像进行二值化处理,对黑色的道路进行线性回归处理,判断前进的角度偏差和小车与道路的距离偏差,同时如果识别到交通标识,将识别的参数通过UART协议传输个ESP32,ESP32根据识别的结构控制小车运动,识别到红灯停止运动,绿灯前进,等等符合交

通标识的结果进行运动,若没有交通标识,小车则按前进的方向进行寻迹。交通标识和道路如下图所示:

四、作品源码

ESP32主控端主程序:

from machine import Pin, UART, Timer  from machine import Timer  import time  import bluetooth  from car import CAR  from neopixel import NeoPixel  RED=(25,0,0)  GREEN=(0,25,0)  LEFT=(0,25,25)  RIGHT= (25,0,25)  BLACK = (0,0,0)  global num  num = 8  pin = Pin(5, Pin.OUT)  np = NeoPixel(pin, 25)  buf = bytes(0)  BLE_MSG = ""  uart = UART(1, baudrate=115200, tx=17, rx=16)  if __name__ == "__main__":      global speed      speed = 200      Car = CAR()      Car.setspeed(speed)      while True:          if (uart.any()):              buf = uart.readline()              print('Echo Byte: {}'.format(buf))              angle = buf.decode("utf-8")              angle = angle.replace("\\n",'')              x=angle.split(" ",1)              distance = float(x[0])              angle = float(x[1])              Car.setspeed(300)              Car.diserror(distance,angle)              Car.angleerror(distance,angle)  

OpenMV从控端主程序:

import sensor, image, time, math  from pyb import UART, LED  uart = UART(3, 115200)  sensor.set_hmirror(True)  GRAYSCALE_THRESHOLD = [(0, 25)]  ROIS = [(0, 100, 160, 20, 0.7),          (0,  50, 160, 20, 0.3),          (0,   0, 160, 20, 0.1) ]  weight_sum = 0  for r in ROIS: weight_sum += r[4]  sensor.reset()  sensor.set_pixformat(sensor.GRAYSCALE)  sensor.set_framesize(sensor.QQVGA)  sensor.skip_frames(time = 2000)  sensor.set_auto_gain(False)  sensor.set_auto_whitebal(False)  sensor.set_hmirror(True)  sensor.set_vflip(True)  clock = time.clock()  while(True):      clock.tick()      img = sensor.snapshot()      centroid_sum = 0      for r in ROIS:          blobs = img.find_blobs(GRAYSCALE_THRESHOLD, roi=r[0:4], merge=True)          if blobs:              largest_blob = max(blobs, key=lambda b: b.pixels())              img.draw_rectangle(largest_blob.rect())              img.draw_cross(largest_blob.cx(),                             largest_blob.cy())              centroid_sum += largest_blob.cx() * r[4]      center_pos = (centroid_sum / weight_sum)      deflection_angle = 0      deflection_angle = -math.atan((center_pos-80)/60)      deflection_angle = math.degrees(deflection_angle)      uart.write("%d\n" % deflection_angle)      print("Turn Angle: %d\n" % deflection_angle)      time.sleep_ms(100)  

五、神经网络模型训练

在神经网络部分,我们选取了 YOLOV2 检测网和 RESNET18 分类网满足需求,检测网数据集约 4000 张,分类网数据集约 3600 张。

图 5数据集相关示意图  

练时长约 48 小时、 12 小时模型收敛,训练结束。检测网、分类网在Linux 端的验证集精度分别为 97%与 98%,满足理想状态。

图 6 训练结束时验证集精度

模型训练结束后,将最终完成的权重文件进行保存,在本地 Linux 系统内对训练完成的权重其进行测试。如图示,在测试过程当中,我们设置的输出阈值为70%。从测试结果可以看出,当同时出现多类路标时,能够准确分类绝大多数的路标,由于YOLOV2 具有更快的检测速率,能够在更短的时间内将采集到的路标全部识别出结果;当出现某一类路标时能够准确识别出路标的的种类,可以达到我们的预期目标,可以达到我们的预期目标,可以进行算法模型的量化处理。

图 7 不同路标的 PC 端预测结果

ESP32 arduino点灯真香,附最新Arduino ESP32环境搭建方法(原文地址:http://bbs./thread-1227400-1-1.html

用了几天时间终于把用Arduino IDE把ESP32-S2的点灯例程跑起来了。

我觉得应该是我的问题,不过我发现好像很多人都遇到了和我一样的问题,原因其实都是网的问题。这个问题不应该是厂商不知道的问题,可能这块板子更倾向于国外市场?

几年前第一次用ESP32时就跑遍全网各种找解决方案,先是vscode 的platfromio,再到vscode的esp idf,当时也同样花了几天的时间。

这次时隔多年,再用ESP32时发现怎么弄的全忘了,原来的vscode环境也是各种问题,想跑个例程都难。为了方便,我退一步,用Arduino总可以了吧,以前总觉得Arduino是给初学者用的,或者给那些不喜欢搭建复杂(ESP32那样)环境的人用的。没想到啊没想到,一个Arduino环境下的esp32开发竟然能这么难,难到我全网找答案,试遍各用方法都无济于事。

不过我也不是光来抱怨的,这次在最新版Arduino下安装最新版esp32环境我是有经验的,不管网上那些各种方法是否适合现在的版本,反正我是都没跑起来。

下面是我解决Arduino安装esp32环境出错的解决办法,当然每个人的环境不一样,这个方法只适合遇到和我一样问题的网友。

首先是下载最新版的Arduino IDE(https://www./en/software),当前最新版是2.0.2,下载后安装,这个没什么好说的。

刚安装好的Arduino里是没有ESP32对应的开发板的。

到github上找到相应的软件包(https://github.com/espressif/arduino-esp32/releases/ ),我的访问慢,下载慢,如果你的能访问还很快就不用看了,如果你的不能访问那就要另想办法。当前最新的arduino-esp32版本是2.0.5,点标题进入下载页面。

找到底部的资源列表,下载esp32-2.0.5.zip和package_esp32_index.json,因为我这边下载速度非常慢,我使用了迅雷,迅雷是个好东西,快的时候能达到几Mbps,其它下载软件应该也适用。

下载好的package_esp32_index.json文件放在,C:\Users\lu\AppData\Local\Arduino15,lu替换成你的用户名,当前这些方法是针对windows系统的, linux和mac可以自行寻找差异。

esp32-2.0.5.zip放到C:\Users\lu\AppData\Local\Arduino15\staging\packages文件夹下,这些是网上介绍的一些方法。

然后在Arduino的首选项里的其它开发板管理地址里添加:https://github.com/espressif/arduino-esp32/releases/download/2.0.5/package_esp32_index.json,要不找不到ESP32资源。

设置好点工具->开发板->开发板管理器。

在开发板管理器里搜索ESP32,然后点安装。这也是网址介绍的方法。

这时提示正在下载软件包。

然后会报错,原因是下载对应资源时响应超时。这时复制下边的网址,把它加入到迅雷这样的下载软件里下载。

下载完成后把相应的文件复制到C:\Users\lu\AppData\Local\Arduino15\staging\packages下,再次点安装。

这时会发现它已经走了一步,然后还会出错。 

这次出错的是另一个文件,然后按照提示再次下载另一个文件,反复测试直到所有软件包全都下好。

为了省时间安装时可以直接把网断开,这样点安装它就会马上报错,能马上得到对应网址。

或者可以打开刚刚下载的package_esp32_index.json文件,在tool节点下,把所有不同name对应的systems下的host为x86_64-mingw32的url对应的文件都下载了,x86_64-mingw32对应windows系统,其它系统可以选择其它标识。 

下载好的文件都放在C:\Users\lu\AppData\Local\Arduino15\staging\packages下,再点安装就不会报错了。

弄了这么多天,看着软件包一个个的安装成功,直到最后提示“已安装 esp32:esp32@2.0.5 平台"是一件非常爽的事情。

安装完成后就能在开发板下边找到esp32,我的是esp32s2,选一个开发板型号。

然后再找一个点灯的例程。

接上开发板,选择相应的串口。

点右箭头编译下载 。

进度条一顿跑,然后提示失败。WARNING: ESP32-S2FNR2 chip was placed into download mode using GPIO0.

esptool.py can not exit the download mode over USB. To run the app, reset the chip manually.

To suppress this note, set --after option to 'no_reset'.

上传失败: 上传错误:exit status 1

是因为我的开发板是通过USB下载的,需要手动复位开发板才能正常运行。点下复位。小灯就闪起来了。

从来没觉得点灯会这么香,倍儿香倍儿香的。

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多