物联网之ESP32控制舵机、通过网页设置舵机角度、Web服务、舵机原理、接线、Arduino、WiFi、Http

本文主要是介绍物联网之ESP32控制舵机、通过网页设置舵机角度、Web服务、舵机原理、接线、Arduino、WiFi、Http,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

MENU

  • 前言
  • 原理
  • 硬件电路设计
  • 软件程序设计
    • LEDC输出PWM信号
    • 使用第三方库控制舵机
    • 网页控制舵机


前言

舵机在电子产品中非常常见,比如四足机器人、固定翼航模等都有应用,因此学习舵机对电子制作非常有意义。本文章使用Arguino的PWM对SG90舵机旋转角度控制。


原理

舵机是一种位置(角度)伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。舵机只是一种通俗的叫法,其本质是一个伺服电机。

舵机

舵机有很多规格,但所有的舵机都有外接三根线,分别用棕、红和橙三种颜色进行区分,由于舵机品牌不同,颜色也会有所差异,棕色为接地线,红色为电源正极线,橙色为信号线。只要通过信号线给予规定的控制信号即可实现舵机码盘的转动。

接线

SG90的主要电气参数
使用电压: 4.8V~6V
尺寸: 221.5mm x 11.8mm x 22.7mm
重量: 9g
角度范围: 0-180°


舵机的工作原理是由接收机或者单片机发出信号给舵机,其内部有一个基准电路,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。经由电路板上的IC判断转动方向,再驱动无核心马达开始转动,透过减速齿轮将动力传至摆臂,同时由位置检测器送回信号,判断是否已经到达定位。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。一般舵机旋转的角度范围是0度到180度,当然也有0度到360度。


没有必要了解舵机的内部结构,只需要知道如何通过PWM控制其转动即可。舵机的控制就是通过一个固定的频率,给其不同的占空比的,来控制舵机不同的转角。


舵机的转动的角度是通过调节PWM(脉冲宽度调制)信号的占空比来实现的,标准PWM(脉冲宽度调制)信号的周期固定为20ms(50Hz),理论上脉宽分布应在1ms到2ms之间,但是,事实上脉宽可由0.5ms到2.5ms之间,脉宽和舵机的转角0°~180°相对应。有一点值得注意的地方,由于舵机牌子不同,对于同一信号,不同牌子的舵机旋转的角度也会有所不同。

角度与时间

0.5~2.5ms的PWM高电平部分对应控制180度舵机的0~180度,对应的控制关系。

对应关系

高电平占整个周期(20ms)的时间舵机旋转的角度对应的占空比
0.5ms0.5//20
1ms45°1//20
1.5ms90°1.5//20
2ms135°2//20
2.5ms180°2.5//20

硬件电路设计

材料名称数量
舵机1
杜邦线(跳线)3

线路图

注意接线顺序。


软件程序设计

LEDC输出PWM信号

首先,使用LEDC输出PWM信号,根据之前的实验原理,可以确定频率、最大脉宽与最小脉宽。

// 1/20秒,50Hz的频率,20ms的周期,这个变量用来存储时钟基准
#define FREQ 50
// 通道
// 高速通道(0~7)由80MHz时钟驱动
// 低速通道(8~15)由1MHz时钟驱动
#define CHANNEL 0
// 分辨率设置为8,就是2的8次方,用256的数值来映射角度
#define RESOLUTION 8
// 定义舵机PWM控制引脚
#define SERVO 13// 定义函数用于输出PWM的占空比
int calculatePWM(int degree) {// 20ms周期内,高电平持续时长0.5-2.5ms,对应0-180度舵机角度// 对应0.5ms(0.5ms/(20ms/256))float min_width = 0.6 / 20 * pow(2, RESOLUTION);// 对应2.5ms(2.5ms/(20ms/256))float max_width = 2.5 / 20 * pow(2, RESOLUTION);if (degree < 0) degree = 0;if (degree > 180) degree = 180;// 返回度数对应的高电平的数值return (int)(((max_width - min_width) / 180) * degree + min_width);
}void setup() {// 用于设置LEDC通道的频率和分辨率ledcSetup(CHANNEL, FREQ, RESOLUTION);// 将通道与对应的引脚连接ledcAttachPin(SERVO, CHANNEL);
}void loop() {for (int i = 0; i <= 180; i += 10) {// 输出PWM,设置LEDC通道的占空比ledcWrite(CHANNEL, calculatePWM(i));delay(1000);}
}

使用第三方库控制舵机

如果想使用Arduino控制舵机就需要在ESP32Servo库,点击项目,选择加载库中的管理库

管理库

然后输入ESP32Servo,点击安装即可。

安装

可以在VSCode的PlatformIO中,根据案例了解ESP32Servo库的使用方法。

VSCode

#include <ESP32Servo.h>#define SERVO_PIN 13
#define MAX_WIDTH 2500
#define MIN_WIDTH 500// 定义servo对象
Servo my_servo;void setup() {// 分配硬件定时器ESP32PWM::allocateTimer(0);// 设置频率my_servo.setPeriodHertz(50);// 关联servo对象与GPIO引脚,设置脉宽范围my_servo.attach(SERVO_PIN, MIN_WIDTH, MAX_WIDTH);
}void loop() {my_servo.write(180);delay(1000);my_servo.write(0);delay(1000);
}

网页控制舵机

代码

#include <WiFi.h>
#include <WebServer.h>
#include <math.h>// Wi-Fi 网络名称和密码
const char* ssid = "ShiLai";
const char* password = "MJgn20240904$";// Web服务器对象
WebServer server(80);// 频率、通道、分辨率和舵机引脚定义
#define FREQ 50
#define CHANNEL 0
#define RESOLUTION 8
#define SERVO 13// 定义函数用于输出PWM的占空比
int calculatePWM(int degree) {// 20ms周期内,高电平持续时长0.5-2.5ms,对应0-180度舵机角度。float min_width = 0.6 / 20 * pow(2, RESOLUTION);float max_width = 2.5 / 20 * pow(2, RESOLUTION);if (degree < 0) degree = 0;if (degree > 180) degree = 180;return (int)(((max_width - min_width) / 180) * degree + min_width);
}void setup() {// 设置串口波特率Serial.begin(9600);// 连接到Wi-FiWiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) {delay(500);Serial.print("加载中...");}Serial.print("\nIP地址:");Serial.println(WiFi.localIP());// 用于设置 LEDC 通道的频率和分辨率ledcSetup(CHANNEL, FREQ, RESOLUTION);// 将通道与对应的引脚连接ledcAttachPin(SERVO, CHANNEL);// 设置处理网页请求的函数server.on("/", handleRoot);server.on("/set", handleServo);// 启动Web服务器server.begin();
}void loop() {// 处理网页请求server.handleClient();
}// 处理根页面的请求
void handleRoot() {String html = "<!DOCTYPE html>";html += "<html lang='en'>";html += "<head>";html += "<meta charset='UTF-8'>";html += "<meta name='viewport' content='width=device-width, initial-scale=1.0'>";html += "<title>网页控制舵机</title>";html += "</head>";html += "<body>";html += "<h1>网页控制舵机</h1>";html += "<input id='idInpu' type='number' min='0' max='180' value='0' />";html += "<button style='margin-left: 8px;' οnclick='handleSetAngle()'>设置角度</button>";html += "<p id='idP'></p>";html += "<script>";html += "let idP = document.getElementById('idP');";html += "handleSetAngle();";html += "function handleSetAngle() {";html += "let idInpu = document.getElementById('idInpu').value;";html += "let xhttp = new XMLHttpRequest();";html += "idP.innerHTML = idInpu;";html += "xhttp.open('GET', '/set?angle=' + idInpu, true);";html += "xhttp.onreadystatechange = function() {";html += "let isCode = this.readyState === 4 && this.status === 200;";html += "if (isCode) idP.innerHTML = this.responseText;";html += "};";html += "xhttp.send();";html += "}";html += "</script>";html += "</body>";html += "</html>";server.send(200, "text/html", html);
}// 处理舵机角度设置的请求
void handleServo() {String angleStr = server.arg("angle");int angle = angleStr.toInt();// 检查角度是否在0到180度之间if (angle >= 0 && angle <= 180) {ledcWrite(CHANNEL, calculatePWM(angle));server.send(200, "text/html", "Angle set to: " + angleStr);} else {server.send(200, "text/html", "Invalid angle. Please enter a value between 0 and 180.");}
}

解析
代码段使用ESP32通过Wi-Fi建立一个Web服务器,允许用户通过网页输入角度来控制舵机的旋转角度。


01、引入库和定义常量

#include <WiFi.h>
#include <WebServer.h>
#include <math.h>

WiFi.h用于连接Wi-Fi网络。
WebServer.h用于创建一个HTTP Web服务器。
math.h包含数学函数库,用于进行角度与PWM信号的计算。


02、Wi-Fi 网络名称和密码

const char* ssid = "ShiLai";
const char* password = "MJgn20240904$";

ssid和password定义需要连接的Wi-Fi网络的名称和密码。


03、Web服务器对象

WebServer server(80);

创建一个WebServer对象,端口号为80,表示HTTP服务器的默认端口。


04、舵机控制的定义

#define FREQ 50
#define CHANNEL 0
#define RESOLUTION 8
#define SERVO 13

FREQ: PWM信号的频率设置为50Hz(标准舵机的工作频率)。
CHANNEL: LEDC通道编号,ESP32上使用硬件PWM控制舵机。
RESOLUTION: PWM信号的分辨率设置为8位。
SERVO: 舵机信号线连接的引脚编号为13。


05、定义函数用于输出PWM的占空比

int calculatePWM(int degree) {float min_width = 0.6 / 20 * pow(2, RESOLUTION);float max_width = 2.5 / 20 * pow(2, RESOLUTION);if (degree < 0) degree = 0;if (degree > 180) degree = 180;return (int)(((max_width - min_width) / 180) * degree + min_width);
}

calculatePWM函数用于将舵机的角度(0~180度)转换为对应的PWM占空比。
min_width和max_width分别表示对应于0度和180度时的PWM占空比宽度。
通过线性插值计算出给定角度对应的PWM信号。


06、setup函数

void setup() {Serial.begin(9600);WiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) {delay(500);Serial.print("加载中...");}Serial.print("\nIP地址:");Serial.println(WiFi.localIP());ledcSetup(CHANNEL, FREQ, RESOLUTION);ledcAttachPin(SERVO, CHANNEL);server.on("/", handleRoot);server.on("/set", handleServo);server.begin();
}

Serial.begin(9600)初始化串口通信,波特率为9600,用于调试信息输出。
WiFi.begin(ssid, password)尝试连接Wi-Fi网络,等待连接成功。
ledcSetup(CHANNEL, FREQ, RESOLUTION)配置LEDC通道,设置PWM频率和分辨率。
ledcAttachPin(SERVO, CHANNEL)将LEDC通道与舵机信号引脚连接。
server.on("/", handleRoot)设置根路径的HTTP请求处理函数。
server.on("/set", handleServo)设置用于调整舵机角度的HTTP请求处理函数。
server.begin()启动Web服务器。


07、loop函数

void loop() {server.handleClient();
}

loop函数中调用server.handleClient(),用于不断处理来自客户端的HTTP请求。


08、处理根页面的请求

void handleRoot() {String html = "<!DOCTYPE html>...";server.send(200, "text/html", html);
}

handleRoot函数生成一个HTML页面,用户可以在该页面中输入舵机角度,并通过点击按钮发送请求以设置舵机角度。
server.send(200, “text/html”, html)向客户端发送HTML内容。


09、处理舵机角度设置的请求

void handleServo() {String angleStr = server.arg("angle");int angle = angleStr.toInt();if (angle >= 0 && angle <= 180) {ledcWrite(CHANNEL, calculatePWM(angle));server.send(200, "text/html", "Angle set to: " + angleStr);} else {server.send(200, "text/html", "Invalid angle. Please enter a value between 0 and 180.");}
}

handleServo函数接收HTTP请求中的angle参数,并将其转换为整数。
检查角度是否在0到180度之间,若在范围内则调用ledcWrite函数设置舵机的PWM信号,否则返回错误信息。


10、总结
代码段在ESP32上实现一个Web服务器,允许用户通过网页界面输入舵机的角度,服务器接收到请求后将角度转换为PWM信号以控制舵机旋转。


效果图

0度

0°


90度

90°


180度

180°

这篇关于物联网之ESP32控制舵机、通过网页设置舵机角度、Web服务、舵机原理、接线、Arduino、WiFi、Http的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1142209

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

hdu4407(容斥原理)

题意:给一串数字1,2,......n,两个操作:1、修改第k个数字,2、查询区间[l,r]中与n互质的数之和。 解题思路:咱一看,像线段树,但是如果用线段树做,那么每个区间一定要记录所有的素因子,这样会超内存。然后我就做不来了。后来看了题解,原来是用容斥原理来做的。还记得这道题目吗?求区间[1,r]中与p互质的数的个数,如果不会的话就先去做那题吧。现在这题是求区间[l,r]中与n互质的数的和

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

【区块链 + 人才服务】可信教育区块链治理系统 | FISCO BCOS应用案例

伴随着区块链技术的不断完善,其在教育信息化中的应用也在持续发展。利用区块链数据共识、不可篡改的特性, 将与教育相关的数据要素在区块链上进行存证确权,在确保数据可信的前提下,促进教育的公平、透明、开放,为教育教学质量提升赋能,实现教育数据的安全共享、高等教育体系的智慧治理。 可信教育区块链治理系统的顶层治理架构由教育部、高校、企业、学生等多方角色共同参与建设、维护,支撑教育资源共享、教学质量评估、

Java Web指的是什么

Java Web指的是使用Java技术进行Web开发的一种方式。Java在Web开发领域有着广泛的应用,主要通过Java EE(Enterprise Edition)平台来实现。  主要特点和技术包括: 1. Servlets和JSP:     Servlets 是Java编写的服务器端程序,用于处理客户端请求和生成动态网页内容。     JSP(JavaServer Pages)

BUUCTF靶场[web][极客大挑战 2019]Http、[HCTF 2018]admin

目录   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 [web][HCTF 2018]admin 考点:弱密码字典爆破 四种方法:   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 访问环境 老规矩,我们先查看源代码

【区块链 + 人才服务】区块链集成开发平台 | FISCO BCOS应用案例

随着区块链技术的快速发展,越来越多的企业开始将其应用于实际业务中。然而,区块链技术的专业性使得其集成开发成为一项挑战。针对此,广东中创智慧科技有限公司基于国产开源联盟链 FISCO BCOS 推出了区块链集成开发平台。该平台基于区块链技术,提供一套全面的区块链开发工具和开发环境,支持开发者快速开发和部署区块链应用。此外,该平台还可以提供一套全面的区块链开发教程和文档,帮助开发者快速上手区块链开发。

【Linux】应用层http协议

一、HTTP协议 1.1 简要介绍一下HTTP        我们在网络的应用层中可以自己定义协议,但是,已经有大佬定义了一些现成的,非常好用的应用层协议,供我们直接使用,HTTP(超文本传输协议)就是其中之一。        在互联网世界中,HTTP(超文本传输协议)是一个至关重要的协议,他定义了客户端(如浏览器)与服务器之间如何进行通信,以交换或者传输超文本(比如HTML文档)。