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