360度编码器开关

英文名称:Gravity: Rotary Encoder Module(I2C)

中文名称:Gravity: 360度旋转编码器开关

简介

这是一款有趣的编码器开关,它的外观类似电位器,但它又不是电位器。它是一款可级联的360°旋转编码器开关,它有20个单圈脉冲,每个脉冲对应一个档位。为了让用户能实时的了解当前状态,在每个档位边上还设置了LED灯显示。 为了方便使用,将输出模式设置成I2C数据输出,可以通过程序设置每个档位的精度,最小值为1,最大值为51。例如:设置的值为1,则需要转动2.5圈才会亮一颗LED灯;设置的值为51,每转动一个档位就亮一颗LED灯。 它的功能远不止于此,为了让它适用更多场景,设计了级联功能。它可以只占用一个I2C接口,就能控制多个输出设备。比如,可以用它同时控制灯光亮度、灯光颜色、音量大小、转速大小等。

特性

应用场景

技术规格

引脚说明

序号 丝印 功能描述
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的使用教程

准备

主要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-调节编码器增益系数

/*!
 * @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-编码器置零

/*!
 * @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灯的颜色

  /*!
 * @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亮度

/*!
 * @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或者论坛联系我们!

更多问题及有趣的应用,可以 访问论坛 进行查阅或发帖。

更多

DFshopping_car1.png DFRobot商城购买链接