文章目錄
- 前言
- 硬體選擇
- 一、下位機所需要實作的功能
- 1.LED部分
- 2.PWM部分
- 3.無刷電機部分
- 4.串口部分
- 5.I2c驅動部分
- 6.MPU6050配置相關暫存器部分
- 7.決議姿態角,PID演算法和EKF(濾波)
- 二、上位機所需要實作的功能
- 1.串口發送部分
- 2.opencv部分
- 總結以及成品展示
前言
筆者今年參加了工程訓練比賽(現在已經邁入了linux下驅動開發的大坑中),在最近學習linux驅動的同時突然想著做一個長期博客,算是一個教程吧也就當對我自己所學習STM32的經歷做一個總結回顧,會將我代碼的實作程序做個羅列,大神看到有說錯的地方可以留言哈,剛入門的小白看到有什么不懂的地方也可以留言看到就回復,
硬體選擇
提示:筆者上位機采用書梅派4b使用Python來進行處理影像識別,下位機采用STM32f103單片機,樹梅派4b的處理這么多資料也算是勉勉強強,若是想用性能更強一些的可以試試rk3399的板子,相對來說性能上比4b要強一些,尤其是做視覺處理一定要注意板子的性能能不能跟的上特別實在一些實時性要求比較高的要求下,
一、下位機所需要實作的功能
1.LED部分
需要使用多個led來代表所識別的多邊形黑色附著物所以我們需要定義兩到三個點亮led的驅動,這部分很簡單,
看LED部分代碼點我:
2.PWM部分
我們需要控制多個無刷電機,三個懸浮電機,兩個驅動電機,TIM3定時器提供了四個,再加上TIM1的一個,也可以全部使用TIM1定時器來提供所需要的5路PWM,TIM1能提供多少個PWM我忘記了,需要的花可以查閱相關資料,
看定時器部分代碼點我:(沒更新別點)
3.無刷電機部分
無刷電機不同以我們平常所見的普通直流電機,他需要配合電子調速器來使用就是我們俗稱的電調,想要驅動無刷電機要看自己買的電調說明書,一般都有頻率限制一般50hz—400hz最高是500hz,頻率的計算有個公式能算,這里先不說明后面具體用到了再詳細說明,
驅動無刷電機部分:(沒更新別點)
4.串口部分
串口很重要,想要實作上位機和下位機之間的相互通信就需要串口這個功能,配置好串口之外還需要自己寫一個資料幀,如果不對資料進行規定會出現很多接受錯誤,影響后面的指令,(串口的狀態很重要)
串口和協議:(沒更新別點)
5.I2c驅動部分
STM32官方有硬體I2c不過很多人都說不好用,好象是專利問題吧,我所采用得是模擬I2c,難點在于I2c的時序部分,時序部分很容易出錯當時也花了不少時間除錯時許,當然現在網上也有很多模擬i2c的代碼基本上都是可以用的,需要在意的是延時,延時過長或者過短mcu也是接收不到的,
I2c驅動部分:(沒更新別點)
6.MPU6050配置相關暫存器部分
這一部分主要就是通過I2c的讀寫函式對6050內部暫存器進行配置,比較簡單如果你的I2c沒有問題的話,
MPU6050暫存器部分:(沒更新別點)
7.決議姿態角,PID演算法和EKF(濾波)
PID不多說了很經典也很簡單但是調節引數你得有點東西,先說說為什么需要濾波演算法,我們通過6050能解算出角度(通過加速度原始資料和角速度原始資料),但是這不能直接拿來用,額你可以直接用加速度資料如果你不在意這個資料的大范圍跳一枚輕噴,動,如果我們要獲得相對穩定可用的資料我們就需要卡爾曼濾波(EFK),也有其他方法例如四元素奈何實在看不懂四元素不理解,簡單來說經過EKF之后的資料我們差不多就可以直接拿來用了,
姿態解算和濾波:(沒更新別點)
二、上位機所需要實作的功能
1.串口發送部分
Python實作串口發送還是很簡單的別忘了裝CH340驅動,然后安裝PYserial庫,代碼講到了再說,
上位機串口和協議:(沒更新別點)
2.opencv部分
這部分我當初以為很難,接觸了Opencv后又覺得很簡單不是很難,但是當你慢慢的代碼要處理的資料越來越多,如果有例外或者判斷陳述句沒處理到位的話,BUG就來了,我當時遇到過一個BUG在一些特定的環境下程式會出現假死的狀態,后來花了兩天
,慢慢排查原因出現在了try陳述句,,,很低級的錯誤,
影像識別部分:(沒更新別點)
總結以及成品展示
總的來說,經過了幾個月的不解努力,沒有白費力氣不管結果如何,這都是寶貴的經驗,

opencv上位機效果展示 沒有錄上位機畫面炊訓者看下效果

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/287685.html
標籤:其他
