資料介紹
描述
互聯網上有大量關于 Arduino 控制的汽車項目的描述。套件包括電機和底盤。其中一些套件是兩輪驅動,第三輪作為浮動腳輪。
這種三輪配置本質上是不穩定的,即使在驅動程序中將兩個電機設置為相同的速度,也不會直線行駛。車輪直徑、滾動摩擦和電機特性的變化會導致偏差。克服這個問題的唯一方法是增加反饋并定期對電機速度進行修正。該項目將解釋如何實施以實現直線行駛。
Arduino 控制的汽車
這是一個由 Arduino 控制的汽車示例,由兩輪驅動套件構建。主要組成部分是:
兩輪驅動套件,包括電機、底盤、各種螺絲和螺母、車輪和車輪編碼器。
本文不包括如何制造汽車的描述;互聯網上有很多資源可以解釋所需的步驟。
成品車如下:
?
整車電路圖如下:
?

只是配置上需要注意的幾點:
- 該車采用并聯/串聯配置的四節 ICR16340 700 mAh 鋰離子電池。其中兩個串聯的電池在充滿電后可提供約 8 V 的電壓,足以驅動電機和 Arduino 板。并聯電池可能存在問題(可能會產生循環電流),作為替代方案,ICR16340 電池有 2800 mAh 版本——其中兩個串聯應該足以為汽車供電。
- 電機控制由 L298N 橋驅動器模塊執行。同樣,有大量資源可以解釋它們的運行方式以及如何連接電機和控件。
- 該電路使用數字引腳 5 和 6 將 PWM 輸出到 L298N 板以控制電機速度。這些引腳的 PWM 頻率由 ATmega328P 的定時器 0 控制。數字引腳 9 和 10 的 PWM 頻率由定時器 1 控制。稍后在該項目中,定時器 1 用于觸發距離控制回路,因此與引腳 9 和 10 的 PWM 沖突。不要在該項目中使用這些引腳。
- 根據您的具體接線方式,可能需要調換電機引線以獲得一致的方向。此外,HC-020K 編碼器模塊必須在軟件中與正確的電機配對。這可能需要交換中斷 2 和 3 或調整軟件。
脈搏過多之謎
HC-020K 編碼器模塊依靠 LM393 比較器來生成方波脈沖。編碼器輪上的每個孔都會在方波中產生上升沿和下降沿,其頻率與輪速成正比。對這些方波脈沖進行計數也會得出與行進距離成正比的總數。使用 Arduino 對這些脈沖進行計數的標準方法是將它們連接到中斷并讓中斷服務例程 (ISR) 遞增計數器(稍后提供示例代碼)。
幾項試圖將脈沖計數與 rpm 和行進距離相協調的實驗表明,脈沖計數不正確的因素約為十倍 - 十倍于許多脈沖。這使得編碼器幾乎毫無用處。此異常需要進一步調查
以下是 HC-020K 編碼器的一些示波器軌跡:
?

在 5 毫秒的時間尺度上,方波的上升沿和下降沿看起來很干凈。然而,如果放大到 2 微秒的時間尺度,方波的下降沿會在 5V 到 0V 的轉換期間顯示多個向上向下的尖峰。
?

這些尖峰中的每一個都可能觸發中斷并導致脈沖計數過多。它們是由 HC-020K 編碼器模塊上的比較器電路的性質引起的——它在開環模式下運行。
解決這個問題的正確方法是通過在輸出和提供參考電壓的分壓器之間添加一個反饋電阻,在比較器電路中引入遲滯。有幾篇文章解釋了這個電路——這里是德州儀器的一個例子。
https://www.ti.com/lit/ug/tidu020a/tidu020a.pdf
要針對遲滯修改 HC-020K 編碼器模塊,需要從輸出端到 LM393 的引腳 2 連接一個 50KOhm 電阻。由于使用了表面貼裝 IC,實際上很難執行此 mod。如果你能做到——祝你好運!
一些額外的研究顯示了一種替代方法。這需要在輸出和地之間有一個 100nF 的電容器。這是一個更容易實現的模組,如下所示。
?

?

電容器有效濾除高頻尖峰并提供平滑過渡。產生的波不是方波,因為它被電容器在前沿和下降沿上的充電和放電所修改。示波器軌跡如下:
?

放大到5微秒的時間尺度,方波的下降沿顯示單次跳變
?

進行此修改后,脈沖計數與觀察到的轉速很好地對齊。
反饋控制
既然解開了太多脈沖的謎團,是時候將車輪編碼器的反饋控制應用于電機速度了。基本思想是根據測得的脈沖數調整單個電機速度,使輪子覆蓋相同的距離并沿直線驅動 Arduino。
反饋控制回路分為許多類別,但最常見的稱為 PID(比例、積分和微分)回路。關于這個主題的信息很多,他們的研究是一門完整的學科。簡單系統如下圖:
?

將設定點(期望輸出)與反饋(實際輸出)進行比較,誤差用于生成對受控系統的輸入。該輸入將系統驅動到所需的輸出,以便最終反饋等于設定點。
對于 Arduino 汽車,需要控制的輸出是兩個車輪的脈沖計數之差。如果此差異為零,則車輪將行駛相同的距離(假設車輪直徑相等)。
幾個定義:
- 來自車輪 A(電機 A)的脈沖計數 = pulseA
- 來自輪 B(電機 B)的脈沖計數 = pulseB
- 脈沖計數之間的差異 = 反饋 = pError = pulseA – pulseB
- 設定點 = 0
下面是Arduino小車基本控制策略的流程圖:
?

關于中斷的部分
Arduino 上的控制程序使用中斷有兩個目的:
- 對來自編碼器的脈沖進行計數。每次編碼器輸出進行 1 到 0 轉換時,都會在 Arduino 上觸發中斷。
- 強制控制回路比較計數的脈沖并根據控制算法調整電機速度。
第一個中斷的相關代碼片段是
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 是用于保存計數的變量。Count1 和 count2 是中斷服務程序,只是增加計數器。中斷在從編碼器接收到的方波的下降沿觸發。
第二個中斷使用 ATMega328 內置的 Timer1。定時器以預定的時間間隔觸發中斷。然后,這會運行一個控制回路,使汽車保持直線行駛。相關代碼片段如下:
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
}
預分頻器 (0CR1A) 的值決定了中斷的頻率。
控制汽車(第 1 部分)
第一種直接駕駛汽車的方法使用基于流程圖的簡單算法。代碼如下:
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 部分)
一種更復雜的方法是使用 PID 控制器。Arduino 庫包括一個名為 FastPID 的庫,它實現了 PID 控制器。添加到與 IDE 關聯的庫。
有關如何在以下鏈接中使用此庫的文檔
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;
}
可以通過為 Kp、Kd 和 Ki 分配不同的值來調整回路的靈敏度
最后的話
希望這有助于直接駕駛!
- 如何制作Arduino藍牙控制的汽車
- 通過WiFi網絡控制Arduino汽車
- Arduino藍牙控制的機器人汽車
- 通過觸摸屏和Arduino控制汽車HVAC
- 藍牙控制的Arduino汽車
- 鍵盤控制的Arduino汽車
- 帶有Arduino Mega的藍牙控制汽車
- 如何制作藍牙控制的Arduino汽車
- 帶有Arduino Uno的藍牙控制汽車
- 一輛Arduino藍牙控制的汽車
- 用Arduino構建藍牙控制的汽車
- Arduino控制器使用教程 16次下載
- Arduino轉接控制板的電路原理圖免費下載 35次下載
- Arduino開發機器人經典書籍推薦Arduino開發實戰指南:機器人卷
- Arduino控制器使用圖文教程 0次下載
- Arduino提供的PWM控制功能入門(1) 2721次閱讀
- 如何使用Python和PinPong庫控制Arduino 1033次閱讀
- 使用Wii nunchuk手柄連接Arduino控制伺服電機的方法 4298次閱讀
- 如何使用Arduino Nano控制紅綠燈 5412次閱讀
- 如何使用L298N和Arduino板控制直流電機 1w次閱讀
- 如何從網頁控制arduino? 4186次閱讀
- 基于Arduino UNO和HC-05藍牙模塊控制伺服電機 5094次閱讀
- 如何使用Arduino創建停車門禁控制系統? 5302次閱讀
- dfrobot Arduino Nano控制板介紹 5954次閱讀
- dfrobot動手玩轉Arduino套件介紹 1524次閱讀
- dfrobotRomeo 三合一Arduino兼容控制器介紹 2580次閱讀
- arduino如何控制舵機及詳細步驟 16.5w次閱讀
- arduino連接顯示屏方法詳解 4.7w次閱讀
- Arduino如何安裝驅動_Arduino安裝驅動步驟 5.9w次閱讀
- arduino是什么以及arduino能干什么 4.5w次閱讀
下載排行
本周
- 1山景DSP芯片AP8248A2數據手冊
- 1.06 MB | 532次下載 | 免費
- 2RK3399完整板原理圖(支持平板,盒子VR)
- 3.28 MB | 339次下載 | 免費
- 3TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費
- 4DFM軟件使用教程
- 0.84 MB | 295次下載 | 免費
- 5元宇宙深度解析—未來的未來-風口還是泡沫
- 6.40 MB | 227次下載 | 免費
- 6迪文DGUS開發指南
- 31.67 MB | 194次下載 | 免費
- 7元宇宙底層硬件系列報告
- 13.42 MB | 182次下載 | 免費
- 8FP5207XR-G1中文應用手冊
- 1.09 MB | 178次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 2555集成電路應用800例(新編版)
- 0.00 MB | 33566次下載 | 免費
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費
- 4開關電源設計實例指南
- 未知 | 21549次下載 | 免費
- 5電氣工程師手冊免費下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費
- 6數字電路基礎pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅動電路設計》 溫德爾著
- 0.00 MB | 6656次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉中文版)
- 78.1 MB | 537798次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420027次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191187次下載 | 免費
- 7十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183279次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138040次下載 | 免費
評論