找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1853|回复: 3
打印 上一主题 下一主题
收起左侧

openMV实现舵机定位色块STM32

[复制链接]
跳转到指定楼层
楼主
ID:956485 发表于 2021-7-26 11:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
实验目的:本实验实现使用openMV检测前方色块,并传回色块的坐标位置给STM32,控制舵机转动来跟踪色块。

openMV部分


  • import sensor, image, time
  • from pyb import UART
  • import json
  • red_threshold  = (46, 80, 19, -5, 38, 103)
  • sensor.reset() # Initialize the camera sensor.
  • sensor.set_pixformat(sensor.RGB565) # use RGB565.
  • sensor.set_framesize(sensor.QQVGA) # use QQVGA for speed.
  • sensor.skip_frames(10) # Let new settings take affeOpenMV_Xct.
  • sensor.set_auto_whitebal(False) # turn this off.
  • clock = time.clock() # Tracks FPS.
  • uart = UART(3, 115200)
  • uart.init(115200, bits=8, parity=None, stop=1)  #8位数据位,无校验位,1位停止位
  • def find_max(blobs):
  •     max_size=0
  •     for blob in blobs:
  •         if blob[2]*blob[3] > max_size:
  •             max_blob=blob
  •             max_size = blob[2]*blob[3]
  •     return max_blob
  •     def sending_data(cx_max,cy_max):
  •         global uart;
  •         data = ustruct.pack("<bbbb",              #格式为俩个字符俩个短整型(2字节)
  •                    0xff,
  •                    0xfe,
  •                    int(cx_max),
  •                    int(cy_max));
  •                                                    #数据1
  •                                     # up sample by 4#数据2LCD_ShowStringLCD_ShowString
  •         uart.write(data);   #必须要传入一个字节数组
  • while(True):
  •     clock.tick() # Track elapsed milliseconds between snapshots().
  •     img = sensor.snapshot() # Take a picture and return the image.
  •     blobs = img.find_blobs([red_threshold])
  •     if blobs:
  •         max_blob = find_max(blobs)
  •         img.draw_cross(max_blob.cx(),max_blob.cy())
  •         img.draw_circle(max_blob.cx(),max_blob.cy(),max_blob.cx()-max_blob.x(), color = (255, 255, 255))
  •         X =int(max_blob.cx()-img.width()/2)
  •         Y =int(max_blob.cy()-img.height()/2)
  •       #  FH = bytearray([0xb3,0xb3])
  •       #  uart.write(FH)     #打印帧头
  •         data = bytearray([0xb3,0xb3,X,Y,0x5b])
  •         uart.write(data)    #打印XY轴的偏移坐标
  •         print("X轴偏移坐标 : ",X)
  •         print("Y轴偏移坐标 : ",Y)
  •         print("帧率 : ",clock.fps())
  • sending_data(blob.X,blob.Y)

复制代码


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






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

STM32部分

串口接收终端代码

  • void USART1_IRQHandler(void)                        //串口1中断服务程序
  •         {
  •         u8 com_data;
  • #if SYSTEM_SUPPORT_OS                 //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
  •         OSIntEnter();
  • #endif
  •         if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
  •                 {
  •                         USART_ClearFlag(USART1,USART_FLAG_RXNE);
  •       com_data = USART1->DR;
  •                         Openmv_Receive_Data(com_data);     //openmv数据处理函数
  •                         Openmv_Data();                                 //openmv数据处理函数
  •      }
  • #if SYSTEM_SUPPORT_OS         //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
  •         OSIntExit();
  • #endif
  • }

复制代码


处理openMV数据代码

  • #include "openmv.h"
  • int openmv[5];//stm32接收数据数组
  • int8_t OpenMV_X;          /*OPENMV X 轴反馈坐标*/
  • int8_t OpenMV_Y;          /*OPENMV X 轴反馈坐标*/
  • int i=0;
  • void Openmv_Receive_Data(int16_t data)//接收Openmv传过来的数据
  • {
  •         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)                //检测是否接受到结束标志
  •         {
  •         if(data == 0x5B)
  •         {
  •             state = 0;
  •             openmv[4]=data;
  •             Openmv_Data();
  •         }
  •         else if(data != 0x5B)
  •         {
  •             state = 0;
  •             for(i=0;i<5;i++)
  •             {
  •                 openmv=0x00;
  •             }
  •         }
  •         }
  •         else
  •                 {
  •                         state = 0;
  •             for(i=0;i<5;i++)
  •             {
  •                 openmv=0x00;
  •             }
  •                 }
  • }
  • void Openmv_Data(void)
  • {
  •     OpenMV_X=openmv[2];
  •     OpenMV_Y=openmv[3];
  • }


复制代码


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

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


  • while (1)
  •         {
  •             OpenMV_X= openmv[2];
  •                 printf ("\r\n%d\r\n",OpenMV_X);
  •                 if(OpenMV_X>=0&&OpenMV_X<80)
  •                 {
  •                         s=185-OpenMV_X/16;
  •                         TIM_SetCompare1(TIM1, s);
  •                 }
  •                 if(OpenMV_X>=180)
  •                 {
  •                         s=190-(OpenMV_X-180)/16;
  •                         TIM_SetCompare1(TIM1, s);
  •                 }
  •         }



评分

参与人数 1黑币 +10 收起 理由
admin + 10 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:932410 发表于 2021-9-14 11:50 | 只看该作者
求个源码呀,兄弟
回复

使用道具 举报

板凳
ID:876099 发表于 2021-10-20 14:40 来自手机 | 只看该作者
有源码吗
回复

使用道具 举报

地板
ID:1004156 发表于 2022-2-13 17:24 | 只看该作者
求源码大佬
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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