線路跟隨機(jī)器人因其簡(jiǎn)單性而成為學(xué)生和初學(xué)者中流行的機(jī)器人項(xiàng)目之一。它遵循一條線,黑色或白色,具體取決于您如何對(duì)微控制器進(jìn)行編程。在這里,我們使用德州儀器的MSP430 啟動(dòng)板制作一個(gè)線路跟隨機(jī)器人,它遵循黑線。
所需材料
德州儀器 (TI) 的 MSP430G2 啟動(dòng)板
L298D 電機(jī)驅(qū)動(dòng)模塊
連接線
底盤,輪子,過山車
Energia IDE
電源 (3.3v) 和 5v-12v
線路跟隨器的概念
線跟隨器的概念與光有關(guān)。我們?cè)诤诎妆砻嫔鲜褂昧斯獾男袨?。?dāng)光線落在白色表面上時(shí),它幾乎會(huì)完全反射,如果是黑色表面,光線會(huì)被黑色表面吸收。這種解釋的光行為用于該線跟隨機(jī)器人。
?
在這個(gè)基于 MSP430 的線路跟隨機(jī)器人中,我們使用了紅外發(fā)射器和紅外接收器,也稱為光電二極管。它們用于發(fā)送和接收光。紅外透射紅外光。當(dāng)紅外線落在白色表面上時(shí),它會(huì)被反射回來并被光電二極管捕獲,從而產(chǎn)生一些電壓變化。當(dāng)紅外光落在黑色表面上時(shí),光被黑色表面吸收,沒有光線被反射回來,因此光電二極管不會(huì)接收任何光或光線。要了解有關(guān)紅外傳感器的更多信息,請(qǐng)點(diǎn)擊鏈接。
在這個(gè)基于 MSP430 的線路跟隨機(jī)器人中,當(dāng)傳感器檢測(cè)到白色表面時(shí),MSP 得到 1 作為輸入,當(dāng)感應(yīng)黑線 MSP 得到 0 作為輸入時(shí)。
電路說明
我們可以將全線跟隨機(jī)器人分為不同的部分,如傳感器部分、控制部分和驅(qū)動(dòng)器部分。
傳感器部分:本節(jié)包含紅外二極管、電位計(jì)、比較器(運(yùn)算放大器)和 LED。電位計(jì)用于在比較器的一個(gè)端子上設(shè)置基準(zhǔn)電壓,紅外傳感器檢測(cè)線路并在比較器的第二個(gè)端子上提供電壓變化。然后比較器比較兩個(gè)電壓并在輸出端產(chǎn)生數(shù)字信號(hào)。在本電路中,我們?yōu)閮蓚€(gè)傳感器使用了兩個(gè)比較器。LM358用作比較器。LM358 內(nèi)置兩個(gè)低噪聲運(yùn)算放大器。
控制部分:MSP430啟動(dòng)板用于控制隨行機(jī)器人的整個(gè)過程。比較器的輸出連接到數(shù)字引腳P1_3和 MPS430 啟動(dòng)板的P1_4。MSP430 快速啟動(dòng)板讀取這些信號(hào),并將命令發(fā)送到驅(qū)動(dòng)電路以驅(qū)動(dòng)線路跟隨器。
驅(qū)動(dòng)程序部分:驅(qū)動(dòng)器部分由電機(jī)驅(qū)動(dòng)器和兩個(gè)直流電機(jī)組成。電機(jī)驅(qū)動(dòng)器用于驅(qū)動(dòng)電機(jī),因?yàn)?MSP430 啟動(dòng)板不能為電機(jī)提供足夠的電壓和電流。因此,我們?cè)黾恿艘粋€(gè)電機(jī)驅(qū)動(dòng)電路,為電機(jī)提供足夠的電壓和電流。在這里,我們使用L298d驅(qū)動(dòng)器來驅(qū)動(dòng)直流電機(jī)。MSP430 快速啟動(dòng)板向此電機(jī)驅(qū)動(dòng)程序發(fā)送命令,然后驅(qū)動(dòng)電機(jī)。
我們開發(fā)了使用不同 Micrcontroller 的線路跟隨機(jī)器人:
使用8051微控制器的線路跟隨機(jī)器人
使用Arduino的線路跟隨機(jī)器人
使用樹莓派的線跟隨機(jī)器人
使用PIC微控制器的線路跟隨機(jī)器人
使用MSP430的隨線機(jī)器人的工作
線路跟隨器的工作非常有趣。線路跟隨機(jī)器人使用傳感器感應(yīng)黑線,然后將信號(hào)發(fā)送到 MSP430 啟動(dòng)板。然后 MSP430 啟動(dòng)板根據(jù)傳感器的輸出驅(qū)動(dòng)電機(jī)。
在這個(gè)項(xiàng)目中,我們使用兩個(gè)紅外傳感器模塊,即左傳感器和右傳感器。當(dāng)左右傳感器都感應(yīng)到白色時(shí),機(jī)器人向前移動(dòng)。
如果左側(cè)傳感器出現(xiàn)在黑線上,則機(jī)器人轉(zhuǎn)向左側(cè)。
如果右傳感器感應(yīng)到黑線,則機(jī)器人向右轉(zhuǎn)動(dòng),直到兩個(gè)傳感器都位于白色表面。當(dāng)白色表面出現(xiàn)時(shí),機(jī)器人再次開始向前移動(dòng)。
如果兩個(gè)傳感器都位于黑線上,則機(jī)器人停止。
電路圖
這款MSP430 線路跟隨機(jī)器人的電路非常簡(jiǎn)單。比較器的輸出直接連接到 MSP430 快速啟動(dòng)板的數(shù)字引腳編號(hào)p1_3和P1_4。電機(jī)驅(qū)動(dòng)器的輸入引腳 IN1、IN2、IN3 和 IN4 分別連接到 MSP430 Launchpad 的數(shù)字引腳 P1_5、P2_0、P2_1 P2_2。一個(gè)電機(jī)連接在電機(jī)驅(qū)動(dòng)器OUT1和OUT2的輸出引腳上,另一個(gè)電機(jī)連接在OUT3和OUT4上。這里我們使用3.3v電源為除電機(jī)驅(qū)動(dòng)器模塊以外的整個(gè)電路供電。我們?yōu)殡姍C(jī)驅(qū)動(dòng)器模塊提供了 8v。用戶可以使用5v-12v。
?
您還可以構(gòu)建自己的 IR 模塊,就像我在 Perf Board 上構(gòu)建的那樣。以下是紅外模塊的電路:
編程說明
完整的程序和視頻可以在本文末尾找到。
在程序中,首先,我們定義傳感器和電機(jī)的輸入和輸出引腳。然后為線路跟隨器的方向定義一些宏,然后編寫指令來選擇傳感器輸出
注意:傳感器可能是低電平有效或高電平有效,因此首先檢查傳感器的輸出是什么,然后通過注釋或取消注釋 activeLowMode 來選擇指令。對(duì)于活動(dòng)高電平,請(qǐng)注釋活動(dòng)低模式宏。
#define l_sensor P1_3
#define r_sensor P1_4
int pins[4]={P1_5,P2_0,P2_1,P2_2};
#define forward 0x05
#define left 0x06
#define right 0x09
#define stop 0x00
//#define activeLowMode
#ifdef activeLowMode
int res[4]={forward,left,right,stop};
#else
int res[4]={stop,right,left,forward};
#endif
之后,在設(shè)置功能中,我們?yōu)閭鞲衅骱碗姍C(jī)引腳提供方向。然后在循環(huán)功能中,我們檢查輸入并將輸出發(fā)送到電機(jī)驅(qū)動(dòng)器模塊以運(yùn)行電機(jī)。
void setup()
{
for(int i=0;i<4;i++)
pinMode(pins[i], OUTPUT);
pinMode(l_sensor, INPUT);
pinMode(r_sensor, INPUT);
}
void loop() { ?int sense=(digitalRead(l_sensor)<<1) | digitalRead(r_sensor); ?for(int i=0;i<4;i++) ? ?digitalWrite(pins[i], (res[sense]>>i) & 0x01); }
我們使用 MSP430 啟動(dòng)板讀取此行追隨者中的四個(gè)條件。我們使用了兩個(gè)傳感器,即左傳感器和右傳感器。
條件:高電平有效輸出
?
輸入 | 輸出 |
運(yùn)動(dòng) 機(jī)器人的 |
||||
左傳感器 | 正確的傳感器 | 左電機(jī) | 右電機(jī) | |||
LS | RS | 微型企業(yè) | 彩信 | 馬幣1 | 馬幣2 | ? |
0 | 0 | 0 | 0 | 0 | 0 | 停 |
0 | 1 | 1 | 0 | 0 | 0 | 右轉(zhuǎn) |
1 | 0 | 0 | 0 | 1 | 0 | 左轉(zhuǎn) |
1 | 1 | 1 | 0 | 1 | 0 | 向前 |
?
#define l_sensor P1_3
#define r_sensor P1_4
int pins[4]={P1_5,P2_0,P2_1,P2_2};
#define forward 0x05
#define left 0x06
#define right 0x09
#define stop 0x00
//#define activeLowMode
#ifdef activeLowMode
int res[4]={forward,left,right,stop};
#else
int res[4]={stop,right,left,forward};
#endif
void setup()?
{
for(int i=0;i<4;i++)
pinMode(pins[i], OUTPUT);
pinMode(l_sensor, INPUT);
pinMode(r_sensor, INPUT);
}
void loop()?
{
int sense=(digitalRead(l_sensor)<<1) | digitalRead(r_sensor);
for(int i=0;i<4;i++)
digitalWrite(pins[i], (res[sense]>>i) & 0x01);
}
?
?
評(píng)論
查看更多