DIY Arduino萬(wàn)向節|自穩平臺
在本教程中,我們將學(xué)習如何建立一個(gè)Arduino萬(wàn)向節或一個(gè)帶有伺服電機的自穩定平臺。本教程實(shí)際上是先前關(guān)于 .
概述
我用三維建模軟件設計了萬(wàn)向節。它由3臺MG996R伺服電機組成,用于3軸控制,以及MPU6050傳感器、Arduino和電池的底座。

您可以在以下位置找到并下載此三維模型以及用于三維打印的STL文件:
使用我的,我3D打印了所有的部件,它們都非常完美。

裝配
組裝萬(wàn)向節很容易。我從安裝偏航伺服開(kāi)始。我用M3螺栓和螺母把它固定在底座上。

下一步,我用同樣的方法固定了滾動(dòng)伺服。這些零件是專(zhuān)門(mén)設計的,以方便安裝MG996R伺服系統。

為了將零件相互連接,我使用了圓喇叭,它作為伺服系統的附件。

首先,我們需要用兩個(gè)螺栓將圓喇叭固定在底座上,然后用另一個(gè)螺栓將其連接到之前的伺服系統上。

我重復了這個(gè)過(guò)程,組裝其余的組件,變槳伺服和頂部平臺。

下一步,我通過(guò)伺服線(xiàn)通過(guò)支架的開(kāi)口,以保持他們的組織。然后我插入MPU6050傳感器,用螺栓和螺母將其固定在底座上。

為了給這個(gè)項目供電,我用了2節鋰離子電池,我把它們放在這個(gè)電池架上。我用兩個(gè)螺栓和螺母把電池座固定在底座上。

2節鋰離子電池將產(chǎn)生約7.4V的電壓,但我們需要5伏的電壓來(lái)為Arduino和伺服系統供電。

這就是為什么我使用了一個(gè)降壓轉換器,將7.4伏轉換為5伏。
Arduino萬(wàn)向節電路圖
現在剩下的,就是把一切聯(lián)系起來(lái)。這里的電路圖和所有的電路圖都需要連接起來(lái)。

您可以從以下鏈接獲取本Arduino教程所需的組件:
MPU6050 IMU
MG996R伺服
降壓轉換器
Arduino Uno
試驗板和跨接導線(xiàn)
最后,我把電子元件和電線(xiàn)壓入底座,用底部的蓋子蓋住它們。

有了這個(gè),自平衡平臺或Arduino萬(wàn)向節就完成了,它的工作和預期一樣好。剩下的就是看看程序。

Arduino代碼
本例中的Arduino代碼是對MPU6050 U DMP6示例的修改 .
代碼說(shuō)明:所以,我們使用輸出可讀的偏航,俯仰和橫搖。
// Get Yaw, Pitch and Roll values
#ifdef OUTPUT_READABLE_YAWPITCHROLL
mpu.dmpGetQuaternion(&q, fifoBuffer);
mpu.dmpGetGravity(&gravity, &q);
mpu.dmpGetYawPitchRoll(ypr, &q, &gravity);
// Yaw, Pitch, Roll values - Radians to degrees
ypr[0] = ypr[0] * 180 / M_PI;
ypr[1] = ypr[1] * 180 / M_PI;
ypr[2] = ypr[2] * 180 / M_PI;
// Skip 300 readings (self-calibration process)
if (j <= 300) {
correct = ypr[0]; // Yaw starts at random value, so we capture last value after 300 readings
j++;
}
// After 300 readings
else {
ypr[0] = ypr[0] - correct; // Set the Yaw to 0 deg - subtract the last random Yaw value from the currrent value to make the Yaw 0 degrees
// Map the values of the MPU6050 sensor from -90 to 90 to values suatable for the servo control from 0 to 180
int servo0Value = map(ypr[0], -90, 90, 0, 180);
int servo1Value = map(ypr[1], -90, 90, 0, 180);
int servo2Value = map(ypr[2], -90, 90, 180, 0);
// Control the servos according to the MPU6050 orientation
servo0.write(servo0Value);
servo1.write(servo1Value);
servo2.write(servo2Value);
}
#endif
一旦我們得到這些值,首先我們把它們從弧度轉換成度。
// Yaw, Pitch, Roll values - Radians to degrees
ypr[0] = ypr[0] * 180 / M_PI;
ypr[1] = ypr[1] * 180 / M_PI;
ypr[2] = ypr[2] * 180 / M_PI;
然后我們等待或讀取300個(gè)讀數,因為在此期間傳感器仍處于自校準過(guò)程中。另外,我們捕捉偏航值,它在開(kāi)始時(shí)不像俯仰和橫搖值為0,而是總是一些隨機值。
// Skip 300 readings (self-calibration process)
if (j <= 300) {
correct = ypr[0]; // Yaw starts at random value, so we capture last value after 300 readings
j++;
}
在300個(gè)讀數之后,首先我們通過(guò)減去上面捕獲的隨機值將偏航設置為0。然后我們將偏航、俯仰和橫搖的值從-90度映射到0到180度,這些值用于驅動(dòng)伺服系統。
// After 300 readings
else {
ypr[0] = ypr[0] - correct; // Set the Yaw to 0 deg - subtract the last random Yaw value from the currrent value to make the Yaw 0 degrees
// Map the values of the MPU6050 sensor from -90 to 90 to values suatable for the servo control from 0 to 180
int servo0Value = map(ypr[0], -90, 90, 0, 180);
int servo1Value = map(ypr[1], -90, 90, 0, 180);
int servo2Value = map(ypr[2], -90, 90, 180, 0);
// Control the servos according to the MPU6050 orientation
servo0.write(servo0Value);
servo1.write(servo1Value);
servo2.write(servo2Value);
}
最后利用寫(xiě)函數,把這些值作為控制信號發(fā)送給伺服系統。當然,你可以禁用偏航伺服,如果你只想穩定的X和Y軸,并使用這個(gè)平臺作為相機常平架。
請注意這遠不是好的相機萬(wàn)向節。運動(dòng)不平穩,因為這些伺服不是為了這樣的目的。真正的相機萬(wàn)向節使用一種特殊類(lèi)型的為了獲得流暢的動(dòng)作。所以,考慮這個(gè)項目只是為了教育目的。
*博客內容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀(guān)點(diǎn),如有侵權請聯(lián)系工作人員刪除。