树莓派+Ardunio的魔方机器人
一個多月沒有冒頭寫點東西了 因為一直在忙著畢業前的大項目 這一個月啃了安卓 初識了Python圖像處理 最大的重頭戲還是這個魔方機器人 現在正好閑下來了 把這個機器人項目中的一些東西做一下總結
先上一個完工圖
1、功能模塊圖
整個機器人分為兩大功能區
上位機:樹莓派作為上位機,從四個攝像頭捕捉整個魔方六面的情況,按照算法將每一面的顏色塊填充到Kociemba中即可到到對應的魔方解法,解法作為輸出給到Ardunio中
下位機:Ardunio作為下位機 ,接收從樹莓派中傳過來的解法步驟 控制電機進行相應的解魔方步驟
2、Ardunio uno
下位機主要進行的是接收樹莓派發送來的串口信息和電機驅動
Ardunio中自帶步進電機控制相關的庫AccelStepper.h
這一部分的代碼邏輯流程圖如下:
主要包括三個主要的function:Void serialEvent()、void checkStringCase(String str[])、void checkEachCase()
Void serialEvent()
每次樹莓派發送數據時,它都會將數據傳遞給這個函數,然后它會檢查是否有數據進來。如果是,則通過循環將傳入的字符串讀入comdata。
由于我們需要一步一步地執行Raspberry傳遞的步驟,并一步一步地執行旋轉,所以我們需要將傳遞的字符串轉換為字符串數組(字符串readFromGPIO[])
從串口中讀取字符串并將字符串切割成字符串數組:
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[])
在將字符串分割成字符串數組之后,字符串數組中的每一項都通過checkCase()函數通過一個循環傳遞
void checkEachCase()
對傳入的每個字符串執行相應的旋轉函數,如果字符串是“F”而非順時針旋轉90°,如果字符串是“F”而非逆時針旋轉90°,以此類推
3、USB串口通信
本來的想法是通過GPIO引腳進行通信,畢竟只需要樹莓派向Ardunio發送數據,只需要一個引腳就夠了,但是后來看了下樹莓派的GPIO輸出是3.3V,而Ardunio接收需要5V,所以才選擇了USB串口通信
在樹莓派終端輸入ls /dev/tty*,查看兩個連接端口的名稱。檢查是否有任何ttyACM0文件(注意,這僅在兩個硬件usb連接時可用。如果兩者沒有連接,就沒有)
最新的系統一般是自動生成的。看到ttyACM0意味著兩者可以通信。接下來,讓我們測試代碼。
樹莓派端的代碼:
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代碼只是示例的一部分,我們在工程文件中編寫了使用USB連接樹莓派-3的代碼
有關Ardunio和樹莓派通信的內容可以看這一篇博客:樹莓派與arduino通信
4、使用攝像頭及openCV對魔方顏色進行檢測識別
能完整拍下一個正方形6面的最小攝像頭數要求是2個
在我們的項目中因為臺架遮擋的原因 一共用了四個攝像頭 然后對四個攝像頭獲取到的顏色塊再進行拼接 如下圖所示:
解魔方的算法用的是Kociemba算法 github上直接有算法的源碼以及 使用方法
傳送門:kociemba算法
kociemba算法在主要的思想就是檢測每一面的每一個小塊顏色并按照下邊的樣式將魔方6面展開
展開后的六面顏色信息可以成為一個數組
如下 這是魔方還原時候顏色的狀態 可以看到在第二行的數組其實就代表了 下面展開后六面顏色情況的一個數組
整個樹莓派的代碼放不上來 有需要的可以私信找我要喔~
就簡單說說邏輯:
1.完整的代碼在名為“Cube_project”的包下。
2.其中包含一個main.py文件,幫助執行從“Kociemba”獲得的解決方案的完整顏色檢測和傳輸。
3.Main函數從調用Camera_1_data.py函數開始:
?,它獲取從相機捕獲的圖像的X和Y坐標。
?,然后從common.py中獲取顏色邊界。
?,并根據給定的坐標檢測顏色。
?,并返回顏色,將它們放置在檢測到的臉的例子,如頂部,左邊,右邊等。
4.按照Kociemba提到的格式追加完整數據“uuuuuuurrrrrrrfffffffffddddddddlllllllbbbbbbbbb”。
5.上面的函數返回兩個值,其中一個返回一個標志(true或false),它檢查所有的面是否只有9種顏色,其他的值。
6.cube_rep.py顯示當前檢測到的顏色如下所示(魔方打亂了):
7.如果標志為真,那么附加的數據將被傳遞給cube_algorithm.py中的Kociemba算法。
8.而得到的解以下面的格式放置為字符串“R ', F, U, U '”。
9.然后這個字符串被傳遞給Arduino并從Arduino得到一個反饋,不管它是否收到了反饋。
10.如果標志為false,則顯示一條錯誤消息“發現了一些問題,您需要調試這個問題”。
11.如果攝像機連接在正確的位置,只需要運行main.py文件。
具體openCV如何檢測魔方上的顏色等后面寫圖像處理的總結時候再詳細寫寫
不足點總結:
1,顏色識別的時候受環境光的影響很大 太暗和太亮都會影響識別 有沒有大佬分享一下怎么提升的 😜
2,電機的控制沒有閉環 使用encoder會保證電機轉動更加準確
總結
以上是生活随笔為你收集整理的树莓派+Ardunio的魔方机器人的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 夜深模拟器安装的一些问题
- 下一篇: 数据统计与分析基础实验一:基本语法与运算