查看: 103782|回复: 44

Arduino教程——旋转编码器

  [复制链接]

该用户从未签到

发表于 2012-12-15 10:56 | 显示全部楼层 |阅读模式
我们使用的旋转编码器时序为
                     → CW(顺时针)
A   -----------             --------------  HIGH
                   ----------                    LOW

                     ← CCW(逆时针)
B  --------             ------------------  HIGH
              ----------                         LOW

RotaryEncoder

RotaryEncoder


ENA脚下降沿触发时查询B脚的电平,若为低电平时,由时序图可知为顺时针方向旋转(CW),Position增加1
而ENA脚上升沿触发时查询B脚的电平,若为高电平时,由时序图可知为顺时针方向旋转(CW),Position已增加1,故此时我们不再考虑
ENA脚下降沿触发时查询B脚的电平,若为高电平时,由时序图可知为逆时针方向旋转(CCW),Position减少1
而ENA脚上升沿触发时查询B脚的电平,若为低电平时,由时序图可知为逆时针方向旋转(CCW),Position已减少1,故此时我们不再考虑

DSCF2699.JPG
编码器模块已设置了对ENA ENB的上拉以及按键SW的上拉
将ENA ENB SW依次连接到传感器扩展板或者Arduino主控板的数字脚2、3、4上
VCC GND依次连接到+5V和GND上
下载运行代码,打开串口监视器Serial Monitor
旋转编码器可看到顺时针旋转时旋转过一个编码点后数值会增加1
逆时针旋转则相应减少1
按下按键时旋转编码器模块板载的LED会被点亮,同时串口监视器中会显示"Switch Pressed"

[mw_shl_code=cpp,true]/*
  RotaryEncoder

  Read a rotary encoder with interrupts
  Read the press action with digitalread
  Encoder&Switch hooked up with common to +5V
  ENCODER_A_PIN to pin 2
  ENCODER_A_PIN to pin 3
  SWITCH_PIN to pin 4  

  Published by ArduinoCN&OpenJumper.For surport
  materials and a full range of system boards &
  periphrals please visit :
              http://www.arduino.cn
            http://www.openjumper.com
  created & modified 15 Dec 2012
  by i3water
*/

#define ENCODER_A_PIN 2
#define ENCODER_B_PIN 3
#define SWITCH_PIN    4
long position;

void setup(){
  //setup our pins 初始化我们的需要的引脚
  pinMode(ENCODER_A_PIN, INPUT);
  pinMode(ENCODER_B_PIN, INPUT);
  pinMode(SWITCH_PIN, INPUT);

  attachInterrupt(0, read_quadrature, CHANGE);

  //setup our serial 初始化Arduino串口
  Serial.begin(9600);
}

void loop(){
   if (digitalRead(SWITCH_PIN) == LOW){
     delay(10);
     if (digitalRead(SWITCH_PIN) == LOW){
       Serial.println("Switch Pressed");
     }
   }
   Serial.print("Position: ");
   Serial.println(position, DEC);
   delay(1000);
}

void read_quadrature(){  
  // found a low-to-high on channel A ENA脚下降沿中断触发
  if (digitalRead(ENCODER_A_PIN) == LOW){   
    // check channel B to see which way 查询ENB的电平以确认是顺时针还是逆时针旋转
    if (digitalRead(ENCODER_B_PIN) == LOW)
      position++;
  }
  // found a high-to-low on channel A ENA脚上升沿中断触发
  else{
    // check channel B to see which way 查询ENB的电平以确认是顺时针还是逆时针旋转
    if (digitalRead(ENCODER_B_PIN) == LOW)
      position--;
  }
}[/mw_shl_code]

  • TA的每日心情
    开心
    2015-12-19 18:11
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-6-10 22:46 | 显示全部楼层
    Lee 发表于 2014-4-11 20:46
    不是,这是中断做的。详情你可以看任何一本单片机书的中断章节

    试验多次,还是觉得楼主的代码有问题。

    极客工坊也有旋转编码器的代码。我试验过了,他的代码没问题。

    该用户从未签到

    发表于 2012-12-15 12:41 | 显示全部楼层
    好文章,谢谢!
  • TA的每日心情
    郁闷
    2015-4-5 18:14
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2012-12-15 19:26 | 显示全部楼层
    嗯,很不错……学习中

    该用户从未签到

    发表于 2012-12-18 19:38 | 显示全部楼层
    拓展版没有0.0

    该用户从未签到

    发表于 2013-1-8 11:34 | 显示全部楼层
    {:soso_e181:}
  • TA的每日心情
    擦汗
    2015-7-9 16:28
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2013-1-9 16:12 | 显示全部楼层
    好东西,正想用这个,拆了好几各鼠标了,
  • TA的每日心情
    无聊
    2015-2-15 21:29
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2013-4-7 17:11 | 显示全部楼层
    rocxer 发表于 2013-1-9 16:12
    好东西,正想用这个,拆了好几各鼠标了,

    为什么拆鼠标?

    该用户从未签到

    发表于 2013-7-15 21:55 | 显示全部楼层
    wangpingsx 发表于 2013-4-7 17:11
    为什么拆鼠标?

    鼠标的滚轮就是旋转编码器

    该用户从未签到

    发表于 2013-7-17 14:17 | 显示全部楼层
    学习了,谢谢!

    该用户从未签到

    发表于 2013-9-27 23:41 | 显示全部楼层
    公司刚好也是用这个 旋转鼠标 拆了一个用示波器去看原理,没有弄明白。最后用的是公司以前 旋转鼠标的代码。不过和这个不一样。
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    热门推荐

    5分钟带你快速了解新一代开发板:M5STACK
    5分钟带你快速了解新一代
    一、什么是M5Stack M5Stack是一种模块化、可堆叠扩展的开发板,每个模块
    【原创】全球最小口袋3D打印机mini one直播教程贴
    【原创】全球最小口袋3D打
    最近闲得蛋疼,没事搞个掌上3D打印机,先放效果图吧。 搞了半天,终于能正常打印,
    【小项目】基于XIAO的逃跑蜘蛛
    【小项目】基于XIAO的逃跑
    项目介绍:蜘蛛会在夜晚保持安静。但是一有光线,蜘蛛就会开始震动,逃离光线。硬件:
    心电传感器实验 ESP32 + AD8232
    心电传感器实验 ESP32 + A
    早前买了心电传感器,一直没机会用起来,疫情期间无聊翻将出来发现买错了,但是心电导
    Stduino IDE stm32 最小系统 小蓝板 驱动继电器(五)
    Stduino IDE stm32 最小系
    弱电控制强电 单片机输出输入的电压在3.3V到5V之间,而生活中常用电器很多是12V、220V
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
    快速回复 返回顶部 返回列表