ESP32-CAM模块网络摄像头demo加装舵机控制教程

本文详细指导如何通过修改网络摄像头demo程序,利用ESP32-CAM模块和不同类型的舵机实现电机控制。涉及硬件连接、C代码编写、HTML界面设计及占空比计算,适合初学者进行物联网项目实践。

目录

硬件

1、ESP32-CAM模块 + USB串口
2、360°舵机
3、180°舵机

接线方式

在这里插入图片描述

把电机按照产品描述连接5V跟GND,信号线按照设定PWM的输出GPIO口接,如我,GPIO14为180°电机控制信号,GPIO15为360°电机控制信号。

电机线描述如下图
在这里插入图片描述

修改网络摄像头demo程序

1、打开VSCode,打开demo程序

在这里插入图片描述在这里插入图片描述

2、在文件夹camera_web_server中的main文件夹中创建电机控制的.c文件,在main文件夹的include中创建电机控制的.h文件
在这里插入图片描述
3、打开app_mcpwm.h文件,添加电机控制函数声明。目前需要用到的是以下几个函数

//app_mcpwm.h
#ifndef _APP_MCPWM_H_		//
#define _APP_MCPWM_H_		//头文件预处理

#ifdef __cplusplus
extern "C" {
#endif

void app_mcpwm_main();			//电机初始化函数

void motor_forward(float duty); //PWM占空比设置,用于180°电机控制角度

void motor_step();			//360°电机正转

void motor_back();			//360°电机反转

void motor_stop();			//360°电机停止
#ifdef __cplusplus
}
#endif

#endif

4、打开app_mcpwm.c文件,开始对电机控制函数进行实现。

#include <stdio.h>
#include "string.h"
#include "app_mcpwm.h"
#include "driver/mcpwm.h"		//电机PWM输出控制的部分其实芯片厂商已经给出对应的接口,具体实现在esp-idf目录下的driver目录中。我们这里把头文件#include "driver/mcpwm.h"添加进来就可以使用与PWM相关的函数。



void moto_init(){			//做PWM的初始化
    mcpwm_gpio_init(MCPWM_UNIT_0, MCPWM0A, 14);		//首先是初始化GPIO14,设置成MCPWM0A的输出引脚
    mcpwm_gpio_init(MCPWM_UNIT_0, MCPWM0B, 15);		//首先是初始化GPIO15,设置成MCPWM0B的输出引脚
    mcpwm_config_t mcpwmConfig = {					//设置Time0计时器的状态
        .frequency = 50, 							//设置频率,单位是HZ。周期=1/频率,算出周期=20ms	
        .cmpr_a = 2.5, 								//PWM0A用于控制180°电机,0°的高电平是0.5ms,所以初始化占空比=0.5ms/20ms = 2.5% 
        .cmpr_b = 7.5, 								//PWM0B用于控制360°电机,静止的高电平是1.5ms,所以初始化占空比=1.5ms/20ms = 7.5% 
        .counter_mode = MCPWM_UP_COUNTER,			//设置Time0计时器的计数方式为往上加
        .duty_mode = MCPWM_DUTY_MODE_0,				//MCPWM_DUTY_MODE_0以为高电平占周期的占比方式
    };
    mcpwm_init(MCPWM_UNIT_0, MCPWM_TIMER_0, &mcpwmConfig);	//初始化开始,完成这一步后模块开始输出PWM波
}

void app_mcpwm_main(){		//主函数进来的接口
    moto_init();
}

void motor_forward(float duty){	
    mcpwm_set_duty(MCPWM_UNIT_0, MCPWM_TIMER_0, MCPWM_OPR_A, duty);		//修改PWM0A的占空比为duty
}

void motor_step(){
    mcpwm_set_duty(MCPWM_UNIT_0, MCPWM_TIMER_0, MCPWM_OPR_B, 5);	//修改PWM0B的占空比为5%
}

void motor_back(){
    mcpwm_set_duty(MCPWM_UNIT_0, MCPWM_TIMER_0, MCPWM_OPR_B, 10);	//修改PWM0B的占空比为10%
}
void motor_stop(){
    mcpwm_set_duty(MCPWM_UNIT_0, MCPWM_TIMER_0, MCPWM_OPR_B, 7.5);	//修改PWM0B的占空比为7.5%
}

5、在app_main.c文件中加入电机控制函数的调用
在这里插入图片描述

以上这几部就已经可以写好电机控制的函数了。但是我们的目标是由HTML网页控制电机转动。接着往下。

修改HTML文件

以VScode打开main目录下的WWW目录下的index_ov2640.html
在这里插入图片描述

1、我们的目标是添加两个控制电机的控件,可以参考AE Level,在该控件下添加连个一样的布局。
在这里插入图片描述
2、打开index_ov2640.html,,找到AE Level的那一行,把真个布局拷贝复制修改如下
在这里插入图片描述
这里可以看到在新增控制180和360中,

<input type="range" id="motor2_place" min="-2" max="2" value="0" class="default-action">

注意其中的id=xxx,这个id最中会传到模块中。

在这里插入图片描述
修改最大最小值,保存
我们可以看到HTML已经改好了
在这里插入图片描述

修改模块的app_httpd.c文件

找到函数

static esp_err_t cmd_handler(httpd_req_t *req)

该函数是HTML操作类请求的入口
最后面添加
在这里插入图片描述
此部分为处理关键字名子为motor1_place和motor2_place的函数部分:
1、motor1_place处理中先根据角度转换成对应占空比,在设置到模块中。
2、motor1_place处理中则直接根据1:正转;-1:反转;0:停止来修改不同的占空比。

修改完成后,进行编译烧录,即可完成。

最后说一下占空比怎么计算。

180°电机控制

180°电机的官方使用说明如下
在这里插入图片描述
0°~180°对应的脉冲宽度为0.5ms—2.5ms

以频率为50HZ来算,那么周期T
T = 1 / 频率 = 1 / 50 =0.02s = 20ms
那么0°~180°对应占空比是0.5/20 — 2.5/20 也就是2.5 — 12.5

设置x为要转的角度,设占空比为y,那么可以得到以下公式:

y = x * (12.5 - 2.5)/180 +2.5

故对于180°电机,初始化占空比为2.5,设置某角度则根据上述公式计算出占空比。

360°电机控制

360°电机的官方使用说明如下
在这里插入图片描述

360°电机需要控制的是方向跟速度。
1ms — 1.5ms :正转,且速度越靠近1.5ms越慢
1.5 : 停止
1.5ms — 2ms : 反转,且速度越靠近1.5ms越慢

那么我们设定速度为固定最大,即:

1ms:正转
1.5 : 停止
2ms : 反转

以频率为50HZ来算,那么周期T
T = 1 / 频率 = 1 / 50 =0.02s = 20ms
那么

正转对应占空比:5%
停止对应占空比:7.5%
反转对应占空比:10%

<think>好的,我现在需要帮用户解决关于ESP32-CAM和PCA9685控制8路舵机的示例代码和教程的问题。首先,我得回忆一下这两个组件的相关知识。 ESP32-CAM是一款集成了摄像头的开发板,常用于图像传输和物联网项目。它基于ESP32芯片,支持Wi-Fi和蓝牙。而PCA9685是一个I2C接口的16通道PWM控制器,常用于控制多个舵机或LED。用户想用这两个组件控制8个舵机,所以需要连接它们,并编写代码。 首先,硬件连接是关键。ESP32-CAM的I2C引脚通常是GPIO 2(SDA)和GPIO 14(SCL),但需要确认,因为不同板子可能有差异。PCA9685的VCC接5V,GND接地,SDA和SCL对应连接。舵机的信号线接到PCA9685的通道0到7,共8路。 接下来是软件部分。用户需要安装Adafruit_PWMServoDriver库,这个库简化了PCA9685的控制。代码结构大致包括初始化I2C通信、设置PWM频率(通常50Hz对应舵机)、然后控制舵机角度。需要注意的是,舵机角度需要转换为对应的脉宽,比如0度对应100us,180度对应2000us,但不同舵机可能有差异,可能需要调整。 用户可能遇到的问题包括I2C地址冲突,PCA9685默认地址是0x40,如果有其他设备可能需要改地址。还有电源问题,多个舵机同时运行可能需要外部电源,避免电流不足导致ESP32-CAM重启。此外,ESP32-CAM的GPIO可能被摄像头占用,需要确保使用的I2C引脚未被占用。 代码示例中,需要包含Wire库和Adafruit库,初始化对象,设置频率。然后,在循环中逐个控制舵机转动,可能有延迟。用户可能需要调整脉冲长度来匹配舵机实际角度范围。 教程步骤应该详细说明硬件连接、库安装、代码上传和测试。可能需要提醒用户上传代码时注意ESP32-CAM的进入下载模式的方法,比如按住复位按钮再按复位按钮。 还要考虑用户可能的疑问,比如如何扩展更多舵机(PCA9685有16通道),如何同步控制多个舵机,或者如何结合摄像头功能与舵机控制。不过用户当前问题集中在基础控制,可能不需要深入这些方面,但可以简要提及。 最后,验证代码的正确性,确保没有语法错误,逻辑正确。比如,在循环中遍历0到7通道,设置角度后延迟,观察舵机转动是否平滑。可能需要建议用户先测试单个舵机,再逐步增加,方便排查问题。</think>我将为您分步骤讲解ESP32-CAM搭配PCA9685控制8路舵机的实现方法: --- ### 一、硬件准备 1. **ESP32-CAM开发板**(带摄像头模组) 2. **PCA9685模块**(16通道PWM控制器) 3. **舵机**(SG90/MG996等,5V供电) 4. **杜邦线**若干 5. **5V/2A电源**(建议单独给舵机供电) --- ### 二、电路连接 | ESP32-CAM | PCA9685 | 舵机 | |-----------|---------|-----| | 5V | VCC | - | | GND | GND | GND | | GPIO2(SDA)| SDA | - | | GPIO14(SCL)| SCL | - | | - | PWM0-7 | 信号线 | --- ### 三、Arduino代码实现 ```cpp #include <Wire.h> #include <Adafruit_PWMServoDriver.h> Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x40); #define SERVOMIN 100 // 0度对应脉冲长度(单位:微秒) #define SERVOMAX 500 // 180度对应脉冲长度 #define FREQUENCY 50 // 舵机工作频率 void setup() { Serial.begin(115200); pwm.begin(); pwm.setPWMFreq(FREQUENCY); } void setServoAngle(uint8_t channel, int angle) { int pulse = map(angle, 0, 180, SERVOMIN, SERVOMAX); pwm.setPWM(channel, 0, pulse); } void loop() { // 依次控制0-7号舵机 for(int ch=0; ch<8; ch++){ for(int ang=0; ang<=180; ang+=10){ setServoAngle(ch, ang); delay(50); } delay(500); for(int ang=180; ang>=0; ang-=10){ setServoAngle(ch, ang); delay(50); } } } ``` --- ### 四、库安装步骤 1. 打开Arduino IDE 2. 点击「工具」->「管理库」 3. 搜索安装 **Adafruit PWM Servo Driver Library** --- ### 五、关键参数说明 $$ \text{脉冲宽度} = \frac{\text{角度} \times (2000 - 500)}{180} + 500 $$ 1. `SERVOMIN/SERVOMAX`需根据实际舵机调整 2. 使用`setPWMFreq(50)`设置标准舵机频率 3. I2C地址默认为0x40(可通过模块跳线修改) --- ### 六、常见问题排查 1. **舵机抖动**:检查供电是否充足(建议单独供电) 2. **无响应**:检查I2C地址是否正确(可用I2C扫描程序确认) 3. **角度偏差**:校准`SERVOMIN/SERVOMAX`参数 4. **WiFi干扰**:避免使用GPIO0/GPIO2等复用引脚 --- ### 七、进阶应用建议 1. 结合OV2640摄像头实现视觉伺服控制 2. 使用FreeRTOS创建独立舵机控制任务 3. 通过WebSocket实现远程控制 4. 添加电位器实现闭环控制 建议先使用单个舵机测试,确认基础功能正常后再扩展多路控制。实际项目中需注意舵机总电流不超过电源负载能力。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值