近日心血來潮用Makeblock的零件搭了個自動爬樓梯的小車
下面給大家介紹一下如何搭建這個案例。由于是自動爬行,那么自然有各種傳感器。什么巡線(當接觸開關(guān)用),超聲波,限位開關(guān),陀螺儀~~
首先先簡單介紹一下實現(xiàn)原理
額。。理想狀態(tài)下一共有8個階段,其中1號輪子和4號輪子都是帶電機的主動輪,其他都是從動輪,而且升降裝置裝在2號和4號輪子上
階段1
前進
階段2
超聲波檢測到前方有障礙(這里指的是樓梯)
車體上升,1號和2號升降裝置把1號和3號輪子升起來直到超聲波傳感器檢測不到樓梯
階段3
1號和4號輪子推動小車前進
階段4
2號輪子的巡線傳感器檢測碰到樓梯了,1號升降裝置把2號輪子收回去
階段5
1號和4號輪子推動小車前進
階段6
4號輪子上的限位開關(guān)檢測到4號輪子已經(jīng)碰到樓梯,主動輪停止轉(zhuǎn)動,2號升降裝置把4號輪子收回去
階段7
1號輪子推動小車前進 也就是階段1
階段8
也就是階段2,小車繼續(xù)前進直到超聲波檢測到樓梯然后開始循環(huán)
額。。攀爬原理差不多就是這樣了,接下來給大家介紹一下搭建方法以及調(diào)試過程中碰到的一些問題
這個案例在機械結(jié)構(gòu)方面的一個特色就是這個升降的裝置,既要可靠,又要比較迅速地升降。所以我選擇了齒條齒輪的配合方式,并且使用單孔梁作為滑軌,用3*3的同步帶固定片配合雙孔梁做了個簡易滑塊。
下面是搭建使用的材料和方法。
升降裝置1
雙孔梁032*4
雙孔梁160*2
M4*22螺絲*8
M4螺母*8
然后使用下面的材料把上面搭好的結(jié)構(gòu)連接起來
3*3同步帶固定片*4
M4*8螺絲*16
額。。這樣滑塊就搭好了
拿兩根0808*312的單孔梁剛好能穿過滑塊
接下來我們來搭齒條
由于我們這個自動爬樓梯小車比較智能,能夠適應(yīng)不同高度的樓梯,所以我們的滑軌和齒條都要準備的長一點,既然滑軌都有312mm那么長了,齒條肯定不能短
所以我使用了4段齒條拼接起來,至于為什么上面的材料圖片中有一根312的單孔梁呢,這是有原因的。光靠齒條拼接的話在升降過程中齒條與齒條之間的連接處會彎,這一彎齒輪和齒條的嚙合就出問題了,噠噠噠滑齒了。至于為什么我會發(fā)現(xiàn)這個問題呢,這個就不解釋了,說多了都是淚。所以我們要把齒條固定在這根單孔梁上。如下
接下來把導(dǎo)軌和齒條固定在一起
材料如下
144雙孔梁*1
M4*22螺絲*3
M4螺母*2
176雙孔梁*2
M4*22螺絲*6
M4螺母*6
裝上2號輪子(從動輪)
使用以下材料
輪胎*2
90T同步帶輪*2
螺絲軸*2
法蘭軸承*4
M4螺母*2
M3*5無頭螺絲*2
4*2塑料墊片*4
把輪子固定在雙控梁的端面
2號輪子和1號升降裝置搭建完畢
接下來搭建4號輪子和2號升降裝置
2號升降裝置結(jié)構(gòu)和1號一樣
所需材料也一樣
只不過把032雙孔梁固定在下圖的位置
導(dǎo)軌和齒條的搭建與1號升降裝置一樣
上端的連接使用080雙孔梁替代144雙孔梁
128雙孔梁*1
M4*22螺絲*6
M4螺母*6
裝上L形支架,用
M4*14螺絲*2
M4螺母*2
固定在梁上
完成2號升降裝置的搭建后就可以開始搭建4號輪子(主動輪)
所需材料如下
25mm電機*1
90T同步帶輪
25mm電機支架
傳動固定盤
M3*5螺絲
M4*14螺絲
套上輪胎,用
M4*14螺絲*2
螺母*2
固定在L形支架上
完成1、2號升降裝置和2、4號輪子搭建,整車結(jié)構(gòu)就完成一半了
接下來開始搭建主車架、1號和3號輪子
首先,把1號輪子(主動輪)搭建好
輪胎*2
90T同步帶輪*2
傳動固定盤*2
M4*14螺絲*8
M4螺母*4
M3*5螺絲*4
M3*5無頭螺絲*2
25mm電機*2
25mm電機支架*2
064雙孔梁*2
搭建前防撞杠
160雙孔梁*1
L形支架*2
M4*14螺絲*4
M4螺母*4
搭建主車架
192雙孔梁*2
防撞杠*1
前輪*2
M4*30螺絲*6
M4螺母*6
搭建3號輪子(從動輪)
輪胎*2
90T同步帶輪*2
088單孔梁*2
法蘭軸承*4
螺紋軸*2
4*2塑料墊片*4
螺母*2
M3*5無頭螺絲*2
使用
M4*22螺絲*4
M4螺母*4
把3號輪子固定在車架上
裝上2號升降裝置
使用M4*14螺絲*8
裝上1號升降裝置
使用M4*14螺絲*6
由于樓梯寬度有限,輪子又比較大所以只能把輪子錯開安裝,為了節(jié)約搭建時間和材料,4號輪組之用了一個電機和一個輪子
再安裝升級裝置的電機
37電機(裝好電機支架)*2
18T齒輪*2
M3*5無頭螺絲*2
M4*8螺絲*4
調(diào)整好齒輪和齒條的距離分別固定在1號、2號升降裝置雙孔梁的螺紋槽上
完成機械搭建
接下來開始安裝傳感器
限位開關(guān)*1
裝在2號升降裝置側(cè)面
限位開關(guān)*2
分別裝在1號2號升降裝置的梁上。(作用:限制抬升高度)
安裝電機驅(qū)動
安裝巡線傳感器
M4*22螺絲
4*10塑料圓柱
4*2塑料墊片*4
巡線傳感器*1
安裝陀螺儀
安裝超聲波傳感器
由于超聲波模塊沒辦法檢測0-30mm的距離,所以放里面去了 讓防撞桿去撞樓梯,小車撞上障礙后剛好是30mm多點,順利檢測到(這都是調(diào)試后才發(fā)現(xiàn)的~_~?。。?/p>
安裝主控板
安裝適配器(限位開關(guān)用)
額。?;旧蟼鞲衅靼惭b好了,現(xiàn)在介紹一下各個整車結(jié)構(gòu)和傳感器
整車從左到右可以按輪子分成4個部分,其中1號輪子和4號輪子是主動輪(驅(qū)動輪),2號和3號輪子是從動輪
其中1號和2號升降裝置控制2號和4號輪子的位置
這里加裝陀螺儀是因為我們升降裝置用的是直流電機,沒辦法保證車體平衡,所以加入陀螺儀調(diào)整電機抬升速度
整車圖
接線圖
代碼如下:#include “MeOrion.h”
#include
MeGyro gyro;
MeDCMotor lifer1(PORT_1); //升降1
MeDCMotor lifer2(PORT_2); //升降2
MeDCMotor rw(M2); //1號驅(qū)動輪
MeDCMotor fw(M1); //4號驅(qū)動輪
MeLineFollower lineFinder1(PORT_7); // 巡線
MeLimitSwitch upWard1(PORT_3, SLOT2); // 1號升降限位開關(guān)
MeLimitSwitch forWard2(PORT_4, SLOT1); // 4號輪子限位開關(guān)
MeLimitSwitch upWard2(PORT_4, SLOT2); // 2號升降限位開關(guān)
MeUltrasonicSensor ultraSensor(PORT_8); // 1號輪子超聲波
void setup() // 初始化,前后升降裝置回收
{
Serial.begin(9600);
gyro.begin();
lifer1.run(-250);
while (!upWard1.touched());
lifer1.stop();
lifer2.run(-250);
while (!upWard2.touched());
lifer2.stop();
}
void Step2()
{
float p = 15;
float i = 0.01;
float angle = 0;
float targetAngle = 0;
float integration = 0;
float err = 0;
while (NotStop())
{
gyro.update();
float angle = gyro.getAngleX();
err = angle - targetAngle;
integration += err;
int speed1 = 200;
int speed2 = 200;
speed2 = speed1 + err * p;// + integration * i;
lifer1.run(speed1);
lifer2.run(speed2);
//delay(10);
}
lifer1.stop();
lifer2.stop();
}
int startTiming = 0;
unsigned long startTime = 0;
int NotStop()
{
int16_t distance;
distance = ultraSensor.distanceCm();
delay(10);
if (0 == startTiming)
{
if ((distance 《 10) && (distance 》 1))
{
return 1;
}
else
{
startTiming = 1;
startTime = millis();
return 1;
}
}
else
{
unsigned long currentTime = millis();
if (currentTime - startTime 《 2500) //超聲波檢測不到樓梯后延時2.5秒
{
return 1;
}
else
{
return 0;
}
}
}
void loop()
{
startTiming = 0;
startTime = 0;
//階段1 小車前進
fw.run(60);
rw.run(60); //1號 4號輪子推動小車前進
int16_t distance;
do
{
distance = ultraSensor.distanceCm();
delay(10);
}
//階段2 碰到樓梯 主動輪停止 整體車架上升
while (!((distance 《 4) && (distance 》 1))); //如果碰到樓梯
fw.stop();
rw.stop();
Step2();
//階段3 1號 4號輪子推動小車前進
fw.run(60);
rw.run(60);
//階段4 2號輪子巡線傳感器檢測到樓梯 主動輪停止 升降裝置1把2號輪子收回去
while (!(lineFinder1.readSensors() != S1_IN_S2_IN));
lifer1.run(-250);
fw.stop();
rw.stop();
while (!upWard1.touched()); //1號升降限位開關(guān)檢測升降結(jié)束
lifer1.stop();
Adjust();
//階段5 1號 4號輪子推動小車前進
fw.run(60);
rw.run(60);
//階段6 4號輪子限位開關(guān)檢測到4號輪子碰到樓梯 主動輪停止 2號升降裝置回收4號輪子
while (!forWard2.touched());
lifer2.run(-250);
fw.stop();
rw.stop();
while (!upWard2.touched()); //1號升降限位開關(guān)檢測升降結(jié)束
lifer2.stop();
//階段7 循環(huán)階段1
//階段8 循環(huán)階段2
}
void Adjust() //陀螺儀控制1、2號升降電機控制平衡
{
int p = 40;
//float i = 0.05;
float angle = 0;
float targetAngle = 4;
//float integration = 0;
//float err = 0;
do
{
gyro.update();
angle = gyro.getAngleX();
//err = (angle - targetAngle);
//integration += err;
lifer2.run((angle - targetAngle) * p);// + i * integration);
//delay(10);
}
while(fabs(angle - targetAngle) 》 1);
lifer2.stop();
}
-
傳感器
+關(guān)注
關(guān)注
2550文章
51049瀏覽量
753174 -
Makeblock
+關(guān)注
關(guān)注
1文章
4瀏覽量
3833
發(fā)布評論請先 登錄
相關(guān)推薦
評論