K210+串口通信(实测有用)

前段时间我学习了如何使用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的垃圾分类,这两个小的项目我会在写一篇博客将他们分享出来。

©️2022 CSDN 皮肤主题:黑客帝国 设计师:我叫白小胖 返回首页

打赏作者

我与nano

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值