找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2797|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

openMV實(shí)現(xiàn)舵機(jī)定位色塊STM32

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:956485 發(fā)表于 2021-7-26 11:13 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
實(shí)驗(yàn)?zāi)康?/font>:本實(shí)驗(yàn)實(shí)現(xiàn)使用openMV檢測(cè)前方色塊,并傳回色塊的坐標(biāo)位置給STM32,控制舵機(jī)轉(zhuǎn)動(dòng)來(lái)跟蹤色塊。

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位數(shù)據(jù)位,無(wú)校驗(yàn)位,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",              #格式為倆個(gè)字符倆個(gè)短整型(2字節(jié))
  •                    0xff,
  •                    0xfe,
  •                    int(cx_max),
  •                    int(cy_max));
  •                                                    #數(shù)據(jù)1
  •                                     # up sample by 4#數(shù)據(jù)2LCD_ShowStringLCD_ShowString
  •         uart.write(data);   #必須要傳入一個(gè)字節(jié)數(shù)組
  • 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軸的偏移坐標(biāo)
  •         print("X軸偏移坐標(biāo) : ",X)
  •         print("Y軸偏移坐標(biāo) : ",Y)
  •         print("幀率 : ",clock.fps())
  • sending_data(blob.X,blob.Y)

復(fù)制代碼


代碼介紹:此部分為openMV追蹤色塊(黃色)并且傳回色塊的橫坐標(biāo)位置給STM32C8T6t,同時(shí)也可以用串口打印出來(lái)色塊距離中心坐標(biāo)位置偏移值。
如圖所示






如果要利用串口顯示的話(huà)可以用一根杜杜邦線(xiàn)接openMV的P4和USB轉(zhuǎn)TTL的RXD接收端即可。

STM32部分

串口接收終端代碼

  • void USART1_IRQHandler(void)                        //串口1中斷服務(wù)程序
  •         {
  •         u8 com_data;
  • #if SYSTEM_SUPPORT_OS                 //如果SYSTEM_SUPPORT_OS為真,則需要支持OS.
  •         OSIntEnter();
  • #endif
  •         if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中斷(接收到的數(shù)據(jù)必須是0x0d 0x0a結(jié)尾)
  •                 {
  •                         USART_ClearFlag(USART1,USART_FLAG_RXNE);
  •       com_data = USART1->DR;
  •                         Openmv_Receive_Data(com_data);     //openmv數(shù)據(jù)處理函數(shù)
  •                         Openmv_Data();                                 //openmv數(shù)據(jù)處理函數(shù)
  •      }
  • #if SYSTEM_SUPPORT_OS         //如果SYSTEM_SUPPORT_OS為真,則需要支持OS.
  •         OSIntExit();
  • #endif
  • }

復(fù)制代碼


處理openMV數(shù)據(jù)代碼

  • #include "openmv.h"
  • int openmv[5];//stm32接收數(shù)據(jù)數(shù)組
  • int8_t OpenMV_X;          /*OPENMV X 軸反饋?zhàn)鴺?biāo)*/
  • int8_t OpenMV_Y;          /*OPENMV X 軸反饋?zhàn)鴺?biāo)*/
  • int i=0;
  • void Openmv_Receive_Data(int16_t data)//接收Openmv傳過(guò)來(lái)的數(shù)據(jù)
  • {
  •         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)                //檢測(cè)是否接受到結(jié)束標(biāo)志
  •         {
  •         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];
  • }


復(fù)制代碼


其他部分的代碼就很簡(jiǎn)單,在這里只列出關(guān)鍵部分代碼

下面就是關(guān)鍵的控制舵機(jī)轉(zhuǎn)動(dòng)的代碼


  • 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);
  •                 }
  •         }



評(píng)分

參與人數(shù) 1黑幣 +10 收起 理由
admin + 10 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:932410 發(fā)表于 2021-9-14 11:50 | 只看該作者
求個(gè)源碼呀,兄弟
回復(fù)

使用道具 舉報(bào)

板凳
ID:876099 發(fā)表于 2021-10-20 14:40 來(lái)自手機(jī) | 只看該作者
有源碼嗎
回復(fù)

使用道具 舉報(bào)

地板
ID:1004156 發(fā)表于 2022-2-13 17:24 | 只看該作者
求源碼大佬
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表