久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標(biāo)題: 自平衡小車的入門 [打印本頁]

作者: 51黑ww    時間: 2016-4-11 14:22
標(biāo)題: 自平衡小車的入門
一、引言

2014年10月18日開始接觸到自平衡小車,于是就有了DIY自平衡小車的沖動了,于是在網(wǎng)上看到很多有關(guān)自平衡小車的帖子,在淘寶上也發(fā)現(xiàn)有很多現(xiàn)成的套件或相應(yīng)的部件,這些豐富的資源極為凌亂,讓新入行的人很難決策、不知如何下手。正如當(dāng)下的社會一樣,專家太多,而且各種專家的見解相同,甚至意見相左,弄得新入行的人更不知道怎么辦了。

首先聲明,我不是什么專家,只是一個過來人,走過的路多一些、時間長一些,遇到的挫折也多一些而已,所以有點(diǎn)自己的體會。特別是接觸到現(xiàn)在的很多年輕人,再加上我自己也是剛剛接觸自平衡小車,就有些想要說的話了,但確沒有要說的具體對象,于是就在此瞎說一通,有不對的地方,請廣大的“xx友”予以斧正!

做自平衡小車是要花錢、花精力的,很多新人還是學(xué)生,還沒有收入,所以在花錢這方面就更猶豫了,特別是淘寶上介紹的什么價位的東西都有,好的東西貴,便宜的東西又怕不靠譜。其實(shí),對于真正的發(fā)燒友來說,錢是次要的,他們的經(jīng)驗(yàn)都是靠前期花費(fèi)的銀子積累起來的,別看他們有了經(jīng)驗(yàn)之后,往往花點(diǎn)小錢就能解決大問題。關(guān)于花錢我也是一樣,換個手機(jī)、吃頓飯很隨便,錢花得多了去了,但是要買點(diǎn)這些東西就算計來算計去,一點(diǎn)小錢都要花費(fèi)幾個小時來回比較,哪怕運(yùn)費(fèi)貴兩塊錢都不愿意。我雖然做了一個這樣不起眼的小東西,現(xiàn)在來看直接成本能控制在100元以內(nèi),但我前期來回折騰的錢統(tǒng)計了一下有1121.15元。所以這里介紹一些東西的目的,也是讓還未有收入來源的學(xué)生們花點(diǎn)小錢積累更多一些的經(jīng)驗(yàn),從而提高“投入產(chǎn)出”比,我就當(dāng)作你們前面的探路者之一吧。

想做自平衡小車的我接觸的有下面幾類人群:

1、好奇,看到這個很神奇,而且有那么多人都做成了,我也是學(xué)了這么多年了,也會不少東西了,所以我也要做一個;
2、想通過這個自平衡小車學(xué)單片機(jī);
3、自己學(xué)的專業(yè)與此相關(guān),所以想拿他開刀,來練練手;
4、還有就是我這樣的人,沒事干,又有點(diǎn)“經(jīng)驗(yàn)”,拿它來消磨時間,填補(bǔ)自己的空虛。

無論是哪類人群,如果是第一次上手,請都不要輕敵,當(dāng)然也不排除一次就蒙成功了的,東西是做出來了,但我想從中學(xué)到的東西是不會太多的。
還有很多新人都認(rèn)為算法最復(fù)雜,也是最為困難的部分,其實(shí)我的看法是這部分恰恰是很簡單的部分,如果前期障礙都解決了(譬如,買了一套現(xiàn)成的小車底盤,和一些參考資料),剩下的還真就是簡單的編寫(其實(shí)大部分也是抄來的)程序、調(diào)整一下參數(shù),就成功了,其結(jié)果就是照葫蘆畫了個瓢!
如果,沒解決前期問題,就像很多人一樣,怎么調(diào)參數(shù)都調(diào)不好,因?yàn)樗麄冎恢莱绦蚝退惴ǎ恢赖木筒蝗シ治龊拖朕k法知道,想辦法去解決,就在沒問題的部分瞎折騰。這是我想起一個寓言:就是燈下找鑰匙,一個人看到另外一個人晚上在路燈下找東西,就問他,你找什么東西啊?那個人說,我找鑰匙。你的鑰匙是掉在這兒嗎?他說不是掉在這兒。那你為什么要在這兒找呢,他說因?yàn)檫@兒有燈,看得見,別的地放沒亮光,我看不見。

想做還沒做的你們有些什么樣的想法和看法呢?

下面給新人如何交流技術(shù)問題提個建議:

技術(shù)問題交流不能像日常生活中大媽們對話那樣(這也是網(wǎng)絡(luò)聊天的模式),簡短的幾個詞就能表達(dá)的,就像我們單位的年輕人說話方式一樣,問他某項(xiàng)工作的情況,他就會說一句,沒問題或者說不行,話要是能這樣簡單說下就能很好交流的,要么是相當(dāng)?shù)母呤郑词窃谝黄鹕盍藥资甑膬煽谧印?br />
你們說行和不行,都要說清楚(注意這里的清楚二字,很多人話是說不清楚的),做了哪些工作,是怎么做的,現(xiàn)象是怎樣的,最好是有圖有數(shù)據(jù),不要自己就給出一個結(jié)論來,因?yàn)橹暗挠行┕ぷ鞑坏轿唬踔劣绣e誤,這個結(jié)論是不靠譜的,結(jié)論是由聽者自己來下的,而不是由說者告訴聽者!!!

有些人,想問的問題也說不出來(的確有人知道,說不出來,還有些人能說出來,卻寫不出來),這時候你們最好上照片,上圖吧,圖文并茂的表達(dá)。

二、PID那點(diǎn)事

關(guān)于PID的算法,網(wǎng)絡(luò)上資料很多,也有各種通俗易懂的解釋,我這里想給大家一個只要具有初中數(shù)學(xué)、物理基礎(chǔ)的人,就能明白的一種不甚嚴(yán)謹(jǐn)?shù)模菀桌斫獾囊环N解釋方法。
先給出一個典型的PID算法框圖,如下圖:


我這里先將此圖簡化為僅剩P控制部分的框圖,至于其他的I和D部分,最后僅用兩句話解釋一下就行了,再也無需太多的解釋了。


比例調(diào)節(jié)的公式是:u(t) = Kp * e(t),e(t) = r(t) – c(t)
其中:r(t) 是設(shè)定值,就是你想讓被控系統(tǒng)某個參數(shù)所要保持的狀態(tài)值; c(t)是系統(tǒng)的這個參數(shù)的實(shí)際狀態(tài)值。

比例調(diào)節(jié)的過程就是即時成比例地反應(yīng)控制系統(tǒng)的偏差信號e(t),偏差一旦產(chǎn)生,通過 Kp * e(t) 產(chǎn)生控制作用以減小偏差。理想的情況是有多大的誤差,通過這個調(diào)節(jié)作用之后,就能將誤差消除。但實(shí)際情況并非都是那么理想,Kp小了,修正不到位,Kp大了就會出現(xiàn)矯枉過正的現(xiàn)象。

對于自平衡小車來說,要控制的這個參數(shù)就是小車的傾斜角度,就是想辦法讓這個小車停在你所設(shè)定的角度上,這樣小車就能穩(wěn)定平衡了。

這樣我們就知道了,控制的作用就是想讓被控系統(tǒng)穩(wěn)定在你所設(shè)定的某個值上。拿小車的平衡來說就是讓小車的傾斜角度與其物理(就是小車不控制時,能夠自然穩(wěn)定)平衡角度一致,始終保持在這個傾斜狀態(tài)。

對于有些結(jié)構(gòu)比較好的小車,僅比例這一項(xiàng),在沒有大的擾動的情況下,的確就能穩(wěn)定的控制小車平衡。但往往情況并非這么理想,所以還要用到積分項(xiàng)I或微分項(xiàng)D。那么實(shí)際會出現(xiàn)小車來回擺動,或者始終往某個方向傾斜,造成小車往一邊跑,最后控制不住就倒地了。

先說說來回擺動的問題吧,來回擺動是不是就是小車有一定的傾斜轉(zhuǎn)動角速度,角速度是什么呢?角速度是不是就是角度的微分(有點(diǎn)超出初中的知識范圍了,還是改成初中能理解的語言吧,也就是說速度是不是在單位時間內(nèi)的位置差)。好了,我要不想讓他擺動,是不是控制這個角速度為0,是不是就不擺動了。那么,我們增加D項(xiàng),就能達(dá)到這個目的,雖然不是絕對的解決,但還是明顯的改善了很多的。

下面接著說始終往一邊偏的問題,如果能不往一邊偏,僅來回擺動,也就是這個角度一會大、一會小,一會正、一會負(fù),經(jīng)過積分(又超出范圍了,長時間的角度求平均),這個角度平均值幾乎是0,如果往一邊偏的話,這個平均值就是某個不為0的值了,這是我們加上I項(xiàng)就能克服這個問題了。

啰里啰嗦的說多了,打字也打累了,趕緊總結(jié)一下結(jié)束吧。

PID控制:對于角度環(huán)來說:P是消除角度的誤差,I是消除角度累積的誤差,D是消除角度變化率(角速度)的誤差;同理,對于速度環(huán)來說:P是消除速度的誤差,I是消除速度累積(位置)的誤差,D是消除速度變化率(加速度)的誤差。


三、方案選擇

經(jīng)歷過項(xiàng)目開發(fā)的人員都知道,第一個首要任務(wù)就是要進(jìn)行需求分析,這個需求是要認(rèn)真分析的,因?yàn)樾枨蟛皇且粋單一不變的變量,更不是一個不變的常量。他是在一定的范圍和一段時間內(nèi)都要符合你的需求,滿足你的需要。在做這個小車時,個人的需求也符合馬斯洛的需求層次理論的。在需求分析中最重要的是要列出那些相互矛盾的方面,并且要根據(jù)自己的核心需求進(jìn)行合理和有效的舍取。

那么我這里提出的自平衡小車入門,也是要滿足一組特定的需求,現(xiàn)將其羅列如下:
1、投入的經(jīng)費(fèi)要低;
2、小車要能很好的實(shí)現(xiàn)平衡,而且是要在一定的控制下實(shí)現(xiàn)的自平衡,而不是那種不倒翁式的平衡(結(jié)構(gòu)本身就具有的能力);
3、盡量像那些大神們一樣,也能控制它前后運(yùn)動和左右轉(zhuǎn)動;
4、門檻要低,就是容易成功,而不是折騰得“要死的心都有了”(有些網(wǎng)友在調(diào)試過程中發(fā)出的感慨);
5、從中能提高自己的動手能力、提高分析和解決問題的能力;
6、能對大家覺得神奇的PID有深刻的體會。

自平衡小車無論什么方案都有以下幾個部分:一是檢測平衡狀態(tài)所用的傳感器;二是控制核心的處理器;三是執(zhí)行控制動作的電機(jī)。

傳感器有加速度、陀螺組合的,有用超聲波測距的,還有用紅外測距的;

處理器流行的有用STM32系列的,有用Arduino開源的,也還有人用最傳統(tǒng)的51系列的;

電機(jī)有用帶AB相測速輸出的強(qiáng)動力的電機(jī),也有用步進(jìn)電機(jī),還有用舵機(jī)的,也有用低廉的TT馬達(dá)(俗稱香蕉電機(jī))。

根據(jù)上述的入門需求,我這里提供的入門方案配置如下:超聲波測距傳感器 + Arduino Nano控制模塊 + TT馬達(dá)(L298N電機(jī)驅(qū)動模塊) + 7.4V/2200mAh鋰電池 + 藍(lán)牙串口無線模塊。

這個方案的核心優(yōu)點(diǎn)(除了成本低之外)是超聲波測距模塊,抗干擾強(qiáng),不像MPU6050極容易受干擾(電磁干擾和安裝位置敏感性的機(jī)械干擾),關(guān)于MPU6050的問題,大家可以在網(wǎng)絡(luò)上看看一些新手們的煩惱(死機(jī)、數(shù)據(jù)不穩(wěn)定等等)。

這個方案遭人詬病的是,“超聲波測距的自平衡小車不能爬坡、不能在斜坡上平衡”,首先這里所說的不能爬坡和不能在斜坡上平衡說法本身就極為不準(zhǔn)確,這是網(wǎng)絡(luò)上說話不靠譜的通病,其實(shí)他們想要表達(dá)的是在坡度變化的地方,超聲波測距方式的自平衡小車不是實(shí)現(xiàn)平衡控制。這種說法的人只是憑自己想當(dāng)然的一種臆斷,沒有任何實(shí)際的根據(jù),根據(jù)我的實(shí)踐,這個問題通過速度環(huán)的控制是完全能夠解決的。其實(shí)爬坡的關(guān)鍵點(diǎn),是看你的電機(jī)性能如何,而不是別的什么。

在這里補(bǔ)充說明一點(diǎn),有很多人想用這個作為學(xué)習(xí)單片機(jī)的平臺,這個想法我個人覺得有點(diǎn)反了,要學(xué)單片機(jī),這個平臺太局限了,選擇別的可能要更合適一些。

前面這三節(jié)都是務(wù)虛的,從下面開始逐漸深入到實(shí)處,有些東西因?yàn)樯婕暗饺腴T,可能寫得也啰嗦一些了,因?yàn)橛行┚W(wǎng)友真的是一點(diǎn)基礎(chǔ)(概念)也沒有、從未動過手,但還是很執(zhí)著的想做這個,為了照顧他們,會的人一是忍忍,另一方面也幫助幫助那些需要幫助的人吧!




四、硬件設(shè)計

根據(jù)方案的框圖,首先分別介紹各模塊,由于這里主要是討論自平衡小車,而不是學(xué)習(xí)單片機(jī),所以與自平衡小車關(guān)系不大的單片機(jī)使用以及程序部分就不擬討論了。按照框圖順序和硬件調(diào)試步驟,首先介紹的是超聲波測距模塊。

4.1、超聲波測距模塊
我們選擇的超聲波測距模塊型號是:新款HC-SR04超聲波測距模塊。

這個模塊的淘寶鏈接是:


推薦用這種


不推薦用這種,就是圖中紅色區(qū)域有個4MHz的晶體

它的特點(diǎn),我從賣家那里摘抄部分信息如下:

新款提升了IC性能,因晶振受低溫環(huán)境影響,頻率容易發(fā)生漂移。所以去掉了晶振。比帶晶振的穩(wěn)定很多,此型號為原廠原裝型號,市場上大部分4塊多錢的HC-SR04帶晶振的那種,都是仿品性能不穩(wěn)定!(通過我買的幾種對比,情況的確如此,有些精度更高的,近距離運(yùn)用時,效果更差)

(1)主要技術(shù)參數(shù)
工作電壓:DC5V
靜態(tài)電流:小于2mA
電平輸出:高電平5V、低電平0V
感應(yīng)角度:不大于15度
探測距離:2cm ~ 450cm
精度:可達(dá)0.3cm

(2)接線方式
VCC(電源正端)可用杜邦線接Arduino Nano模塊的5V端;
GND(地)接Arduino Nano模塊的GND;
Trig(控制端)接Arduino Nano模塊的D4;
Echo(接收端)接Arduino Nano模塊的D5。

(3)工作原理:
采用IO觸發(fā)測距,給Trip控制端至少10us的高電平信號;模塊自動發(fā)送8個40khz的方波,并自動檢測是否有信號返回;如有信號返回,通過Echo輸出一高電平,高電平持續(xù)的時間就是超聲波從發(fā)射到返回的時間。

測試距離 =(高電平時間 * 聲速)/ 2。


測試原理圖


測試接線照片

//超聲波測距模塊測試程序
char val='z'; //調(diào)節(jié)與控制命令字
unsigned int TrigPin = 4, EchoPin = 5, Len_Echo = 0; //HC-SR04觸發(fā)信號,回波檢測,回波時間
unsigned long systime0; //上次系統(tǒng)時間,當(dāng)前時間

//初始化
void setup() {
  Serial.begin(115200);
  pinMode(EchoPin, INPUT); //超聲波測距
  pinMode(TrigPin, OUTPUT);
  digitalWrite(TrigPin, LOW);
  systime0 = millis(); //讀取系統(tǒng)時間
}
//主循環(huán)程序
void loop() {
  if(millis() - systime0 >= 5){ //系統(tǒng)循環(huán)周期為5ms
    systime0 = millis();
    digitalWrite(TrigPin, HIGH); //發(fā)送超聲波測量觸發(fā)脈沖
    delayMicroseconds(10);
    digitalWrite(TrigPin, LOW);
    Len_Echo = pulseIn(EchoPin, HIGH); //回波時間測量
    if (Serial.available() > 0) {
      val = Serial.read();
      if(val == 'A') {
        Serial.println(Len_Echo); //超聲波測距輸出
      }
    }
  }
}

使用串口調(diào)試助手(sscom42.exe)發(fā)送字符“A”命令讀取超聲波的測距值。
sscom42.zip (338.41 KB, 下載次數(shù): 25)

程序中超聲波的測量周期是5ms,一般超聲波測距的測量周期遠(yuǎn)遠(yuǎn)大于這個值,但在小車平衡中,這個值不能太大,否則是不能穩(wěn)定控制住小車平衡的。

串口測試界面如下圖所示:


注意:串口號選擇要正確,比特率要與程序中的一致(此處為115200),這里為了方便,串口輸出的是字符串,發(fā)送的命令是“A”,圖中用了100ms間隔的定時發(fā)送。

曬曬做自平衡小車過程中我所花費(fèi)的清單:


4.2、自平衡小車供電

本想講控制板輸出后的電機(jī)驅(qū)動模塊,后來一想,沒有電,這個模塊怎么驅(qū)動呀,所以接下來先說說自平衡小車的供電吧。
我們這里因?yàn)檫x用的是TT馬達(dá),它的工作電壓網(wǎng)上給出的是DC3~6V,6V時的空載電流小于200mA,為了不頻繁的充電,我們選用容量大一點(diǎn)的7.4V鋰電池,其容量為2200mAh。在網(wǎng)上搜了一家性價比還不錯的淘寶店鋪,鏈接如下(注意,東西最好一次買齊,有備份的更好):




充電器:


連接線:


下面給出這個自平衡小車電池供電的電路原理圖。


BT為7.4V鋰電池,CB為充電接口。電池通過開關(guān)S1分別給Arduino Nano模塊和L298N電機(jī)驅(qū)動模塊供電。這個原理圖沒什么可說明的,照著連接,別接錯了,正負(fù)別接反了就沒問題。

4.3、電機(jī)驅(qū)動模塊

電機(jī)驅(qū)動模塊,我們選擇最常用的,價格低廉的L298N電機(jī)驅(qū)動模塊,這個模塊可以同時驅(qū)動兩個電機(jī),正好適用我們的需求。直接給出淘寶鏈接如下:


你們可能會發(fā)現(xiàn),有很多東西,你怎么都推薦這家呢,首先聲明,我跟他們一點(diǎn)關(guān)系都沒有,我之所以選這家,是在價格合理的情況下,盡量在這一家把東西買齊,這樣你們就會少花費(fèi)運(yùn)費(fèi)了,可以節(jié)約點(diǎn)小錢。







該模塊是2路的H橋驅(qū)動,所以可以同時驅(qū)動兩個電機(jī),在自平衡小車中通常利用ENA、ENB使能端輸入控制兩個電機(jī)的PWM信號,分別控制兩個電機(jī)的轉(zhuǎn)速;利用IN1、IN2輸入控制電機(jī)1的方向; 利用IN3、IN4輸入控制電機(jī)2的方向。其控制邏輯表如下:



電路原理圖如下:



這個電路原理其實(shí)也沒什么可說的,但有些新手憑自己的想當(dāng)然,要么用Arduino Nano模塊的5V接到L298N模塊的5V(看清楚,L298N的5V是輸出,不是輸入)。有明白不能接這里的,他接到L298N模塊的VIN,Arduino Nano模塊的5V提供不了大電流,這種接法如果是負(fù)載重點(diǎn)(電機(jī)工作電流比較大時),無異于將Arduino Nano模塊的5V短路(效果差不多,就是燒掉了)。再明白一點(diǎn)的人將L298N的Vin和GND接到7.4V的電池或其他外部獨(dú)立供電的電源上,但告訴我程序控制不了電機(jī),電機(jī)不轉(zhuǎn),其原因是什么呢?他的Arduino Nano模塊是通過USB接口供電的,Arduino Nano模塊與L298N模塊沒有共地,這一切看似簡單的問題,在有些新手那里就是百思不得其解,這些問題他們因?yàn)椴恢涝颍砸蔡岵怀鰡栴},好在看到現(xiàn)場接線的照片,還能幫著分析分析,有些問題你如果不在現(xiàn)場真是你想不到的狀況。
還有的人也會檢查,用電壓表測輸出給電機(jī)的電壓,但是怎么測的呢?他是分別測量OUT1~OUT4對GND的電壓。這個說明他們不知道H橋是怎么回事,也不知道電機(jī)上的電壓是什么。
L298N模塊拿到手后,在用程序測試之前,先直接加電測試確定模塊是否正常。測試方法是給VIN與GND之間加上工作電壓,IN1~IN4、ENA、ENB按照控制邏輯表加信號,看看OUT1-OUT2和OUT3-OUT4之間的電壓是否正常,不同的控制情況下,這個電壓的極性是否會反轉(zhuǎn)。如果一切正常進(jìn)入程序測試階段。
下面給出測試程序,包含了前面的超聲測距的程序。

//藍(lán)牙遙控?zé)o碼盤,TT馬達(dá)超聲自平衡小車硬件單元測試程序
char val='z'; //調(diào)節(jié)與控制命令字
int Left_PWM, Right_PWM; //左右電機(jī)PWM輸出
unsigned int TrigPin = 4, EchoPin = 5, Len_Echo = 0; //HC-SR04觸發(fā)信號,回波檢測,回波時間
unsigned int M_IN1 = 6, M_IN2 = 7, M_IN3 = 8, M_IN4 = 9; // L298:IN1-IN4
unsigned int M_ENA = 10, M_ENB = 11; // L298:ENA-ENB
unsigned long systime0; //上次系統(tǒng)時間,當(dāng)前時間

//電機(jī)輸出
void SetMotorVoltage(int Left_MotorVol, int Right_MotorVol) {
  if(Left_MotorVol >= 0) {
    digitalWrite(M_IN1, LOW);
    digitalWrite(M_IN2, HIGH);
  }else {
    digitalWrite(M_IN1, HIGH);
    digitalWrite(M_IN2, LOW);
    Left_MotorVol = -Left_MotorVol;
  }
  if(Right_MotorVol >= 0) {
    digitalWrite(M_IN3, LOW);
    digitalWrite(M_IN4, HIGH);
  }else {
    digitalWrite(M_IN3, HIGH);
    digitalWrite(M_IN4, LOW);
    Right_MotorVol = -Right_MotorVol;
  }  
  if(Left_MotorVol > 255) Left_MotorVol = 255; //防止PWM值超過255
  if(Right_MotorVol > 255) Right_MotorVol = 255; //防止PWM值超過255
  analogWrite(M_ENA, Left_MotorVol);
  analogWrite(M_ENB, Right_MotorVol);
}

//初始化
void setup() {
  Serial.begin(115200);
  pinMode(M_ENA, OUTPUT); //電機(jī)控制
  pinMode(M_IN1, OUTPUT);
  pinMode(M_IN2, OUTPUT);
  pinMode(M_ENB, OUTPUT);
  pinMode(M_IN3, OUTPUT);
  pinMode(M_IN4, OUTPUT);   
  pinMode(EchoPin, INPUT); //超聲波測距
  pinMode(TrigPin, OUTPUT);
  digitalWrite(TrigPin, LOW);
  systime0 = millis(); //讀取系統(tǒng)時間
}
//主循環(huán)程序
void loop() {
  if(millis() - systime0 >= 5){ //系統(tǒng)循環(huán)周期為5ms
    systime0 = millis();
    digitalWrite(TrigPin, HIGH); //發(fā)送超聲波測量觸發(fā)脈沖
    delayMicroseconds(10);
    digitalWrite(TrigPin, LOW);
    Len_Echo = pulseIn(EchoPin, HIGH); //回波時間測量
    SetMotorVoltage(Left_PWM, Right_PWM);
    if (Serial.available() > 0) {
      val = Serial.read();
      if(val == 'A') {
        Serial.println(Len_Echo); //超聲波測距輸出
      }
      if(val == 'B') {
        Left_PWM ++; Serial.print(Left_PWM); Serial.print("        "); Serial.println(Right_PWM);//左電機(jī)加速
      }
      if(val == 'b') {
        Left_PWM --; Serial.print(Left_PWM); Serial.print("        "); Serial.println(Right_PWM);//左電機(jī)減速
      }
      if(val == 'C') {
        Right_PWM ++; Serial.print(Left_PWM); Serial.print("        "); Serial.println(Right_PWM);//右電機(jī)加速
      }
      if(val == 'c') {
        Right_PWM --; Serial.print(Left_PWM); Serial.print("        "); Serial.println(Right_PWM);//右電機(jī)減速
      }
    }
  }
}

4.4、藍(lán)牙串口模塊

藍(lán)牙串口模塊相對比較簡單,按照給的資料就能使用了,之所以選擇這款藍(lán)牙模塊,是因?yàn)檫B接過程中不出任何信息,這樣就不會產(chǎn)生各種干擾你程序的信息了。




賣家介紹也很詳細(xì),我這里就不啰嗦了。賣家提供的資料和配置軟件(很好用)。 4 藍(lán)牙.zip (1.38 MB, 下載次數(shù): 14)

下面給出與Arduino Nano模塊的接線原理圖。



這里要說明的一點(diǎn)是,如果要用Arduino Nano模塊USB的串口,藍(lán)牙串口就不能用,二者只能用其一。所以藍(lán)牙串口也是用插座的,這樣不用時,就可拔下來。因?yàn)檫@兩者在硬件是用了單片機(jī)的同一個串口。

5、材料清單


超聲自平衡小車材料清單.zip (10.49 KB, 下載次數(shù): 16)

這個材料清單不含手動遙控部分,如果簡單的控制,直接用手機(jī)就能控制,想做點(diǎn)復(fù)雜的控制可以用搖桿+Arduino模塊+藍(lán)牙+供電,自制一個兩通道比例遙控器,有需要的,以后再展開討論吧。

4.6、完整原理圖



五、結(jié)構(gòu)裝配

自平衡小車的裝配實(shí)際上很簡單,但關(guān)鍵是小車的結(jié)構(gòu)設(shè)計,如果小車的本身結(jié)構(gòu)設(shè)計得好,自身就很容易平衡在某個角度,那么自平衡小車的平衡控制效果也就好,如果本身極不容易平衡,那么其控制效果也就要差一截,也就是網(wǎng)上很多人抱怨,在設(shè)定的平衡點(diǎn)不能穩(wěn)定不動的保持平衡,總在晃動或抖動。

新手關(guān)心的都是些電路、程序、算法、參數(shù)(程序里的參數(shù))之類的東西,小車的結(jié)構(gòu)也有很多參數(shù),為什么就不關(guān)心呢?譬如重心、機(jī)械平衡點(diǎn)(這個詞我也不知道專業(yè)點(diǎn)怎么稱呼,意思是在沒有施加控制的情況下,小車平衡時的位置)。還有就是傳感器安裝的位置,因?yàn)閭鞲衅靼惭b位置不同,它對平衡感知的精確度和靈敏性也不同。

這里先貼上幾張我最新版的藍(lán)牙超聲自平衡小車裝配過程中和完成后的幾張照片,供大家參考一下,這也沒有什么設(shè)計,只是憑著感覺做的,我這方面的知識幾乎是零,沒有設(shè)計能力,但我知道有一些因素是很重要的。網(wǎng)絡(luò)上這方面的介紹也很少,希望學(xué)機(jī)械的同學(xué)們在這方面多思考一些,給大家提供一套設(shè)計思路和方案。









我這個加電的情況下,在某個角度是能勉強(qiáng)短時間內(nèi)保持平衡的。

下面發(fā)兩張群里網(wǎng)友裝配的兩張照片,我不知道他這個平衡情況如何,我問他機(jī)械平衡角度大概是多少,他也不知道,有沒有人知道更通俗或更準(zhǔn)確的這個術(shù)語,我也不知道是不是我表達(dá)得不準(zhǔn)確,造成別人不理解。



六、軟件設(shè)計

軟件這里直接上程序吧,很多參數(shù)值我并沒有給出我調(diào)試好的參數(shù),其目的是希望你們不要囫圇吞棗式的干這件事,你們要根據(jù)你們自己搭建的小車平臺來確定自己程序的參數(shù)。整個程序除了前面的宏定義,不到100行,這些程序你們先看,弄明白了,再去調(diào)試。

//利用超聲波測距傳感器實(shí)現(xiàn)小車平衡
#define L_max 200
#define L_min 150
#define L_a 0.5
#define filter_init 10
#define L_t 20

byte val = 0x00; //調(diào)節(jié)與控制命令字
int i, LoopCount = 0; //平衡點(diǎn)調(diào)整,PID各調(diào)整設(shè)定系數(shù)
int E_0 = 0, E_1 = 0, PWM_Out, Left_PWM, Right_PWM; //誤差,PWM輸出,左右電機(jī)PWM輸出
double Kp = 0.0, Kd = 0.0; //PID系數(shù)
double Len_filter = 0, Len_0 = 180; //測距濾波,機(jī)械平衡距離
unsigned int TrigPin = 4, EchoPin = 5, Len_Echo = 0; //HC-SR04觸發(fā)信號,回波檢測,回波時間
unsigned int M_IN1 = 6, M_IN2 = 7, M_IN3 = 8, M_IN4 = 9; // L298:IN1-IN4
unsigned int M_ENA = 10, M_ENB = 11; // L298:ENA-ENB
unsigned long systime0; //系統(tǒng)時間


//電機(jī)輸出
void SetMotorVoltage(int Left_MotorVol, int Right_MotorVol) {
  if(Left_MotorVol >= 0) {
    digitalWrite(M_IN1, LOW);
    digitalWrite(M_IN2, HIGH);
  }else {
    digitalWrite(M_IN1, HIGH);
    digitalWrite(M_IN2, LOW);
    Left_MotorVol = -Left_MotorVol;
  }
  if(Right_MotorVol >= 0) {
    digitalWrite(M_IN3, LOW);
    digitalWrite(M_IN4, HIGH);
  }else {
    digitalWrite(M_IN3, HIGH);
    digitalWrite(M_IN4, LOW);
    Right_MotorVol = -Right_MotorVol;
  }  
  if(Left_MotorVol > 255) Left_MotorVol = 255; //防止PWM值超過255
  if(Right_MotorVol > 255) Right_MotorVol = 255; //防止PWM值超過255
  analogWrite(M_ENA, Left_MotorVol);
  analogWrite(M_ENB, Right_MotorVol);
}

//初始化
void setup() {
  Serial.begin(115200);
  pinMode(M_ENA, OUTPUT); //電機(jī)控制
  pinMode(M_IN1, OUTPUT);
  pinMode(M_IN2, OUTPUT);
  pinMode(M_ENB, OUTPUT);
  pinMode(M_IN3, OUTPUT);
  pinMode(M_IN4, OUTPUT);   
  pinMode(EchoPin, INPUT); //超聲波測距
  pinMode(TrigPin, OUTPUT);
  digitalWrite(TrigPin, LOW);
  i = 0;
  systime0 = millis();
}
//主循環(huán)程序
void loop() {
  if(millis() - systime0 >= L_t) {
    systime0 = millis();
    digitalWrite(TrigPin, HIGH); //發(fā)送超聲波測量觸發(fā)脈沖
    delayMicroseconds(15);
    digitalWrite(TrigPin, LOW);
    Len_Echo = pulseIn(EchoPin, HIGH); //回波時間測量
    if((Len_Echo < L_max) && (Len_Echo > L_min)) {
      Len_filter *= L_a; //一階濾波
      Len_filter += (1 - L_a) * Len_Echo;
      i ++;
      if(i > filter_init){
        i = 100;
        LoopCount ++;
        E_0 = Len_0 - Len_filter;
        PWM_Out = Kp * E_0 + Kd * (E_0 - E_1);
        E_1 = E_0;
        Left_PWM = PWM_Out;
        Right_PWM = PWM_Out;
        SetMotorVoltage(Left_PWM, Right_PWM);
      }
    }else {
      SetMotorVoltage(0, 0); //超出平衡范圍,停止PWM輸出
      i = 0; Len_filter = 0;
    }
  }
  //處理串口指令,發(fā)送相應(yīng)數(shù)據(jù)
  if (Serial.available() > 0) {
    val = Serial.read();
    //參數(shù)調(diào)節(jié)
    if(val == 0x01) Kp += 0.01;
    if(val == 0x02) Kp -= 0.01;
    if(val == 0x03) Kd += 0.01;
    if(val == 0x04) Kd -= 0.01;
    if(val == 0x05) Len_0 ++;
    if(val == 0x06) Len_0 --;   
    if(val == 0x07) {
      Serial.print(Len_0); Serial.print("        ");
      Serial.print(Kp); Serial.print("        "); Serial.println(Kd); //查看設(shè)置參數(shù)
    }
    if(val == 0x08) {
      Serial.print(Len_filter); Serial.print("        "); Serial.println(PWM_Out); //
    }
  }
}

源代碼下載: v3.zip (3.04 KB, 下載次數(shù): 25)

七、調(diào)試

有些人急著等我帖子發(fā)完,現(xiàn)在把主要的內(nèi)容都發(fā)上來了,但剩下的卻是最為關(guān)鍵的調(diào)試,在調(diào)試之前你們一定要把前面的東西都消化吸收了,再進(jìn)行調(diào)試。這一部分我先不急著寫,希望跟大家互動著一起來寫,這樣內(nèi)容才豐富,才有更針對性。

平衡調(diào)試完成的,請大家上照片和視頻,做完的,我提供藍(lán)牙超聲自平衡小車的遙控版源代碼,這個代碼暫時不在這里給出了。


7.1 接地問題

很多網(wǎng)友在做自平衡車時都遇到各種干擾,無法解決,同樣的原理圖和程序,怎么就不行呢?!用人家現(xiàn)成的電路板沒問題,自己用模塊搭建就不行了。

今天就講講接地問題,網(wǎng)上有現(xiàn)成的,我直接抄過來(http://wenku.baidu.com/link?url= ... a_zHzlfXLHOrvhCXKDm)。

單點(diǎn)接地有兩種類型,一種是串聯(lián)單點(diǎn)接地,另一種是并聯(lián)單點(diǎn)接地。

串聯(lián)單點(diǎn)接地中,許多電路之間有公共阻抗,因此相互之間由公共阻抗耦合產(chǎn)生的干擾十分嚴(yán)重。



串聯(lián)單點(diǎn)接地的干擾:

A點(diǎn)的電位是:VA = ( I1 + I2 + I3 ) R1

A點(diǎn)的電位是:VB = ( I1 + I2 + I3 ) R1 + ( I2 + I3 ) R2  

C點(diǎn)的電位是: VC = ( I1 + I2 + I3 ) R1 + ( I2 + I3 ) R2 + I3 R3 從公式中可以看出,A、B、C各點(diǎn)的電位是受電路工作電流影響的,隨各電路的地線電流而變化。尤其是C點(diǎn)的電位,十分不穩(wěn)定。

這種接地方式雖然有很大的問題,卻是實(shí)際中最常見的,因?yàn)樗趾唵巍5诖蠊β屎托」β孰娐坊旌系南到y(tǒng)中,切忌使用,因?yàn)榇蠊β孰娐分械牡鼐電流會影響小功率電路的正常工作。另外,最敏感的電路要放在A點(diǎn),這點(diǎn)電位是最穩(wěn)定的。另外,從前面討論的放大器情況知道,功率輸出級要放在A點(diǎn),前置放大器放在B、C點(diǎn)。

以上是網(wǎng)絡(luò)上直接復(fù)制的內(nèi)容,下面說幾句多余的話,沒有動過手的新人,接觸實(shí)際的東西很少,這個時代更是如此,從小就在虛擬環(huán)境下成長,教育也是如此的一個虛擬環(huán)境,初中學(xué)習(xí)物理時,很多例子、練習(xí)題都有一個括號,(……忽略不計),這些忽略的經(jīng)常有電池內(nèi)阻、燈泡電阻不變、導(dǎo)線電阻忽略不計以及力學(xué)中一些摩擦力忽略不計等等,這些都是嚴(yán)重的誤導(dǎo),導(dǎo)致現(xiàn)在很多大學(xué)生畢業(yè)工作多少年了,還問燈泡為什么不能串起來接(當(dāng)然,你串起來接也不會死人的,也出不了什么大事)……

有些人還很固執(zhí),你告訴他原因了,他還不信,對于這種人你就自己接著折騰吧!

所以,在此告訴那些使用現(xiàn)成模塊的新人,確實(shí)很方便,但整體的(不是模塊單獨(dú)本身)電磁兼容方面是有很大隱患的。

回到做自平衡小車上來,電機(jī)的啟動以及正反轉(zhuǎn)的切換都會帶來很強(qiáng)的脈沖干擾(電機(jī)線圈的感應(yīng)電動勢),對于那些高速器件,或者時序要求很嚴(yán)的器件來說就是一個很主要的干擾源。

藍(lán)牙串口調(diào)試助手,怎么使用,自己摸索!!!
藍(lán)牙串口 5.4.2.zip (1.49 MB, 下載次數(shù): 19)

藍(lán)牙串口調(diào)試助手的使用與Arduino怎么編程沒有關(guān)系,只與你程序用了什么樣的命令有關(guān)系,這些命令集就是最簡單的一種通信協(xié)議。

八、測試總結(jié)

總結(jié)這部分,我就寫個說明,這個說明就是希望總結(jié)由實(shí)踐者們來寫吧!!!
作者: 51黑ww    時間: 2016-4-11 14:40
“世界單片機(jī)菜鳥組織” —— 51版超聲自平衡小車項(xiàng)目

一、小車底盤







小車挺精致的吧!

手機(jī)藍(lán)牙重力感應(yīng)控制超聲自平衡小車程序

WJY_DIY_4.zip (521.41 KB, 下載次數(shù): 22)






“世界單片機(jī)菜鳥組織” —— 51版超聲自平衡小車項(xiàng)目進(jìn)展二







作者: 淺若清風(fēng)    時間: 2016-5-20 13:25
樓主說得對,頂!d=====( ̄▽ ̄*)b file:///C:/Users/120/AppData/Local/Temp/SGPicFaceTpBq/4968/10087CD1.gif

作者: TJCL1451681    時間: 2017-6-6 18:55
為什么沒人評論呢,我感覺寫的很好啊,竟然沒人做嗎,我想問下最夠那個調(diào)節(jié)PID 的程序沒太看懂,if(i > filter_init),這個i一直是1啊,這個判斷進(jìn)不去啊,循環(huán)一遍,下面還有i=0,還是進(jìn)不去啊
作者: TJCL1451681    時間: 2017-6-7 16:14
還是那個程序,我發(fā)現(xiàn)了else的位置,所以可以運(yùn)行,但是len_filter很大啊,循環(huán)了20次后,還是不明白,而且調(diào)試的時候,每次都要重新調(diào)節(jié)kp和kd嗎?那個E0是誤差,應(yīng)該是和len_echo的差啊,為什么是len_filter呢,而且E1有什么用呢,還有l(wèi)oopcount,雖然可以調(diào)節(jié)運(yùn)行小車,但程序還是不懂
作者: TJCL1451681    時間: 2017-6-7 23:06
做了三天,鋼調(diào)好一點(diǎn),模型還是很丑,不過已經(jīng)改了好幾次了,比前面強(qiáng)多了,最后pid參數(shù)調(diào)的還不是很好,小車還不是很穩(wěn),不過已經(jīng)很開心了

IMG_20170607_222742.jpg (3.91 MB, 下載次數(shù): 154)

IMG_20170607_222742.jpg

IMG_20170607_222725.jpg (3.16 MB, 下載次數(shù): 149)

IMG_20170607_222725.jpg

IMG_20170607_222644.jpg (4.13 MB, 下載次數(shù): 151)

IMG_20170607_222644.jpg

IMG_20170607_222624.jpg (4.01 MB, 下載次數(shù): 148)

IMG_20170607_222624.jpg

作者: TJCL1451681    時間: 2017-6-7 23:08
怎么上傳視頻啊,不能分享啊,我自己拍的
作者: admin    時間: 2017-6-7 23:14
TJCL1451681 發(fā)表于 2017-6-7 23:08
怎么上傳視頻啊,不能分享啊,我自己拍的

樓主是不是視頻超過20m了,有優(yōu)酷等平臺的地址嗎?
作者: 1217205590    時間: 2017-7-31 20:54
樓主做得挺好的,只是現(xiàn)在好多做平衡小車的都去其他論壇了,所以你的帖子被埋沒了,我也是今天第一次在這里找平衡小車的。
作者: 風(fēng)的輕歌    時間: 2017-11-15 19:55
樓主加油!
作者: 單片機(jī)小菜雞    時間: 2018-1-13 16:32
太厲害啦!!
作者: 昆明曾誠    時間: 2018-2-7 15:18
挺詳細(xì)的教程,
作者: zhao1022    時間: 2018-3-28 09:29
很好,學(xué)到啦。自己會努力的。
作者: jack_xingjiao    時間: 2018-4-1 21:32
很用心了
作者: aking991    時間: 2018-4-3 10:14
用超聲波作平衡檢測,難度會大很多,如果能作成,也是不容易的人
作者: 18719179642    時間: 2018-4-6 20:46
TJCL1451681 發(fā)表于 2017-6-7 23:06
做了三天,鋼調(diào)好一點(diǎn),模型還是很丑,不過已經(jīng)改了好幾次了,比前面強(qiáng)多了,最后pid參數(shù)調(diào)的還不是很好, ...

請問你這個可以前進(jìn)  后退  左右轉(zhuǎn)嗎

作者: 18719179642    時間: 2018-4-6 20:48
aking991 發(fā)表于 2018-4-3 10:14
用超聲波作平衡檢測,難度會大很多,如果能作成,也是不容易的人

請問你知道樓主這個可以前進(jìn)  后退  左右轉(zhuǎn)嗎
作者: 957723414    時間: 2018-4-21 01:19
希望對自己項(xiàng)目有作用,謝謝樓主的分享
作者: icgsgf    時間: 2018-4-21 14:52
那個。。。遙控的軟件有哪些
作者: MIA李    時間: 2018-7-26 16:55
想問樓主,咱們做自平衡車是不是在不通電物理狀態(tài)下就能夠?qū)崿F(xiàn)平衡,???
作者: TTT96    時間: 2018-7-26 17:18
點(diǎn)贊點(diǎn)贊,太厲害了
作者: MIA李    時間: 2018-7-27 11:10
樓主。。你那個4.3電機(jī)驅(qū)動模塊那的程序是測試什么?實(shí)驗(yàn)效果是什么?
作者: MIA李    時間: 2018-7-27 15:09
樓主,
你程序中
Right_PWM --; Serial.print(Left_PWM); Serial.print("\t"); Serial.println(Right_PWM);//右電機(jī)減速
\t是什么意思啊?
作者: MIA李    時間: 2018-7-27 16:29
樓主,你那個手機(jī)apk怎么用啊




歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 一区二区三区四区av | 国产精品羞羞答答 | 日韩欧美在线看 | 日韩精品免费看 | 一区中文字幕 | 久久精品 | 午夜在线观看免费视频 | 国产区视频在线观看 | 老女人性生活视频 | 亚洲高清视频在线观看 | 亚洲成a人片 | 亚洲天堂av在线播放 | 国产成人一区二区 | av网站在线看 | 黄色片在线播放 | 欧美日韩在线免费观看 | 黄视频网站在线观看 | 欧美大片91 | 激情久久久 | 一级性生活视频 | 长河落日电视连续剧免费观看 | 五月婷婷丁香综合 | 激情久久网 | 国产精品一区二区三区四区五区 | 视频一区二区三区在线观看 | 国产伦精品一区二区三区照片 | 日韩精品观看 | 亚洲午夜视频在线观看 | 亚洲成a人| 精品在线一区 | 欧美成人一区二区 | 波多野结衣乳巨码无在线观看 | 日韩黄色在线 | 日韩av资源| 色就是色欧美 | 欧美人xxxx| 免费观看一区二区三区 | 国模一区二区三区 | 色婷婷中文字幕 | 九九久久久| 日韩中文字幕精品 |