littlebot
Published on 2025-03-31 / 0 Visits
0

【源码】基于飞桨的智能车自动驾驶与路标识别

项目简介

本项目依托飞桨(PaddlePaddle)深度学习框架,开发了具备路标识别功能的智能车自动驾驶系统。项目覆盖从硬件环境配置、元器件调试到小车驱动开发的全流程,利用摄像头进行实时图像采集与处理,助力智能车实现自主导航。

项目的主要特性和功能

  1. 硬件环境配置:借助AI Studio的公共数据集搭建开发环境,对ESP32开发板及LED灯、按钮、电机、舵机、蜂鸣器和摄像头等元器件进行配置与调试。
  2. 元器件调试:LED灯可实现点亮、闪烁和呼吸灯效果;按钮能控制LED灯开关;电机可进行正转、反转和停止操作;舵机可调整角度;蜂鸣器能通过PWM信号调节音调和响度;摄像头能进行实时图像采集与处理。
  3. 小车驱动开发:支持通过Web界面控制小车前进、后退、左转、右转和停止,还能实现摄像头的实时流媒体传输和图像捕获。

安装使用步骤

1. 环境配置

  1. 在AI Studio的公共数据集中找到 “arduino智能小车” 数据集,下载 “esp32两个目录最新版.zip” 文件。
  2. 解压文件,把 “免安装环境” 和 “AppData” 文件夹中的 “Local” 文件夹放至C盘 “用户” 文件夹中的 “AppData” 文件夹内。
  3. 将 “免安装环境” 和 “Program Files (x86)” 文件夹中的 “Arduino” 文件夹放至C盘 “Program Files (x86)” 文件夹中。
  4. 打开 “Arduino” 文件夹中的 “arduino.exe”,在工具栏选 “开发板” 选项,选择 “ESP32 Arduino” - “AI Thinker ESP32 - CAM”。
  5. 用数据线把开发板连到电脑,在工具栏选对应端口,打开串口监视器,将波特率设为115200。

2. 元器件调试

LED灯

编写程序实现点亮、闪烁和呼吸灯效果,示例代码: c const int led32 = 32; void setup() { pinMode(led32, OUTPUT); } void loop() { digitalWrite(led32, LOW); delay(500); digitalWrite(led32, HIGH); delay(500); }

按钮

编写程序实现按下按钮控制LED灯开关,示例代码: c const int led32 = 32; const int button35 = 35; void setup() { pinMode(led32, OUTPUT); pinMode(button35, INPUT); } void loop() { if (digitalRead(button35) == LOW) { digitalWrite(led32, !digitalRead(led32)); delay(500); } }

电机

编写程序控制电机正转、反转和停止,示例代码: c const int a = 26; const int b = 27; void setup() { pinMode(a, OUTPUT); pinMode(b, OUTPUT); } void loop() { digitalWrite(a, LOW); digitalWrite(b, HIGH); delay(5000); digitalWrite(a, HIGH); digitalWrite(b, LOW); delay(5000); digitalWrite(a, HIGH); digitalWrite(b, HIGH); delay(5000); }

舵机

编写程序控制舵机角度调整,示例代码: c const int a = 15; void setup() { ledcSetup(0, 50, 8); ledcAttachPin(a, 0); } void loop() { ledcWrite(0, 20); delay(1000); ledcWrite(0, 7); delay(1000); }

蜂鸣器

编写程序通过PWM信号控制蜂鸣器音调和响度,示例代码: c const int buzzer = 25; void setup() { ledcSetup(0, 1000, 8); ledcAttachPin(buzzer, 0); } void loop() { for (int f = 200; f <= 2000; f += 10) { ledcWriteTone(0, f); delay(1000); } }

摄像头

编写程序实现实时图像采集与处理,示例代码: ```c

include "esp_camera.h"

void setup() { camera_config_t config; config.ledc_channel = LEDC_CHANNEL_0; config.ledc_timer = LEDC_TIMER_0; config.pin_d0 = Y2_GPIO_NUM; config.pin_d1 = Y3_GPIO_NUM; config.pin_d2 = Y4_GPIO_NUM; config.pin_d3 = Y5_GPIO_NUM; config.pin_d4 = Y6_GPIO_NUM; config.pin_d5 = Y7_GPIO_NUM; config.pin_d6 = Y8_GPIO_NUM; config.pin_d7 = Y9_GPIO_NUM; config.pin_xclk = XCLK_GPIO_NUM; config.pin_pclk = PCLK_GPIO_NUM; config.pin_vsync = VSYNC_GPIO_NUM; config.pin_href = HREF_GPIO_NUM; config.pin_sscb_sda = SIOD_GPIO_NUM; config.pin_sscb_scl = SIOC_GPIO_NUM; config.pin_pwdn = PWDN_GPIO_NUM; config.pin_reset = RESET_GPIO_NUM; config.xclk_freq_hz = 20000000; config.pixel_format = PIXFORMAT_JPEG; esp_err_t err = esp_camera_init(&config); if (err != ESP_OK) { Serial.printf("Camera init failed with error 0x%x", err); return; } } void loop() { camera_fb_t * fb = esp_camera_fb_get(); if (!fb) { Serial.println("Camera capture failed"); return; } esp_camera_fb_return(fb); delay(1000); } ```

3. 小车驱动开发

Web界面控制

通过Web界面控制小车前进、后退、左转、右转和停止,示例代码: c void move_forward() { mcpwm_set_duty(MCPWM_UNIT_0, MCPWM_TIMER_0, MCPWM_OPR_A, 0); mcpwm_set_duty(MCPWM_UNIT_0, MCPWM_TIMER_0, MCPWM_OPR_B, motor_duty_cycle); } void move_backward() { mcpwm_set_duty(MCPWM_UNIT_0, MCPWM_TIMER_0, MCPWM_OPR_A, motor_duty_cycle); mcpwm_set_duty(MCPWM_UNIT_0, MCPWM_TIMER_0, MCPWM_OPR_B, 0); } void motor_stop() { mcpwm_set_duty(MCPWM_UNIT_0, MCPWM_TIMER_0, MCPWM_OPR_A, 100); mcpwm_set_duty(MCPWM_UNIT_0, MCPWM_TIMER_0, MCPWM_OPR_B, 100); } void turn_left() { mcpwm_set_duty(MCPWM_UNIT_1, MCPWM_TIMER_1, MCPWM_OPR_A, servo_duty_cycle_center - servo_duty_cycle_differ); } void turn_right() { mcpwm_set_duty(MCPWM_UNIT_1, MCPWM_TIMER_1, MCPWM_OPR_A, servo_duty_cycle_center + servo_duty_cycle_differ); } void straight() { mcpwm_set_duty(MCPWM_UNIT_1, MCPWM_TIMER_1, MCPWM_OPR_A, servo_duty_cycle_center); }

摄像头实时流媒体传输

实现摄像头的实时流媒体传输和图像捕获,示例代码: c void startCameraServer() { server.on("/", HTTP_GET, [](AsyncWebServerRequest * request) { request->send_P(200, "text/html", index_html); }); server.on("/capture", HTTP_GET, [](AsyncWebServerRequest * request) { camera_fb_t * fb = esp_camera_fb_get(); if (!fb) { Serial.println("Camera capture failed"); return; } request->send_P(200, "image/jpeg", (const uint8_t *)fb->buf, fb->len); esp_camera_fb_return(fb); }); server.begin(); }

下载地址

点击下载 【提取码: 4003】