STM32通过K210进行PID巡线,使用蓝牙模块与电脑通信从而进行P,I,D参数的调节

这篇具有很好参考价值的文章主要介绍了STM32通过K210进行PID巡线,使用蓝牙模块与电脑通信从而进行P,I,D参数的调节。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一.前言部分(废话部分)

二.K210色块识别

1.必要知识

2.色块识别

3.单片机的接收代码

三.通过蓝牙连接在电脑上实现PID的调参

一.前言部分(废话部分)

我使用的是HAL库,如果你使用的是标准库的话可以根据对应标准库的函数进行更改即可

因为之前使用灰度传感器进行巡线,即使用上PID,最后的效果也不尽人意,主要原因就在于传感器的传回的数字量是离散的,非常容易出现摇头、摆头的情况,原本打算再买一个有模拟量输出的传感器,突然又想到可以用实验室空下来的K210进行巡线,传回的数据也是一个类似模拟量的值,也就是连续的,于是就有了这篇文章。

二.K210色块识别

1.必要知识

K210的使用和Openmv不尽相同,使用的库函数都是一致的,由于Sipeed官网给出的例程实在是太少,于是就在Openmv的官网上查找资料,.

网站是这两个:序言 · OpenMV中文入门教程OpenMV Cam快速参考 — MicroPython 1.9.2 文档 (singtown.com)

由于之前有一定的Python的基础知识,看起来还是比较轻松的,如果没有Python的基础知识建议去这个网站大致看一看,比如for循环的语法,if的语法,while循环的语法,以及列表,元组,以及函数的定义和引用,这些和C有区别的东西看一看,敲一敲代码,大致也能记住,有C的基础的话看这些东西还是很快的。

2.色块识别

import sensor
import image
import lcd
import time

from machine import UART #串口库函数
from fpioa_manager import fm # GPIO重定向函数

sensor.reset()
sensor.set_pixformat(sensor.GRAYSCALE)
sensor.set_framesize(sensor.QQQVGA)
sensor.skip_frames()

fm.register(7, fm.fpioa.UART1_TX, force=True)
fm.register(6, fm.fpioa.UART1_RX, force=True)
uart_A = UART(UART.UART1, 115200, 8, 0, 1)

def sending_data(x,y,z):
    FH = bytearray([0x2C,0x12,x,y,z,0x5B])
    uart_A.write(FH);

Threshold = (20, 66)
roi1 = (0,10,80,10)
cy = cz =24
while 1:
    img = sensor.snapshot()
    blobs = img.find_blobs([Threshold],roi = roi1,merge=True)
    if blobs:
        for blob in blobs:
            img.draw_rectangle(blob[0:4])
            img.draw_cross(blob[5], blob[6])
            distance = blob.cx()
            sending_data(distance,cy,cz)
    else:
        distance = 0

下面开始进行色块识别的内容:

我先贴出代码,一行一行的解释代码的作用(代码不多,非常简单,只有发送的部分,接收的部分之后再添加)

首先是sensor部分:

第一个是初始化感光元件的代码,这部分是默认的,只要你使用摄像头,这一行都要添加。

然后设置图像是灰度图像还是彩色图像,我在这里使用灰度图,基本上很多识别任务(数字识别、小球位置的识别等)都可以用灰度图,并且数据的处理量还小,能加快运行的速度,如果之后再加入一些识别的任务的话,能够提高一些帧数。

第三个是设置图像的大小,这是从官网截下来的设置图像大小的方法:

  • sensor.set_framesize() 设置图像的大小
    • sensor.QQCIF: 88x72
    • sensor.QCIF: 176x144
    • sensor.CIF: 352x288
    • sensor.QQSIF: 88x60
    • sensor.QSIF: 176x120
    • sensor.SIF: 352x240
    • sensor.QQQQVGA: 40x30
    • sensor.QQQVGA: 80x60
    • sensor.QQVGA: 160x120
    • sensor.QVGA: 320x240
    • sensor.VGA: 640x480
    • sensor.HQQQVGA: 80x40
    • sensor.HQQVGA: 160x80
    • sensor.HQVGA: 240x160
    • sensor.B64X32: 64x32 (用于帧差异 image.find_displacement())
    • sensor.B64X64: 64x64 用于帧差异 image.find_displacement())
    • sensor.B128X64: 128x64 (用于帧差异 image.find_displacement())
    • sensor.B128X128: 128x128 (用于帧差异 image.find_displacement())
    • sensor.LCD: 128x160 (用于LCD扩展板)
    • sensor.QQVGA2: 128x160 (用于LCD扩展板)
    • sensor.WVGA: 720x480 (用于 MT9V034)
    • sensor.WVGA2:752x480 (用于 MT9V034)
    • sensor.SVGA: 800x600 (仅用于 OV5640 感光元件)
    • sensor.XGA: 1024x768 (仅用于 OV5640 感光元件)
    • sensor.SXGA: 1280x1024 (仅用于 OV5640 感光元件)
    • sensor.UXGA: 1600x1200 (仅用于 OV5640 感光元件)
    • sensor.HD: 1280x720 (仅用于 OV5640 感光元件)
    • sensor.FHD: 1920x1080 (仅用于 OV5640 感光元件)
    • sensor.QHD: 2560x1440 (仅用于 OV5640 感光元件)
    • sensor.QXGA: 2048x1536 (仅用于 OV5640 感光元件)
    • sensor.WQXGA: 2560x1600 (仅用于 OV5640 感光元件)
    • sensor.WQXGA2: 2592x1944 (仅用于 OV5640 感光元件

我使用的是sensor.QQQVGA,也就是80×60的分辨率,识别的效果还可以,根据自己的实际需求进行添加即可。

最后一个跳过最开始的一些不稳定的图像。

然后配置串口,使用7,6引脚作为数据的TX,RX端

再定义一个函数,使用bytearray函数封装一个数组,作为发送给单片机的数据包

使用UART_A.write(FH)发送数据包即可

之后设置阈值(thresholds),至于如何设置阈值,可以看这个视频OpenMV巡线小车 | 星瞳科技

感兴趣区的设置根据的自己的需求和实际的情况(也就是你摄像头摆放的位置,其实也可以用后期的调参来调整,直接使用和我一样的也可以)

cx,cz预留一些位置用来做之后其他识别任务的传输,不影响目前的任务。

在While循环里

第一行是拍摄一张照片,获得一个image的对象,至于这个对象里面有什么统计信息,可以在

OpenMV Cam快速参考 — MicroPython 1.9.2 文档 (singtown.com)

这个网站的搜索栏里输入image就可以查找

下一个是image.fin_blobs,也就是寻找色块的函数,这个函数的输入值也可以在上面那个网站里找到,我就不进行赘述了。

注意一定要用if判断blob对象是否为None,否则一但识别不到色块,程序就会报错。

识别到色块后用其中心的x坐标,也就是blob.cx()来作为输入量,传入数据包中发送给单片机。

3.单片机的接收代码

		if(UartHandle->Instance==USART2)
		{
				HAL_UART_Receive_IT(&huart2,&com_data,1);
				if(RxState==0&&com_data==0x2C)  					//0x2c帧头
				{
					
					RxState=1;
					RxBuffer1[RxCounter1++]=com_data;
				}
		
				else if(RxState==1&&com_data==0x12)  			//0x12帧头
				{
					RxState=2;
					RxBuffer1[RxCounter1++]=com_data;
				}
		
				else if(RxState==2)
				{
					RxBuffer1[RxCounter1++]=com_data;
 
					if(RxCounter1==6 && com_data == 0x5B)   //RxBuffer1接受满了,接收数据结束
					{
						
						cx=RxBuffer1[RxCounter1-4];
						cy=RxBuffer1[RxCounter1-3];
						cz=RxBuffer1[RxCounter1-2];
						RxCounter1 = 0;
						RxState = 0;	
					}
					else if(RxCounter1 > 6)            			//接收异常
					{
						RxState = 0;
						RxCounter1=0;
						for(i=0;i<6;i++)
						{
								RxBuffer1[i]=0x00;      					//将存放数据数组清零
						}
					
					}
				}
				else   																		//接收异常
				{
						RxState = 0;
						RxCounter1=0;
						for(i=0;i<6;i++)
						{
								RxBuffer1[i]=0x00;      					//将存放数据数组清零
						}
				}
		}
		HAL_UART_Receive_IT(&huart2, (uint8_t *)RxBuffer, 1););

我使用的是串口2,这部分代码是放在串口中断的回调函数里的,最后接受完之后注意要再开启接收,在main函数的while循环前也需要添加一样的代码来开启中断接收,cx是K210识别色块后发送回的色块的中心X坐标,如果要在其他.c文件里调用cx,在头文件里对cx进行一个extern的声明,然后在.c文件中进行定义,再在要使用cx的头文件里包含就可以了。

三.通过蓝牙连接在电脑上实现PID的调参

至于如何使用蓝牙在电脑上进行PID的调参,可以看我的另一篇有关平衡车的文章,里面写的很详细。

到这里就基本结束了,至于数据包的解析,无非就是每接收1字节的数据进行一次中断,然后判断数据的帧头,再将有效的数据放入一个接收数组里,通过帧尾或者提前设定好的数据长度就可以接收了,还是非常简单的,就不进行赘述了(如果想要发送多于一个字节的数据,可以用多个一个字节的数据进行组合,取数据的高位,地位,然后进行组合就可以得到想要的数据了)

效果视频我之后录制并发送到B站。文章来源地址https://www.toymoban.com/news/detail-631096.html

到了这里,关于STM32通过K210进行PID巡线,使用蓝牙模块与电脑通信从而进行P,I,D参数的调节的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32与K210串口通信

    目录 1.前言  2.接线部分 3.代码部分 1.k210部分 1.调用自带的库文件 2.将I/O18设置为UART1_TX功能并设置串口 3.数据发送函数 4.主函数 4.程序现象 2.STM32部分 1主函数 2.串口接收程序 3.程序现象  4.完整代码 5.总结         这篇文章是为了填上一篇k210的简单PID巡线埋下的坑,k2

    2024年02月06日
    浏览(49)
  • 亚博k210视觉模块与stm32双向通信

    【K210模块】使用UART模块发送和接收数据_KevinGuo457的博客-CSDN博客 K210的串口_uart_a.write_飞鸟211的博客-CSDN博客 ①每隔1s终端以及串口助手收到消息并显示 ②通过串口助手发送123,K210收到数据并显示 这里如果想要指定K210接收的数据,判断条件不能直接用==(原因参考上面的链接

    2024年04月23日
    浏览(104)
  • K210和STM32串口通信(亲测有效)

    最近想做一个K210数字识别和寻迹,方便完成2021年电赛F题,完成了数字训练和脱机运行就想赶紧进行一次通信,调了好几天(郁闷+自闭几天),按照官方的历程看,配置的没问题但是会一直出现乱码,得不到自己想要的数据,所以准备发一下这个文章,希望帮助一下道友。 代码

    2024年02月14日
    浏览(41)
  • K210 UART串口通信介绍与 STM32通信

    目录 K210-UART串口通信相关函数: 使用K210串口的时候需要映射引脚: K210与STM32串口通信  发送单字节: K210端 STM32端 发送数据包 K210端 STM32端  K210的UART模块支持全双工通信,可以同时进行数据的发送和接收。在K210上使用UART串口通信,你可以连接外部设备,如传感器、显示器

    2024年03月23日
    浏览(47)
  • K210视觉循迹,STM32之间串口通信 #智能车

    目录 个人感慨与感悟 K210视觉循迹 本人是一名大二的二本学生,本篇文章记录一下我这一年多的学习历程(主要还是针对标题的内 容)。 下面是我的一些经历和感悟,不感兴趣的可以直接跳过 -——————————        高考完之后,在我收到录取通知书之后,父母让

    2024年01月19日
    浏览(40)
  • 电赛备赛日记(一):K210与STM32串口通信

       拖更了n久的备赛日记终于来啦,最近实现了关于K210图像识别并将所需数据(即目标类别,目标在图像中的加权坐标)其中,加权坐标指K210识别到的目标并框出的框的宽和高与框左上顶点的坐标加权,希望以此来判断目标所处的位置并方便后续进行诸如寻迹,目标跟随等

    2024年02月04日
    浏览(64)
  • K210追小球程序与STM32最小系统板通信(自主学习)

    本人先通过学习OPENMV,再延申到K210中。(主要是OPENMV我还没买屏幕,但是K210有)在OPENMV官网中,有相关追小球的函数,但是是用OPENMV单片机来进行调试的。在网上找到的相关源码,加载到OPENMV后发现帧数很慢。 学校实训的要求是要做出能追一定物体的平衡小车,我的小车的

    2024年02月16日
    浏览(43)
  • STM32_通过Ymodem协议进行蓝牙OTA升级固件教程

    作为单片机进阶能力,IAP升级固件的学习是非常重要的。 想直接看如何操作的从第三条开始看。 蓝牙OTA(Over-The-Air)升级是指通过蓝牙无线技术,对设备中的固件或软件进行远程升级和更新的过程。蓝牙OTA升级在现代物联网和智能设备领域有着重要的应用和意义。 重要性:

    2024年02月04日
    浏览(45)
  • STM32CubeMx学习与K210串口通信+识别橘色色块——点亮小灯

     K210模块的串口发送代码 识别色块 +数字处理 这里zz是4个数字的数,则需要分成千百位和低二位传输 zz是距离。也映射了距离的算法 整体K210代码 STM32串口接受端函数 判断帧头帧尾 如果数据正常 判断 数据是否合格 若合格则点灯 否则灭灯 不要忘记加入

    2024年02月14日
    浏览(52)
  • 【STM32】使用HAL库进行电机速度环PID控制,代码+调参

    主控:STM32F103C8T6 在进行速度控制之前,我们首先需要进行速度采样,这里参见这篇博文 ​ 这里不细说电机驱动模块的选型和使用,而是说一个常见的误区。我们驱动电机要使用两路PWM,一般是一路给PWM信号,一路是纯低电平。但这其实是不好的,正确的做法是一路给PWM,另

    2023年04月20日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包