“有效实测:优化K210串口通信”

前段时间我学习了如何使用K210训练模型做目标检测,单纯的学会训练模型并没有什么用处,要把K210应用到实际中去,也就是和单片机和各类模块结合使用,你必须会使用串口通信。这篇文章将教你如何使用K210进行串口通信。

文章目录

  • 前言
  • 一、准备
  • 1.硬件准备
  • 2.软件准备
  • 二、串口通信
  • 1.Maixpy
  • 2.GPIO简单介绍
  • 3.串口通信方法
  • 4.代码
  • 总结

  • 前言

    学会了训练模型,就要将它应用到实际中,这就需要我们结合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的垃圾分类,这两个小的项目我会在写一篇博客将他们分享出来。

    物联沃分享整理
    物联沃-IOTWORD物联网 » “有效实测:优化K210串口通信”

    发表评论