电位器和编码器模块
目录
一、模块简介(一)
二、工作原理
三、用法用例
四、模块简介(二)
五、区别电位器与编码器
六、工作原理
本篇介绍 Arduino 模拟输入功能,通过读取电位器输入的电压值或来控制 LED灯的亮度。模块简介(一)
电位器 (英文:Potentiometer)是可变电阻器的一种。通常是由电阻体与转动或滑动系统组成,即靠一个动触点在电阻体上移动,获得部分电压输出。 电位器的作用——调节电压(含直流电压与信号电压)和电流的大小。电位器是一种可调的电子元件。它是由一个电阻体和一个转动或滑动系统组成。当电阻体的两个固定触点之间外加一个电压时,通过转动或滑动系统改变触点在电阻体上的位置,在动触点与固定触点之间便可得到一个与动触点位置成一定关系的电压。它大多是用作分压器,这时电位器是一个四端元件。电位器基本上就是滑动变阻器,有几种样式,一般用在音箱音量开关和激光头功率大小调节。 常见的电位器 有:线绕电位器,合成碳膜电位器,有机实芯电位器,金属玻璃釉电位器,导电塑料电位器,数字电位器,多圈精密可调电位器等等。
工作原理
它可以将外部输入的模拟信号转换为芯片运算时可以识别的数字信号,从而实现读入模拟值的功能。Arduino 模拟输入功能有 10 位精度,即可以将 0~5V 的电压信号转换为0~1024 的整数形式表示。我们通过使用 analogRead() 函数读取电位器输入的电压值,然后通过analogWrite()函数来控制 LED 灯亮度。
用法用例
1
材料准备
arduino1 个 LED 灯1 个 220Ω限流电阻1 个电位器2
硬件连接图

3
引脚说明

4
示例代码
/*AnalogRead
通过电位器改变 LED 灯亮度
*/int ledPin = 10;//将 LED 连接至 10 号引脚int readValue = 0; //保存读到的模拟值int ledValue = 0; //保存 LED 灯占空比void setup() {
pinMode(ledPin, OUTPUT);//将电位器引脚设置为输出状态
}void loop(){
readValue = analogRead(A0); //读取 A0 模拟口的数值(0-5V 对应 0-1204取值)
ledValue = map(readValue, 0, 1024, 0, 255);//将 0 到 1024 之间的数据映射成 0 到 255 之间的数据
analogWrite(ledPin, ledValue); //PWM 最大取值 255
}
程序中通过 analogRead()函数来读取模拟输入值,这个输入值的范围是 0 到1024 之间,然后通过 analogWrite()函数来改变 LED 灯占空比,占空比的范围是 0到 255 之间。通过使用 map()函数将范围做了重新映射。
5
代码说明
接下来代码将被分成小块进行详细说明: pinMode(ledPin, OUTPUT); 这里需要选用引脚 1o 数字口带~号一类的具有 pwm 功能的引脚输出口。 PWM 全称:Pulse Width Modulation,通常中文翻译为: 脉冲宽度调制 通过将一段数字信号编码为方波信号,在外部作用事物上达到拟输出效果的一种手段。 实际中,使用数字控制产生占空比不同的方波(一个不停在开与关之间切换的信号)来控制模拟输出。


6
函数介绍
analogRead() 描述:读取指定模拟引脚的值。 函数原型:analogRead(pin) 参数:模拟输入引脚。 返回值:0 到 1024 之间的整数。 map() 描述:将数据从一个范围映射到另一个范围。 函数原型:map(value, fromLow, fromHigh, toLow, toHigh)参数: value: 要映射的数据 fromLow: 当前范围的下限值。 formHigh: 当前范围的上限值。 toLow: 目标范围的下限值。 toHigh: 目标范围的上限值。返回值:重新映射后的数据。模块简介(二)
下面,我们还有一种类似电位器的器件,它便是编码器。 编码器 EC11 也叫开关编码器、旋转编码器,因广泛用于车载 DVD、车载导航、汽车影音上,也经常被人称为汽车编码器。EC11 编码器在各类仪器设备中用于频率、音量、速度、温度、电压、菜单选择、光线强弱等参数的控制。EC11 系列编码器主要用于 汽车电 子、 多媒体音响、 仪器仪表、 家用电器、 智能家居、 计算机周边、 医疗器械等领域。主要用于频率调节、亮度调节、温度调节、音量调节的参数控制等。目前常用的增量式编码器全部为机械式编码器,好用且成本低,高端的一般为非机械光电式编码器。
区别电位器与编码器
1.电位器和编码器旋转角度大不同电位器与编码器,有着本质的区别,最直接的分辨方法就是:旋转一下,要是旋转角度不足一圈的是电位器,要是可以 360 度无限旋转的是编码器。2.电位器和编码器工作原理大不同 电位器:原理是通过旋转改变阻值输出,因为电位器内部有电阻片,电阻片有角度限制,所以旋转角度不足 360 度。 编码器:原理是通过旋转改变脉冲输出,因为编码器内部是触点,通过接通与断开改变脉冲,所以可以 360 度无限旋转。在大多数的旋转编码器上,当我们旋转它时,会感觉到它内部有一个个凸点(称为 steps),一般凸点有 12 个,有些有 24 个。工作原理


1
电路连接

2
引脚说明


3
示例代码
/*
Rotary Encoder - LED Brightness Control
*/#define encoderOutA 6 //将编码器信号口 A 连接至 6 号引脚 #define encoderOutB 7 //将编码器信号口 B 连接至 7 号引脚#define LED 9//将 LED 连接至 9 号引脚(必须使用 pwm 串口)int brightness = 0;//定义亮度int State;//定义通道 A 末值int old_State;//定义通道 A 初值void setup() {
pinMode (encoderOutA, INPUT);//将编码器信号口 A 引脚设置为输入状态
pinMode (encoderOutB, INPUT);//将编码器信号口 B 引脚设置为输入状态
Serial.begin (9600);//初始化串口,设定串口通信速率为 9600(波特)
old_State = digitalRead(encoderOutA);//读取通道 A 的值
}void loop(){
State = digitalRead(encoderOutA);//读取通道 A 的值if (State != old_State)
{if (digitalRead(encoderOutB) != State)//通道 B 的值超前,增加亮度
{
brightness ++;
}else
{//通道 B 的值超前,降低亮度
brightness --;
}if (brightness >= 255)
brightness = 255;if (brightness <= 0)
brightness = 0;//保障亮度在 0~255 之间
Serial.print("brightness: ");
Serial.println(brightness);//向串口打印亮度
}
old_State = State; //回溯通道 A 初始位置
analogWrite(LED , brightness);//通过 pwm 波来改变 LED 亮度
}
4
代码分析
analogWrite(LED , brightness); 模拟输出函数:指定要输出 PWM 波的引脚,可调节 LED 亮度 参数 brightness 指定是 PWM 的脉冲宽度,范围为 0~255。 在 analogWrite() 和 analogRead() 函数内部,已经完成了引脚的初始化,因此不用在 Setup() 函数中进行初始化操作。要确定编码器位置,我们需要将通道 A 和 B 连接到 Arduino 的输入。我们在开头读取并保存通道 A 的初始值。然后,我们读取通道 A 的瞬时值,如果通道 B 的值超前,我们减小计数器。否则,我们增加计数器。您需要获得轴的位置,然后您可以通过 PWM 减少或增加 LED 灯。由于 PWM 的值介于 0 到 255 之间,因此我们也在代码中将轴位置设置在此范围内。接下来,你就可以从一个旋转方向调 LED 的亮度啦。以上代码文件及使用的库可以到以下QQ群统一下载
机甲学院技术交流QQ群
931630584

