英文名称:Gravity: Rotary Encoder Module(I2C)
中文名称:Gravity: 360度旋转编码器开关
简介
这是一款有趣的编码器开关,它的外观类似电位器,但它又不是电位器。它是一款可级联的360°旋转编码器开关,它有20个单圈脉冲,每个脉冲对应一个档位。为了让用户能实时的了解当前状态,在每个档位边上还设置了LED灯显示。
为了方便使用,将输出模式设置成I2C数据输出,可以通过程序设置每个档位的精度,最小值为1,最大值为51。例如:设置的值为1,则需要转动2.5圈才会亮一颗LED灯;设置的值为51,每转动一个档位就亮一颗LED灯。
它的功能远不止于此,为了让它适用更多场景,设计了级联功能。它可以只占用一个I2C接口,就能控制多个输出设备。比如,可以用它同时控制灯光亮度、灯光颜色、音量大小、转速大小等。
特性
- I2C数据输出,正转加,反转减,使用简单明了。
- 可通过地址开关,设置4个不同的I2C地址。
- 环形LED灯显示当前的值,漂亮直观。
- 2个I2C端口输出,可级联使用。
应用场景
- 音量调节。
- 火力调节。
- 转速调节。
- 灯光调节。
技术规格
- 工作电压:3.3V~5V
- 全回转角度:360°
- 单圈脉冲数:20
- 接口方式:两个标准的Gravity:I2C接口
- 级联数量:4个
- 回转寿命:30000±200 Cycles
- 接触电阻:≤100mΩ
- 绝缘阻抗:100MΩ以上
- 振荡:<10ms按压
- 工作温度:-30℃~+80℃
- 精度范围:1~51
- 最小精度值可设置为:1(转动约2.5圈,led灯亮一个)
- 最大精度值可设置为:51(转动一格,led灯亮一个)
- 储存范围:0~1023
- 尺寸:37mm*37mm
引脚说明
序号 | 丝印 | 功能描述 |
---|---|---|
1 | VCC/+ | 电源正极 |
2 | GND/- | 电源负极 |
3 | SCL/C | I2C时钟线 |
4 | SDA/D | I2C数据线 |
I2C地址:
1 | 2 | ADDR |
---|---|---|
0 | 0 | 0x54 |
0 | 1 | 0x55 |
1 | 0 | 0x56 |
1 | 1 | 0x57 |
Arduino的使用教程
准备
- 硬件
- 1 x Arduino UNO控制板
- 1 x Rotary Encoder Module (I2C)
- 若干 杜邦线
- 软件
-
Arduino IDE, 点击下载Arduino IDE
-
库链接:点击下载
-
关于如何安装库文件,点击链接
-
- 接线图
主要API接口函数列表
/* @brief 读取模块基本信息
* @param pbuf 读取到的数据的存放地址
* 第一个元素为:模块的PID
* 第二个元素为:模块的VID
* 第三个元素为:固件版本号
* 第四个元素为:模块的通信地址
*/
void readBasicInfo(uint16_t* pbuf);
/**
* @brief 获取编码器当前计数值
* @return 返回值范围为: 0-1023
*/
uint16_t getEncoderValue(void);
/**
* @brief 设置编码器计数值
* @param value 范围[0, 1023], 超出范围设置无效
*/
void setEncoderValue(uint16_t value);
/**
* @brief 获取编码器当前增益系数,转动一格的数值精度。
* @n 精度范围:1~51,最小为1(转动约2.5圈LED灯亮一个),最大为51(转动一格LED灯就亮起一个)。
* @return 返回值范围为: 1-51
*/
uint8_t getGainCoefficient(void);
/**
* @brief 设置编码器增益系数,转动一格的数值精度。
* @n 精度范围:1~51,最小为1(转动约2.5圈LED灯亮一个),最大为51(转动一格LED灯就亮起一个)。
* @param gainValue 范围[1, 51], 超出范围设置无效
*/
void setGainCoefficient(uint8_t gainValue);
/**
* @brief 检测按键是否已按下
* @return 返回true 已检测到按键按下,返回false 未检测到按键按下
*/
bool detectButtonDown(void);
样例代码1-获取编码器的基本信息
- **功能描述:**获取编码器基本信息、当前计数值和当前旋转增益
/*!
* @file getData.ino
* @brief 这个demo演示了如何获取编码器基本信息、当前计数值和当前旋转增益
* @copyright Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)
* @licence The MIT License (MIT)
* @author [qsjhyy](yihuan.huang@dfrobot.com)
* @version V0.1
* @date 2021-09-15
* @get from https://www.dfrobot.com
* @url https://github.com/DFRobot/DFRobot_VisualRotaryEncoder
*/
#include <DFRobot_VisualRotaryEncoder.h>
/**
* Instantiate an object to drive our sensor;
* Set address according to encoder DIP switch CH1 and CH2:
* | 1 | 2 | ADDR |
* |---|---|------|
* | 0 | 0 | 0x54 |
* | 0 | 1 | 0x55 |
* | 1 | 0 | 0x56 |
* | 1 | 1 | 0x57 |
*/
DFRobot_VisualRotaryEncoder_I2C sensor(/*i2cAddr = */0x54, /*i2cBus = */&Wire);
void setup()
{
Serial.begin(115200);
// initialize sensor
while( NO_ERR != sensor.begin() ){
Serial.println("Communication with device failed, please check connection");
delay(3000);
}
Serial.println("Begin ok!");
/**
* Retrieve basic information from the sensor and buffer it into basicInfo, the structure that stores information
* Members of basicInfo structure: PID, VID, version, i2cAddr
*/
sensor.refreshBasicInfo();
/* Module PID, default value 0x01F6 (the highest two of the 16-bits data are used to judge SKU type: 00: SEN, 01: DFR, 10: TEL; The next 14 numbers are used as num)(SEN0502) */
Serial.print("PID: 0x0");
Serial.println(sensor.basicInfo.PID, HEX);
/* Module VID, default value 0x3343(for manufacturer DFRobot) */
Serial.print("VID: 0x");
Serial.println(sensor.basicInfo.VID, HEX);
/* Firmware version number: 0x0100 represents V0.1.0.0 */
Serial.print("versions: 0x0");
Serial.println(sensor.basicInfo.version, HEX);
/* Module communication address, default value 0x54, module device address (0x54~0x57) */
Serial.print("communication address: 0x");
Serial.println(sensor.basicInfo.i2cAddr, HEX);
/**
* Get the encoder current gain factor, and the numerical accuracy for turning one step
* Accuracy range:1~51,the minimum is 1 (light up one LED about every 2.5 turns), the maximum is 51 (light up one LED every one step rotation)
* Return value range: 1-51
*/
uint8_t gainCoefficient = sensor.getGainCoefficient();
Serial.print("Encoder current gain coefficient: ");
Serial.println(gainCoefficient);
Serial.println();
delay(1000);
}
void loop()
{
/**
* Get the encoder current count
* Return value range: 0-1023
*/
uint16_t encoderValue = sensor.getEncoderValue();
Serial.print("The encoder current counts: ");
Serial.println(encoderValue);
Serial.println();
delay(1000);
}
结果
样例代码2-调节编码器增益系数
- **功能描述:**旋转编码器一共有51个精度(1-51),旋转编码器每调节一个刻度,对应的模拟值增加50(约为50),因此将精度设为10,对应的旋转编码器需要调节五次才能亮一个LED灯。
/*!
* @file setSensor.ino
* @brief 这个demo演示了,如何设置编码器增益系数
* @copyright Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)
* @licence The MIT License (MIT)
* @author [qsjhyy](yihuan.huang@dfrobot.com)
* @version V0.1
* @date 2021-09-15
* @get from https://www.dfrobot.com
* @url https://github.com/DFRobot/DFRobot_VisualRotaryEncoder
*/
#include <DFRobot_VisualRotaryEncoder.h>
/*
实例化一个对象,来驱动我们的传感器;
地址根据编码器拨码开关设置:
| 1 | 2 | ADDR |
|---|---|------|
| 0 | 0 | 0x54 |
| 0 | 1 | 0x55 |
| 1 | 0 | 0x56 |
| 1 | 1 | 0x57 |
*/
DFRobot_VisualRotaryEncoder_I2C sensor(/*iicAddr = */0x54, /*iicBus = */&Wire);//表示当前编码器的地址为0x54
void setup()
{
Serial.begin(115200);//初始化串口
// 初始化传感器
while( NO_ERR != sensor.begin() ){
Serial.println("Communication with device failed, please check connection");
delay(3000);
}
Serial.println("Begin ok!");
/**
* 设置编码器增益系数,转动一格的数值精度。
* 精度范围:1~51,最小为1(转动约2.5圈LED灯亮一个),最大为51(转动一格LED灯就亮起一个)。
* gainValue 范围[1, 51], 超出范围设置无效
*/
sensor.setGainCoefficient(10);//表示当前的精度值为:10
/**
* 获取编码器当前增益系数,转动一格的数值精度。
* 精度范围:1~51,最小为1(转动约2.5圈LED灯亮一个),最大为51(转动一格LED灯就亮起一个)。
* 返回值范围为: 1-51
*/
uint8_t gainCoefficient = sensor.getGainCoefficient();
Serial.print("Encoder current gain coefficient: ");
Serial.println(gainCoefficient);
Serial.println();
delay(1000);
}
void loop()
{
/**
* 获取编码器当前计数值
* 返回值范围为: 0-1023
*/
uint16_t encoderValue = sensor.getEncoderValue();
Serial.print("The encoder currently counts: ");
Serial.println(encoderValue);
Serial.println();
delay(1000);
}
结果
样例代码3-编码器置零
- **功能描述:**按下按键,将编码器的计数值清零,能够看到亮着的LED灯全部熄灭。
/*!
* @file setSensor.ino
* @brief 这个demo演示了,检测按键按下时,将编码器计数值置零.
* @copyright Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)
* @licence The MIT License (MIT)
* @author [qsjhyy](yihuan.huang@dfrobot.com)
* @version V0.1
* @date 2021-09-15
* @get from https://www.dfrobot.com
* @url https://github.com/DFRobot/DFRobot_VisualRotaryEncoder
*/
#include <DFRobot_VisualRotaryEncoder.h>
/*
实例化一个对象,来驱动我们的传感器;
地址根据编码器拨码开关设置:
| 1 | 2 | ADDR |
|---|---|------|
| 0 | 0 | 0x54 |
| 0 | 1 | 0x55 |
| 1 | 0 | 0x56 |
| 1 | 1 | 0x57 |
*/
DFRobot_VisualRotaryEncoder_I2C sensor(/*iicAddr = */0x54, /*iicBus = */&Wire);////表示当前编码器的地址为0x54
void setup()
{
Serial.begin(115200);//表初始化串口
// 初始化传感器
while( NO_ERR != sensor.begin() ){
Serial.println("Communication with device failed, please check connection");
delay(3000);
}
Serial.println("Begin ok!");
/**
* 设置编码器增益系数,转动一格的数值精度。
* 精度范围:1~51,最小为1(转动约2.5圈LED灯亮一个),最大为51(转动一格LED灯就亮起一个)。
* gainValue 范围[1, 51], 超出范围设置无效
*/
sensor.setGainCoefficient(51);//表示编码器的精度值为51
/**
* 获取编码器当前增益系数,转动一格的数值精度。
* 精度范围:1~51,最小为1(转动约2.5圈LED灯亮一个),最大为51(转动一格LED灯就亮起一个)。
* 返回值范围为: 1-51
*/
uint8_t gainCoefficient = sensor.getGainCoefficient();
Serial.print("Encoder current gain coefficient: ");
Serial.println(gainCoefficient);
Serial.println();
delay(1000);
}
void loop()
{
/**
* 检测按键是否已按下
* 返回true 已检测到按键按下,返回false 未检测到按键按下
*/
if(sensor.detectButtonDown()){
/**
* 设置编码器计数值
* value 范围[0, 1023], 超出范围设置无效
* 此示例中,检测到按键按下,就将编码器计数值置零,能够看到亮着的led全部熄灭
*/
sensor.setEncoderValue(0);
}
/**
* 获取编码器当前计数值
* 返回值范围为: 0-1023
*/
uint16_t encoderValue = sensor.getEncoderValue();
Serial.print("The encoder currently counts: ");
Serial.println(encoderValue);
Serial.println();
delay(1000);
}
结果
串口数据的显示:
样例代码4-调节RGB灯的颜色
- **功能描述:**这个项目中需要添加RGB的灯环库,然后通过三个旋转编码器来调节RGB灯环颜色。
- **RGB灯环库:**待更新
- 接线图
/*!
* @file 04.ino
* @brief 这个demo演示了,通过设置旋转编码器的地址后,级联三个旋转编码器调节RGB灯的颜色。
* @copyright Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)
* @licence The MIT License (MIT)
* @author [qsjhyy](fengying.nie@dfrobot.com)
* @version V0.1
* @date 2021-09-27
* @get from https://www.dfrobot.com
* @url
*/
#include <DFRobot_NeoPixel.h>
// 动态变量
volatile float R, G, B;
// 函数声明
uint32_t rgbToColor(uint8_t r, uint8_t g, uint8_t b);
// 创建对象
DFRobot_NeoPixel neoPixel_2;
#include <DFRobot_VisualRotaryEncoder.h>
/*
实例化一个对象,来驱动我们的传感器;
地址根据编码器拨码开关设置:
| 1 | 2 | ADDR |
|---|---|------|
| 0 | 0 | 0x54 |
| 0 | 1 | 0x55 |
| 1 | 0 | 0x56 |
| 1 | 1 | 0x57 |
*/
DFRobot_VisualRotaryEncoder_I2C sensor_1(/*iicAddr = */0x54, /*iicBus = */&Wire);
DFRobot_VisualRotaryEncoder_I2C sensor_2(/*iicAddr = */0x55, /*iicBus = */&Wire);
DFRobot_VisualRotaryEncoder_I2C sensor_3(/*iicAddr = */0x56, /*iicBus = */&Wire);
void setup()
{
neoPixel_2.begin(2, 12); //设置灯的引脚为2,灯珠颗数为12.
neoPixel_2.setBrightness(255);
Serial.begin(115200);
// 初始化传感器
while( NO_ERR != sensor_1.begin()&&NO_ERR != sensor_2.begin()&&NO_ERR != sensor_3.begin() ){
Serial.println("Communication with device failed, please check connection");
delay(3000);
}
Serial.println("Begin ok!");
/**
* 设置编码器增益系数,转动一格的数值精度。
* 精度范围:1~51,最小为1(转动约2.5圈LED灯亮一个),最大为51(转动一格LED灯就亮起一个)。
* gainValue 范围[1, 51], 超出范围设置无效
*/
sensor_1.setGainCoefficient(30);
sensor_2.setGainCoefficient(30);
sensor_3.setGainCoefficient(30);
/**
* 获取编码器当前增益系数,转动一格的数值精度。
* 精度范围:1~51,最小为1(转动约2.5圈LED灯亮一个),最大为51(转动一格LED灯就亮起一个)。
* 返回值范围为: 1-51
*/
uint8_t gainCoefficient_1 = sensor_1.getGainCoefficient();
uint8_t gainCoefficient_2 = sensor_2.getGainCoefficient();
uint8_t gainCoefficient_3 = sensor_3.getGainCoefficient();
Serial.print("Encoder current gain coefficient: ");
Serial.println(gainCoefficient_1);
Serial.println(gainCoefficient_2);
Serial.println(gainCoefficient_3);
Serial.println();
delay(1000);
}
void loop()
{
/**
* 检测按键是否已按下
* 返回true 已检测到按键按下,返回false 未检测到按键按下
*/
if(sensor_1.detectButtonDown()){
/**
* 设置编码器计数值
* value 范围[0, 1023], 超出范围设置无效
* 此示例中,检测到按键按下,就将编码器计数值置零,能够看到亮着的led全部熄灭
*/
sensor_1.setEncoderValue(0);
}
if(sensor_2.detectButtonDown()){
/**
* 设置编码器计数值
* value 范围[0, 1023], 超出范围设置无效
* 此示例中,检测到按键按下,就将编码器计数值置零,能够看到亮着的led全部熄灭
*/
sensor_2.setEncoderValue(0);
}
if(sensor_3.detectButtonDown()){
/**
* 设置编码器计数值
* value 范围[0, 1023], 超出范围设置无效
* 此示例中,检测到按键按下,就将编码器计数值置零,能够看到亮着的led全部熄灭
*/
sensor_3.setEncoderValue(0);
}
/**
* 获取编码器当前计数值
* 返回值范围为: 0-1023
*/
uint16_t encoderValue_1 = sensor_1.getEncoderValue();
uint16_t encoderValue_2 = sensor_2.getEncoderValue();
uint16_t encoderValue_3 = sensor_3.getEncoderValue();
Serial.print("encoderValue_1: ");
Serial.println(encoderValue_1);
Serial.print("encoderValue_2: ");
Serial.println(encoderValue_2);
Serial.print("encoderValue_3: ");
Serial.println(encoderValue_2);
Serial.println();
R = (map(encoderValue_1, 0, 1023, 0, 255));
G = (map(encoderValue_2, 0, 1023, 0, 255));
B = (map(encoderValue_3, 0, 1023, 0, 255));
neoPixel_2.setRangeColor(0, 11, rgbToColor(round(R), round(G), round(B)));
Serial.print("R: ");
Serial.println(round(R));
Serial.print("G: ");
Serial.println(round(G));
Serial.print("B: ");
Serial.println(round(B));
Serial.println();
delay(1000);
}
// 静态函数
uint32_t rgbToColor(uint8_t r, uint8_t g, uint8_t b)
{
return (uint32_t)((((uint32_t)r<<16) | ((uint32_t)g<<8)) | (uint32_t)b);
}
结果
串口数据的显示:
样例代码5-控制舵机角度
- **功能描述:**这个项目中主要是通过转动旋转编码器来控制舵机的角度。
/*!
* @file setSensor.ino
* @brief 这个demo演示了,如何通过编码器控制舵机角度。
* @copyright Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)
* @licence The MIT License (MIT)
* @author [qsjhyy](yihuan.huang@dfrobot.com)
* @version V0.1
* @date 2021-09-15
* @get from https://www.dfrobot.com
* @url https://github.com/DFRobot/DFRobot_VisualRotaryEncoder
*/
#include <DFRobot_VisualRotaryEncoder.h>
/*
实例化一个对象,来驱动我们的传感器;
地址根据编码器拨码开关设置:
| 1 | 2 | ADDR |
|---|---|------|
| 0 | 0 | 0x54 |
| 0 | 1 | 0x55 |
| 1 | 0 | 0x56 |
| 1 | 1 | 0x57 |
*/
DFRobot_VisualRotaryEncoder_I2C sensor(/*iicAddr = */0x54, /*iicBus = */&Wire);
#include <Servo.h>
Servo myservo;
int pos = 0; // 初始化舵机角度
void setup()
{
myservo.attach(9); // 设置舵机连接引脚
Serial.begin(115200);
// 初始化传感器
while( NO_ERR != sensor.begin() ){
Serial.println("Communication with device failed, please check connection");
delay(3000);
}
Serial.println("Begin ok!");
/**
* 设置编码器增益系数,转动一格的数值精度。
* 精度范围:1~51,最小为1(转动约2.5圈LED灯亮一个),最大为51(转动一格LED灯就亮起一个)。
* gainValue 范围[1, 51], 超出范围设置无效
*/
sensor.setGainCoefficient(51);
/**
* 获取编码器当前增益系数,转动一格的数值精度。
* 精度范围:1~51,最小为1(转动约2.5圈LED灯亮一个),最大为51(转动一格LED灯就亮起一个)。
* 返回值范围为: 1-51
*/
uint8_t gainCoefficient = sensor.getGainCoefficient();
Serial.print("Encoder current gain coefficient: ");
Serial.println(gainCoefficient);
Serial.println();
delay(1000);
}
void loop()
{
/**
* 检测按键是否已按下
* 返回true 已检测到按键按下,返回false 未检测到按键按下
*/
if(sensor.detectButtonDown()){
/**
* 设置编码器计数值
* value 范围[0, 1023], 超出范围设置无效
* 此示例中,检测到按键按下,就将编码器计数值置零,能够看到亮着的led全部熄灭
*/
sensor.setEncoderValue(0);
}
/**
* 获取编码器当前计数值
* 返回值范围为: 0-1023
* 将编码器的值映射为舵机角度
*/
uint16_t encoderValue = sensor.getEncoderValue();
Serial.print("The encoder currently counts: ");
Serial.println(encoderValue);
pos = map(encoderValue, 0, 1023, 10, 170);
myservo.write(pos);
Serial.println();
delay(1000);
}
结果
样例代码6-控制LED亮度
- **功能描述:**这个项目中主要是通过转动旋转编码器来控制LED的亮度。
/*!
* @file setSensor.ino
* @brief 这个demo演示了,如何通过编码器控制LED亮度。
* @copyright Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)
* @licence The MIT License (MIT)
* @author [qsjhyy](yihuan.huang@dfrobot.com)
* @version V0.1
* @date 2021-09-15
* @get from https://www.dfrobot.com
* @url https://github.com/DFRobot/DFRobot_VisualRotaryEncoder
*/
#include <DFRobot_VisualRotaryEncoder.h>
/*
实例化一个对象,来驱动我们的传感器;
地址根据编码器拨码开关设置:
| 1 | 2 | ADDR |
|---|---|------|
| 0 | 0 | 0x54 |
| 0 | 1 | 0x55 |
| 1 | 0 | 0x56 |
| 1 | 1 | 0x57 |
*/
DFRobot_VisualRotaryEncoder_I2C sensor(/*iicAddr = */0x54, /*iicBus = */&Wire);
// #include <Servo.h>
// Servo myservo;
int LED = 0; // 初始化LED灯的亮度
int ledPin = 10; // 设置LED连接引脚
void setup()
{
pinMode(ledPin, OUTPUT);
Serial.begin(115200);
// 初始化传感器
while( NO_ERR != sensor.begin() ){
Serial.println("Communication with device failed, please check connection");
delay(3000);
}
Serial.println("Begin ok!");
/**
* 设置编码器增益系数,转动一格的数值精度。
* 精度范围:1~51,最小为1(转动约2.5圈LED灯亮一个),最大为51(转动一格LED灯就亮起一个)。
* gainValue 范围[1, 51], 超出范围设置无效
*/
sensor.setGainCoefficient(51);
/**
* 获取编码器当前增益系数,转动一格的数值精度。
* 精度范围:1~51,最小为1(转动约2.5圈LED灯亮一个),最大为51(转动一格LED灯就亮起一个)。
* 返回值范围为: 1-51
*/
uint8_t gainCoefficient = sensor.getGainCoefficient();
Serial.print("Encoder current gain coefficient: ");
Serial.println(gainCoefficient);
Serial.println();
delay(1000);
}
void loop()
{
/**
* 检测按键是否已按下
* 返回true 已检测到按键按下,返回false 未检测到按键按下
*/
if(sensor.detectButtonDown()){
/**
* 设置编码器计数值
* value 范围[0, 1023], 超出范围设置无效
* 此示例中,检测到按键按下,就将编码器计数值置零,能够看到亮着的led全部熄灭
*/
sensor.setEncoderValue(0);
}
/**
* 获取编码器当前计数值
* 返回值范围为: 0-1023
* 将编码器的值映射为LED亮度
*/
uint16_t encoderValue = sensor.getEncoderValue();
Serial.print("The encoder currently counts: ");
Serial.println(encoderValue);
LED = map(encoderValue, 0, 1023, 0, 255);
analogWrite(ledPin,LED); //给LED写入对应值
Serial.println();
delay(1000);
}
常见问题
还没有客户对此产品有任何问题,欢迎通过qq或者论坛联系我们!
更多问题及有趣的应用,可以 访问论坛 进行查阅或发帖。