基于STM32以及CUBEMX的項目分享(一)。
本人從接觸單片機一直到到現在走了不少的彎路,也無人去引導,所以學習的深度仍然不夠深刻,所以這些項目中可能會包含一些錯誤的見解,還請各位佬可以不吝賜教,謝謝大家,下面開始我的分享內容了。
一、關于準備電賽第一步,復刻21年電賽送藥小車
我參加21年電賽時是個菜鳥,當時也沒能幫上學長的忙,因此自己也心存遺憾,于是在備戰23年電賽時我選擇完成當年的遺憾。
對于21年電賽的內容我就不做過多的講解,賽題可以在網上找到的哈,大家可以看看哈,當然要是不想找,我也給出地址供大家查看哈:
下面說一下我對于21年電賽的思路吧,這個思路適合能力一般的同學哈,大佬們的方案更快更穩,但是同時也對于知識的要求更加嚴格,我選擇的是“編碼器定脈沖“的思路,也是就為賽道量身定做一套行駛的函數,因為21年的送藥小車的賽道距離是固定的,那么我們只需要保證我們函數運行距離的準確性即可,其實做到最后也就是調參啦。
那么說完了我們的車該怎么跑,下面說說各個病房要怎么去吧:
1.對于近端病房
近端病房位置是固定的,我們大可不必耗費時間以及攝像頭的算力去進行計算,大可以直接寫死程序,簡單、明了、迅速。對于能力一般的同學來說這就是最優解,那我們來說說怎么做吧,第一步:給攝像頭看1或者2的數字,第二步:直行到第一個十字路口,第三步:是1就左拐是2就右拐,第四步:走到終點后停下。這便是去的思路,回來時啊也是走固定的距離,但是你可以選擇倒車回來也可以選擇原地打轉180度都是可以的,我這里是直接倒車,當然我的隊友選擇MPU6050轉向環直接準確180度回旋,走的結果是一樣的,但是很明顯轉向環更加漂亮。這便是我的思路。
2.對于中、遠端病房
中端和遠端的方法我就放在一起講了,因為前面小車行進的方法已經說的很明白了哈,剩下的就看看攝像頭啦! 先說攝像頭哈,我個人專注C的程序,我的隊友偏向于搞K210這些,當然我用的是OPENMV,兩者可以說是一樣的哈,廢話不說,我直接告訴大家我的數字識別思路,就是模板匹配,多個模板匹配也就是ctrl+c然后ctrl+v哈,給各位看看openmv的模板匹配的代碼!具@里不給大家講這個OPENMV的編程方法了嗷,奉上官方教程更加的權威:book.openmv cc/image/template-match.html】 - template = image.Image("/template.pgm")//下面說一些關鍵的代碼
復制代碼- r = img.find_template(template, 0.70, step=4, search=SEARCH_EX)
復制代碼 也就是說啊,我們只需要錄入模板即可實現數字識別啦,但是啊這個不是特別穩定,最好還是能訓練一下模型去運行這樣識別的精準度會很好,關于如何訓練的問題,網上有很多講解的,但是有一點就是,我更加推薦K210使用訓練的模型,因為它的算力比較高運行起來也更好。在文章的末尾我會給出我的openmv代碼給大家參考的。 3.openmv與stm32的通信
openmv也是STM32啦其實,所以效果是一樣的,我們先來說說openmv該怎么發送數據給STM32吧:
我們定義一個openmv的串口發送函數: - def sending_data(cx,cy,x_flag,y_flag):
- global uart;
- data = bytearray([0x2C,0x12,cx,cy,x_flag,y_flag,0x5B])#這個函數可以將我們的數據打包成16進制的一幀數據包,也是十分的方便哈
- uart.write(data) #這個函數就是串口發送函數了
復制代碼 那既然openmv發了數據,接下來就看看STM32怎么去接收吧: 1.首先定義一個函數,然后這個函數的特性就是一個字節一個字節的處理 2.進行一些自己定義的規則判斷
串口的處理其實并不困難,大家拿到代碼認真分析即可明白其中的意思,這個代碼我也將放置在文末。 二、總結 我是這樣打算的,我分幾期和大家分享這些內容,這個作為第一期吧,主要分享21年電賽送藥小車的思路以及一些源碼哈,大家等我后面更新吧,大家對于我分享的代碼有疑問的話可以在評論區提出來哈,或者有更好的思路,都可以提出,大家一起進步,志同道合的人總會走到一起的! 不多說,我先奉上我的代碼了【恰點黑幣啦,嘻嘻】。 |