openmv与stm32通讯实现控制舵机跟随颜色块转动[hal库]

3 篇文章 0 订阅
2 篇文章 0 订阅

由于之前写了一篇openmv与stm32串口通讯的博客,恰巧最近又突发奇想,想做一个用openmv视觉控制舵机转动的程序,于是便花了一个下午写成了这个代码,尝试用hal库完成代码的编写

openmv

所需要的元器件

  • stm32单片机
  • stlink
  • openmv
  • 舵机
  • 导线若干
    在这里插入图片描述

整体思路

  1. 先编写openmv的代码,实现特定颜色识别,并把坐标值通过串口发送出去;
  2. 之后在cube上配置相关stm32的初始化设置,并生成代码;
  3. 在keil里编写串口中断接收函数,将串口1用于接收openmv发送来的数据,并编写舵机控制程序;
  4. 烧录程序实现效果,并改进出现的问题。

接线方式

  • stm32通过uart1与openmv连接
  • stm32通过sw与stlink连接
  • stm32通过GND、VCC、PWM口连接舵机

完成效果

openmv识别特定颜色的物体,并把其坐标发送给stm32,单片机读取后控制舵机转动,实现定向跟随效果。

Cube配置

  1. 串口

串口
2. 定时器

定时器

代码解析

  • openmv颜色识别及坐标发送

import sensor, image, time
from pyb import UART
import json

threshold = [(6, 16, 19, 63, 4, 25)]

sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time = 2000 )
sensor.set_auto_whitebal(False)

clock = time.clock()

uart = UART(3, 115200)

uart.init(115200, bits=8, parity=None, stop=1)  #8位数据位,无校验位,1位停止位、

while(True):
    clock.tick()
    img = sensor.snapshot()
    blob = img.find_blobs(threshold, area_threshold=300)
    if blob: #如果找到了目标颜色
        FH = bytearray([0xb3,0xb4])
        uart.write(FH)
        for b in blob:
        #迭代找到的目标颜色区域
            img.draw_cross(b[5], b[6]) # cx, cy
            img.draw_edges(b.min_corners(), color=(0,255,0))
            x = b.cx()
            y = b.cy()

            data = bytearray([x,y])
            uart.write(data)

            end = bytearray([0x01,0x01,0xb5,0xb6])
            uart.write(end)



  • stm32串口中断接收

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)     //opmv-receive
{
	if(huart==&huart1)
	{	
		HAL_UART_Receive_IT(&huart1,&my_re_buf1[++pt_w1],1);  		
		trans(my_re_buf1[pt_w1]);		
	}
}

  • 舵机控制函数


void measure(void)
{
	
      if(m>6){
		
			  if(x<130&&x>10){
				
				if(servo_angle<90){
									
	     	servo_angle+=5;
	     	MG996R_Set_Angle(servo_angle); 	//SERVO
					
				}
		
      	}else if(x>170&&x<300){
					
					
					if(servo_angle>-90){
									
	     	servo_angle-=5;
	     	MG996R_Set_Angle(servo_angle); 	//SERVO
					
				}
		
	}
	m=0;
		
	}
	m++;
	

}



  • 数据帧头判断部分代码

static int state = 0;
	
	if(state==0&&data==0xb3)
	{
		state=1;
		opmvdata[0]=data;

	}
	else if(state==1&&data==0xb4)
	{
		state=2;
		opmvdata[1]=data;
	}

  • 数据帧尾不符清除部分


        else if(data != 0xb6)
        {
            state = 0;
            for(i=0;i<8;i++)
            {
                opmvdata[i]=0x00;
            }           
        }

遇到的问题

舵机控制的时候容易跑偏,后面发现是openmv代码里颜色识别容易对摄像头内多对象进行颜色识别,传回来的数据就会波动较大,因此改变了颜色识别的阈值,实现了较为稳定的颜色识别舵机跟随效果

总结

写程序的时候要注意多方面的问题,不能仅仅考虑当下的问题,因此经验总结很重要,不能忽视。

  • 28
    点赞
  • 299
    收藏
    觉得还不错? 一键收藏
  • 45
    评论
评论 45
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值