e小白

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 226|回复: 0

openMV实现舵机定位色块STM32

[复制链接]

1

主题

1

帖子

17

积分

新手上路

Rank: 1

积分
17
发表于 2021-4-18 16:01:20 | 显示全部楼层 |阅读模式
openMV实现舵机定位色块STM32
实验目的:本实验实现使用openMV检测前方色块,并传回色块的坐标位置给STM32,控制舵机转动来跟踪色块。

openMV部分


  1. import sensor, image, time
  2. from pyb import UART
  3. import json

  4. red_threshold  = (46, 80, 19, -5, 38, 103)
  5. sensor.reset() # Initialize the camera sensor.
  6. sensor.set_pixformat(sensor.RGB565) # use RGB565.
  7. sensor.set_framesize(sensor.QQVGA) # use QQVGA for speed.
  8. sensor.skip_frames(10) # Let new settings take affeOpenMV_Xct.
  9. sensor.set_auto_whitebal(False) # turn this off.
  10. clock = time.clock() # Tracks FPS.

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

  13. def find_max(blobs):
  14.     max_size=0
  15.     for blob in blobs:
  16.         if blob[2]*blob[3] > max_size:
  17.             max_blob=blob
  18.             max_size = blob[2]*blob[3]
  19.     return max_blob

  20.     def sending_data(cx_max,cy_max):
  21.         global uart;
  22.         data = ustruct.pack("<bbbb",              #格式为俩个字符俩个短整型(2字节)
  23.                    0xff,
  24.                    0xfe,
  25.                    int(cx_max),
  26.                    int(cy_max));
  27.                                                    #数据1
  28.                                     # up sample by 4#数据2LCD_ShowStringLCD_ShowString
  29.         uart.write(data);   #必须要传入一个字节数组


  30. while(True):
  31.     clock.tick() # Track elapsed milliseconds between snapshots().
  32.     img = sensor.snapshot() # Take a picture and return the image.

  33.     blobs = img.find_blobs([red_threshold])
  34.     if blobs:

  35.         max_blob = find_max(blobs)
  36.         img.draw_cross(max_blob.cx(),max_blob.cy())
  37.         img.draw_circle(max_blob.cx(),max_blob.cy(),max_blob.cx()-max_blob.x(), color = (255, 255, 255))
  38.         X =int(max_blob.cx()-img.width()/2)
  39.         Y =int(max_blob.cy()-img.height()/2)

  40.       #  FH = bytearray([0xb3,0xb3])
  41.       #  uart.write(FH)     #打印帧头

  42.         data = bytearray([0xb3,0xb3,X,Y,0x5b])
  43.         uart.write(data)    #打印XY轴的偏移坐标



  44.         print("X轴偏移坐标 : ",X)
  45.         print("Y轴偏移坐标 : ",Y)


  46.         print("帧率 : ",clock.fps())
  47. sending_data(blob.X,blob.Y)
复制代码


代码介绍:此部分为openMV追踪色块(黄色)并且传回色块的横坐标位置给STM32C8T6t,同时也可以用串口打印出来色块距离中心坐标位置偏移值。
如图所示






如果要利用串口显示的话可以用一根杜杜邦线接openMV的P4和USB转TTL的RXD接收端即可。

STM32部分

串口接收终端代码

  1. void USART1_IRQHandler(void)                        //串口1中断服务程序
  2.         {
  3.         u8 com_data;
  4. #if SYSTEM_SUPPORT_OS                 //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
  5.         OSIntEnter();   
  6. #endif
  7.         if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
  8.                 {
  9.                         USART_ClearFlag(USART1,USART_FLAG_RXNE);
  10.       com_data = USART1->DR;
  11.                         Openmv_Receive_Data(com_data);     //openmv数据处理函数
  12.                         Openmv_Data();                                 //openmv数据处理函数               
  13.                
  14.      }
  15. #if SYSTEM_SUPPORT_OS         //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
  16.         OSIntExit();                                                                                          
  17. #endif
  18. }
复制代码


处理openMV数据代码

  1. #include "openmv.h"
  2. int openmv[5];//stm32接收数据数组
  3. int8_t OpenMV_X;          /*OPENMV X 轴反馈坐标*/
  4. int8_t OpenMV_Y;          /*OPENMV X 轴反馈坐标*/


  5. int i=0;

  6. void Openmv_Receive_Data(int16_t data)//接收Openmv传过来的数据
  7. {
  8.         static u8 state = 0;
  9.         if(state==0&&data==0xb3)
  10.         {
  11.                 state=1;
  12.                 openmv[0]=data;
  13.         }
  14.         else if(state==1&&data==0xb3)
  15.         {
  16.                 state=2;
  17.                 openmv[1]=data;
  18.         }
  19.         else if(state==2)
  20.         {
  21.                 state=3;
  22.                 openmv[2]=data;
  23.         }
  24.         else if(state==3)
  25.         {
  26.                 state = 4;
  27.                 openmv[3]=data;
  28.         }

  29.         else if(state==4)                //检测是否接受到结束标志
  30.         {
  31.         if(data == 0x5B)
  32.         {
  33.             state = 0;
  34.             openmv[4]=data;
  35.             Openmv_Data();
  36.         }
  37.         else if(data != 0x5B)
  38.         {
  39.             state = 0;
  40.             for(i=0;i<5;i++)
  41.             {
  42.                 openmv=0x00;
  43.             }           
  44.         }
  45.         }   
  46.         else
  47.                 {
  48.                         state = 0;
  49.             for(i=0;i<5;i++)
  50.             {
  51.                 openmv=0x00;
  52.             }
  53.                 }
  54. }

  55. void Openmv_Data(void)
  56. {
  57.     OpenMV_X=openmv[2];
  58.     OpenMV_Y=openmv[3];

  59. }
复制代码


其他部分的代码就很简单,在这里只列出关键部分代码

下面就是关键的控制舵机转动的代码


  1. while (1)
  2.         {
  3.                
  4.             OpenMV_X= openmv[2];
  5.                 printf ("\r\n%d\r\n",OpenMV_X);
  6.                 if(OpenMV_X>=0&&OpenMV_X<80)
  7.                 {
  8.                         s=185-OpenMV_X/16;
  9.                         TIM_SetCompare1(TIM1, s);      

  10.                 }
  11.                
  12.                 if(OpenMV_X>=180)
  13.                 {
  14.                         s=190-(OpenMV_X-180)/16;
  15.                         TIM_SetCompare1(TIM1, s);      

  16.                        
  17.                 }      

  18.       
  19.         }
复制代码

                     
舵机的初始化代码在这里我就不列了,我用的是TIM1。
它是根据STM32接收到的数据的坐标位置来进行一个条件判断,这里32端接受到的数据为横坐标值,当色块在右侧,数据为0—80,当色块在左侧时,数据为260—180.由此来计算舵机的占空比具体是多大。
————————————————
版权声明:本文为CSDN博主「俊俊是天才」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_51959247/article/details/115817897

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|e小白

GMT+8, 2021-6-24 05:22 , Processed in 0.043637 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表