项目简介
本项目依托飞桨(PaddlePaddle)深度学习框架,开发了具备路标识别功能的智能车自动驾驶系统。项目覆盖从硬件环境配置、元器件调试到小车驱动开发的全流程,利用摄像头进行实时图像采集与处理,助力智能车实现自主导航。
项目的主要特性和功能
- 硬件环境配置:借助AI Studio的公共数据集搭建开发环境,对ESP32开发板及LED灯、按钮、电机、舵机、蜂鸣器和摄像头等元器件进行配置与调试。
- 元器件调试:LED灯可实现点亮、闪烁和呼吸灯效果;按钮能控制LED灯开关;电机可进行正转、反转和停止操作;舵机可调整角度;蜂鸣器能通过PWM信号调节音调和响度;摄像头能进行实时图像采集与处理。
- 小车驱动开发:支持通过Web界面控制小车前进、后退、左转、右转和停止,还能实现摄像头的实时流媒体传输和图像捕获。
安装使用步骤
1. 环境配置
- 在AI Studio的公共数据集中找到 “arduino智能小车” 数据集,下载 “esp32两个目录最新版.zip” 文件。
- 解压文件,把 “免安装环境” 和 “AppData” 文件夹中的 “Local” 文件夹放至C盘 “用户” 文件夹中的 “AppData” 文件夹内。
- 将 “免安装环境” 和 “Program Files (x86)” 文件夹中的 “Arduino” 文件夹放至C盘 “Program Files (x86)” 文件夹中。
- 打开 “Arduino” 文件夹中的 “arduino.exe”,在工具栏选 “开发板” 选项,选择 “ESP32 Arduino” - “AI Thinker ESP32 - CAM”。
- 用数据线把开发板连到电脑,在工具栏选对应端口,打开串口监视器,将波特率设为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】