當前位置: 華文星空 > 知識

你有什麽有微控制器或開源硬體做的有意思的作品嗎?

2018-01-07知識
https://www.zhihu.com/video/935964261520474112

這個作品始於2016年上半年,應該是高一下學期開學沒多久,我奶奶轉了一個德國的魔術方塊機器人的視訊給我,視訊裏的機器在一秒鐘之內就復原了一個三階魔術方塊。我當時覺得特別有意思,因為我比較喜歡玩魔術方塊,當時又選修了有關Arduino的校本課程,就抱著試試看的心態準備自己做一個魔術方塊機器人。

中間遇到了特別多的困難,我也不是一直時間充裕,因此這個魔術方塊機器人斷斷續續到2017年11月才最終完成,復原了一個打亂的魔術方塊。制作過程就不贅述了,簡單介紹一下它本身吧。

先介紹一下工作流程。首先需要把打亂的魔術方塊以展開圖的形式把各個面各個色塊的顏色輸入電腦,執行一個C++(其實只是C with STL哈哈哈)程式輸出魔術方塊解法步驟。然後把解法復制到Arduino的程式碼裏,燒錄進微控制器。微控制器隨即控制步進電機執行解法,復原魔術方塊。復原過程平均來說在五秒鐘之內可以完成。

解魔術方塊的演算法叫 Thistlethwaite's Algorithm ,以群論為理論基礎求解魔術方塊。對於這個演算法來說,魔術方塊不再是由顏色,而是每個棱塊角塊的相對位置和朝向表達。因此,有別於人類使用的層先法,CFOP之類的方法,這個演算法極其抽象,但是優點是穩定高效,解法較短。感興趣的話可以戳這兩個連結深入了解一下:

總之,我是歷盡千辛萬苦才從互聯網的一個不知名的角落找到了一個仍能編譯執行的C++實作。我再自己寫了一段程式碼,把魔術方塊的顏色表達轉換為棱塊角塊相對位置的表達。拼起來以後就是求解魔術方塊的部份。

硬體部份主要用到了 Arduino MEGA2560 ,6組 42步進電機 + L298N ,和一個直流穩壓電源。我查了很多技術文件才終於把接線和控制程式碼對應起來,又歷經一番胡亂的調參,才終於實作了微控制器對步進電機的控制。

我使用的魔術方塊是 GAN356 ,一款容錯效能極佳的魔術方塊。但是還有一個至關重要的優點是它的中心塊可以開啟,並且是中空的,這就給連線步進電機提供了方便。

如圖,我測量了尺寸,設計出了連線件(聯想到了可以換多種頭的那種螺絲刀的介面設計),3D打印出了成品。7對小東西花了九十幾塊還不包郵,我買微控制器都只花了40不到啊,肉疼。

當我終於看到我的魔術方塊機器人復原了一個魔術方塊,而不是把它擰的更亂的時候我內心的成就感是爆棚的。這麽久的嘗試終於(居然??)有了結果。

現階段還有兩個遺憾。其一,我沒有想到一個好辦法做出一個穩定而又靈活能脫開的支架固定步進電機,每次都要靠手拼命按著步進電機才不會跑掉…… 另外,我需要人眼辨識顏色再輸入電腦,我想使用OpenCV或者Mathematica之類的做顏色辨識,苦於水平有限,沒有什麽好的想法。知乎上大神雲集,回答這個問題的最大原因就是希望有人提供點幫助。

更多有關程式碼和魔術方塊機器人本身的內容我在Arduino中文社群發帖寫過。

最後放一下GitHub連結。Arduino的程式碼都是原創的,SOLVECUBE.cpp裏面中文註釋部份是原創的。

2018.1.19 更新

https://www.zhihu.com/video/937796539515637760

這個視訊是我做的一個演示。我最近找到了一個 在GitHub開源的 整合了魔術方塊動態顏色辨識、即時求解的工具。 作者是Daniel Walton 。我在演示視訊中先把復原的魔術方塊按照隨機的打亂公式打亂,再使用這個工具進行顏色辨識和求解,並成功復原了打亂的魔術方塊。

這個工具非常的強大和友好。我所做的只不過是調整了幾千行中報錯的那幾行,出錯原因應該只是我的OpenCV和Python版本和作者的有些出入而已。整個軟體是基於Python的,用到了電腦的前置網路攝影機做即時的色塊檢測,並讀取RGB值,即時顯示在左邊。記錄下整個魔術方塊54個色塊的RGB數值後,另一個程式會根據這些數值確定魔術方塊每個色塊的顏色。一旦得到了每個色塊的顏色,軟體會呼叫一個用C寫成的Kociemba Solver 它使用了 Herbert Kociemba's two-phase algorithm ,據說這是我之前用的那個演算法和實作方式的全面升級版(原理是相似的), 平均僅需20步 就能復原三階魔術方塊。

雖然這完全不是我原創的,但是我還是想來分享一下這個國外大神的計畫。如果涉及到任何侵權之類的問題,我會刪除相關內容,並且不會把它們用在我的魔術方塊機器人裏。