資料介紹
描述
我們構(gòu)建了這個自穩(wěn)定機器人作為基礎(chǔ)設(shè)置,以展示機器人如何根據(jù)不同的傳感器類型與其周圍環(huán)境進行交互。
在此示例中,您可以看到配備了 24GHz 雷達和超聲波傳感器的機器人:
XMC4700 提供了幾個未使用的通信接口,可以將不同類型的傳感器添加到您的項目中。
有興趣建造自己的機器人嗎?在此處查找如何構(gòu)建它的說明。
1) 力學(xué)
使用“ Top Plate XMC4700 ”或“ Top Plate XMC4700 電線”開始構(gòu)建。電線版本為電致發(fā)光線提供了一個環(huán)繞的凹口。

該部件適合從 12V 電池電壓到 5V 的 DCDC 電壓轉(zhuǎn)換器 (WE 173010578),用于我們的控制器和可能的電致發(fā)光逆變器。此外,它可以將您的電纜固定到位并固定機器人的主開關(guān)。

將 XMC4700 Relax Kit 擰在上面,并將 Motorshield 堆疊在微控制器頂部。Motorshield 提供了一個開放區(qū)域,非常適合在頂部焊接 IMU(慣性測量單元)傳感器。

繼續(xù)打印和組裝下部——底盤。它裝有兩個電機以及可選的電致發(fā)光逆變器。


使用與電池高度相匹配的 M3 墊片將頂板安裝到底盤上。

為了將車輪連接到電機,我們使用了 M5 墊片,我們鉆出并添加了一個螺紋以將輪軸固定到電機軸上。

為了將車輪連接到輪軸,我們打印了另一個適配器:

就是這樣 - 這些都是組裝自穩(wěn)定機器人所需的所有部件

2) 電子產(chǎn)品
本節(jié)簡要介紹所使用的電子元件。如需更詳細的信息,請查看供應(yīng)商網(wǎng)頁。
步進電機(Nema17) 當(dāng)您需要設(shè)置精確位置時,步進電機很重要。對于這種不是必須的機器人,但我們用它們來驅(qū)動機器人回到它的“原位”,這是你推開它后的起點。
Arduino v2 的 Adafruit Motor/Stepper/Servo Shield這是驅(qū)動電機的功率級。它使用 TB6612 MOSFET 驅(qū)動器,每個通道具有 1.2A 的電流能力,并帶有一個方便的 Arduino 庫來驅(qū)動步進電機。
El線我們使用電致發(fā)光 (EL) 線來顯示機器人的模式。這是一根用大約 100V 和 2500Hz 的交流電壓供電的電線。這將使它在整個表面發(fā)光。
EL逆變器 要為我們的 EL 線產(chǎn)生交流電壓,需要一個 EL 逆變器:輸入 5V DC -> 輸出 100V AC
IMU BNO055該傳感器將幫助我們了解機器人的位置以及它是否即將倒向一側(cè)。為此,我們使用:絕對方向(歐拉矢量,100Hz)基于 360° 球體的三軸方向數(shù)據(jù)和角速度矢量(100Hz)三軸“旋轉(zhuǎn)速度”,單位為 rad/s。
XMC4700 Relax Kit是主控制器,因此也是我們機器人的大腦。它具有 Arduino Uno 引出線,可以在 Arduino IDE 中使用:
3)電機控制
您可以在四種模式下運行電機:Microstep (1/8)、Interleave、Single 和 Double
Microstep (1/8)執(zhí)行從分離器的一個線圈到另一個線圈的平滑切換。這是最流暢但也是最慢的模式:

在從一個線圈切換到另一個線圈期間,Interleave僅引入半步(1:2) 。這種模式比微步更快,但不是那么平滑。

雙步和單步(1:1)正在完成一個完整的步驟。“單”模式僅使用一個線圈作為有源線圈,而“雙”模式使用兩個有源線圈,因此具有更大的扭矩。這些是最快的模式,但在低速時也有點粗糙。

在此圖中可以更好地看出不同的速度范圍:

為了充分利用步進器在不同模式下的功能,我們通過從一個模式移交給另一個模式來使用所有這些功能:

不幸的是,對于任何后續(xù)控制算法來說,這都是一場噩夢,因為對于控制信號(x 軸)的不同變化,您會看到速度值(y 軸)的不同增加。這就是為什么我們將電機控制線性化,以獲得控制信號與速度增加的線性關(guān)系:

在 Arduino 中,我們可以使用這個映射函數(shù)來做到這一點:
if(Regelausgang_Lage >= -160 && Regelausgang_Lage <= 160){
Schrittart=1; // Microschritt (beide Richtungen)
Speed = map (Regelausgang_Lage, -160,160, -400,400);
}
else if (Regelausgang_Lage >=161 && Regelausgang_Lage <= 650) {
Schrittart=2; //Interleave (positiv)
Speed = map (Regelausgang_Lage, 161,650, 90,400);
}
else if ( Regelausgang_Lage >= -650 && Regelausgang_Lage <=-161) {
Schrittart=2; //Interleave (negativ)
Speed = map (Regelausgang_Lage, -161,-650, -90,-400);
}
if (Regelausgang_Lage >=651) {
Schrittart=3; //Double (positiv)
Speed = map (Regelausgang_Lage, 651,1300, 200,400);
}
if ( Regelausgang_Lage <= -651) {
Schrittart=3; //Double (negativ)
Speed = map (Regelausgang_Lage, -651,-1300, -200,-400);
}
}
4) 控制算法
級聯(lián)控制用于控制系統(tǒng)。這意味著我們使用四個從屬控制回路。這種拓撲結(jié)構(gòu)的優(yōu)點是可以使用多個子系統(tǒng)來簡化復(fù)雜系統(tǒng)。每個子系統(tǒng)都由特定的控制器調(diào)節(jié)。作用于內(nèi)部子系統(tǒng)的干擾會在影響外部控制回路之前進行調(diào)整。由于每個子系統(tǒng)都需要一定的時間來執(zhí)行操縱變量,因此更高級別的控制系統(tǒng)必須慢 4 倍。該系統(tǒng)可分為四個子系統(tǒng):
- Lageregelung調(diào)整機器人的角度并防止機器人跌倒。為此,我們使用 PID 控制器來控制輪速。
- Geschwindigkeitsregelung控制機器人的速度。為此,我們使用另一個 PID 控制器來控制機器人的角度。
- Positionsregelung控制機器人相對于其起點的位置。我們使用 P 控制器來操縱機器人的速度。
- Orientierungsregelung控制機器人移動的方向。我們?yōu)榇耸褂昧硪粋€ P 控制器,它作用于輪速。

由于運行這些控制算法的時間至關(guān)重要,因此它們由定時器中斷觸發(fā)

// Interrupt Setup
//------------------------------------------------------------------------------------------------
// Setup Postition Interrupt
//------------------------------------------------------------------------------------------------
XMC_CCU4_SLICE_COMPARE_CONFIG_t pwm_config = {0};
pwm_config.passive_level = XMC_CCU4_SLICE_OUTPUT_PASSIVE_LEVEL_HIGH;
pwm_config.prescaler_initval = XMC_CCU4_SLICE_PRESCALER_32768;
XMC_CCU4_Init(CCU41, XMC_CCU4_SLICE_MCMS_ACTION_TRANSFER_PR_CR);
XMC_CCU4_SLICE_CompareInit(CCU41_CC43, &pwm_config);
XMC_CCU4_EnableClock(CCU41, 3);
XMC_CCU4_SLICE_SetTimerPeriodMatch(CCU41_CC43, 704); // Adjust last Value or Prescaler
/* Enable compare match and period match events */
XMC_CCU4_SLICE_EnableEvent(CCU41_CC43, XMC_CCU4_SLICE_IRQ_ID_PERIOD_MATCH);
/* Connect period match event to SR0 */
XMC_CCU4_SLICE_SetInterruptNode(CCU41_CC43, XMC_CCU4_SLICE_IRQ_ID_PERIOD_MATCH, XMC_CCU4_SLICE_SR_ID_0);
/* Configure NVIC */
/* Set priority */
NVIC_SetPriority(CCU41_0_IRQn, 10U);
/* Enable IRQ */
NVIC_EnableIRQ(CCU41_0_IRQn);
XMC_CCU4_EnableShadowTransfer(CCU41, (CCU4_GCSS_S0SE_Msk << (4 * 3)));
XMC_CCU4_SLICE_StartTimer(CCU41_CC43);
//------------------------------------------------------------------------------------------------
// Setup Geschwindigkeit Interrupt
//------------------------------------------------------------------------------------------------
XMC_CCU4_Init(CCU42, XMC_CCU4_SLICE_MCMS_ACTION_TRANSFER_PR_CR);
XMC_CCU4_SLICE_CompareInit(CCU42_CC43, &pwm_config);
XMC_CCU4_EnableClock(CCU42, 3);
XMC_CCU4_SLICE_SetTimerPeriodMatch(CCU42_CC43, 176); // Adjust last Value or Prescaler 176->25Hz 220->20Hz
/* Enable compare match and period match events */
XMC_CCU4_SLICE_EnableEvent(CCU42_CC43, XMC_CCU4_SLICE_IRQ_ID_PERIOD_MATCH);
/* Connect period match event to SR0 */
XMC_CCU4_SLICE_SetInterruptNode(CCU42_CC43, XMC_CCU4_SLICE_IRQ_ID_PERIOD_MATCH, XMC_CCU4_SLICE_SR_ID_0);
/* Configure NVIC */
/* Set priority */
NVIC_SetPriority(CCU42_0_IRQn, 10U);
/* Enable IRQ */
NVIC_EnableIRQ(CCU42_0_IRQn);
XMC_CCU4_EnableShadowTransfer(CCU42, (CCU4_GCSS_S0SE_Msk << (4 * 3)));
XMC_CCU4_SLICE_StartTimer(CCU42_CC43);
//------------------------------------------------------------------------------------------------
// Setup Sensor Interrupt
//------------------------------------------------------------------------------------------------
XMC_CCU4_Init(CCU43, XMC_CCU4_SLICE_MCMS_ACTION_TRANSFER_PR_CR);
XMC_CCU4_SLICE_CompareInit(CCU43_CC43, &pwm_config);
XMC_CCU4_EnableClock(CCU43, 3);
XMC_CCU4_SLICE_SetTimerPeriodMatch(CCU43_CC43, 43); // Adjust last Value or Prescaler
/* Enable compare match and period match events */
XMC_CCU4_SLICE_EnableEvent(CCU43_CC43, XMC_CCU4_SLICE_IRQ_ID_PERIOD_MATCH);
/* Connect period match event to SR0 */
XMC_CCU4_SLICE_SetInterruptNode(CCU43_CC43, XMC_CCU4_SLICE_IRQ_ID_PERIOD_MATCH, XMC_CCU4_SLICE_SR_ID_0);
/* Configure NVIC */
/* Set priority */
NVIC_SetPriority(CCU43_0_IRQn, 10U);
/* Enable IRQ */
NVIC_EnableIRQ(CCU43_0_IRQn);
XMC_CCU4_EnableShadowTransfer(CCU43, (CCU4_GCSS_S0SE_Msk << (4 * 3)));
XMC_CCU4_SLICE_StartTimer(CCU43_CC43
4.1 位置控制 - “Lageregelung”
請記住 - 我們調(diào)整機器人的角度并防止機器人跌倒。為了設(shè)置一定的角度,電機軸以低于重心(機器人站立)或通過加速力矩(機器人移動)建立力矩平衡的方式移動。位置控制回路通過 100 Hz 的定時器中斷調(diào)用。可以描述如下:

PID控制器:

P - 比例份額是將我們的角度偏移量乘以一個常數(shù)因子“Kp”你可以把它想象成一個杠桿的長度來推動偏移量
I - 積分部分術(shù)語“Ki”不僅增加了與錯誤相關(guān)的動作,而且還增加了錯誤持續(xù)的時間。我們只需將當(dāng)前偏移量添加到“積分器”值。
D-微分項“Kd”不考慮誤差,而是誤差的變化率。幸運的是,我們的傳感器已經(jīng)通過測量角速度矢量來測量這一點。D 部分對系統(tǒng)起到阻尼器的作用。
//------------------------------------------------------------------------------------------------
// PID Lageregler
//------------------------------------------------------------------------------------------------
Winkelabweichung = (double(euler.z())-sollWinkel);
integrator_Lage = constrain (integrator_Lage + Winkelabweichung,-integrator_LageMAX, integrator_LageMAX); // I Anteil der Lageregelung wird begrenzt
Regelausgang_Lage = constrain (KP_Lage*Winkelabweichung\
+ KI_Lage * integrator_Lage\
+ KD_Lage*double(gyroscope.x()),-1300, 1300); // Begrenzung auf Schrittmotorkennlinie
4.1.1 調(diào)整位置控制器
我們通過調(diào)整 PID 控制算法的參數(shù) Kp、Ki、Kd 來調(diào)整控制器。使用的方法稱為“齊格勒-尼科爾斯調(diào)諧法”。保持 Ki 和 Kd 為 0,同時增加 Kp,直到系統(tǒng)達到穩(wěn)定極限,從而進入諧波振蕩。通過這種方式在 out case 中找到的值被稱為 Kp_krit=200 并顯示了 300ms 的周期。

使用下表計算 Kd = Kp*Tv 和 Ki = Kp/Tn

注意:在我們的例子中 Ki 為 800,但是當(dāng)我們每秒增加 100 次時,我們將它降低到 8。
4.2 速度控制 - “Geschwindigkeitsregelung”
速度控制器控制機器人的速度。為此,我們使用另一個 PID 控制器來控制機器人的角度。位置控制回路通過 25Hz 的定時器中斷調(diào)用。可以描述如下:

機器人的輪速由我們的“Lageregelung”控制回路給出。我們還使用低通濾波器對該值進行了平滑處理。然后我們還通過獲取實際速度值和上次速度值以及測量它們之間的 40ms (25Hz) 時間差來計算加速度。
PID控制器:

void get_sollsollWinkel() {
//--------------------------------------------------------------------------------------------------------------------------------------------------------------
// Tiefpassfilter
//--------------------------------------------------------------------------------------------------------------------------------------------------------------
Regelausgang_Lage_5 = Regelausgang_Lage_4;
Regelausgang_Lage_4 = Regelausgang_Lage_3;
Regelausgang_Lage_3 = Regelausgang_Lage_2;
Regelausgang_Lage_2 = Regelausgang_Lage_1;
Regelausgang_Lage_1 = Regelausgang_Lage;
Regelausgang_Lage_filter = (Regelausgang_Lage_1 \
+ Regelausgang_Lage_2 \
+ Regelausgang_Lage_3 \
+ Regelausgang_Lage_4 \
+ Regelausgang_Lage_5)/5;
//--------------------------------------------------------------------------------------------------------------------------------------------------------------
// Bilden der Geschwindigkeitsableitung
//--------------------------------------------------------------------------------------------------------------------------------------------------------------
d_Geschwindigkeit = (Regelausgang_Lage_filter - Regelausgang_Lage_filter_alt)\
/Ta_Geschwindigkeitsregler;
Regelausgang_Lage_filter_alt = Regelausgang_Lage_filter;
//--------------------------------------------------------------------------------------------------------------------------------------------------------------
// Geschwindigkeitsregler -> Ausgang sollWinkel
//--------------------------------------------------------------------------------------------------------------------------------------------------------------
Geschwindigkeitsabweichung = sollGeschwindigkeit - Regelausgang_Lage_filter;
if (abs(Positionsabweichung) <= 15 ) { //Regelparameter bei geringer Positionsabweichung
KP_geschw = 0.0045; // Proportionalanteil des Geschwindigkeitsreglers
KI_geschw = 0.0009; // Integralanteil des Geschwindigkeitsreglers
KD_geschw = 0.000; // Differentianteil des Geschwindigkeitsreglers
}
else{ //Regelparameter bei gr??erer Positionsabweichung
KP_geschw = 0.0090; // Proportionalanteil des Geschwindigkeitsreglers
KI_geschw = 0.0007; // Integralanteil des Geschwindigkeitsreglers
KD_geschw = 0.0002; // Differentianteil des Geschwindigkeitsreglers
}
integrator_geschw = constrain(integrator_geschw + Geschwindigkeitsabweichung,\
-sollWinkelMAX/KI_geschw, sollWinkelMAX/KI_geschw); //I Anteil wird begrenzt
sollWinkel = constrain(KP_geschw * Geschwindigkeitsabweichung \
+ KI_geschw * integrator_geschw \
+ KD_geschw * d_Geschwindigkeit,\
-sollWinkelMAX, sollWinkelMAX); //Winkelbegrenzung
}
4.2.1 調(diào)整速度控制器
速度控制器的調(diào)整與位置控制器相同。使用 PID,我們?nèi)匀粫吹降退倨频恼袷帯?/font>切換到用于低速偏移的 PI 控制器解決了這個問題。在此我們降低了 Kp 并稍微增加了 Ki。這是一個嘗試 ;)
4.3 位置控制——“Positionsregelung”
該控制器控制機器人相對于其初始位置的位置。通過計算步進器的旋轉(zhuǎn)步數(shù)可以知道該位置。作用于機器人速度的簡單 P 控制器就足夠了:

我們嘗試了不同的 Kp 值。在 Kp=4 時,顯示了最佳的控制器性能。

void get_sollGeschwindigkeit() {
//--------------------------------------------------------------------------------------------------------------------------------------------------------------
// Positionsregler -> Ausgang sollGeschwindigkeit
//--------------------------------------------------------------------------------------------------------------------------------------------------------------
Positionsabweichung = (sollPosition - pos_aktuell);
//+++Ausweichen+++
if (Distanz_X1 <= 15 && Distanz_X1 > 0) { //Einschaltschwelle "Hand folgen"
KP_dist_X1 = 75;
KP_pos = 0;
EL_threshold = 1; //EL-Wire leuchtet
}
//+++Positionsregler+++
else if (Distanz_X1 > 30 || Distanz_X1 == 0) { //Ausschaltschwelle "Hand folgen"
KP_dist_X1 = 0;
KP_pos = 4;
EL_threshold = constrain(abs(Positionsabweichung),0,300)* -0.15 + 50;
//EL-Wire blinkt(2-10Hz)
}
else {/*Hysterese*/}
sollGeschwindigkeit = constrain (KP_pos*Positionsabweichung \
+ KP_dist_X1*(-15+Distanz_X1),\
-GeschwindigkeitMAX, GeschwindigkeitMAX);
}
- 二輪自平衡機器人開源設(shè)計
- 使用Arduino的自平衡機器人 0次下載
- 基于Arduino UNO的自平衡機器人 0次下載
- 帶有BT Web控制的Arduino自平衡機器人
- Magicbit的自平衡機器人
- 利用麥克風(fēng)和音符來控制自平衡機器人
- 使用TensorFlow對自平衡機器人進行手勢控制
- 如何制作WiFi控制的自平衡機器人
- Arduino平衡機器人盾牌代碼
- 迷你平衡機器人
- 畢業(yè)設(shè)計--球上自平衡機器人
- 基于JJBoover的遠程控制ARDUNO自平衡機器人資料下載 2次下載
- 可載人自平衡移動機器人控制系統(tǒng)設(shè)計李京濤 0次下載
- DIY:簡簡單單自制平衡機器人 25次下載
- 自平衡人形機器人動作控制器的設(shè)計
- 電機轉(zhuǎn)子動平衡機使用過程中的常見問題 1209次閱讀
- 烤箱自平衡門鉸鏈機構(gòu)的設(shè)計 1760次閱讀
- 利用STM32實現(xiàn)自平衡機器人功能項目 1081次閱讀
- 基于STM32的自平衡機器人設(shè)計 982次閱讀
- 基于STM32的球上自平衡機器人設(shè)計方案 2068次閱讀
- 如何使用DonkeyCar平臺構(gòu)建一個自主機器人 2296次閱讀
- 如何使用Arduino制造一個自動平衡機器人 4833次閱讀
- 基于使用A4988驅(qū)動程序和HC-05 bt模塊構(gòu)建自平衡機器人 2152次閱讀
- 基于ATmage128單片機和紅外測距傳感器實現(xiàn)自平衡機器人系統(tǒng)的設(shè)計 2475次閱讀
- 基于ATmega128單片機實現(xiàn)自平衡機器人控制系統(tǒng)的應(yīng)用方案 4106次閱讀
- 聯(lián)想發(fā)布自研工業(yè)機器人 2705次閱讀
- 面對疫情 醫(yī)療機器人能幫上什么忙? 2236次閱讀
- 真空潔凈機器人 6354次閱讀
- 簡易平衡機器人制作圖解 6936次閱讀
- 如何使用HRMRP機器人平臺構(gòu)建機器人應(yīng)用系統(tǒng) 1699次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數(shù)據(jù)手冊
- 1.06 MB | 532次下載 | 免費
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費
- 3TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費
- 5元宇宙深度解析—未來的未來-風(fēng)口還是泡沫
- 6.40 MB | 227次下載 | 免費
- 6迪文DGUS開發(fā)指南
- 31.67 MB | 194次下載 | 免費
- 7元宇宙底層硬件系列報告
- 13.42 MB | 182次下載 | 免費
- 8FP5207XR-G1中文應(yīng)用手冊
- 1.09 MB | 178次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 2555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33566次下載 | 免費
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費
- 4開關(guān)電源設(shè)計實例指南
- 未知 | 21549次下載 | 免費
- 5電氣工程師手冊免費下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費
- 6數(shù)字電路基礎(chǔ)pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅(qū)動電路設(shè)計》 溫德爾著
- 0.00 MB | 6656次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537798次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191187次下載 | 免費
- 7十天學(xué)會AVR單片機與C語言視頻教程 下載
- 158M | 183279次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138040次下載 | 免費
評論