找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 4295|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

制作麥克風(fēng)滾輪(牛人作品我只是簡(jiǎn)單的翻譯了下)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主


你好,

我的目標(biāo)是建立一個(gè)藍(lán)牙控制的機(jī)器人,讓一個(gè)朋友在吉他/低音放大器前移動(dòng)麥克風(fēng)。這個(gè)機(jī)器人被音響工程師用來(lái)完美地將麥克風(fēng)放在揚(yáng)聲器前面的正確位置,以測(cè)試聲音,最終獲得最佳音質(zhì)。

我知道我還需要設(shè)計(jì)和編寫(xiě)一個(gè)帶有迷人用戶(hù)界面的應(yīng)用程序,用于任何Android智能手機(jī)移動(dòng)機(jī)器人。


該項(xiàng)目分為4個(gè)主要部分:

-電子硬件

-力學(xué)元素

-固件編程

-應(yīng)用程序開(kāi)發(fā)

這是一個(gè)非常多功能的項(xiàng)目,因?yàn)樗梢宰詣?dòng)和遠(yuǎn)程移動(dòng)其他東西,如一個(gè)微型投影儀,一盞燈或相機(jī)放在一個(gè)房間的天花板上。

我為這些照片道歉,因?yàn)槲曳浅嶂杂谥圃鞕C(jī)器人,所以沒(méi)有拍到令人滿(mǎn)意的照片。

請(qǐng)寫(xiě)信給我,以便進(jìn)一步解釋和評(píng)論。

玩得高興!

披露:我很喜歡做這個(gè)項(xiàng)目,它對(duì)我很好,但我不負(fù)責(zé)任何損害,可能發(fā)生在你身上。用電工作的人可能會(huì)受傷。這個(gè)項(xiàng)目的所有硬件都在非常低的電壓(12伏)下工作,所以這是不可能發(fā)生的,但在電子元件中總是會(huì)過(guò)熱和燃燒。此外,在建造這樣一個(gè)機(jī)械移動(dòng)機(jī)器人時(shí),非常重要的是要非常小心,因?yàn)槟愕氖挚赡軙?huì)被困在移動(dòng)部件中,最終可能會(huì)受傷。我推薦這個(gè)項(xiàng)目的人知道電子,機(jī)械和電氣工程至少在中級(jí)水平。

教程筆記:
第一步:電子“配料”




硬件:

-1 Arduino Uno(最好是原版)

-1個(gè)HC-06藍(lán)牙模塊

-1個(gè)數(shù)控屏蔽

-3個(gè)電流為1A的A4988驅(qū)動(dòng)器(或電流為2A的DRV8825)

-3 NEMA 17步進(jìn)電機(jī)(具有良好的扭矩),例如本電機(jī)或本電機(jī)

-2個(gè)微動(dòng)開(kāi)關(guān)

-1個(gè)12V 60W的電源驅(qū)動(dòng)程序例如

-1個(gè)EU連接器(示例)

-附加4極電纜


步驟2:機(jī)械零件



該項(xiàng)目的大多數(shù)機(jī)械元件都可以很容易地在網(wǎng)上找到。然而,電機(jī)的塑料支架是由我的一個(gè)朋友用3d打印機(jī)投影和制造的,另一個(gè)朋友用他的cnc銑削了中央電機(jī)(z軸)的鋁支架。



您可以看到最終裝配(在步驟4中),使用您喜愛(ài)的三維設(shè)計(jì)cam軟件在鏈接處制作這些零件,并將文件發(fā)送到本地fablab。你可以在這里找到你當(dāng)?shù)氐墓S(chǎng)實(shí)驗(yàn)室。它們將幫助您制作3D打印和數(shù)控銑削零件。



機(jī)械材料:

-2件60cm鋁擠壓35mmx35mm直線(xiàn)導(dǎo)軌(可在線(xiàn)查找)

-8個(gè)方位(確保與圖片中的方位相同。適用于鋁制直線(xiàn)導(dǎo)軌)

-1個(gè)3D打印機(jī)皮帶

-2個(gè)滑輪(見(jiàn)圖)

-2個(gè)用于電機(jī)的3D打印機(jī)械支架,這些零件用螺釘固定在鋁導(dǎo)軌上

-用于中央電機(jī)(Z軸)的數(shù)控銑削鋁支架。設(shè)計(jì)它,讓你當(dāng)?shù)氐墓S(chǎng)來(lái)做!

-任何電纜鏈或柔性電纜管,你可以在圖片中找到兩個(gè)例子

-安裝五金件的電箱


步驟3:電子組裝



現(xiàn)在我們只需要把硬件連接起來(lái)。

1)將防護(hù)罩放在Arduino頂部

2)將HC-06藍(lán)牙模塊連接到防護(hù)罩頂部的插腳上。

小心!看圖片2,你可以看到:

HC-06的TX將轉(zhuǎn)到Arduino的RX

HC-06的RX將傳送到Arduino的TX

3)連接微動(dòng)開(kāi)關(guān)或限位開(kāi)關(guān)。從下面的代碼中可以看出,微動(dòng)開(kāi)關(guān)的常開(kāi)觸點(diǎn)必須連接在插腳9和GND之間,以限制X軸;插腳10和GND之間,以限制Y軸。您不需要外部上拉或下推電阻器,因?yàn)槲覀儗⑹褂脙?nèi)置Arduino的內(nèi)部上拉電阻器。關(guān)于這個(gè)主題的更多信息可以在這里找到。

pinmode(9,input_pullup);

pinmode(10,輸入_pullup);

4)將步進(jìn)電機(jī)連接到屏蔽上,但要注意,因?yàn)槟梢钥吹讲竭M(jìn)電機(jī)表示為兩個(gè)感應(yīng)器,請(qǐng)按照屏蔽銷(xiāo)的順序?qū)⒏袘?yīng)器的右極連接到右銷(xiāo)。如果你搞砸了,不會(huì)發(fā)生什么嚴(yán)重的事情,但如果你搞砸了,要么馬達(dá)不動(dòng),要么會(huì)發(fā)出嘎嘎聲和震動(dòng)!

對(duì)于我使用過(guò)的電機(jī),電纜顏色如下:

A+黑色

A-綠色

B+紅色

B-藍(lán)色

我已經(jīng)附上步進(jìn)電機(jī)數(shù)據(jù)表,在那里你會(huì)發(fā)現(xiàn)所有的技術(shù)信息,因?yàn)槟憧梢钥吹竭@些步進(jìn)電機(jī)接受高達(dá)2A的電流每相。即使標(biāo)稱(chēng)電壓是2.2V,也不存在像我們這樣以12V的電壓驅(qū)動(dòng)它們的問(wèn)題。

小心!如果電機(jī)過(guò)熱,減小電流或插入降壓以降低電壓!

這個(gè)設(shè)置允許你使用電機(jī)的全部功率,你可以看到這些步進(jìn)電機(jī)有一個(gè)很好的扭矩曲線(xiàn)。即使轉(zhuǎn)速(每分鐘轉(zhuǎn)數(shù))增加,也會(huì)保持30ncm的扭矩。30ncm意味著在距離中心1cm處,它們可以旋轉(zhuǎn)約3kg的重量。這么小的馬達(dá)真讓人印象深刻!

5)驅(qū)動(dòng)器頂部有一個(gè)小螺釘,用于限制流向電機(jī)的電流量。如果你使用的是A4988(紅色的),你可以保持電流的大小不變,通常是1A。或者在上面使用一個(gè)更大的散熱器,把它也增加到1.5A。

如果您使用DRV8825(紫色的),您可以在2A驅(qū)動(dòng)電機(jī)。要測(cè)量電流,您需要一個(gè)串聯(lián)的數(shù)字萬(wàn)用表或臺(tái)式電源。

有時(shí)如果可能發(fā)生馬達(dá)發(fā)出一點(diǎn)煩人的嗡嗡聲,你必須調(diào)節(jié)電流直到嗡嗡聲消失,這是由寄生頻率引起的。

6)如果您愿意,可以將電源的EU接頭放在盒子的預(yù)先制作的孔中,并進(jìn)行一些焊接,以達(dá)到Arduino的車(chē)輛識(shí)別號(hào)針腳。12V線(xiàn)也意味著要連接到屏蔽上的藍(lán)色連接器,這是主線(xiàn),它將給步進(jìn)電機(jī)供電,并最終移動(dòng)您的軸。

小心!如果你顛倒了電機(jī)屏蔽上的正負(fù)極,你會(huì)燒掉它,使其無(wú)法使用。務(wù)必用萬(wàn)用表測(cè)量從電源到EU接頭,再到屏蔽電源接頭的導(dǎo)線(xiàn)極性。

7)把所有的電子設(shè)備放在盒子里,確保你在盒子里鉆孔,以便電纜能出來(lái)。我放了一些漂亮的銀PG7出來(lái)的盒子。

恭喜你搞定了這個(gè)亂七八糟的家伙!

stepper motor datasheet.pdf (140.25 KB, 下載次數(shù): 8)

Torque_Curve.pdf (133.26 KB, 下載次數(shù): 6)


步驟4:機(jī)械裝配



你可以自由地用你自己的創(chuàng)造力去嘗試,把軸承和支撐部件連接起來(lái),這兩個(gè)軸由鋁型材制成。

同時(shí)激發(fā)你的創(chuàng)造力,設(shè)計(jì)支持步進(jìn)電機(jī)。NEMA17是一個(gè)標(biāo)準(zhǔn),看看數(shù)據(jù)表中的電機(jī)機(jī)械規(guī)格,確保你設(shè)計(jì)了一個(gè)很好的支架,并用正確的螺栓將其固定在上面。

您可以設(shè)計(jì)支架并將其三維打印,例如第一張圖片,也可以用鋁制作支架。你需要有人的幫助,有一個(gè)數(shù)控銑床這樣做。

你將需要相當(dāng)精確和明智地使用你的卡尺來(lái)設(shè)計(jì)這些零件。

小提示:當(dāng)你設(shè)計(jì)兩個(gè)連接在一起的部件時(shí),我建議你在兩個(gè)部件之間留有0.2毫米或0.1毫米的公差。

從圖片中獲取主要想法,并使用您最喜歡的cam軟件進(jìn)行自己的設(shè)計(jì),一旦您將三維模型通過(guò)電子郵件發(fā)送到您當(dāng)?shù)氐膄ablab,他們將非常樂(lè)意使其成為現(xiàn)實(shí)。

你可以在這里找到你當(dāng)?shù)氐墓S(chǎng)實(shí)驗(yàn)室。


步驟5:使用app inventor開(kāi)發(fā)應(yīng)用程序




我用一個(gè)叫做app inventor的偉大的在線(xiàn)生成器設(shè)計(jì)了這個(gè)應(yīng)用程序。

你可以在這個(gè)鏈接上找到這個(gè)應(yīng)用程序。(你可以用你的谷歌賬號(hào)登錄)

或者您可以在下面下載.aia文件并將其導(dǎo)入到app inventor中。

我會(huì)解釋一下這個(gè)應(yīng)用程序:

1)重要的初始位是通過(guò)藍(lán)牙將應(yīng)用程序連接到機(jī)器人。

有一個(gè)帶有藍(lán)牙標(biāo)志的列表選擇器。當(dāng)用戶(hù)單擊它時(shí),將顯示可用的藍(lán)牙列表,用戶(hù)可以從HC-06連接到藍(lán)牙客戶(hù)端,該客戶(hù)端實(shí)際上是藍(lán)牙網(wǎng)絡(luò)。

顯示一條消息,說(shuō)明連接已發(fā)生,并顯示以下消息,告訴用戶(hù)打開(kāi)電機(jī)以向系統(tǒng)供電。

2)我想評(píng)論的另一點(diǎn)是命令。

-應(yīng)用程序?qū)⑼ㄟ^(guò)藍(lán)牙向Arduino發(fā)送不同的單個(gè)字符。

-我使用了簡(jiǎn)單的大寫(xiě)字母:例如,字母“d”是將x軸向后移動(dòng)的命令。同時(shí),此命令還會(huì)將應(yīng)用程序上的小麥克風(fēng)圖標(biāo)(ImageSprite1)向后移動(dòng)4像素。

-一些命令是:

A→Y軸前進(jìn),麥克風(fēng)圖標(biāo)4像素前進(jìn)

O→家

“G”→將當(dāng)前X和Y位置保存在插槽1中

“H”→從插槽1 X和Y位置加載,并將電機(jī)和麥克風(fēng)圖標(biāo)移到那里

3)用戶(hù)可以在250px x 250px畫(huà)布上拖動(dòng)小麥克風(fēng)圖標(biāo),無(wú)需使用箭頭即可移動(dòng)電機(jī)。這是一個(gè)有趣的特性,它是由一個(gè)名為imagesprite1.dragged的長(zhǎng)邏輯塊完成的。

-它獲取在畫(huà)布上拖動(dòng)圖像的像素位置。

-當(dāng)250 px的最大值對(duì)應(yīng)于72°電機(jī)的62次運(yùn)動(dòng)以到達(dá)鋁直線(xiàn)導(dǎo)軌的末端時(shí),進(jìn)行線(xiàn)性比例。這個(gè)比例允許Arduino知道馬達(dá)必須向前/向后旋轉(zhuǎn)到圖標(biāo)被拖動(dòng)的相應(yīng)位置的次數(shù)。

-例如,如果系統(tǒng)最初處于起始位置,則圖標(biāo)位于x=0px和y=0px

-用戶(hù)拖動(dòng)X=70px和Y=100px位置的圖標(biāo)

-比例后,電機(jī)運(yùn)動(dòng)為x1=17和y1=24

-一個(gè)類(lèi)似“.17,24*;”的命令字符串被發(fā)送到hc-06

-Arduino固件隨后將解析此字符串并相應(yīng)地移動(dòng)電機(jī)。這意味著X軸電機(jī)將向前旋轉(zhuǎn)17倍72°,Y軸電機(jī)將向前旋轉(zhuǎn)24倍72°。

小心!為了避免在拖動(dòng)圖像時(shí)反彈,并確保在用戶(hù)實(shí)際釋放拖動(dòng)圖標(biāo)時(shí)執(zhí)行正確的命令,我還必須插入塊imagesprite1.touchup

-在此塊中,發(fā)送一個(gè)簡(jiǎn)單的“u”字符,以確保當(dāng)Arduino找到“u”字符時(shí),它將執(zhí)行上一個(gè)最終命令字符串,但忽略上一個(gè)跳轉(zhuǎn)的字符串:

例如:“.12,19*;.14,22*;.17,24*;u”要執(zhí)行的正確命令是“u”之前的命令,也就是說(shuō)“.17,24*”,在有兩個(gè)彈跳接觸之前。我必須把這個(gè)插進(jìn)去,以避免彈跳的接觸,這是混亂的一切。

我希望通過(guò)這個(gè)解釋?zhuān)隳芨宄乜吹綉?yīng)用程序中的邏輯塊。不過(guò),你想學(xué)多久就學(xué)多久。你在下面找到.aia文件;蛘咧皇前惭b它并下載.apk文件。

Mic Roller.rar (4.98 MB, 下載次數(shù): 7)
GraphicBluetoothstepmotor_copy.rar (1.89 MB, 下載次數(shù): 8)


步驟6:Arduino固件




下面是所有C編程愛(ài)好者的部分。請(qǐng)隨意下載Arduino代碼,您可能會(huì)注意到某些部分可能會(huì)被修改和簡(jiǎn)化,但它仍然工作得很好。

此代碼中使用的最重要的庫(kù)是laurb9的步進(jìn)驅(qū)動(dòng)程序庫(kù),您可以在github上的以下鏈接中找到它

https://github.com/laurb9/steperdriver網(wǎng)站

我們最初使用這個(gè)庫(kù)定義步進(jìn)電機(jī),然后旋轉(zhuǎn)它們。

另一個(gè)重要的庫(kù)是Arduino Uno的EEPROM庫(kù),用于保存X、Y和Z軸的位置。

我已經(jīng)盡力盡可能多地引用代碼,給出每一位的所有可能的解釋。不過(guò),下面我也將進(jìn)一步評(píng)論一些內(nèi)容。

1)在void setup()部分中,代碼只執(zhí)行一次。在Arduino代碼的以下部分中,檢查是否存在串行通信,直到用戶(hù)發(fā)送ON命令,才發(fā)生任何事情。用戶(hù)按下后,等待的下一個(gè)命令是:

O→主命令

“Z”→“關(guān)閉”命令

do    //this cycle waits until someone click the ON button on the app{  if(Serial.available()>0)    {     state=Serial.read();      Serial.println(readString); //prints string to serial port out        }  }while(state!='V'); //system ON commanddigitalWrite(8, LOW); do //this cycle waits that the user push either Home Button or OFF button  {  if(Serial.available()>0)    {     state=Serial.read();      Serial.println(readString); //prints string to serial port out        }  } while((state!='O')&&(state!='Z'));
2)-你還記得在應(yīng)用程序中我們?cè)?jīng)發(fā)送命令'd'來(lái)向后發(fā)送馬達(dá)嗎?-你還記得我們把Y限位開(kāi)關(guān)連接到插腳10和GND?最初,我們檢查Y電機(jī)是否能夠?qū)嶋H后退:如果按下引腳10上的限位開(kāi)關(guān),Arduino將讀取GND,即使在應(yīng)用程序上按下后退按鈕,也不會(huì)發(fā)生任何事情。如果不按下限位開(kāi)關(guān),我們只需用簡(jiǎn)單的步進(jìn)指令將電機(jī)旋轉(zhuǎn)72°。旋轉(zhuǎn)(72)并減小1的y變量。if(limitYstate==HIGH)    { if(c == 'B')   //Y motor backward      {        stepperY.rotate(72); //the value is not negative because I mounted the motors upside-down in my assembly, sorry      delay(5);      Y--;      Serial.println("Y value, ");       Serial.println(Y);       Serial.println("Y motor backward");      readString="";           }    }3)這是一個(gè)難點(diǎn),基本上我們?cè)谶@里捕獲用戶(hù)拖動(dòng)應(yīng)用程序上的麥克風(fēng)圖標(biāo)時(shí)發(fā)送的字符串,然后我們解析這些數(shù)據(jù)。例如,也就是說(shuō),我們將子字符串轉(zhuǎn)換為整數(shù):x=“17”變成xm=17y=“24”變?yōu)閥m=24在這個(gè)過(guò)程中,我們將每個(gè)字符串加載到緩沖區(qū)數(shù)組中,最后使用atoi()命令獲取整數(shù)值。你還記得拖動(dòng)麥克風(fēng)徽標(biāo)時(shí)應(yīng)用程序中的彈跳問(wèn)題嗎?好吧,電機(jī)不會(huì)移動(dòng),直到在序列上讀到字符“u”,然后電機(jī)才會(huì)根據(jù)最后的xm和ym值旋轉(zhuǎn)。
if (c == ';')     // character ; means that the user has dragged the microphone icon on the app     {            Serial.println();            Serial.print("captured String is : "); //we have captured the string with the X Y Z values, now we need to parse it and elaborate it, the following commands are for parsing             Serial.println(readString); //prints string to serial port out, used for debugging                  ind1 = readString.indexOf('.');  //finds location of .            ind2 = readString.indexOf(',');  //finds location of ,            XString = readString.substring(ind1+1, ind2);   //captures the string between charactes . and ,            ind3 = readString.indexOf('*');   //find location of * which delimits the end string            YString = readString.substring(ind2+1, ind3);   //captures the string between charactes , and *            char buf1[XString.length()+1];     //create a characters array long as substring X            XString.toCharArray(buf1, XString.length()+1);   //load string X in the array buf1            char buf2[YString.length()+1];  //create a characters array long as substring Y            YString.toCharArray(buf2, YString.length()+1);    //load the string Y in array buf2            Xm = atoi(buf1); //convert the string in arra buf 1, which is a character with the value of X in an integer            Ym = atoi(buf2); //convert the string in arra buf 2, which is a character with the value of Y in an integer            readString="";      //clears variables for new input                        XString="";            YString="";              Serial.print("X = "); //we print everything on the serial monitor for debugging            Serial.println(X);             Serial.print("Y = ");            Serial.println(Y);            Serial.print("Xm = ");            Serial.println(Xm);             Serial.print("Ym = ");            Serial.println(Ym);       }            if (c == 'U')  //move the motors in the position of the X Y values read from the app movement       {            Serial.print("X = ");            Serial.println(X);             Serial.print("Y = ");            Serial.println(Y);            Serial.print("final Xm = ");            Serial.println(Xm);             Serial.print("final Ym = ");            Serial.println(Ym);            stepperX.rotate(-72*(Xm-X));            delay(5);                        stepperY.rotate(-72*(Ym-Y));            delay(5);            X=Xm;            Y=Ym;            readString="";       }

finale4.rar (3.12 KB, 下載次數(shù): 5)

步驟7:結(jié)束

祝賀你!如果你到了這里,你可以好好拍一下自己的肩膀。如果你是一個(gè)音響工程師或音樂(lè)家,你可能也節(jié)省了一點(diǎn)錢(qián),因?yàn)樗{(lán)牙控制的麥克風(fēng)放置機(jī)器人可能是相當(dāng)昂貴的。我希望這個(gè)項(xiàng)目能激勵(lì)你做許多類(lèi)似的其他或升級(jí)這個(gè)。謝謝你的支持!

2.jpg (21 KB, 下載次數(shù): 173)

2.jpg

3.jpg (22.36 KB, 下載次數(shù): 189)

3.jpg

評(píng)分

參與人數(shù) 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:615839 發(fā)表于 2019-9-28 20:39 | 只看該作者
高手啊,累死了都!不明白
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表