当前位置: 首页 > news >正文

ESP8266使用舵机以及16路PWM舵机PCA 9685的使用方式

PWM全称

50Hz也就是一秒内变换50次

根据上面的公式

一个高电平一个低电平叫一个脉冲。

例如每个脉冲占20毫秒,那么他的频率是多少?

就是用1去除以他的周期,也就是我们上面说的20,那么就是除0.02,1秒等于1000毫秒,20毫秒换算成秒。换算过来就是0.02, 1/0.02 = 50,那么他的频率也就是50.

例如这张图,他就是有4个周期

占空比,占空比是指在一定时间高电平保持的时间与总周期的比值

例如下面两段周期分别都是10毫秒的时间

那么高电平占了7ms,那么他在总过程当中就是占了70%

输入电流等于输出电量*占空比

输入为5v,占空比为20%,那么输出就是1

借鉴网址:搞懂什么是PWM控制_哔哩哔哩_bilibili

实例1:PWM与LED的故事

例如我们想要led灯常亮,那么只需要一直给高电平就行了

熄灭就给低电平

假如我们不停的切换高低电平,那么他就会闪烁熄灭

但是如果我们让切换的速度变的极快,那么就不会看见闪烁在熄灭,类似我们看玄幻小说的残影,只要速度够快,原地就会留下一个残影

我们将亮的时间延长,断灭的时间减少,再加上切换的速度,那么你只会看见光芒减弱

实例2:PWM与舵机的故事

舵机根据输入的PWM信号进行转动,舵机内部的芯片会将电位器的电压信号转换成PWM信号,与输入的PWM指令进行对比.最后得到控制电机转动的信号,比如旋转方向和速度

上面的图看来,不同的占比毫秒就能改变他的度数,例如2ms就能让舵机转到135度

程序实例:转动舵机到125度

#define ServoPin 2 // 舵机引脚2号
int highTime  = 2000;//高电平占时换算成微秒。例如2毫秒就是2000微秒
int period = 20000;//固定周期20ms
void setup() {// put your setup code here, to run once:pinMode(ServoPin,OUTPUT);
}void loop() {digitalWrite(ServoPin,HIGH);delayMicroseconds(highTime);//高电平持续时间digitalWrite(ServoPin,LOW);delayMicroseconds(period-highTime);//低电平持续时间// put your main code here, to run repeatedly:}

舵机正极接5V 负极接GND,信号线接2

实例程序:让舵机依次旋转

#define ServoPin 2 // 舵机引脚2号
int highTime  = 500;//高电平占时换算成微秒。例如2毫秒就是2000微秒
int a = 1000;
int c = 2000;
int d = 2500;
int period = 20000;//固定周期20ms
void setup() {// put your setup code here, to run once:pinMode(ServoPin,OUTPUT);
}void loop() {digitalWrite(ServoPin,HIGH);delayMicroseconds(highTime);//高电平持续时间digitalWrite(ServoPin,LOW);delayMicroseconds(period-highTime);//低电平持续时间delay(1000);digitalWrite(ServoPin,HIGH);delayMicroseconds(a);//高电平持续时间digitalWrite(ServoPin,LOW);delayMicroseconds(period-a);//低电平持续时间delay(1000);digitalWrite(ServoPin,HIGH);delayMicroseconds(c);//高电平持续时间digitalWrite(ServoPin,LOW);delayMicroseconds(period-c);//低电平持续时间delay(1000);digitalWrite(ServoPin,HIGH);delayMicroseconds(d);//高电平持续时间digitalWrite(ServoPin,LOW);delayMicroseconds(period-d);//低电平持续时间delay(100000);// put your main code here, to run repeatedly:}

实例程序:让他旋转的速度慢慢相加

#define ServoPin 2 // 舵机引脚2号
int highTime  = 500;//高电平占时换算成微秒。例如2毫秒就是2000微秒int period = 20000;//固定周期20ms
void setup() {// put your setup code here, to run once:pinMode(ServoPin,OUTPUT);
}void loop() {digitalWrite(ServoPin,HIGH);delayMicroseconds(highTime);//高电平持续时间digitalWrite(ServoPin,LOW);delayMicroseconds(period-highTime);//低电平持续时间highTime += 1;// put your main code here, to run repeatedly:}

舵机自带的控制函数

舵机使用函数控制

实例1,:让舵机来回旋转

#include <Servo.h> 
int pos  = 0;Servo myservo;
void setup() {// put your setup code here, to run once:myservo.attach(3);//
}void loop() {for (pos = 0; pos <= 180; pos += 1){myservo.write(pos);//驱动舵机旋转delay(15);//等待舵机转到相应位置}for(pos = 180; pos >= 0; pos -= 1){//让舵机从180转到0myservo.write(pos);delay(15);}
}

16路舵机控制板

接线方式

注意看线的颜色,GND = GND  SCL = D1 SOA = D2 VCC = 3V或5V V+ = VIN

这个是esp8266的接线方式,arduino需要大家去探索一下

#include <Wire.h> //I2C库文件wire
#include <Adafruit_PWMServoDriver.h> //驱动板库文件// 默认地址 0x40
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
int a = 102;
#define SERVO_0  a  //寄存器的值 102 =0.5ms = 0°
#define SERVO_45  187 
#define SERVO_90  280 
#define SERVO_135  373 
#define SERVO_180  510 void setup() {Serial.begin(9600);pwm.begin();pwm.setPWMFreq(50);  // 50HZ更新频率,相当于20ms的周期delay(10);
}void loop() {pwm.setPWM(0, 0, SERVO_0);//舵机编号、脉冲起始时间、脉冲结束时间delay(10);SERVO_0 += 1;Serial.println(SERVO_0);}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【docker】docker容器部署常用服务
  • Qt 跨平台支持任务栏进度条以及自绘消息通知显示
  • 如何使用nodejs的fsPromise.access()判断文件权限
  • git 常用指令(创建分支、提交分支、解决冲突)
  • [设备] 关于手机设备中几种传感器的研究
  • float32转float16、snorm/sunorm8/16 学习及实现
  • 浅析DNS服务器:办公网DNS的架构思路分享
  • 深度学习6--深度神经网络
  • 【政策分享】最全!2023-2024年国家遥感政策汇总
  • 华为OD机试(C卷,200分)- 可以组成网络的服务器
  • Sparksql array相关函数
  • gin-vue-admin框架遇到AxiosError:Network Error怎么解决?
  • redis--分布式锁(1)
  • Python(模块---pandas+matplotlib+pyecharts)
  • Apache OFBiz 曝出严重漏洞,允许预身份验证 RCE
  • [笔记] php常见简单功能及函数
  • 2017 前端面试准备 - 收藏集 - 掘金
  • css的样式优先级
  • dva中组件的懒加载
  • eclipse的离线汉化
  • flutter的key在widget list的作用以及必要性
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • iOS 颜色设置看我就够了
  • JAVA 学习IO流
  • Java教程_软件开发基础
  • JS实现简单的MVC模式开发小游戏
  • JS专题之继承
  • Laravel 中的一个后期静态绑定
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • maya建模与骨骼动画快速实现人工鱼
  • Next.js之基础概念(二)
  • session共享问题解决方案
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 大快搜索数据爬虫技术实例安装教学篇
  • 关于Flux,Vuex,Redux的思考
  • 使用权重正则化较少模型过拟合
  • 小程序开发中的那些坑
  • 长三角G60科创走廊智能驾驶产业联盟揭牌成立,近80家企业助力智能驾驶行业发展 ...
  • ​一些不规范的GTID使用场景
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • #pragma once
  • #ubuntu# #git# repository git config --global --add safe.directory
  • #数据结构 笔记一
  • $refs 、$nextTic、动态组件、name的使用
  • (4)(4.6) Triducer
  • (java)关于Thread的挂起和恢复
  • (void) (_x == _y)的作用
  • (八)Flink Join 连接
  • (搬运以学习)flask 上下文的实现
  • (第二周)效能测试
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (简单) HDU 2612 Find a way,BFS。
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...