日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

树莓派+Ardunio的魔方机器人

發(fā)布時(shí)間:2023/12/8 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 树莓派+Ardunio的魔方机器人 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一個(gè)多月沒(méi)有冒頭寫(xiě)點(diǎn)東西了 因?yàn)橐恢痹诿χ厴I(yè)前的大項(xiàng)目 這一個(gè)月啃了安卓 初識(shí)了Python圖像處理 最大的重頭戲還是這個(gè)魔方機(jī)器人 現(xiàn)在正好閑下來(lái)了 把這個(gè)機(jī)器人項(xiàng)目中的一些東西做一下總結(jié)

先上一個(gè)完工圖

1、功能模塊圖

整個(gè)機(jī)器人分為兩大功能區(qū)
上位機(jī):樹(shù)莓派作為上位機(jī),從四個(gè)攝像頭捕捉整個(gè)魔方六面的情況,按照算法將每一面的顏色塊填充到Kociemba中即可到到對(duì)應(yīng)的魔方解法,解法作為輸出給到Ardunio中
下位機(jī):Ardunio作為下位機(jī) ,接收從樹(shù)莓派中傳過(guò)來(lái)的解法步驟 控制電機(jī)進(jìn)行相應(yīng)的解魔方步驟

2、Ardunio uno


下位機(jī)主要進(jìn)行的是接收樹(shù)莓派發(fā)送來(lái)的串口信息和電機(jī)驅(qū)動(dòng)
Ardunio中自帶步進(jìn)電機(jī)控制相關(guān)的庫(kù)AccelStepper.h
這一部分的代碼邏輯流程圖如下:

主要包括三個(gè)主要的function:Void serialEvent()、void checkStringCase(String str[])、void checkEachCase()

Void serialEvent()
每次樹(shù)莓派發(fā)送數(shù)據(jù)時(shí),它都會(huì)將數(shù)據(jù)傳遞給這個(gè)函數(shù),然后它會(huì)檢查是否有數(shù)據(jù)進(jìn)來(lái)。如果是,則通過(guò)循環(huán)將傳入的字符串讀入comdata。

由于我們需要一步一步地執(zhí)行Raspberry傳遞的步驟,并一步一步地執(zhí)行旋轉(zhuǎn),所以我們需要將傳遞的字符串轉(zhuǎn)換為字符串?dāng)?shù)組(字符串readFromGPIO[])

從串口中讀取字符串并將字符串切割成字符串?dāng)?shù)組:

String readFromGPIO[40];//read string form GIOP while (Serial.available() > 0) {comdata += char(Serial.read());delay(2);}//change string into string arrayif (comdata.length() > 0){ int pos = 0; for(int i=0;i<comdata.length();i++){if(comdata[i] != ',')//','as the separator{readFromGPIO[pos] += comdata[i];Serial.println(readFromGPIO[pos] ); }else{pos++;}}

void checkStringCase(String str[])
在將字符串分割成字符串?dāng)?shù)組之后,字符串?dāng)?shù)組中的每一項(xiàng)都通過(guò)checkCase()函數(shù)通過(guò)一個(gè)循環(huán)傳遞

void checkEachCase()
對(duì)傳入的每個(gè)字符串執(zhí)行相應(yīng)的旋轉(zhuǎn)函數(shù),如果字符串是“F”而非順時(shí)針旋轉(zhuǎn)90°,如果字符串是“F”而非逆時(shí)針旋轉(zhuǎn)90°,以此類推

3、USB串口通信


本來(lái)的想法是通過(guò)GPIO引腳進(jìn)行通信,畢竟只需要樹(shù)莓派向Ardunio發(fā)送數(shù)據(jù),只需要一個(gè)引腳就夠了,但是后來(lái)看了下樹(shù)莓派的GPIO輸出是3.3V,而Ardunio接收需要5V,所以才選擇了USB串口通信

在樹(shù)莓派終端輸入ls /dev/tty*,查看兩個(gè)連接端口的名稱。檢查是否有任何ttyACM0文件(注意,這僅在兩個(gè)硬件usb連接時(shí)可用。如果兩者沒(méi)有連接,就沒(méi)有)

最新的系統(tǒng)一般是自動(dòng)生成的。看到ttyACM0意味著兩者可以通信。接下來(lái),讓我們測(cè)試代碼。
樹(shù)莓派端的代碼:

#import serial #import serial module ser = serial.Serial('/dev/ttyACM0', 9600,timeout=1); #open named port at 9600,1s timeout #try and except structure are exception handler try:while 1:ser.write('s'); #write a string to portresponse = ser.readall(); #read a string from portprint response; except:ser.close( );

Ardunio端的代碼:

void setup() { Serial.begin(9600); // 9600 bps }void loop() { if (Serial. available()) { if('s' == Serial.read()) Serial.println("Hello Raspberry,I am Arduino."); } }

上面的Arduino代碼只是示例的一部分,我們?cè)诠こ涛募芯帉?xiě)了使用USB連接樹(shù)莓派-3的代碼
有關(guān)Ardunio和樹(shù)莓派通信的內(nèi)容可以看這一篇博客:樹(shù)莓派與arduino通信

4、使用攝像頭及openCV對(duì)魔方顏色進(jìn)行檢測(cè)識(shí)別

能完整拍下一個(gè)正方形6面的最小攝像頭數(shù)要求是2個(gè)
在我們的項(xiàng)目中因?yàn)榕_(tái)架遮擋的原因 一共用了四個(gè)攝像頭 然后對(duì)四個(gè)攝像頭獲取到的顏色塊再進(jìn)行拼接 如下圖所示:

解魔方的算法用的是Kociemba算法 github上直接有算法的源碼以及 使用方法
傳送門(mén):kociemba算法

kociemba算法在主要的思想就是檢測(cè)每一面的每一個(gè)小塊顏色并按照下邊的樣式將魔方6面展開(kāi)

展開(kāi)后的六面顏色信息可以成為一個(gè)數(shù)組
如下 這是魔方還原時(shí)候顏色的狀態(tài) 可以看到在第二行的數(shù)組其實(shí)就代表了 下面展開(kāi)后六面顏色情況的一個(gè)數(shù)組

整個(gè)樹(shù)莓派的代碼放不上來(lái) 有需要的可以私信找我要喔~
就簡(jiǎn)單說(shuō)說(shuō)邏輯:

1.完整的代碼在名為“Cube_project”的包下。
2.其中包含一個(gè)main.py文件,幫助執(zhí)行從“Kociemba”獲得的解決方案的完整顏色檢測(cè)和傳輸。
3.Main函數(shù)從調(diào)用Camera_1_data.py函數(shù)開(kāi)始:
?,它獲取從相機(jī)捕獲的圖像的X和Y坐標(biāo)。
?,然后從common.py中獲取顏色邊界。
?,并根據(jù)給定的坐標(biāo)檢測(cè)顏色。
?,并返回顏色,將它們放置在檢測(cè)到的臉的例子,如頂部,左邊,右邊等。
4.按照Kociemba提到的格式追加完整數(shù)據(jù)“uuuuuuurrrrrrrfffffffffddddddddlllllllbbbbbbbbb”。
5.上面的函數(shù)返回兩個(gè)值,其中一個(gè)返回一個(gè)標(biāo)志(true或false),它檢查所有的面是否只有9種顏色,其他的值。
6.cube_rep.py顯示當(dāng)前檢測(cè)到的顏色如下所示(魔方打亂了):

7.如果標(biāo)志為真,那么附加的數(shù)據(jù)將被傳遞給cube_algorithm.py中的Kociemba算法。
8.而得到的解以下面的格式放置為字符串“R ', F, U, U '”。
9.然后這個(gè)字符串被傳遞給Arduino并從Arduino得到一個(gè)反饋,不管它是否收到了反饋。
10.如果標(biāo)志為false,則顯示一條錯(cuò)誤消息“發(fā)現(xiàn)了一些問(wèn)題,您需要調(diào)試這個(gè)問(wèn)題”。
11.如果攝像機(jī)連接在正確的位置,只需要運(yùn)行main.py文件。

具體openCV如何檢測(cè)魔方上的顏色等后面寫(xiě)圖像處理的總結(jié)時(shí)候再詳細(xì)寫(xiě)寫(xiě)

不足點(diǎn)總結(jié):
1,顏色識(shí)別的時(shí)候受環(huán)境光的影響很大 太暗和太亮都會(huì)影響識(shí)別 有沒(méi)有大佬分享一下怎么提升的 😜
2,電機(jī)的控制沒(méi)有閉環(huán) 使用encoder會(huì)保證電機(jī)轉(zhuǎn)動(dòng)更加準(zhǔn)確

總結(jié)

以上是生活随笔為你收集整理的树莓派+Ardunio的魔方机器人的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。