









摘 要:隨著科學技術的不斷發展,人工智能化的重要性日益顯現,引起學界和業界人士的廣泛關注。文章提出并設計了以STM32F103RC微處理器為主控芯片的智能小車,擁有紅外循跡、超聲波避障和無線傳輸等功能。小車基于紅外線的反射原理準確跟隨黑帶行駛,利用超聲波檢測到與障礙物的距離,進而改變行進方向,實現精準避障,同時能夠進行無線通信傳輸。測試結果表明,小車能夠很好地完成循跡、避障和通信的功能。
關鍵詞:單片機;紅外循跡;超聲波避障;無線通信;智能小車
中圖分類號:TP23;TP212 文獻標識碼:A 文章編號:2096-4706(2024)14-0161-07
Intelligent Trolley Design Based on Single-Chip Microcomputer
HU Chun
(College of Electrical Engineering, Northwest Minzu University, Lanzhou 730124, China)
Abstract: With the continuous development of science and technology, the importance of Artificial Intelligence is becoming increasingly apparent, attracting widespread attention from academia and industry professionals. This paper proposes and designs an intelligent trolley with STM32F103RC microprocessor as the main control chip, which has functions such as infrared tracking, ultrasonic obstacle avoidance, and wireless transmission. The trolley accurately follows the black belt based on the principle of infrared reflection, uses ultrasonic waves to detect the distance from obstacles, and then changes the direction of travel to achieve precise obstacle avoidance. At the same time, it can conduct wireless communication transmission. The test results indicate that the trolley can perform well in tracking, obstacle avoidance, and communication functions.
Keywords: single-chip microcomputer; infrared tracking; ultrasonic obstacle avoidance; wireless communication; intelligent trolley
DOI:10.19850/j.cnki.2096-4706.2024.14.033
0 引 言
隨著科技的不斷發展,智能化加速走進人們的生活,在教育、醫療、軍事等領域都有廣泛的應用。目前,智能車輛以及在智能車輛基礎上開發出來的產品已成為智能交通系統運行的關鍵設備,世界上許多國家都在積極進行智能車輛的研究和開發設計[1],移動機器人出現于20世紀60年代,是機器人學的一個重要分支[1]。斯坦福研究院的Nils Nilssen和Charles Rosen等人,在1966年至1972年間研制出取名為Shakey的自主式移動機器人,目的是將人工智能技術應用到復雜的環境中,完成機器人系統的自主推理、規劃和控制。從此,移動機器人從無到有,數量不斷增多,智能車輛作為移動機器人的一個重要分支也得到越來越多的關注[1]。
智能小車也叫無人車輛,是一個集環境感知、規劃決策、多等級輔助駕駛[2]等多種功能于一體的綜合系統[3],它結合運用了計算機、傳感、信息、通信、導航及白動控制等技術[1],是典型的高新技術綜合體。它具有道路障礙自動識別、自動報警、自動制動、自動保持安全距離、車速和巡航控制等功能。智能車輛在原有車輛系統的基礎上增加了一些智能化技術的設計,主要特點是其在復雜的道路情況下,能自動繞開障礙物并沿著預定的道路軌跡行進[2]。
1 總體設計方案
采用STM32F103RC微處理器作為主控芯片,主要實現循跡、避障和無線通信等功能。紅外循跡模塊使小車可以根據地上的黑帶自動行駛,超聲波模塊通過超聲波來探查前方障礙,檢測小車與障礙物之間的距離,準確執行避障命令。電機驅動模塊通過L298N驅動小車前進、后退轉向及停止。無線通信模塊通過NRF24L01實現對小車的無線控制。系統框圖如圖1所示。
2 硬件設計
2.1 智能小車中央處理模塊的硬件設計
智能小車中央處理模塊采用基于Cortex-M3內核的STM32系列微控處理器STM32F103。該產品系列具有16 KB~1 MB Flash、多種控制外設、USB全速接口和CAN,在工業、醫療領域得到廣泛應用,本次所用的單片機是STM32F103RC,具有低電壓、低功耗、高性能、穩定性好、簡單易用等優勢,滿足小車的基本需求,其最小系統如圖2所示。
2.2 智能小車驅動模塊的硬件設計
智能小車驅動模塊使用的是L298的立式封裝L298N,它是一款可接受高電壓、大電流的雙路全橋式電機驅動芯片,工作電壓可達46 V,輸出電流最高可至4 A,采用Multiwatt 15腳封裝,接受標準TTL邏輯電平信號,具有兩個使能控制端,在不受輸入信號影響的情況下通過板載跳帽插拔的方式動態調整電路運作方式[4]。電機驅動電路圖如圖3所示。
2.3 智能小車超聲波測距避障模塊的硬件設計
智能小車超聲波避障模塊使用的是HC-SR04超聲波距離傳感器,它的核心是兩個超聲波傳感器,一個用作發射器,將電信號轉換為40 kHz超聲波脈沖;一個用作接收器,接收器監聽發射的脈沖。如果接收到脈沖,它將產生一個輸出脈沖,其寬度可用于確定脈沖傳播的距離。同時,我們可以使用舵機進行輔助。舵機的主要作用是改變HC-SR04模塊的照射方向,從而控制超聲波的發射方向。圖4為HC-SR04超聲波傳感器引腳。
2.4 智能小車循跡模塊的硬件設計
智能小車循跡使用的是TCRT5000光電傳感器模塊,它是基于TCRT5000紅外光電傳感器設計的一款紅外反射式光電開關,傳感器由高發射功率紅外光電二極管和高靈敏度光電晶體管組成,輸出信號經施密特電路整形[5],穩定可靠。當紅外線照射到黑帶上時,由于黑帶會吸收掉紅外線,致使小車的接收管無法接收到紅外線,探測器輸出高電平信號,指示二極管處于熄滅狀態;當紅外線照射到白色地面上時,會被重新反射回來[6],小車的紅外接收管吸收到紅外線,使探測器輸出低電平信號,指示二極管被點亮。通過對探測器輸出信號的檢測和分析,可以實現小車的自動循跡。圖5為小車循跡模塊電路圖。
2.5 無線通信模塊的硬件設計
NRF24L01是一款新型單片射頻收發器件,工作于2.4~2.5 GHz ISM頻段[5]。內置頻率合成器、功率放大器、晶體振蕩器、調制器等功能模塊[5],并融合了增強型ShockBurst技術,其中輸出功率和通信頻道可通過程序進行配置,NRF24L01功耗低,在以-6 dBm的功率發射時,工作電流也只有9 mA;接收時,工作電流只有12.3 mA,可提供多種低功率工作模式,工作在100 MW時電流為160 mA,在數據傳輸方面相對Wi-Fi距離更遠。
3 系統的軟件設計
3.1 智能小車驅動模塊軟件設計
智能小車驅動模塊使用的是L298的立式封裝L298N,其主要的功能有:
1)將L298N模塊的IN1和IN2分別連接到STM32通用定時器的兩個輸出通道引腳,通過配置定時器兩個輸出通道的PWM大小來控制電機的速度與方向。
2)通過將一個普通的GPIO引腳連接到模塊的EN端口來控制電機的制動與啟動。此外,小車的速度和轉向控制采用PID算法。
小車運動算法實現代碼如下:
// PID 參數
float Kp = 1.0;float Ki = 0.5;float Kd = 0.2;
// 時間步長
float dt = 0.1;
// 誤差變量
float error = 0;float error_previous = 0;float integral = 0;float derivative = 0;
// 輸出限制
float max_output = 100;float min_output = -100;
// 目標位置和當前位置
float target_position = 100;float current_position = 0;
int getPID(int current_position) {
// 模擬運動過程,循環計算 PID 控制器的輸出
for (int i = 0; i < 100; i++) {
// 計算誤差
error = target_position - current_position;
// 計算積分項、微分項和控制信號
integral = integral + error * dt;
derivative = (error - error_previous) / dt;
float output = Kp * error + Ki * integral + Kd * derivative;
// 限制輸出信號的范圍
if (output > max_output) {
output = max_output;
} else if (output < min_output) {
output = min_output;
}
//控制小車運動,根據控制信號進行相應動作,請根據具體情況進行替換
control_car(output);
// 更新誤差變量
error_previous = error;
printf("Time: %f, Error: %f, Output: %f\n", i * dt, error, output);
}
return 0;
}
3.2 智能小車超聲波避障模塊的軟件設計
首先我們要通過控制Trig引腳來發送一個至少10 μs的高電平脈沖信號[6],觸發超聲波的發射,在發射的同時開始計時,發射出去的超聲波在介質中傳播,由于聲波具有反射特性,遇到障礙物時就會反射回來,當超聲波的接收端接收到反射回來的超聲波時停止計時。介質為空氣時聲速為340 m/s,根據記錄的時間t,利用小車與障礙的距離=(t×聲速)/ 2這一公式計算出發射位置與障礙物之間的距離。測量距離后,接收到的回波信號會在Echo引腳上生成一個脈沖,寬度與物體距離成正比。可以通過控制器或開發板的輸入引腳來測量脈沖寬度。通過測量超聲波發射與接收之間的時間差,可以計算出障礙物與小車之間的距離。
避障功能程序代碼如下:
//定時器回調函數,用于啟動超聲波模塊
void HAL_TIM_PeriodElapsedCallback (TIM_HandleTypeDef *htim)
{
if(htim == &htim6)
{
HAL_TIM_Base_Stop_IT(&htim6);
ultrasonic=0;
HAL_GPIO_WritePin(Trig_GPIO, Trig_PIN, GPIO_PIN_SET);
HAL_TIM_Base_Start_IT(&htim7);
}
else if(htim == &htim7)
{
HAL_GPIO_WritePin(Trig_GPIO,
Trig_PIN, GPIO_PIN_RESET);
ultrasonic=1;
HAL_TIM_Base_Stop_IT(&htim7);
HAL_TIM_Base_Start_IT(&htim6);
}
}
//外中斷回調函數,用于獲取超聲波距離前方物體的距離
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin==Echo_PIN)
{
if(HAL_GPIO_ReadPin(Echo_GPIO, Echo_PIN))
{
ultrasonic_time=__HAL_TIM_GET_COUNTER(&htim6);
}
else if(ultrasonic==1)
{
ultrasonic=0;
ultrasonic_time=__HAL_TIM_GET_COUNTER
(&htim6)-ultrasonic_time;
ultrasonic_time=ultrasonic_time*17/10;
printf("distance = %d cm\r\n",ultrasonic_time);
}
}
}
3.3 智能小車循跡模塊的軟件設計
小車的循跡功能啟動時,STM32單片機內部的AD模式會對循跡傳感器中的數據進行收集,再反饋給單片機。程序主要通過HAL_GPIO_ReadPin函數來讀取左右兩側循跡傳感器的狀態。如果位于小車左側的傳感器檢測到黑帶,返回的值為真(1),執行Correct_Left()函數,這個函數會使車輛向左轉以避免碰撞。如果左側傳感器沒有檢測到黑線,程序會判斷右側傳感器是否檢測到黑帶。如果檢測到黑帶,返回的值為真(1),執行Correct_Right()函數,這個函數會使車輛向右轉。如果左右兩側的傳感器都沒有檢測到黑帶,返回的值都為假(0),執行Straight()函數,這個函數會使車輛保持直行狀態。通過這種方式,程序可以使小車根據檢測到的黑線進行相應的轉向動作,以避免發生碰撞或離開預定的路徑。圖6為循跡設計流程圖。
3.4 無線通信模塊的程序設計
本設計中采用Keil軟件進行了編程,Keil軟件對單片機編程有很大幫助,其優點是操作相對簡單。本設計中的智能小車使用C語言和C++語言來編寫程序代碼,為了方便我們使用STM32cubeMX軟件,通過對STM32芯片引腳及定時器的配置,快速生成HAL庫的源程序,實現設計功能。
通信模塊通過Linux系統搭建小車的服務器,再通過服務器與小車無線連接,最后對客戶端與小車的程序進行傳輸。本設計還采用了QT軟件來打造客戶端的用戶界面,該界面不僅展示了攝像頭的實時圖像,還呈現了環境檢測收集到的數據,并通過按鈕實現對小車的運動控制。
利用C++實現通信連接代碼如下:
int main() {
// 創建socket
int sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock < 0) {
perror("socket creation failed");
return 1;
}
// 設置服務器地址信息
struct sockaddr_in server_addr;
memset(&server_addr, 0, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); //服務器IP
server_addr.sin_port = htons(8080); // 服務器端口號
// 連接服務器
if (connect(sock, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
perror("connection failed");
return 1;
}
// 發送數據到服務器
const char *msg = "Hello, server!";
int len = strlen(msg);
if (send(sock, msg, len, 0) < 0) {
perror("send failed");
return 1;
}
// 接收服務器返回的數據
char buffer[1024];
int recv_len = recv(sock, buffer, sizeof(buffer), 0);
if (recv_len < 0) {
perror("recv failed");
return 1;
} else {
buffer[recv_len] = '\0'; // 添加字符串結尾符
cout << "Received from server: " << buffer << endl;
}
// 關閉socket連接
close(sock);
return 0;
}
以上代碼使用socket函數創建了一個TCP連接,并發送一條消息到服務器,然后接收了服務器返回的數據。在發送數據時使用了send函數,該函數將數據發送到指定的socket中。在接收數據時使用了recv函數,該函數從指定的socket中接收數據。最后,使用close函數關閉了socket連接。
設計一個使用Qt進行通信遙控的模塊:首先需要在Qt Creator中創建一個新的項目,這個項目將包含小車所有代碼和資源文件;接下來設計UI界面,要在Qt Creator中以拖放的方式來設計UI界面。界面中需要添加一些按鈕來控制小車的運動(如前進、后退、左轉、右轉),設置一個顯示區域來顯示從小車傳回的圖像,同時還需要編寫代碼來建立和維護一個網絡連接,這個連接將用于向小車發送控制命令,以及接收從小車傳回的圖像數據。Qt提供了QTcpSocket類幫助處理TCP連接。連接完畢后會收到從小車傳回的圖像數據,需要將這些數據轉換成圖像并顯示在UI界面上。Qt提供了QImage類來幫助處理圖像數據[7]。處理用戶輸入:當用戶點擊UI界面上的按鈕時,需要編寫相應的槽函數來處理這些事件。這些槽函數將根據用戶的輸入向小車發送相應的控制命令。
小車圖片接收代碼如下:
Widget::~Widget()
{
delete ui;
}
void Widget::on_connectBtn_clicked()
{
readFlag = true;
//連接視頻服務器
camSocket->connectToHost(ui->lineEdit->text(),8888);
//連接串口服務器
serSocket->connectToHost(ui->lineEdit->text(),2001);
}
//連接攝像頭服務器成功
void Widget::camConnectedSlot()
{
ui->connectBtn->setEnabled(false);
}
//連接串口服務器成功
void Widget::serConnectedSlot()
{
ui->upBtn->setEnabled(true);
ui->downBtn->setEnabled(true);
ui->leftBtn->setEnabled(true);
ui->rightBtn->setEnabled(true);
}
//接收并顯示圖片
4 系統功能測試
智能小車利用超聲波模塊實現避障功能,利用紅外光管實現循跡功能,同時實現了Linux與Windows之間的無線通信,經過測試,智能小車各個功能運行正常。系統測試結果如表1所示。
4.1 紅外光管循跡系統調試
該模塊主要測試TCRT5000傳感器是否能檢測到紅外線,測試時二極管會不斷發射紅外線,如發射出的紅外線沒有被反射回來[5],意味著模塊的輸出端為高電平,說明小車檢測到了黑帶,小車跟隨黑帶行駛,當前方有障礙物時紅外線被反射回來且強度足夠大,此時模塊的輸出端為低電平,說明小車未檢測到黑帶,其會自動微調方向,直至檢測到黑帶。經測試,小車能夠跟隨黑帶行駛,紅外光管循跡系統正常。圖7為小車紅外循跡調試方法。
4.2 超聲波避障系統調試
該模塊主要測試HC-SR04超聲波,圖8為模塊的實物圖。開啟超聲波模塊后,小車通過HC-SR04發射出超聲波,由于超聲波在傳播過程中遇到障礙物時會被反射回來,小車接收到反射的超聲波,測量出自身與障礙物之間的距離[8],如圖9所示。隨后小車通過電機驅動模塊改變方向進行避障。經測試,小車能夠自動避障,超聲波系統運行正常。
4.3 無線通信系統調試
該部分有四個控件、一個標簽(Label)、五個按鈕(Button)。一個標簽用來輸入小車的IP地址,一個按鈕用來控制連接和測試連接,另四個按鈕用來控制小車的前進、后退、左轉、右轉。QT中的信號與槽原理和計算機的中斷原理類似,某個特定信號發出后,程序就會調用并執行槽函數中的代碼。點擊connect會使電腦和小車系統相連接,從而控制小車的移動。當按下某一個控制按鈕時,程序跳轉到對應的槽函數,槽函數實現向串口寫數據的功能。
開啟無線通信系統,利用客戶端連接小車上的無線通信模塊與服務器,對IP地址的控制端口進行設置,再利用操控按鈕發送指令。智能小車收到指令后便會開展相應的動作[9]。
同時鏡頭生成的光學圖像會傳送至圖像傳感器,而后將光信號轉變為電信號,再通過A/D向數字圖像信號轉化,并發送至DSP進行處理加工,將信號處理為指定格式的圖像[10]后再傳送至客戶端的顯示屏,圖10為小車圖像轉化的原理圖。經測試,小車能夠實現無線通信,系統運行正常。
5 智能小車實物展示
智能小車已經實現了超聲測距避障,紅外光管循跡和無線通信的功能,圖11為小車各功能展示。
6 結 論
智能小車的基本功能已經實現,但是在測試過程中也出現了一些問題,針對相關問題進行了一些調整。經過調試,小車的各個功能也更加完善。
隨著科學技術的快速發展,人工智能技術越來越得到社會的高度重視,本文主要設計了基于STM32單片機的智能小車,擁有超聲波避障、紅外循跡和無線通信的功能,小車利用超聲波的反射原理實現了精準避障,利用紅外線的發射與接收實現了小車的循跡,同時利用無線裝置遠程控制小車的運動,該設計在自動控制領域擁有廣闊的發展前景,日后經過不斷的優化,會有更加寬廣的利用空間。
參考文獻:
[1]曹丙花,劉夢溪,陳月榮,等.基于陀螺儀控制的無線智能小車設計 [J].電氣電子教學學報,2018,40(3):72-76.
[2] 陸凱峰.基于DSP的多功能智能機器小車的研究 [D].無錫:江南大學,2008.
[3] 劉彥戎.基于STC89C51RC單片機的智能遙感避障小車的系統設計 [J].電子設計工程,2017,25(3):45-48+52.
[4] 孫穎.基于路徑規劃的智能小車控制系統研究 [D].青島:青島大學,2007.
[5] 段麗娜.基于FPGA的智能小車設計 [J].電子設計工程,2014,22(9):184-186+190.
[6] 盧宏炎,宋贊贊.建筑吊頂打孔機的結構設計 [J].精密制造與自動化,2021(2):34-36.
[7] 方國賢.基于STM32智能小車的設計與實現 [D].武漢:武漢輕工大學,2018.
[8] 崔茗涵.基于CAN網絡技術的疲勞駕駛預警系統設計與實現 [D].大連海事大學,2018.
[9] 于波,張強,李建成,等.基于單片機的智能小車系統 [J].化工自動化及儀表,2022,49(3):345-350+361.
[10] 蔣荔.基于STEAM的初中機器人R-CDIO教學模式設計及應用研究 [D].西安:陜西師范大學,2020.
作者簡介:胡純(2003.10—),男,漢族,安徽黃山人,本科在讀,研究方向:自動化。
收稿日期:2024-03-21