openmv识别物体并与单片机通信(STM32)

这篇具有很好参考价值的文章主要介绍了openmv识别物体并与单片机通信(STM32)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

OPENMV端

物体识别

感光元件

 img = sensor.snapshot() #存储摄像头所拍摄的图像并保存在img变量中

寻找色块

 blobs = img.find_blobs([red_thresholds]) #find_blobs函数可以找到色块。

find_blobs函数:此函数参数较多,一般只用第一个参数就可以找到需要的色块。thresholds是颜色的阈值,是一个列表,这个列表可以有多个颜色阈值。
一个颜色阈值的结构是这样的:

thresholds= (minL, maxL, minA, maxA, minB, maxB) #元组里面的数值分别是L A B 的最大值和最小值。

画图

image.draw_cross(x, y, size=5, color=White) #在图像中画一个十字

x,y:是坐标
size:是两侧的尺寸
color:画十字的颜色

image.draw_rectangle(rect_tuple, color=White) #在图像中画一个矩形框

rect_tuple 的格式是 (x, y, w, h)
color:画矩形框的颜色
sensor-感光元件具体介绍
find_blobs函数具体介绍
画图具体介绍

距离判断

实际长度和摄像头里的像素成反比

距离

距离 = k / 直径的像素

K1 = 500   #每次改变物体,K值都要重新计算 K1 = 距离(25cm已知)*直径像素Lm(20)
Lm = (max_blob.w() + max_blob.h())/2 #色块的长与宽 直径像素点个数
length = K1 / Lm

实际距离

实际距离 = k * 直径的像素
相同距离测不同物体的宽和长的长度

K2 = 0.16  #实际距离 = k * 直径的像素,K2 = 实际大小(宽4cm已知)/宽像素b[2]25)
K3 = 0.16  #实际距离 = k * 直径的像素,K3 = 实际大小(长4cm已知)/长像素b[3]25)
width = K2 * max_blob.w()
height = K3 * max_blob.h()

k1值计算:先已知一个长度length,在计算出直径像素点个数Lm。根据公式得到k = lenght * Lm计算出k1。通过改变物体(与计算k1值的物体为同一个)的距离就可以得到物体到openmv的距离。
k2,k3值计算:先得到一个已知物体的实际长和宽,在得到这个物体长和宽的像素。根据公式实际距离 = k * 直径的像素来得到k2,k3。改变不同的物体就可以知道该物体的实际长和宽。
OpenMV测距具体介绍
视频介绍

串口发送

from pyb import UART #模块导入
uart = UART(3,115200) #串口配置
uart.init(9600, bits=8, parity=None, stop=1)
data = bytearray([0xb3,0xb3,max_blob[5],max_blob[6],max_blob[3],0x0d,0x0a]) #要发送的数据
uart.write(data) #数据发送

openmv发送16进制数据需要转换为字节的形式,假设要发送 0x50,0x600,0x70,0x80这几个16进制数据代码如下:

uart = UART(3, 115200) 
uart.init(9600, bits=8, parity=None, stop=1)
data=bytearray([0x50,0x60,0x70,0x80])
uart.write(data)

STM32段

串口接收

串口2配置

  GPIO_InitTypeDef GPIO_InitStructure;
  USART_InitTypeDef USART_InitStructure;
  NVIC_InitTypeDef NVIC_InitStructure;
	 
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);  //使能GPIOA时钟
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE); //使能USART2
	
  USART_DeInit(USART2);
	
  //USART2_TX   GPIOA.2
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA.2
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出
  GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化GPIOA.2
   
  //USART2_RX	GPIOA.3
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA.3
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
  GPIO_Init(GPIOA,&GPIO_InitStructure);//初始化GPIOA.3  

  //Usart2 NVIC 配置
  NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3 ;//抢占优先级3
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//IRQ通道使能
  NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器
 
   //USART 初始化设置
  USART_InitStructure.USART_BaudRate = bound;//串口波特率
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
  USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
  USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收发模式

  USART_Init(USART2,&USART_InitStructure); //初始化串口2
  USART_ITConfig(USART2,USART_IT_RXNE, ENABLE);//开启串口接受中断
  USART_Cmd(USART2,ENABLE);                    //使能串口2

数据处理

	static u8 state = 0;
	if(state == 0 && data == 0xb3)
	{
		state = 1;
		openmv[0] = data;
	}
	else if(state == 1 && data == 0xb3)
	{
		state = 2;
		openmv[1] = data;
	}
	else if(state == 2)
	{
		state = 3;
		openmv[2] = data;
	}
	else if(state == 3)
	{
		state = 4;
		openmv[3] = data;
	}
	else if(state == 4)
	{
		state = 5;
		openmv[4] = data;
	}
	else if(state == 5)
	{
		state = 6;
		openmv[5] = data;
	}
	else if(state == 6) // 检测是否接收到结束标志
	{
		if(data == 0x0a)
		{
			state = 0;
			LED0 =~ LED0;
			openmv[6] = data;
			Openmv_Data();
			data = 0;
		}
		else if(data != 0x0a)
		{
			state = 0;
			for(i = 0;i < 7;i++)
			{
				openmv[i] = 0x00;
			}
		}
	}
	else
	{
		state = 0;
		data = 0;
		LED0 = 1;
		for(i = 0;i < 7;i++)
		{
			openmv[i] = 0x00;
		}
	}

数据显示

在oled上显示需要的数据

	OLED_ShowString(0,0,"OpenMV-X:"); 
	OLED_ShowNum(70,00,OpenMV_X,3,12);
	OLED_ShowString(0,2,"OpenMV-Y:"); 	
	OLED_ShowNum(70,2,OpenMV_Y,3,12);		 
	OLED_ShowString(0,4,"Distance:");  
	OLED_ShowNum(68,4,Distance,3,12);
	OLED_ShowString(90,4,"cm");

Openmv与STM32连线

Openmv端:TXD(P4),RXD(P5),GND。TXD是发送端,RXD是接收端,GND是地线。
STM32端:TXD(PA2),RXD(PA3),GND。
如何连线:OpenMV的RXD连到STM32的TXD;OpenMV的TXD连到STM32的RXD;把OpenMV的GND与STM32的GND相连接。

实验现象

识别到红色物体
openmv识别物体并与单片机通信(STM32)
openmv打印输出数据
openmv识别物体并与单片机通信(STM32)
STM32还未接收到数据
openmv识别物体并与单片机通信(STM32)
STM32接收到数据并在oled上显示
openmv识别物体并与单片机通信(STM32)
注:当stm32上电后,oled上显示数据为0且红灯亮蓝灯灭,当openmv识别到物体并发送数据到stm32时,红灯亮蓝灯闪烁且oled实时显示数据;当openmv未识别到物体时,oled显示上次识别到的数据且红蓝灯亮。


在进行串口配置时,OpenMV和STM32的串口的波特率、奇偶位、停止位等都需要相同,否则传送数据不会成功。


源码获取

GitHub Opwnmv object recognition文章来源地址https://www.toymoban.com/news/detail-401195.html

到了这里,关于openmv识别物体并与单片机通信(STM32)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 梦飞openmv--stm32单片机跑AI

    1 背景 2 AI算力的差距 2.1 DMIPS和MIPS 2.2 TOPS和FLOPS 2.3 stm32H7 和K210 AI算力 2.4 结论: 3 适合openmv的AI网络模型 4.梦飞openmv运行量化的神经网络 5 总结

    2024年02月06日
    浏览(15)
  • 两块stm32单片机串口通信讲解

    本篇文章记录了如何使用stm32f103zet6核心板(下位机)通过串口向stm32f103zet6学习板(上位机)发送数据,stm32f103zet6学习板完成接收,并将接收到的数据显示在LCD显示屏上。 正点原子精英STM32F103ZET6学习板一块(带2.8寸显示屏) STM32F103ZET6核心板一块 电源适配器、数据线以及杜

    2024年02月16日
    浏览(14)
  • 【单片机】基于STM32的UART串口通信

    简单讲解一下UART通信协议,以及UART能够实现的一些功能,还有有关使用STM32CubeMX来配置芯片的一些操作。实验内容基于 正点原子精英板 开发板,单片机芯片为 STM32F103ZET6 。 在后面我会以我使用的STM32F429开发板来举例讲解(其他STM32系列芯片大多数都可以按照这些步骤来操作

    2024年01月17日
    浏览(37)
  • 【单片机毕设选题】stm32实现车牌识别系统 -物联网 嵌入式 单片机

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月20日
    浏览(19)
  • 单片机项目分享 stm32机器视觉的人脸识别系统 - 单片机 物联网 嵌入式

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年01月22日
    浏览(21)
  • 单片机毕业设计 stm32车牌识别系统

    Hi,大家好,学长今天向大家介绍一个 单片机项目 基于stm32的车牌识别系统设计 大家可用于 课程设计 或 毕业设计 在我们的日常生活中, 接触到了很多关于电子科技的技术。 在电子科技交通领域中, 有很多技术都在无形中加入我们的生活, 如图像处理技术, 自动检测技术

    2023年04月12日
    浏览(19)
  • STM32单片机初学4-IIC通信(软件模拟)

    IIC ( Inter-Integrated Circuit )又称I2C(习惯读“I方C”),是 IIC Bus简称,中文名为 集成电路总线 ,它是一种串行通信总线,使用多主从架构,由飞利浦公司在1980年代为了让主板、嵌入式系统或手机用以连接低速周边设备而发展。适用于IC间的短距离数据传输。 最初的IIC通信速

    2024年02月05日
    浏览(21)
  • 单片机项目分享 基于Stm32的家庭智能监控系统 - 单片机 图像识别 人体检测 AI

    hr style=\\\" border:solid; width:100px; height:1px;\\\" color=#000000 size=1\\\" 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最

    2024年01月16日
    浏览(15)
  • STM32单片机初学5-IIC通信驱动OLED屏幕

    在我上篇文章(STM32-软件模拟IIC通信)讲解了软件模拟IIC通信。这篇文章详将细讲解利用软件模拟IIC来控制0.96寸的OLED屏幕(如下图),使其显示字符串。本文将不再对IIC通信原理做详细讲解,所以对IIC通信原理不熟悉的话可以参考我上篇文章(点击上面的链接直接跳转)。

    2023年04月10日
    浏览(14)
  • 【单片机毕设选题】 基于Stm32的家庭智能监控系统 - 单片机 图像识别 人体检测 AI

    hr style=\\\" border:solid; width:100px; height:1px;\\\" color=#000000 size=1\\\" 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最

    2024年01月21日
    浏览(18)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包