前段时间我学习了如何使用K210训练模型做目标检测,单纯的学会训练模型并没有什么用处,要把K210应用到实际中去,也就是和单片机和各类模块结合使用,你必须会使用串口通信。这篇文章将教你如何使用K210进行串口通信。
前言
学会了训练模型,就要将它应用到实际中,这就需要我们结合51单片机、32单片机等待模块一起使用,最重要的一项便是串口通信。接下来我们进入正文
一、准备
1.硬件准备
1.K210开发板
2.usb转ttl
2.软件准备
Maixpy
XCOM串口通信软件
二、串口通信
1.Maixpy
看过上一篇博客后就可以直接进入正题了,打开Maixpy,接下来我们开始写串口通信部分,这里我先和电脑通信。
2.GPIO简单介绍
先对K210的GPIO做个简单的介绍:
K210 支持每个外设随意映射到任意引脚,K210上有高速 GPIO(GPIOHS) 和通用 GPIO
在 K210 上, GPIO 有一下特征:
高速 GPIO:
高速 GPIO 为 GPIOHS,共 32 个。具有如下特点:
可配置输入输出信号
每个 IO 具有独立中断源
中断支持边沿触发和电平触发
每个 IO 可以分配到 FPIOA 上 48 个管脚之一
可配置上下拉,或者高阻
通用 GPIO:
通用 GPIO 共 8 个,具有如下特点:
8 个 IO 使用一个中断源
可配置输入输出信号
可配置触发 IO 总中断,边沿触发和电平触发
每个 IO 可以分配到 FPIOA 上 48 个管脚之一
下 GPIOHS 默认已经被使用, 程序中如非必要尽量不要使用:
构造函数
class GPIO(ID, MODE, PULL, VALUE)
参数
ID: 使用的 GPIO 引脚(一定要使用 GPIO 里带的常量来指定)
MODE: GPIO模式
• GPIO.IN就是输入模式
• GPIO.OUT就是输出模式
PULL: GPIO上下拉模式
• GPIO.PULL_UP 上拉
• GPIO.PULL_DOWN 下拉
• GPIO.PULL_NONE 即不上拉也不下拉
value
修改/读取 GPIO 引脚状态
GPIO.value([value])
[value]: 可选参数,如果此参数不为空,则返回当前 GPIO 引脚状态
如果 [value] 参数不为空,则返回当前 GPIO 引脚状态
接下来直接讲串口通信.
3.串口通信方法
头文件
from machine import UART #导入UART模块
设置串口通信引脚(这里我设置10为TX,11为RX)
fm.register(10, fm.fpioa.UART1_TX, force=True) #10为tx接rx
fm.register(11, fm.fpioa.UART1_RX, force=True) #11为rx接tx
设置串口的波特率,数据位,停止位,奇偶校验位
uart_A = UART(UART.UART1, 115200, 8, 1, 0, timeout=1000, read_buf_len=4096)
串口发送数据(这里我发送的识别物体名称)
uart_A.write(classes[i.classid()]+'\r\n')
将以上代码加入到你的代码里,就可以实现串口通信了
4.代码
这里放入完整代码
import sensor,image,lcd,time #导入sensor、image、lcd、time模块
import KPU as kpu
from machine import UART
from fpioa_manager import fm
lcd.init(freq=15000000) #初始化LCD
sensor.reset() #初始化单目摄像头
sensor.set_pixformat(sensor.RGB565) #设置帧格式
sensor.set_framesize(sensor.QVGA) #设置帧大小
sensor.set_hmirror(0)
sensor.run(1)
task = kpu.load("/sd/yolov2.kmodel")
f=open("anchors.txt","r")
anchor_txt=f.read()
L=[]
for i in anchor_txt.split(","):
L.append(float(i))
anchor=tuple(L)
f.close()
f=open("classes.txt","r")
lable_txt=f.read()
lable = lable_txt.split(",")
f.close()
fm.register(10, fm.fpioa.UART1_TX, force=True)
fm.register(11, fm.fpioa.UART1_RX, force=True)
uart_A = UART(UART.UART1, 115200, 8, 1, 0, timeout=1000, read_buf_len=4096)
anchor = (0.32,0.68,0.7,0.73,0.75,0.75,0.8,0.96,1.1,1.63)
sensor.set_windowing((224, 224))
#初始化yolo2网络
a = kpu.init_yolo2(task, 0.5, 0.3, 5, anchor)
classes=["apple","banana","oranges" ] #标签名称要和你训练时的标签名称顺序相同
while(True):
img = sensor.snapshot() #使用摄像头拍摄一张照片
#lcd.display(img) #在液晶屏上显示一张 image
code = kpu.run_yolo2(task, img) #task为 kpu_load 返回的 kpu_net 对象
#img为从sensor 采集到的图像
#run_yolo2返回的值为kpu_yolo2_find 的列表
if code:
for i in code:
a=img.draw_rectangle(i.rect()) #在图像上绘制一个矩形。此处为作为元组传递回坐标框出矩形
#传回的是检测到的图像的四个坐标
a = lcd.display(img) #在液晶屏上显示被框框框起来的image
for i in code:
lcd.draw_string(i.x(), i.y(), classes[i.classid()], lcd.RED, lcd.WHITE)
lcd.draw_string(i.x(), i.y()+12, '%f'%i.value(), lcd.RED, lcd.WHITE)
lcd.draw_string(50, 200,str(b), lcd.RED, lcd.WHITE)
lcd.draw_string(110, 200,str(c), lcd.RED, lcd.WHITE)
uart_A.write(classes[i.classid()]+'\r\n')
else:
a = lcd.display(img) #如果没有识别出物体,则继续呈现图像
uart_A.deinit()
del uart_A
a = kpu.deinit(task) #反初始化。kpu_load 返回 kpu_net 对象
运行以上代码选择正确的com接口你会看到
当然这段代码你直接拿去可能不能用,因为SD卡里的文件名称,模型名称不一样,修改一下就可以使用,如果你需要坐标等等,直接做对应修改即可。
总结
通过这篇文章相信大家已经掌握了K210的串口通信,然后你可以用K210去做一些小的项目,我用K210做了两个小项目,一个是基于K210的yolov2的口罩检测系统、一个是基于K210的垃圾分类,这两个小的项目我会在写一篇博客将他们分享出来。
版权声明:本文为CSDN博主「我与nano」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_51963216/article/details/121104436
暂无评论