這篇文章來(lái)源于DevicePlus.com英語(yǔ)網(wǎng)站的翻譯稿。
目錄
水平相機(jī)支架簡(jiǎn)介
設(shè)備規(guī)格
3D 打印安裝部件
編寫程序
測(cè)試!
在上一篇文章中,我們構(gòu)建了一個(gè)伺服控制的無(wú)線照明開(kāi)關(guān)。今天,我們打算更上一層樓,嘗試創(chuàng)建一個(gè)水平相機(jī)支架或云臺(tái)。如果您還沒(méi)有準(zhǔn)備好,請(qǐng)隨時(shí)查閱我們的第一個(gè)相機(jī)云臺(tái)項(xiàng)目:第1部分 和 第2部分。
今天的電子食譜
預(yù)計(jì)完成時(shí)間:60分鐘
所需部件:
Arduino UNO R3 或 Arduino Pro Mini
面包板
三軸加速度計(jì) KXR94-2050
Towerpro MG996R 伺服電機(jī)
1. 水平相機(jī)支架簡(jiǎn)介
水平相機(jī)支架,通常稱為“穩(wěn)定器”或“云臺(tái)”,過(guò)去僅用于高預(yù)算生產(chǎn)環(huán)境。由于無(wú)人機(jī)行業(yè)的繁榮和新興消費(fèi)技術(shù),現(xiàn)在利用配備云臺(tái)的無(wú)人機(jī)拍攝高質(zhì)量的視頻已經(jīng)非常普遍——用無(wú)人機(jī)或智能手機(jī)都可以。市面上易于操作的相關(guān)消費(fèi)產(chǎn)品有很多種。其中一些產(chǎn)品采用無(wú)刷電機(jī)進(jìn)行主觀視角拍攝(噪音、速度等)。
圖1.穩(wěn)定器
我一直想親手制作一個(gè)這樣的設(shè)備。上次,我挑戰(zhàn)自己,構(gòu)建了一個(gè)這種設(shè)備,具體內(nèi)容請(qǐng)參見(jiàn)這篇文章,但是結(jié)果卻并不理想……
該設(shè)備有其自身的魅力……但是如果無(wú)法作為穩(wěn)定器使用,那么也毫無(wú)用處。我回顧了之前的項(xiàng)目,發(fā)現(xiàn)許多需要改進(jìn)的地方。最大的問(wèn)題就是我選擇的伺服電機(jī)。之前的電機(jī)功率不夠。其扭矩不足以操作智能手機(jī)。
出于這個(gè)原因,在繼續(xù)其他工作之前我想先關(guān)注一下設(shè)備規(guī)格選型。
2. 設(shè)備規(guī)格
首先,我們來(lái)看一下伺服電機(jī)。雖然之前使用的伺服電機(jī)SG90價(jià)格便宜且易于使用,但是顯然其扭矩不夠。因此,這次我們使用MG996R伺服電機(jī),其扭矩幾乎是之前電機(jī)的5倍,可能動(dòng)作會(huì)略微延遲/減慢。
另外,其他部件基本就是Arduino和加速度計(jì),所以設(shè)置幾乎與上次相同。由于新伺服電機(jī)較大,我用適配器為其供電。電路接線也是相同的。
3. 3D 打印安裝部件
對(duì)于支架的部件,您可以使用上次的木材和金屬配件。但這一次,我想利用3D打印來(lái)制作各個(gè)部件。這次我準(zhǔn)備的三腳架帶有螺絲孔,即使伺服電機(jī)較大,也可以保持穩(wěn)定。我設(shè)計(jì)的小三腳架具有方向性,而且可以單手操作。
這是我3D打印的部件。組裝后的樣子如下所示:
請(qǐng)注意,如果使用ABS樹(shù)脂進(jìn)行3D打印,那么材料固化時(shí)會(huì)發(fā)生收縮。我打印部件時(shí)發(fā)現(xiàn)了這個(gè)問(wèn)題。我注意到部件產(chǎn)生輕微變形,組裝時(shí)螺釘很難擰入。經(jīng)過(guò)多次試驗(yàn)和錯(cuò)誤后,我決定分別打印安裝在伺服電機(jī)上的部件。您可以在這里下載適用于該支架的3D模型: https://github.com/DevicePlus/ServoGimbal
三腳架組裝如下所示:
至于外殼,這取決于您的相機(jī)類型等因素。此外,您還可以根據(jù)您的手機(jī)類型改進(jìn)/更改部件的整體設(shè)計(jì)。
4. 編寫程序
對(duì)于程序,我們有必要進(jìn)行校準(zhǔn)。首先將加速度傳感器傾斜180度,并根據(jù)輸出值調(diào)整伺服電機(jī)的傾斜度。所以我們稍微改進(jìn)了第17個(gè)程序并進(jìn)行了校準(zhǔn)。讓我們用比較容易理解的方式輸出數(shù)字。
首先需要將加速度計(jì)傾斜180度,并根據(jù)輸出值調(diào)整伺服電機(jī)的傾斜度來(lái)校準(zhǔn)加速度計(jì)。讓我們稍微修改一下 第1部分 中的程序,以易于理解的方式輸出校準(zhǔn)值。
int _maxX = 0; int _minX = 1000; int _maxY = 0; int _minY = 1000; int _maxZ = 0; int _minZ = 1000; //****************************************** //Program for acquiring accelerometer values //****************************************** void setup() { // initialize the serial monitor Serial.begin(9600) ; } void loop() { long x , y , z ; x = y = z = 0 ; x = analogRead(1) ; // X axis y = analogRead(2) ; // Y axis z = analogRead(3) ; // Z axis if(_maxX < x){ _maxX = x; } if(_minX > x){ _minX = x; } if(_maxY < y){ _maxY = y; } if(_minY > y){ _minY = y; } if(_maxZ < z){ _maxZ = z; } if(_minZ > z){ _minZ = z; } int centerX = (_maxX-_minX)/2+_minX; int centerY = (_maxY-_minY)/2+_minY; int centerZ = (_maxZ-_minZ)/2+_minZ; float rotateX = ((float)_maxX-(float)_minX)/180; float rotateY = ((float)_maxY-(float)_minY)/180; float rotateZ = ((float)_maxZ-(float)_minZ)/180; Serial.print("X:") ; Serial.print(_minX) ; Serial.print(" ") ; Serial.print(centerX) ; Serial.print(" ") ; Serial.print(_maxX) ; Serial.print(" ") ; Serial.print(rotateX) ; Serial.print(" Y:") ; Serial.print(_minY) ; Serial.print(" ") ; Serial.print(centerY) ; Serial.print(" ") ; Serial.print(_maxY) ; Serial.print(" ") ; Serial.print(rotateY) ; Serial.print(" Z:") ; Serial.print(_minZ) ; Serial.print(" ") ; Serial.print(centerZ) ; Serial.print(" ") ; Serial.print(_maxZ) ; Serial.print(" ") ; Serial.println(rotateZ) ; delay(50) ; }
運(yùn)行此程序后,啟動(dòng)串口監(jiān)視器,然后將傳感器分別在X和Y方向-90度到90度之間傾斜,并確認(rèn)輸出值。將輸出值的最小值和最大值除以180度,獲得的數(shù)值為加速度計(jì)傾斜值/度,這樣可以與伺服電機(jī)的操作同步。
串口監(jiān)視器上的數(shù)值在激活伺服電機(jī)的程序中有所反應(yīng)。
//******************************************** //Program 2 for acquiring accelerometer values //******************************************** #include Servo myservoX; Servo myservoY; void setup() { // initialize the serial monitor Serial.begin(9600) ; myservoX.attach( 5 ); myservoY.attach( 6 ); } void loop() { int i ; long x , y; // read each data 100 times and average x = y = 0 ; for (i=0 ; i < 100 ; i++) { x = x + analogRead(1) ; // read x axis y = y + analogRead(2) ; // read y axis } x = x / 100 ; y = y / 100 ; int rotateX = (x-493)/1.30; //obtain anble myservoX.write( 90-rotateX ); Serial.print("X:") ; Serial.print(x) ; Serial.print(" ") ; Serial.print(rotateX) ; int rotateY = (y-488)/1.23; myservoY.write( 90-rotateY ); Serial.print(" Y:") ; Serial.print(y) ; // Y axis Serial.print(" ") ; Serial.println(rotateY) ; // Y axis delay(10) ; }
5. 測(cè)試!
這次我們有了足夠的功率,但是支架的運(yùn)動(dòng)仍然很有趣……
在上面的視頻中,用手握住設(shè)備時(shí),加速度計(jì)可以捕獲最輕微的搖動(dòng)。即使傳感器軸對(duì)齊,也會(huì)出現(xiàn)到一些不同角度的意外運(yùn)動(dòng)。解決這個(gè)問(wèn)題對(duì)于平滑旋轉(zhuǎn)和未來(lái)改進(jìn)來(lái)說(shuō)至關(guān)重要。
運(yùn)動(dòng)(或搖動(dòng))與相機(jī)(或智能手機(jī))的重量成比例。如果物體小而輕,移動(dòng)就相對(duì)輕微;但是如果放置像智能手機(jī)那樣較重的物體,搖晃就會(huì)很嚴(yán)重。還應(yīng)該改進(jìn)該程序以提高性能并提高可靠性。
我們的最終目標(biāo)是創(chuàng)建一個(gè)像下面的產(chǎn)品一樣穩(wěn)定的云臺(tái):
似乎很多人都嘗試用無(wú)人機(jī)這樣做。有些無(wú)人機(jī)可以保持穩(wěn)定的姿態(tài),所以該設(shè)備可能更適合無(wú)人機(jī)。
今天,我們重新制作了 第1部分 和 第2部分構(gòu)建的水平相機(jī)云臺(tái)。我們對(duì)云臺(tái)的機(jī)械設(shè)計(jì)進(jìn)行了一些改進(jìn),但是隨著項(xiàng)目的進(jìn)一步推進(jìn),我們發(fā)現(xiàn)了更多的挑戰(zhàn)。我們?nèi)匀粺o(wú)法順利控制云臺(tái)?,F(xiàn)在,該設(shè)備只能說(shuō)仍處于測(cè)試階段,但是我們不會(huì)善罷甘休。我們一定會(huì)在不久的將來(lái)重新解決這個(gè)問(wèn)題,并使其成為一個(gè)功能正常的設(shè)備。
DevicePlus 編輯團(tuán)隊(duì)
設(shè)備升級(jí)版適用于所有熱愛(ài)電子和機(jī)電一體化的人。
審核編輯黃宇
-
智能手機(jī)
+關(guān)注
關(guān)注
66文章
18415瀏覽量
179695 -
Arduino
+關(guān)注
關(guān)注
187文章
6457瀏覽量
186503
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論