首先向大家表示歉意,去年發(fā)帖展示初代平衡車時(shí)就已經(jīng)承諾編輯出一份制作說(shuō)明,但一直未能完成,很是抱歉!
原因有四:
1、 太過(guò)粗糙,發(fā)出來(lái)確實(shí)有礙觀瞻;
2、 上次做車沒(méi)留下幾張照片,無(wú)圖無(wú)真相;
3、 一直工作比較繁忙,實(shí)在沒(méi)能抽出時(shí)間;
4、 (接原因2)本意盡快再做一個(gè),留下照片。但女皇遲遲不給批款,所以才延誤至今!
此次為了完成自己的承諾,可是耗費(fèi)了2月的零花錢。并且有視頻有真相,希望您能喜歡。
原理簡(jiǎn)介
“賽格威”平衡車
“賽格威”(英語(yǔ):Segway)是一種電力驅(qū)動(dòng)、具有自我平衡能力的個(gè)人用運(yùn)輸載具,是都市用交通工具的一種。由美國(guó)發(fā)明家狄恩·卡門與他的DEKA研發(fā)公司(DEKA Research and Development Corp.)團(tuán)隊(duì)發(fā)明設(shè)計(jì),并創(chuàng)立思維車責(zé)任有限公司(Segway LLC.),自2001年12月起將思維車商業(yè)化量產(chǎn)銷售。(資料來(lái)源:維基百科中文)
“賽格威”是一種讓人留下深刻印象的代步工具,它占地不足一平方米,乘車人像使用滑板一樣站立其上,雙手解放,但卻可以僅通過(guò)身體移動(dòng)改變重心位置,就進(jìn)行前進(jìn)后退,轉(zhuǎn)彎剎車等操作。傳統(tǒng)的交通工具都無(wú)法做到隨心而動(dòng),必須把大部分精力放在控制方向和速度上,而“賽格威”并不需要專門的操控裝置,一切由車身自主完成,也由此獲得了“平衡車”的別名。
“賽格威”平衡車看來(lái)神奇,但你有沒(méi)有發(fā)現(xiàn)它的原理其實(shí)很簡(jiǎn)單呢?拜最新科技所賜,關(guān)鍵零件都可以在淘寶上直接買到,而控制程序也可以查閱原理自行編寫。擁有自己的平衡車,其實(shí)非常簡(jiǎn)單。
倒立擺和機(jī)器人
“賽格威”的平衡問(wèn)題,實(shí)際上是一個(gè)多級(jí)倒立擺問(wèn)題。當(dāng)一個(gè)人用手托住一根竹竿的底部使它在空中豎直不倒下,這就是一個(gè)一級(jí)倒立擺系統(tǒng)的模型。如果第一根竹竿上面用鉸鏈連著其他竹竿,或者竹竿本身具有一定的彈性(可比擬“賽格威”上的有骨骼和關(guān)節(jié)的大活人),就成了多級(jí)倒立擺。
用手撐竹竿的游戲很多人都玩過(guò),印象最深的應(yīng)當(dāng)是它是一個(gè)靜不穩(wěn)定系統(tǒng)。在桌面上的水杯能自己站穩(wěn),當(dāng)重心投影落于杯底內(nèi)時(shí),即使有細(xì)小擾動(dòng)也不會(huì)倒下。但是手心里的竹竿大部分時(shí)間重心投影不在接觸點(diǎn)上,讓竹竿保持相對(duì)不動(dòng)靠的是動(dòng)態(tài)調(diào)整——竹竿往哪邊倒,手就趕緊往哪邊湊,讓重心回到接觸點(diǎn)周圍。這就是依靠人眼,大腦和人手完成的動(dòng)態(tài)平衡過(guò)程。
人類的大腦在處理這類問(wèn)題上有先天優(yōu)勢(shì),因?yàn)槿说淖呗愤^(guò)程本質(zhì)上來(lái)說(shuō)是不斷前跌的過(guò)程,必須依靠實(shí)時(shí)伸出支撐腳轉(zhuǎn)移重心來(lái)保證直立行進(jìn)的動(dòng)態(tài)平衡。而讓機(jī)器人做到這一點(diǎn)就很困難,需要綜合解決動(dòng)態(tài)控制過(guò)程中的線性問(wèn)題、魯棒性問(wèn)題、鎮(zhèn)定問(wèn)題、隨動(dòng)問(wèn)題以及跟蹤問(wèn)題等諸多細(xì)節(jié)——所以至今見到的人形機(jī)器人里,能僵硬走路的很多,但能和真人一樣上躥下跳的絕無(wú)僅有。
兩名民警駕駛“賽格威”單人警用巡邏車巡邏。圖片來(lái)源:新華網(wǎng)
“賽格威”的動(dòng)態(tài)平衡原理和倒立擺相同,將最上方的乘客作為擺臂,然后控制車輪維持系統(tǒng)重心使乘客直立。當(dāng)駕駛?cè)烁淖冏约荷眢w的角度往前或往后傾時(shí),“賽格威”就會(huì)根據(jù)傾斜的方向前進(jìn)或后退,而速度則與駕駛?cè)松眢w傾斜的程度呈正比以保持平衡。這里的一個(gè)巧妙設(shè)計(jì)是將乘客傳感和控制二合一了——“賽格威”前進(jìn)或后退維持平衡的同時(shí),也達(dá)成了按乘客意圖前進(jìn)或后退的目的。最終,熟練的駕駛?cè)丝梢院妥约盒凶咭粯樱瑑H憑直覺(jué)就能完成前后左右各方向的運(yùn)動(dòng),同時(shí)解放雙手和大腦思維,這一特點(diǎn)使“賽格威”特別適合游覽和警用巡邏。
DIY自己的“賽格威”
和人類行走一樣,“賽格威”的控制也需要傳感器和致動(dòng)器。它依靠MEMS技術(shù)制造的精密固態(tài)陀螺儀和加速度計(jì)感應(yīng)車體的旋轉(zhuǎn),速度和傾斜,高速微處理器計(jì)算傳感器數(shù)據(jù),并驅(qū)動(dòng)輪轂電機(jī)完成前進(jìn)/后退/差速轉(zhuǎn)彎的動(dòng)作。而在電路之外,為了讓它從實(shí)驗(yàn)室中的倒立擺變成實(shí)用的代步車,還需要準(zhǔn)備一些必需的結(jié)構(gòu)零件和附件。
機(jī)械部分
此次設(shè)計(jì)的機(jī)械機(jī)構(gòu)包括一個(gè)簡(jiǎn)單的獨(dú)立懸掛。緩沖部分直接采用自行車的避震器(需要更換彈簧),機(jī)體做得不很緊湊,主要為了能夠拆卸折疊,便于收放和運(yùn)輸。(需要說(shuō)明的是,結(jié)構(gòu)已提交專利申請(qǐng),請(qǐng)勿用于商業(yè)用途。)
整機(jī)材料很簡(jiǎn)單,兩個(gè)獨(dú)立驅(qū)動(dòng)的輪子+電機(jī)驅(qū)動(dòng)板+車身角度傳感器+轉(zhuǎn)彎傳感器+電池+一個(gè)裝下這些東西的盒子 。兩個(gè)輪子、電機(jī)、避震器都是來(lái)自淘寶的成品。鈑金和機(jī)加件為單獨(dú)加工。
這里貼一些制作圖片,詳細(xì)的零件工程圖列在最后。
整機(jī)外形
結(jié)構(gòu)細(xì)節(jié)
電機(jī)安裝部分
電機(jī)為優(yōu)耐特電機(jī),250W,24v/質(zhì)量不好,不作推薦。
電機(jī)法蘭部分剖視
轉(zhuǎn)向機(jī)部分:
整機(jī)背面
裝配過(guò)程
鋰電池倉(cāng)
原設(shè)計(jì)為鉛酸電池,后一朋友為我無(wú)償提供了鋰電池,在此再次表示感謝。
車銑加工
電機(jī)法蘭安裝
整體安裝
電路部分
主控采用AVR的ATMEGA_32,電機(jī)驅(qū)動(dòng)為H橋驅(qū)動(dòng)方式,元件選用的IR2184和IRF1405。傳感器選用IDG300和ADXL335,電流傳感器為ACS755。另外還有一些外圍的小功能,可有可無(wú),不詳述了。
控制驅(qū)動(dòng)PCB圖
傳感器PCB圖
PCB空板
焊接需要注意的就是——?jiǎng)e太馬虎就行。先焊低矮的元器件,再焊大個(gè)的!
焊接基本完成
連接電機(jī)測(cè)試
散熱器:
遙控和語(yǔ)音模塊
控制程序部分
這里就提一些關(guān)鍵部分,一些個(gè)人認(rèn)為有用的代碼附在最后。
流程圖
車身角度獲取
選用的傳感器為模擬量輸出,因此只需要用單片機(jī)的AD采集數(shù)據(jù)后計(jì)算出角度值即可,需要注意的是,采集后的數(shù)據(jù)直接使用效果會(huì)很糟糕。需要再次進(jìn)行濾波計(jì)算,得到一個(gè)準(zhǔn)確、及時(shí)、抗擾動(dòng)的真實(shí)角度數(shù)據(jù)。調(diào)速過(guò)程中可以用串口將數(shù)據(jù)輸出,輔助調(diào)試。
計(jì)算車輪速度
這里就是簡(jiǎn)單的PID控制車輪轉(zhuǎn)速,如果不記得就百度看看。調(diào)試參數(shù)會(huì)花點(diǎn)時(shí)間,剛開始參數(shù)別調(diào)過(guò)大,否則抖動(dòng)起來(lái)有危險(xiǎn)!另外需要設(shè)置角度過(guò)大停機(jī)的功能。
獲取轉(zhuǎn)向數(shù)據(jù)
轉(zhuǎn)向數(shù)據(jù)為采集轉(zhuǎn)向電位器而來(lái),采集后的數(shù)據(jù)進(jìn)行濾波處理后再用。轉(zhuǎn)向中間設(shè)置一個(gè)無(wú)效的死區(qū),也是防止誤動(dòng)作。
遙控
遙控為最普通的4鍵遙控器,淘寶成品。
語(yǔ)音
語(yǔ)音選用成品語(yǔ)音模塊,廠家提供完整說(shuō)明文檔。
溫度
硬件原先選用18b20,很是遺憾這部分程序沒(méi)調(diào)通,可能原因1:系統(tǒng)必須有多處中斷,并且中斷服務(wù)程序比較多,因而打亂了18b20的時(shí)序,加上沒(méi)有示波器,因而沒(méi)調(diào)通。可能原因2:智商問(wèn)題。
嘗試調(diào)試了近2小時(shí)無(wú)果后改用模擬量溫度芯片LM35D,電壓直接由電阻分壓而來(lái)。
其余部分可自由發(fā)揮。
視頻演示
無(wú)視頻無(wú)真相,怕熊上門所以拍了一小段視頻。
客廳實(shí)在太小,還放了些雜物,能夠行走的地方就只有中間一小塊了,跑不開。
友情提示:此車有一定危險(xiǎn)性,不排除摔倒、失控等問(wèn)題,在空地上玩玩就好,打算用來(lái)代步上班的,請(qǐng)給自己買好保險(xiǎn)!
附件1:零件工程圖
點(diǎn)擊下載完整工程圖(文件大小:6.15M)(本設(shè)計(jì)已提交專利申請(qǐng),請(qǐng)勿用于商業(yè)用途。)
附件2:重點(diǎn)代碼
2.1車身角度濾波代碼
/************濾波************/
float P[2][2] = {{ 1, 0 },{ 0, 1 }};
float Pdot[4] ={0,0,0,0};
const char C_0 = 1;
float q_bias, angle_err, PCt_0, PCt_1, E, K_0, K_1, t_0, t_1;
float Q_angle=0.001, Q_gyro=0.003, R_angle=0.5, dt=0.01;
void Kalman_Filter(float angle_m,float gyro_m)
{
angle+=(gyro_m-q_bias) * dt;
Pdot[0]=Q_angle - P[0][1] - P[1][0];
Pdot[1]=- P[1][1];
Pdot[2]=- P[1][1];
Pdot[3]=Q_gyro;
P[0][0] += Pdot[0] * dt;
P[0][1] += Pdot[1] * dt;
P[1][0] += Pdot[2] * dt;
P[1][1] += Pdot[3] * dt;
angle_err = angle_m - angle;
PCt_0 = C_0 * P[0][0];
PCt_1 = C_0 * P[1][0];
E = R_angle + C_0 * PCt_0;
K_0 = PCt_0 / E;
K_1 = PCt_1 / E;
t_0 = PCt_0;
t_1 = C_0 * P[0][1];
P[0][0] -= K_0 * t_0;
P[0][1] -= K_0 * t_1;
P[1][0] -= K_1 * t_0;
P[1][1] -= K_1 * t_1;
angle += K_0 * angle_err;
q_bias += K_1 * angle_err;
angle_dot = gyro_m-q_bias;
}
//**************濾波*****************//
static float C_angle,C_angle_dot;
static float bias_cf;
void Complement_filter(float angle_m_cf,float gyro_m_cf)
{
bias_cf=0.998*bias_cf+0.002*gyro_m_cf;
C_angle_dot=gyro_m_cf-bias_cf;
C_angle=0.98*(C_angle+C_angle_dot*0.02)+0.02*angle_m_cf;
}
//***************************** 濾波結(jié)束*********************************/
2.2 轉(zhuǎn)向數(shù)據(jù)處理代碼
/************轉(zhuǎn)向************/
void Steering_handle(void)
{
Buf= 0.9 *Buf + 0.1 * AD_Turn;
Turning= Buf -Turn_Zero; //
if(Turning 《- Turn_Dead) //死區(qū)
Turning+=Turn_Dead;
else if(Turning》 Turn_Dead)
Turning-=Turn_Dead;
else Turning= 0;
if (mode==0)
{
Drive_A=0;
Drive_B=0;
if (!(angle》0.1||angle《-0.1))
{
mode=1;
}
}
else
{
if(lab==0)
{
Turning=0;
}
else if (Turning》55||Turning《-55)//
{
Turning=0;
lab=3;// turn error
}
else //按車速整定轉(zhuǎn)向數(shù)據(jù)
{
//buf2=Drivespeed;
//if (buf2《0)buf2*=-1;
//buf2/=3;
//Turning/=buf2;
Turning/=1;
}
Drive_A=Drivespeed-Turning;
Drive_B=Drivespeed+Turning;
}
}
//***************************** 轉(zhuǎn)向結(jié)束*********************************/
2.3遙控部分狀態(tài)機(jī)
/***********按鍵********/
#define BOOL int
#define FALSE 0
#define TRUE 1
#define INT8U unsigned int
/**********硬件接口***********/
#define KEYPIN1 (PINC&(1《《3))
#define KEYPIN2 (~PINB&(1《《0))
#define KEYPIN3 (~PINB&(1《《1))
#define KEYPIN4 (~PINB&(1《《3))
#define KEYPIN5 (~PINB&(1《《4))
/**********按恪鍵屬性**********/
#define KEY_JT 0x0e
#define KEY_A 0x0d
#define KEY_B 0x0b
#define KEY_C 0x07
#define KEY_D 0x08
#define KEY_NULL 0x0f
//
#define KEY_LONG_PERIOD 250
#define KEY_CONTINUE_PERIOD 25
//
#define KEY_DOWN 0x80
#define KEY_LONG 0x40
#define KEY_CONTINUE 0x20
#define KEY_UP 0x10
//
#define KEY_STATE_INIT 0
#define KEY_STATE_WOBBLE 1
#define KEY_STATE_PRESS 2
#define KEY_STATE_LONG 3
#define KEY_STATE_CONTINUE 4
#define KEY_STATE_RELEASE 5
uchar KeyScan(void)
{
if(KEYPIN2==0) return KEY_A;
if(KEYPIN3==0) return KEY_B;
if(KEYPIN4==0) return KEY_C;
if(KEYPIN5==0) return KEY_D;
if(KEYPIN1==0) return KEY_JT;
return KEY_NULL;
}
void GetKey(uchar *pKeyValue)
{
static char KeyState = KEY_STATE_INIT;
static char KeyTimeCount = 0;
static char LastKey = KEY_NULL;
char KeyTemp = KEY_NULL;
KeyTemp = KeyScan();
switch(KeyState)
{
case KEY_STATE_INIT:
{
if(KEY_NULL!=(KeyTemp))
{
KeyState = KEY_STATE_WOBBLE;
}
}
break;
case KEY_STATE_WOBBLE:
{
KeyState = KEY_STATE_PRESS;
}
break;
case KEY_STATE_PRESS:
{
if(KEY_NULL!=(KeyTemp))
{
LastKey = KeyTemp;
KeyTemp|=KEY_DOWN;
KeyState = KEY_STATE_LONG ;
}
else
{
KeyState = KEY_STATE_INIT;
}
}
break;
case KEY_STATE_LONG:
{
if(KEY_NULL !=(KeyTemp))
{
if(++KeyTimeCount 》 KEY_LONG_PERIOD)
{
KeyTimeCount = 0;
KeyTemp|=KEY_LONG;
KeyState = KEY_STATE_CONTINUE;
}
}
else
{
KeyState = KEY_STATE_RELEASE;
}
}
break;
case KEY_STATE_CONTINUE:
{
if(KEY_NULL !=(KeyTemp))
{
if(++KeyTimeCount 》 KEY_CONTINUE_PERIOD)
{
KeyTimeCount = 0;
KeyTemp |= KEY_CONTINUE;
}
}
else
{
KeyState = KEY_STATE_RELEASE;
}
}
break;
case KEY_STATE_RELEASE:
{
LastKey |=KEY_UP;
KeyTemp = LastKey;
KeyState = KEY_STATE_INIT;
}
break;
default:break;
}
*pKeyValue = KeyTemp;
}
2.4電池電壓
void Get_Batt_Volt(void)
{
int buf3=0,b=0;
buf3=0.9*buf3+0.1*AD_Batt;
if (b》10)
{
Voltage=buf3*3000.0/1024/65;
b=10;
}
else
{
b++;
}
}
-
DIY
+關(guān)注
關(guān)注
176文章
892瀏覽量
351612 -
平衡車
+關(guān)注
關(guān)注
7文章
80瀏覽量
27375
發(fā)布評(píng)論請(qǐng)先 登錄
DIY雅迪電動(dòng)車鋰電池保護(hù)板的選擇
意法半導(dǎo)體TeseoV GNSS接收器賦能賽格威割草機(jī)器人
平衡電阻器可以改為不平衡嗎
地平線征程6系列新增超10家合作車企及品牌
《漫威爭(zhēng)鋒》全球上線,英特爾銳炫顯卡助力沉浸式體驗(yàn)
通富超威為蘇州經(jīng)濟(jì)社會(huì)發(fā)展注入更強(qiáng)動(dòng)力
朗凱威DIY 磷酸鐵鋰電池組,探索能源新境界

產(chǎn)值百億級(jí)!通富超威(蘇州)新基地竣工

超百臺(tái)徐工新能源牽引車交付湖南常德
平衡車哭訴:MOS 管沒(méi)選好,我的心里不平衡!

思特威CIS芯片單月出貨超1億顆
DIY 250W LLC電動(dòng)車充電器電路圖
SmartDAC-DIY評(píng)估模塊

和普威視重點(diǎn)區(qū)域防范與巡邏系統(tǒng)

評(píng)論