設(shè)計一款顏色分類機器人,用于投票系統(tǒng)
計票臺
用紅色、黃色和綠色的珠子填充頭部。按下按鈕。頭部開始數(shù)所有珠子,根據(jù)顏色將它們吐到不同的罐子里,并在一個小顯示器上更新顏色計數(shù)。
在我們的工作社區(qū),我們使用投票系統(tǒng)來告訴我們一周過得怎么樣。
人們摘下一顆珠子,放在罐子里。綠色表示“我這周過得很好”,黃色表示“這周還行”,紅色表示“糟糕的一周”。有人數(shù)了數(shù)所有的顏色并做了一個報告。我做了這個計票臺來處理計票過程。
設(shè)計
我用橡皮泥做了一個模型。我做了一個3D掃描,并在Tinkercad中做了進一步的編輯。為了能夠進行最終的設(shè)計和彩色打印(不一定是原始顏色),我需要使用Autodesk Fusion,它可以處理原始的80 MB掃描模型的全彩。
原則
小精靈的頭上有一個漏斗狀的洞,要用珠子填滿。珠子一個接一個地穿過管子,停在管子的底部。顏色傳感器讀取顏色。整個頭部隨之旋轉(zhuǎn),而珠子繼續(xù)從精靈的嘴里滾出來,沿著它的舌頭滾進罐子里,同時顏色計數(shù)也在更新。整個過程由智能手機控制。
Detaileddescription
頭部在推力軸承上旋轉(zhuǎn),推力軸承由螺栓固定在底板上的環(huán)形齒輪組成。環(huán)形齒輪有8個軸承球的凹槽。頭部的底部有一個類似的凹槽,允許頭部在球上旋轉(zhuǎn)。行星齒輪系統(tǒng)由連接在頭部的連續(xù)伺服電機提供動力,旋轉(zhuǎn)太陽齒輪。附在頭部的兩個行星齒輪將動力傳遞給環(huán)形齒輪。其中一個行星齒輪上有脈沖探測器的標(biāo)記,用來測量運動的量。
當(dāng)一個珠子落入漏斗管時,它停在鰭狀部分,一個象限形狀的部分。當(dāng)鰭狀肢處于最遠(yuǎn)的位置時,魚頭落入鰭狀肢的一個洞中。鰭狀肢移動一點,將頭部放置在顏色傳感器下。確定顏色后,轉(zhuǎn)動頭部,使舌頭指向正確的罐子。鰭進一步旋轉(zhuǎn),魚頭落入下一個管子,讓魚頭從嘴中滾出來。這時,下一顆珠子已經(jīng)落入漏斗的管中,并停在了鰭上。
更詳細(xì)的描述
一顆珠子落在鰭狀肢上。
鰭狀肢旋轉(zhuǎn),使珠子落入鰭狀肢的孔中。鰭狀肢的高度將只適合孔中的一個頭。
腳蹼旋轉(zhuǎn),使頭部放置在LDR/RGB LED單元(顏色傳感器)上?,F(xiàn)在顏色確定了。黑色頂板和黑色底板將顏色檢測單元與環(huán)境光隔離。鰭狀肢必須是黑色的。在這一點上,整個頭部需要旋轉(zhuǎn),使其落入正確的罐子。
最后,鰭狀肢旋轉(zhuǎn)到初始位置,讓魚頭落入喉管,并進一步離開口腔,沿著舌頭滾下。下一個珠子很有可能落在鰭狀肢上。
LDR/RGB LED單元
通過這種設(shè)計,極少的環(huán)境光應(yīng)該進入為顏色識別過程而創(chuàng)建的房間。但是,在連續(xù)點亮紅、藍(lán)、綠led燈之前,也可以測量完全的暗度,作為參考值。該值可以從每個顏色值中減去。
從一個空的房間里得到回應(yīng)也很重要。環(huán)境光和紅、綠、藍(lán)光的響應(yīng)。
如果環(huán)境光看起來不重要(無論房間的照明是什么,或者房間里是否有一個頭,LDR都會給出相同的響應(yīng)),我將很高興地忽略所有與環(huán)境光有關(guān)的內(nèi)容。在這種情況下,我可以簡單地得到四種不同情況的RGB配置文件。使用10位AD引腳,RGB三元組值可能類似于:
?紅珠(600,150,170)
?綠珠(120、850、130)
?黃珠(580,730,140)
?無正面(100,130,70)
每個RGB三元組都是3D色彩空間中的一個點。當(dāng)一個新的珠子被檢查時,它的顏色輪廓在空間中形成一個點。使用3D畢達(dá)哥拉斯算法,計算到每個已知顏色(或沒有頭盒)的距離,以找出最可能的顏色。如果沒有檢測到明顯的顏色,要么是新的顏色,要么是槍頭在槍膛中的位置不合適。腔內(nèi)的底板應(yīng)引導(dǎo)焊頭到一個位置。在模棱兩可的情況下,鰭狀肢可以前后旋轉(zhuǎn)以使頭部處于更好的位置。
需要考慮的事情
如果LDR/RGB LED方法似乎不可靠,RGB三元組可以轉(zhuǎn)換為另一種顏色空間,如HSV,其中更多的重點可以給予H通道。
如果燈頭的光滑表面反射太多顏色,RGB LED的效果可以使用PWM降低。我們想創(chuàng)造一種情況,只有珠子的真實顏色被LDR反射和捕捉。
由于小精靈的設(shè)計,整個結(jié)構(gòu)根據(jù)確定的顏色旋轉(zhuǎn)。頭部位于固定的環(huán)形基座的頂部,該基座具有作為軸向或推力球軸承的圓形凹槽。環(huán)的內(nèi)緣在行星齒輪中起環(huán)形齒輪的作用。
為了完成推力軸承,頭部部分的底部有類似的凹槽,允許頭部以低摩擦旋轉(zhuǎn)。連續(xù)伺服電機附在太陽齒輪上。太陽齒輪兩側(cè)的兩個行星齒輪將運動傳遞給環(huán)形齒輪。嗯,環(huán)形齒輪是固定的,使行星和太陽旋轉(zhuǎn)。整個頭部與行星一起旋轉(zhuǎn),行星的軸線牢牢地固定在頭部底部。
除鋼珠外,其余部件均為3D打印PLA。編碼器齒輪(行星齒輪之一)以黑色PLA印刷,在頂層有白色圖案,以創(chuàng)建紅外傳感器的圖案。環(huán)形齒輪有84個齒。行星各有35顆牙齒,太陽有14顆牙齒。編碼輪圖案有8個白色扇區(qū)。我將只計算8個部門,而不是16個過渡。
當(dāng)編碼輪的35個齒通過時,它已經(jīng)進行了一次革命。并行進了84個齒圈齒輪中的35個齒。360度的35/84等于150度。我很想增加編碼器齒輪上的扇區(qū)數(shù)量。有10個扇形,一個扇形對應(yīng)15度,這是一個很好的角度,可以達(dá)到30度、45度、60度、90度、120度或360度的任何簡單分?jǐn)?shù)。
如果我堅持8個扇形,其中一個扇形是18.75度。如果我需要更好的分辨率,我不僅可以數(shù)出一種顏色的8個區(qū)域,還可以數(shù)出從一種顏色到另一種顏色的16個過渡。
紅外傳感器工作與模擬輸入引腳。我將只使用一個紅外LED/光敏電阻單元,沒有自己的AD電路。
光敏電阻將根據(jù)它接收到的紅外光量產(chǎn)生一個可測量的電壓。編碼器輪有白色和黑色的部分。所以當(dāng)輪子轉(zhuǎn)動的時候會有一個最大值和最小值。從白色到黑色的轉(zhuǎn)換,以及在兩個方向上的反之亦然,必須對系統(tǒng)進行校準(zhǔn),以便能夠控制兩個方向的旋轉(zhuǎn),并且能夠計數(shù)不是8個轉(zhuǎn)換,而是16個轉(zhuǎn)換,給出9.375度的分辨率。進一步的改進將需要在編碼器齒輪或連續(xù)伺服電機的定時控制上增加更多的扇區(qū):測量轉(zhuǎn)換之間的時間。將該時間分成更小的單位,并在精確的時間停止電機以達(dá)到所需的位置。
但在測試之前,我不能確定扇區(qū)的大小是否相等。只有一個傳感器,我無法確定旋轉(zhuǎn)的方向。我必須依賴于我的程序知道它旋轉(zhuǎn)頭部的方向。
機頭和所有運動部件的重量都在8個軸承鋼球上,這些鋼球沿著文具環(huán)齒輪的凹槽滾動。球環(huán)將所有8個球固定在適當(dāng)?shù)奈恢?。由于有彈性的塑料,這些球很容易被推入環(huán)中。當(dāng)球滾動時,沒有外力作用在環(huán)上,只有輕微的摩擦。所有的力都作用于球和齒環(huán)上的凹槽以及機頭的底部。
測試打印件
頭部有一個相當(dāng)復(fù)雜的底部部分,它附加到一個固定在桌面的環(huán)齒輪,并持有伺服與太陽齒輪和兩個行星齒輪與球軸承和TCRT5000模塊的編碼器齒輪(其中一個行星齒輪)。所以我做了一個測試,看看它是否有效。下面是它的實際應(yīng)用:
注意TCRT5000的紅外LED的發(fā)光。
我有一個穩(wěn)定的旋轉(zhuǎn)速度,并測量了TCRT5000的輸出:
我很有信心,我可以得到非常準(zhǔn)確的讀數(shù)從編碼輪。在我的測試打印中,TCRE5000距離編碼器齒輪只有1毫米,而它應(yīng)該是5毫米。最后的打印,我會加一些毫米。
波浪模式表明,3D打印的編碼輪不是很精確。車輪是用黑色PLA 3D打印的。在頂層,我為編碼員放置了一個圖案。圖案是在白色PLA印刷,但因為它只是一層,結(jié)果是有點灰色,不是很均勻。我可能會用激光切割一塊白色的薄膠粘塑料片,并加上相同的圖案,以獲得更均勻,更反光的表面。
編碼器輪的詳細(xì)描述
如圖所示,來自紅外光電晶體管的信號大致遵循正弦波。浪頂?shù)闹禃兓?,浪底的值也會變化。最小浪頂?95度左右。最大浪底在220左右。我們可以肯定地說,410的值既不是頂部,也不是底部。
現(xiàn)在我們準(zhǔn)備好實際計算輪子的8個白色部分和8個黑色部分,每個部分的粗略精度為9度(見前面的章節(jié))。我們可以通過檢查變化量來找到扇區(qū)的中間位置。首先,我們可能需要一些過濾。假設(shè)我們?nèi)〖t外光電晶體管最后三個讀數(shù)的平均值。我們將該值與之前的讀數(shù)(這是連續(xù)三次讀數(shù)的平均值)進行比較。如果變化率改變符號,我們在波浪的頂部或底部。我們檢查實際讀數(shù)是高于還是低于410,以確定它是哪一個。這樣我們就可以檢測到16個扇區(qū)中的每一個。如果有很多噪音,比如環(huán)境紅外光,我們可能會得到不想要的標(biāo)志變化。
如果由于噪聲導(dǎo)致變化率的符號變化太多,我們需要一個更好的濾波器。無論如何,如果波浪的頂部相距18度,一個頂部與前一個底部相距9度,如果,由于噪聲,我們有兩個頂部,這些頂部可能彼此相距只有1或2度,它們中的任何一個都足夠好。當(dāng)磁頭旋轉(zhuǎn)時,編碼器的邏輯必須每次都知道變化的方向,以及我們是在全波的下半部分還是上半部分。這種準(zhǔn)確性來自于這樣一個事實,即當(dāng)我們不太確定我們是在波浪的上半部分還是下半部分時,我們對變化率有一個非常清晰的解讀。它接近最大正電荷率或最小負(fù)電荷率。當(dāng)我們處于零變化率時,變化率本身無法判斷我們是處于頂端還是底部。但是光電晶體管的絕對值肯定會告訴我們是在頂部還是底部。
通過這種方式,我們將達(dá)到旋轉(zhuǎn)頭部大約9度的分辨率。將分辨率進一步擴展到4.5度,將要求我們檢測到紅外光電晶體管讀數(shù)絕對值的“符號變化”。如果我們把415的平均值設(shè)為0。但正如波形圖所示,415的平均值并不適用于8個波長中的每一個。
當(dāng)編碼器輪旋轉(zhuǎn)時,速率的變化當(dāng)然取決于旋轉(zhuǎn)速度。
…我們看到,紅色曲線(余弦)顯示了藍(lán)色曲線(正弦)的變化率。當(dāng)藍(lán)色曲線從正變?yōu)樨?fù)或反之時,很容易檢測到。當(dāng)藍(lán)色曲線是水平的時候,無論是在頂部還是底部,都很難看到。但當(dāng)紅色曲線從正變?yōu)樨?fù)或反之時,就會發(fā)生這種情況,這更容易檢測到。
編碼器工作流程
1. 檢測最近的頂部或底部。讓它成為你的起點。
2. 要在一個方向上移動n步(每步9度),開始移動,直到讀數(shù)出現(xiàn)符號變化。
3. 繼續(xù)移動直到一階導(dǎo)數(shù)的符號改變。把這算作一個步驟,然后繼續(xù),直到你有n個步驟。
4. 在每個止損點,記住止損點是在波浪的底部還是頂部。知道在閱讀時你要找的符號變化是什么。知道一階導(dǎo)數(shù)的符號變化是多少你想把它算作一個階躍。
從第一步開始,可以找到最近的頂部或底部如下:
檢查初始讀數(shù)。如果高于405,我們正在尋找頂部。向一個方向旋轉(zhuǎn)并計算變化率。如果它是正的,繼續(xù)直到它變成負(fù)的,停在那里,你在頂部。如果它是負(fù)的,改變方向,旋轉(zhuǎn)直到它變成負(fù)的,停在那里,你在頂部。
如果初始讀數(shù)低于405,則與上述方法相反。
工作流程
當(dāng)電源打開時,機器等待一個珠子落入漏斗管。當(dāng)這種情況發(fā)生時,它會再等待10秒,以防用戶仍然添加珠子。
如果沒有珠子落入管中,機器會要求用戶用珠子填充頭部并攪拌。
當(dāng)?shù)谝粋€珠子落入管中10秒后開始排序時,執(zhí)行以下程序流程:
1. 讀珠子的顏色。如果這是第一個一種顏色的珠子,就唱首歌。旋轉(zhuǎn)到相應(yīng)的jar4。前后旋轉(zhuǎn)塞子以釋放珠子,并讓下一個珠子落在顏色傳感器上。如果顏色傳感器看到一個新的頭,跳到1 5.1,如果沒有看到新的頭,來回旋轉(zhuǎn)頭,并在5.1多次嘗試后跳到5 5.2,說“我想這就是全部?;蛘吣銘?yīng)該攪動這些珠子?”如果看到一個新的頭,跳到56。大聲讀出測試結(jié)果并要求用戶關(guān)閉電源
顏色傳感器
我有一個Adafruit TSL2591光傳感器。這有點過分了,我會把它留到更重要的事情上。我在某個地方也有一個真正的顏色傳感器,但由于這個項目只需要檢測三種顏色,所以我不會在這個項目上浪費它。此外,它沒有增加有趣和復(fù)雜的挑戰(zhàn)。所以我選擇一個RGB LED和一個光相關(guān)電阻(LDR)。
當(dāng)珠子落入漏斗管并停在塞子處時,RGB LED在珠子上連續(xù)發(fā)出紅、綠、藍(lán)三色光。LDR測量從頭部反射的光量。每種顏色都會形成自己可識別的“光譜”。為了得到每種顏色的“三波段光譜”平均值,需要進行大量的測量。
電路
4 *節(jié)aa電池
2臺伺服電機
1議長
開關(guān)
印刷電路板
由于比賽的延誤,我沒有時間從PCBWay訂購PCB,一旦我收到了所有其他硬件,所以我使用CNC路由器自己制作。我描述了這個項目的程序。
這是在EasyEDA中設(shè)計的PCB。再一次,由于延遲,我在拿到硬件之前就終止了對歐特克的訂閱。
上部有我在這個項目中需要的所有引腳。我還在下部安裝了10個引腳,主要是為了穩(wěn)定。我焊接頭到每個孔有一個銅線貫穿。如果我想稍后向Ballothar添加功能,則下部的銅跡線將提供對額外引腳的訪問。
簡而言之,我將設(shè)計導(dǎo)出到SVG文件,其中有銅線和孔。我把它讀進了Inkscape,在那里我把所有東西都變成了g代碼。所有的孔將是1毫米鉆頭的任務(wù),所有的銅跡將是另一個任務(wù),研磨到銅表面的路由器鉆頭。
結(jié)果如下:
我做了一個糟糕的工作,定位之前的路由開始。最上面的一個痕跡沒有它應(yīng)有的那么寬。幸運的是,這只是一條數(shù)字信號線,不是電源線。另一個是接地,但它只在那一點接地Arduino板,所以沒有大電流!
放大:
重要的是要清潔表面,去除所有脫落的薄片。
PCB的一個重要特征是它位于Arduino Giga的背面引腳上。太糟糕了,背面引腳不包括任何模擬引腳,因此我需要兩根電線從PCB上穿過千兆級的螺絲孔,到千兆級前面的兩個模擬引腳。
外殼
我在他的后腦殼上開了兩個洞來裝上Arduino Giga和電池組。
Arduino的蓋子有四個釘子來固定它。由于測量錯誤,電池槽太窄了,所以我需要在蓋子上添加一些細(xì)節(jié)來匹配頭部的表面。
而不是掛鉤,這蓋簡單地適合到插槽依偎。
末附加組件
當(dāng)頭部準(zhǔn)備打印時,我發(fā)現(xiàn)我打算使用的漏斗有點太高了。所以我在頭部加了一個“皇冠”來抬高它一點。因為Arduino Giga有無數(shù)的引腳,我也可以添加一些閃爍的LED。
本文編譯自hackster.io