久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5585|回復: 1
打印 上一主題 下一主題
收起左側

基于openmv與stm32的尋球小車制作 附代碼

[復制鏈接]
跳轉到指定樓層
樓主
OPENMV和STM32的識別追蹤小車(詳細版)之OPENMV端
實現:通過OPENMV識別Apriltags標簽,STM32驅動小車追蹤標簽
博主通過一段時間的學習,做了這個比較簡單的以OPENMV為攝像傳感器STM32為控制器的尋物小車,不多說,直接進入正題!

材料準備
小車底盤&&輪子
直流減速電機
杜邦線若干
7.2V電源
L298N模塊
STM32F407最小系統
OPENMV4 H7

程序設計思路
這里分兩個方面來說,一個是OPENMV的程序,另一個是STM32的程序。其中,最重要的地方是openmv與stm32的通信問題,我也會著重講一下這個問題。由于篇幅比較長,我將分兩篇文章講解。

一:首先說一下OPENMV的介紹和程序
1.1(OPENMV介紹)
OpenMV攝像頭是一款小巧,低功耗,低成本的電路板,它幫助你很輕松的完成機器視覺(machine vision)應用。它可以讓我們直接應用具有人工智能的功能的攝像頭作為我們機器人的視覺傳感器。它可以識別出人臉,方塊,小球,標簽等。
這里,我選擇用來識別Apriltags標簽,OPENMV識別Apriltags標簽可以計算出相對于相機的精確3D位置,方向和id。包括有6個自由度,三個位置,三個角度。這里我選擇X,Z軸的位置數據來進行判斷。 Apriltags標簽一共有6個家族,星瞳科技的例程里面默認是TAG36H11家族,因為它的識別錯誤率比較低,而我選擇TAG16H5,因為可以識別得比較遠。

我的OPENMV4 H7是在星瞳科技買的,在星瞳科技官網有上手教程,其中有介紹到OPENMV的串口通信問題。首先,OPENMV的控制芯片其實就是STM32H7,所以單片機與單片機之間肯定是可以通信的,這一點沒有問題,看一下它的引腳圖

這里可以看到P4和P5是串口,P4是TX,P5是RX.(注意一定要看清楚選對引腳).這就是硬件上的連接,下面來講一下OPENMV代碼。

.2(OPENMV代碼)
先貼出代碼
mport sensor, image, time, math,pyb
from pyb import UART

sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QQVGA) # we run out of memory if the resolution is much bigger...
sensor.skip_frames(time = 2000)
sensor.set_auto_gain(False)  # must turn this off to prevent image washout...
sensor.set_auto_whitebal(False)  # must turn this off to prevent image washout...
clock = time.clock()
uart = UART(3, 115200)#串口波特率
uart.init(115200,bits=8,parity=None,stop=1)


f_x = (2.8 / 3.984) * 160 # find_apriltags defaults to this if not set
f_y = (2.8 / 2.952) * 120 # find_apriltags defaults to this if not set
c_x = 160 * 0.5 # find_apriltags defaults to this if not set (the image.w * 0.5)
c_y = 120 * 0.5 # find_apriltags defaults to this if not set (the image.h * 0.5)

def degrees(radians):
    return (180 * radians) / math.pi

while(True):
    clock.tick()
    img = sensor.snapshot()

    for tag in img.find_apriltags(families=image.TAG16H5,fx=f_x, fy=f_y, cx=c_x, cy=c_y): # defaults to TAG16H5
        img.draw_rectangle(tag.rect(), color = (255, 0, 0))
        img.draw_cross(tag.cx(), tag.cy(), color = (0, 255, 0))
        print_args = (tag.x_translation(), tag.z_translation())
        uart.write("x%.2fz%.2fe"% print_args+'\r\n')#
設置特定格式,以便于stm32分割取得數據,這里設置的格式是精確到兩位小數特別代碼講解如下:在附件中
uart.init(115200,bits=8,parity=None,stop=1)
上面一行是OPENMV的波特率,數據數,校驗位,停止位的設置
print_args = (tag.x_translation(), tag.z_translation())上面一行是選擇要發送的數據,Apriltags標簽可以識別出三維坐標以及偏移量的數值,這里我選擇了發送X軸和Z軸的參數,也就是前后以及左右。
uart.write("x%.2fz%.2fe"% print_args+'\r\n')#設置特定格式,以便于stm32分割取得數據上面這一行是串口發送數據我所需要的格式,這里我是所要的保留兩位小數的格式。也就是說,比如X軸的數據為1,則發送的數據是1.00這種格式。Z軸也是如此!痋r\n’是回車換行的意思,這個回車換行也會被發送過去,到時候也作為STM32端的數據檢測,講到STM32代碼的時候也會說清楚。

這是OPENMV端的代碼
尋球小車 7.0(no_find優化).7z (246.8 KB, 下載次數: 123)

單片機源程序如下:
  1. #include "my_include.h"

  2. extern CAR_STATUS_e car_mode;
  3. extern moty_duty run_duty;
  4. extern u8 control_data[MAX_DATA_LENS];
  5. extern float C_P; //cameraP
  6. extern float C_D; //cameraD
  7. extern int16 ser_duty;
  8. extern int16 x_error;
  9. extern int16 last_x_error;
  10. extern uint8 ball_colcor;
  11. extern uint8 BEEP_ON_OFF;

  12. extern uint8 out_edge;//出界

  13. void Car_mode_control()
  14. {

  15.                 if(control_data[3]<50 && control_data[3]!=0) //左出界
  16.                 {
  17.                         out_edge=Left;
  18.                 }
  19.                 else if(control_data[3]>110 && control_data[3]!=0) //右出界
  20.                 {
  21.                         out_edge=Right;
  22.                 }

  23.                
  24.                 //--------------------車位狀態判斷-----------------//
  25.                 if(out_edge==Left && control_data[4]==0 && control_data[5]==0)
  26.                 {
  27.                         car_mode=finding_L;
  28.                 }
  29.                 else if(out_edge==Right && control_data[4]==0 && control_data[5]==0)
  30.                 {
  31.                         car_mode=finding_R;
  32.                 }
  33.                 else if (control_data[3]>0 && control_data[4]>0 && control_data[5]>0)
  34.                 {
  35.                         car_mode=run;
  36.                 }
  37.                 if(control_data[5]<=12 && control_data[5]>=3)
  38.                 {
  39.                                 LED1=0;
  40.                                 car_mode=stop;
  41.                 }
  42.                 else {LED1=1;}
  43.                
  44.                 if(Boma4==0)//強制菜單
  45.                 {
  46.                         car_mode=stop;
  47.                 }
  48.                 //尋找小球的 色號(0為紅,1為綠)        

  49.                 if(Boma3==0)
  50.                 {
  51.                         BEEP_ON_OFF=OFF;
  52.                 }
  53.                 else {BEEP_ON_OFF=ON;}
  54. }


  55. void FTM_updata()
  56. {

  57.                 if(car_mode == run)
  58.                 {
  59.                                 TIM_SetCompare1(TIM1,run_duty.Speed_Duty_R);        //右為  TIM1  CH1
  60.                                 TIM_SetCompare4(TIM1,run_duty.Speed_Duty_L);  //左為  TIM1  CH4
  61.                 }
  62.                 else if(car_mode == finding_R)
  63.                 {
  64.                                 TIM_SetCompare1(TIM1,1400);        //右為  TIM1  CH1
  65.                                 TIM_SetCompare4(TIM1,1400); //左為  TIM1  CH4
  66.                 }
  67.                 else if(car_mode == finding_L)
  68.                 {
  69.                                 TIM_SetCompare1(TIM1,1500);        //右為  TIM1  CH1
  70.                                 TIM_SetCompare4(TIM1,1500); //左為  TIM1  CH4
  71.                 }
  72.           else if(car_mode == stop)
  73.                 {
  74.                                 TIM_SetCompare1(TIM1,0);        //右為  TIM1  CH1
  75.                                 TIM_SetCompare4(TIM1,0);  //左為  TIM1  CH4
  76.                 }
  77. }




  78. void PD_control()
  79. {

  80.         last_x_error=x_error;
  81.         x_error=control_data[3]-80;
  82.         ser_duty = C_P*x_error-C_D*(last_x_error-x_error);

  83.         run_duty.Speed_Duty_R=1550-ser_duty;//正為正轉
  84.         run_duty.Speed_Duty_L=1350-ser_duty;
  85.         //左邊FTM波//限幅        
  86.         run_duty.Speed_Duty_L=run_duty.Speed_Duty_L<1300?1300:run_duty.Speed_Duty_L;
  87.         run_duty.Speed_Duty_L=run_duty.Speed_Duty_L>1600?1600:run_duty.Speed_Duty_L;
  88.         //右邊FTM波//限幅        
  89.   run_duty.Speed_Duty_R=run_duty.Speed_Duty_L<1300?1300:run_duty.Speed_Duty_R;
  90.         run_duty.Speed_Duty_R=run_duty.Speed_Duty_L>1600?1600:run_duty.Speed_Duty_R;

  91.         
  92.         
  93. }
復制代碼


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:713851 發表于 2020-3-23 10:02 | 只看該作者
您好我買了個平衡小車想咨詢怎么與openmv連接
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美日韩中文字幕在线 | 精品一区二区三区在线观看国产 | 婷婷成人在线 | 免费黄色特级片 | 天堂中文资源在线 | 国产精品嫩草影院精东 | 免费一区二区 | 色狠狠一区 | 狠狠干天天干 | 91精品麻豆日日躁夜夜躁 | 伊人久久免费视频 | 国产精品国产馆在线真实露脸 | 午夜精品久久 | 三级在线观看 | 中文在线观看视频 | 日本在线你懂的 | 小早川怜子xxxxaⅴ在线 | 国产精品成人一区二区三区 | 视频在线亚洲 | 天堂一区二区三区 | 久久久久久国产精品免费免费狐狸 | 日韩欧美一区二区三区免费看 | 精品在线观看一区二区 | 黄视频网址 | 日韩三级电影在线看 | 伊人亚洲| 国产欧美精品一区 | 精品在线一区 | 免费一看一级毛片 | 有码在线 | 成人免费小视频 | 一级黄在线观看 | 一级毛片视频免费观看 | 国产中文字幕在线观看 | 日韩一级免费大片 | 久久精品国产一区二区电影 | 夜夜骑首页| av中文字幕在线播放 | 日韩欧美在线观看一区 | 久久久久久免费毛片精品 | 国产一区二区三区在线视频 |