基于单片机的智能小车设计

known 发布于 2025-08-25 阅读(379)

摘 要:随着科学技术的不断发展,人工智能化的重要性日益显现,引起学界和业界人士的广泛关注。文章提出并设计了以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

标签:  小车 

免责声明

本文来自网络,不代表本站立场。如有不愿意被转载的情况,请联系我们。

iidomino cuppor