使用OpenMV与STM32通讯实现舵机跟随颜色块转动【HAL库】- 二维自由度舵机控制【2】

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

所需要的元器件

  • 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;
    		
    
    
    ![img](https://i3.wp.com/img-blog.csdnimg.cn/img_convert/7a13b081f4a7157343f1bc08dc0e354b.png)
    ![img](https://i3.wp.com/img-blog.csdnimg.cn/img_convert/0f04a96e73f11ba3f407ea124a689b09.png)
    
    **既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!**
    
    **由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新**
    
    **[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618679757)**
    
    程,涵盖了95%以上物联网嵌入式知识点,真正体系化!**
    
    **由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新**
    
    **[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618679757)**
    
    

    作者:普通网友

    物联沃分享整理
    物联沃-IOTWORD物联网 » 使用OpenMV与STM32通讯实现舵机跟随颜色块转动【HAL库】- 二维自由度舵机控制【2】

    发表回复