資料介紹
描述
互聯(lián)網(wǎng)上有大量關(guān)于 Arduino 控制的汽車項(xiàng)目的描述。套件包括電機(jī)和底盤。其中一些套件是兩輪驅(qū)動(dòng),第三輪作為浮動(dòng)腳輪。
這種三輪配置本質(zhì)上是不穩(wěn)定的,即使在驅(qū)動(dòng)程序中將兩個(gè)電機(jī)設(shè)置為相同的速度,也不會(huì)直線行駛。車輪直徑、滾動(dòng)摩擦和電機(jī)特性的變化會(huì)導(dǎo)致偏差。克服這個(gè)問(wèn)題的唯一方法是增加反饋并定期對(duì)電機(jī)速度進(jìn)行修正。該項(xiàng)目將解釋如何實(shí)施以實(shí)現(xiàn)直線行駛。
Arduino 控制的汽車
這是一個(gè)由 Arduino 控制的汽車示例,由兩輪驅(qū)動(dòng)套件構(gòu)建。主要組成部分是:
兩輪驅(qū)動(dòng)套件,包括電機(jī)、底盤、各種螺絲和螺母、車輪和車輪編碼器。
本文不包括如何制造汽車的描述;互聯(lián)網(wǎng)上有很多資源可以解釋所需的步驟。
成品車如下:
?
整車電路圖如下:
?
只是配置上需要注意的幾點(diǎn):
- 該車采用并聯(lián)/串聯(lián)配置的四節(jié) ICR16340 700 mAh 鋰離子電池。其中兩個(gè)串聯(lián)的電池在充滿電后可提供約 8 V 的電壓,足以驅(qū)動(dòng)電機(jī)和 Arduino 板。并聯(lián)電池可能存在問(wèn)題(可能會(huì)產(chǎn)生循環(huán)電流),作為替代方案,ICR16340 電池有 2800 mAh 版本——其中兩個(gè)串聯(lián)應(yīng)該足以為汽車供電。
- 電機(jī)控制由 L298N 橋驅(qū)動(dòng)器模塊執(zhí)行。同樣,有大量資源可以解釋它們的運(yùn)行方式以及如何連接電機(jī)和控件。
- 該電路使用數(shù)字引腳 5 和 6 將 PWM 輸出到 L298N 板以控制電機(jī)速度。這些引腳的 PWM 頻率由 ATmega328P 的定時(shí)器 0 控制。數(shù)字引腳 9 和 10 的 PWM 頻率由定時(shí)器 1 控制。稍后在該項(xiàng)目中,定時(shí)器 1 用于觸發(fā)距離控制回路,因此與引腳 9 和 10 的 PWM 沖突。不要在該項(xiàng)目中使用這些引腳。
- 根據(jù)您的具體接線方式,可能需要調(diào)換電機(jī)引線以獲得一致的方向。此外,HC-020K 編碼器模塊必須在軟件中與正確的電機(jī)配對(duì)。這可能需要交換中斷 2 和 3 或調(diào)整軟件。
脈搏過(guò)多之謎
HC-020K 編碼器模塊依靠 LM393 比較器來(lái)生成方波脈沖。編碼器輪上的每個(gè)孔都會(huì)在方波中產(chǎn)生上升沿和下降沿,其頻率與輪速成正比。對(duì)這些方波脈沖進(jìn)行計(jì)數(shù)也會(huì)得出與行進(jìn)距離成正比的總數(shù)。使用 Arduino 對(duì)這些脈沖進(jìn)行計(jì)數(shù)的標(biāo)準(zhǔn)方法是將它們連接到中斷并讓中斷服務(wù)例程 (ISR) 遞增計(jì)數(shù)器(稍后提供示例代碼)。
幾項(xiàng)試圖將脈沖計(jì)數(shù)與 rpm 和行進(jìn)距離相協(xié)調(diào)的實(shí)驗(yàn)表明,脈沖計(jì)數(shù)不正確的因素約為十倍 - 十倍于許多脈沖。這使得編碼器幾乎毫無(wú)用處。此異常需要進(jìn)一步調(diào)查
以下是 HC-020K 編碼器的一些示波器軌跡:
?
在 5 毫秒的時(shí)間尺度上,方波的上升沿和下降沿看起來(lái)很干凈。然而,如果放大到 2 微秒的時(shí)間尺度,方波的下降沿會(huì)在 5V 到 0V 的轉(zhuǎn)換期間顯示多個(gè)向上向下的尖峰。
?
這些尖峰中的每一個(gè)都可能觸發(fā)中斷并導(dǎo)致脈沖計(jì)數(shù)過(guò)多。它們是由 HC-020K 編碼器模塊上的比較器電路的性質(zhì)引起的——它在開環(huán)模式下運(yùn)行。
解決這個(gè)問(wèn)題的正確方法是通過(guò)在輸出和提供參考電壓的分壓器之間添加一個(gè)反饋電阻,在比較器電路中引入遲滯。有幾篇文章解釋了這個(gè)電路——這里是德州儀器的一個(gè)例子。
https://www.ti.com/lit/ug/tidu020a/tidu020a.pdf
要針對(duì)遲滯修改 HC-020K 編碼器模塊,需要從輸出端到 LM393 的引腳 2 連接一個(gè) 50KOhm 電阻。由于使用了表面貼裝 IC,實(shí)際上很難執(zhí)行此 mod。如果你能做到——祝你好運(yùn)!
一些額外的研究顯示了一種替代方法。這需要在輸出和地之間有一個(gè) 100nF 的電容器。這是一個(gè)更容易實(shí)現(xiàn)的模組,如下所示。
?
?
電容器有效濾除高頻尖峰并提供平滑過(guò)渡。產(chǎn)生的波不是方波,因?yàn)樗浑娙萜髟谇把睾拖陆笛厣系某潆姾头烹娝薷摹?/font>示波器軌跡如下:
?
放大到5微秒的時(shí)間尺度,方波的下降沿顯示單次跳變
?
進(jìn)行此修改后,脈沖計(jì)數(shù)與觀察到的轉(zhuǎn)速很好地對(duì)齊。
反饋控制
既然解開了太多脈沖的謎團(tuán),是時(shí)候?qū)④囕喚幋a器的反饋控制應(yīng)用于電機(jī)速度了。基本思想是根據(jù)測(cè)得的脈沖數(shù)調(diào)整單個(gè)電機(jī)速度,使輪子覆蓋相同的距離并沿直線驅(qū)動(dòng) Arduino。
反饋控制回路分為許多類別,但最常見的稱為 PID(比例、積分和微分)回路。關(guān)于這個(gè)主題的信息很多,他們的研究是一門完整的學(xué)科。簡(jiǎn)單系統(tǒng)如下圖:
?
將設(shè)定點(diǎn)(期望輸出)與反饋(實(shí)際輸出)進(jìn)行比較,誤差用于生成對(duì)受控系統(tǒng)的輸入。該輸入將系統(tǒng)驅(qū)動(dòng)到所需的輸出,以便最終反饋等于設(shè)定點(diǎn)。
對(duì)于 Arduino 汽車,需要控制的輸出是兩個(gè)車輪的脈沖計(jì)數(shù)之差。如果此差異為零,則車輪將行駛相同的距離(假設(shè)車輪直徑相等)。
幾個(gè)定義:
- 來(lái)自車輪 A(電機(jī) A)的脈沖計(jì)數(shù) = pulseA
- 來(lái)自輪 B(電機(jī) B)的脈沖計(jì)數(shù) = pulseB
- 脈沖計(jì)數(shù)之間的差異 = 反饋 = pError = pulseA – pulseB
- 設(shè)定點(diǎn) = 0
下面是Arduino小車基本控制策略的流程圖:
?
關(guān)于中斷的部分
Arduino 上的控制程序使用中斷有兩個(gè)目的:
- 對(duì)來(lái)自編碼器的脈沖進(jìn)行計(jì)數(shù)。每次編碼器輸出進(jìn)行 1 到 0 轉(zhuǎn)換時(shí),都會(huì)在 Arduino 上觸發(fā)中斷。
- 強(qiáng)制控制回路比較計(jì)數(shù)的脈沖并根據(jù)控制算法調(diào)整電機(jī)速度。
第一個(gè)中斷的相關(guān)代碼片段是
const int encoder1 = 2;
const int encoder2 = 3;
volatile int pulse1;
volatile int pulse2;
void setup(){
pulse1 = 0;
pulse2 = 0;
attachInterrupt(digitalPinToInterrupt(encoder1), count1, FALLING);
attachInterrupt(digitalPinToInterrupt(encoder2), count2, FALLING);
}
void count1(){
// counting the number of pulses for encoder 1
pulse1++;
}
void count2(){
// counting the number of pulses for encoder 2
pulse2++;
引腳 2 和 3 用于編碼器的中斷輸入。pulse1 和 pulse2 是用于保存計(jì)數(shù)的變量。Count1 和 count2 是中斷服務(wù)程序,只是增加計(jì)數(shù)器。中斷在從編碼器接收到的方波的下降沿觸發(fā)。
第二個(gè)中斷使用 ATMega328 內(nèi)置的 Timer1。定時(shí)器以預(yù)定的時(shí)間間隔觸發(fā)中斷。然后,這會(huì)運(yùn)行一個(gè)控制回路,使汽車保持直線行駛。相關(guān)代碼片段如下:
void setup(){
cli();//stop interrupts
//set timer1 interrupt at 4Hz
TCCR1A = 0;// set entire TCCR1A register to 0
TCCR1B = 0;// same for TCCR1B
TCNT1 = 0;//initialize counter value to 0
// set compare match register for 4hz increments
OCR1A = 3905;// = (16*10^6) / (4*1024) - 1 (must be <65536)
// turn on CTC mode
TCCR1B |= (1 << WGM12);
// Set CS12 and CS10 bits for 1024 prescaler
TCCR1B |= (1 << CS12) | (1 << CS10);
// enable timer compare interrupt
TIMSK1 |= (1 << OCIE1A);
sei();//allow interrupts
}
ISR(TIMER1_COMPA_vect){
//Control loop here
}
預(yù)分頻器 (0CR1A) 的值決定了中斷的頻率。
控制汽車(第 1 部分)
第一種直接駕駛汽車的方法使用基于流程圖的簡(jiǎn)單算法。代碼如下:
int pError = 0;
pError = pulse1 - pulse2;
// pError is positive speed up motor A and slow down motor B
if(pError > 0){
analogWrite(enA, (motorSpeed + 7));
analogWrite(enB, (motorSpeed - 7));
}
// pError is negative speed up motor B and slow down motor A
else if(pError < 0){
analogWrite(enA, (motorSpeed - 7));
analogWrite(enB, (motorSpeed + 7));
}
else {
analogWrite(enA, motorSpeed);
analogWrite(enB, motorSpeed);
}
digitalWrite(led, toggle);
toggle = !toggle;
控制汽車(第 2 部分)
一種更復(fù)雜的方法是使用 PID 控制器。Arduino 庫(kù)包括一個(gè)名為 FastPID 的庫(kù),它實(shí)現(xiàn)了 PID 控制器。添加到與 IDE 關(guān)聯(lián)的庫(kù)。
有關(guān)如何在以下鏈接中使用此庫(kù)的文檔
https://github.com/mike-matera/FastPID
這是代碼片段
float Kp=0.6, Ki=0.4, Kd=0, Hz=4;
int output_bits = 8;
bool output_signed = false;
FastPID driveStraight(Kp, Ki, Kd, Hz, output_bits, output_signed);
ISR(TIMER1_COMPA_vect){
static int pError;
pError = 0;
pError = pulse1 - pulse2;
uint8_t output = driveStraight.step(setpoint, pError);
analogWrite(enA, (motorSpeed - output));
analogWrite(enB, (motorSpeed + output));
digitalWrite(led,toggle);
toggle = !toggle;
}
可以通過(guò)為 Kp、Kd 和 Ki 分配不同的值來(lái)調(diào)整回路的靈敏度
最后的話
希望這有助于直接駕駛!
- 如何制作Arduino藍(lán)牙控制的汽車
- 通過(guò)WiFi網(wǎng)絡(luò)控制Arduino汽車
- Arduino藍(lán)牙控制的機(jī)器人汽車
- 藍(lán)牙控制的Arduino汽車
- 鍵盤控制的Arduino汽車
- 帶有Arduino Mega的藍(lán)牙控制汽車
- 如何制作藍(lán)牙控制的Arduino汽車
- 帶有Arduino Uno的藍(lán)牙控制汽車
- 一輛Arduino藍(lán)牙控制的汽車
- 用Arduino構(gòu)建藍(lán)牙控制的汽車
- Arduino Uno國(guó)內(nèi)改版電路原理圖下載 0次下載
- Arduino控制器使用教程 16次下載
- Arduino轉(zhuǎn)接控制板的電路原理圖免費(fèi)下載 35次下載
- Arduino開發(fā)機(jī)器人經(jīng)典書籍推薦Arduino開發(fā)實(shí)戰(zhàn)指南:機(jī)器人卷
- Arduino控制器使用圖文教程 0次下載
- Arduino提供的PWM控制功能入門(1) 1932次閱讀
- 如何使用Python和PinPong庫(kù)控制Arduino 718次閱讀
- 使用Wii nunchuk手柄連接Arduino控制伺服電機(jī)的方法 3697次閱讀
- 如何使用Arduino Nano控制紅綠燈 5001次閱讀
- 如何使用L298N和Arduino板控制直流電機(jī) 1w次閱讀
- 如何從網(wǎng)頁(yè)控制arduino? 3836次閱讀
- 基于Arduino UNO和HC-05藍(lán)牙模塊控制伺服電機(jī) 4824次閱讀
- 如何使用Arduino創(chuàng)建停車門禁控制系統(tǒng)? 5060次閱讀
- dfrobot Arduino Nano控制板介紹 5611次閱讀
- dfrobot動(dòng)手玩轉(zhuǎn)Arduino套件介紹 1364次閱讀
- dfrobotRomeo 三合一Arduino兼容控制器介紹 2372次閱讀
- arduino如何控制舵機(jī)及詳細(xì)步驟 16.3w次閱讀
- arduino連接顯示屏方法詳解 4.7w次閱讀
- Arduino如何安裝驅(qū)動(dòng)_Arduino安裝驅(qū)動(dòng)步驟 5.8w次閱讀
- arduino是什么以及arduino能干什么 4.4w次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數(shù)據(jù)手冊(cè)
- 1.06 MB | 532次下載 | 免費(fèi)
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費(fèi)
- 3TC358743XBG評(píng)估板參考手冊(cè)
- 1.36 MB | 330次下載 | 免費(fèi)
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費(fèi)
- 5元宇宙深度解析—未來(lái)的未來(lái)-風(fēng)口還是泡沫
- 6.40 MB | 227次下載 | 免費(fèi)
- 6迪文DGUS開發(fā)指南
- 31.67 MB | 194次下載 | 免費(fèi)
- 7元宇宙底層硬件系列報(bào)告
- 13.42 MB | 182次下載 | 免費(fèi)
- 8FP5207XR-G1中文應(yīng)用手冊(cè)
- 1.09 MB | 178次下載 | 免費(fèi)
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 2555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33566次下載 | 免費(fèi)
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費(fèi)
- 4開關(guān)電源設(shè)計(jì)實(shí)例指南
- 未知 | 21549次下載 | 免費(fèi)
- 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費(fèi)
- 6數(shù)字電路基礎(chǔ)pdf(下載)
- 未知 | 13750次下載 | 免費(fèi)
- 7電子制作實(shí)例集錦 下載
- 未知 | 8113次下載 | 免費(fèi)
- 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德爾著
- 0.00 MB | 6656次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費(fèi)
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537798次下載 | 免費(fèi)
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費(fèi)
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費(fèi)
- 6電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191187次下載 | 免費(fèi)
- 7十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
- 158M | 183279次下載 | 免費(fèi)
- 8proe5.0野火版下載(中文版免費(fèi)下載)
- 未知 | 138040次下載 | 免費(fèi)
評(píng)論
查看更多