您的位置: 主页>机器人编程>ROBOLAB编程>旋转编码器的工作原理以及如何同Arduino开发板使
加盟酷吧机器人 培养孩子核心能力

旋转编码器的工作原理以及如何同Arduino开发板使

在本篇文章中,您将了解如何使用旋转编码器。首先,您将看到有关旋转编码器的一些信息,然后您将学习如何使用旋转编码器。

什么是旋转编码器?

旋转编码器是一种机电设备,可将轴角度的位置转换为数字数据。旋转编码器具有带有一些孔的圆形板和两个通道A和B。通过旋转圆形板,当A和B通道通过孔时,在该通道和公共端之间建立连接。这些中断在输出通道中产生方波。通过计算这些脉冲,我们可以找到旋转量。另一方面,通道A和B具有90度的相位差,因此您还可以根据前面的通道脉冲找到旋转方向。

旋转编码器的工作原理以及如何同Arduino开发板使用

编码器可以直接安装在电机轴上,也可以作为模块安装。旋转编码器模块(包括5个引脚)是最常见的旋转编码器。2个引脚提供编码器电源,SW是模块上的按钮,CLK和DT显示A和B通道。

该模块的一些功能包括:

●     无限旋转

●     20脉冲分辨率

●     5V供电电压

旋转编码器的工作原理以及如何同Arduino开发板使用

如何使用旋转编码器?

要使用旋转编码器,我们应该对通道A和B的脉冲进行计数。为此,我们使用Arduino UNO并制作了三个项目:定位编码器、控制LED灯以及控制直流电机的速度和方向。

旋转编码器的工作原理以及如何同Arduino开发板使用

确定旋转编码器轴的位置

将编码器的+连接至5V,GND连接至GND引脚,CLK连接至引脚编号6,DT连接至引脚编号7。

您需要知道轴的位置才能使用编码器。轴的位置根据其旋转量而变化。顺时针旋转时,它从0变为无穷大,逆时针旋转则从0变为负无穷大。

上传以下代码到Arduino开发板中,然后在串行监视器中查看轴编码器的位置。您可以将此代码用于使用编码器的所有项目。

/*RotaryEncoder - get the position*/#define encoderOutA 6 // CLK#defineencoderOutB 7 // DTint counter = 0;int State;int old_State;voidsetup() {pinMode (encoderOutA, INPUT);pinMode (encoderOutB,INPUT);Serial.begin (9600);//Read First Position of ChannelAold_State = digitalRead(encoderOutA);}void loop() {State =digitalRead(encoderOutA);if (State != old_State){if(digitalRead(encoderOutB) != State){counter ++;}else {counter--;}Serial.print("Position: ");Serial.println(counter);}old_State =State; // the first position was changed}old_State = State; // thefirst position was changed}

要确定编码器位置,我们需要将通道A和B连接到Arduino的输入。我们在开头读取并保存通道A的初始值。然后,我们读取通道A的瞬时值,如果通道B的值超前,我们减小计数器。否则,我们增加计数器。

使用轴旋转控制LED灯

电路连接

旋转编码器的工作原理以及如何同Arduino开发板使用

代码

/*RotaryEncoder - LED Brightness Control*/#define encoderOutA 6 //CLK#define encoderOutB 7 // DT#define LED 9 // LED , must connectto pwm pinint brightness = 0;int State;int old_State;void setup(){pinMode (encoderOutA, INPUT);pinMode (encoderOutB, INPUT);pinMode(LED, INPUT);Serial.begin (9600);//Read First Position of ChannelAold_State = digitalRead(encoderOutA);}void loop() {State =digitalRead(encoderOutA);if (State != old_State){if(digitalRead(encoderOutB) != State){brightness ++;}else {brightness--;}if (brightness >= 255) brightness = 255;if (brightness <=0) brightness = 0;Serial.print("brightness:");Serial.println(brightness);}old_State = State; // the firstposition was changedanalogWrite(LED , brightness);}首先,您需要获得轴的位置,然后您可以通过PWM减少或增加LED灯。由于PWM的值介于0到255之间,因此我们也在代码中将轴位置设置在此范围内。

用中断控制直流电机的速度和方向

电路连接

旋转编码器的工作原理以及如何同Arduino开发板使用

代码

/*  Rotary Encoder - Controlling a DC Motor usingL293D Shield*/#include#define CLK 2#define DT  5#define SW  3AF_DCMotor motor(1, MOTOR12_64KHZ);int motor_dir = 0;int State;int old_State, change;volatile intmotor_speed = 0;volatile boolean buttonState = false;void setup(){  Serial.begin(9600);  pinMode(CLK,INPUT);  pinMode(DT, INPUT);  pinMode(SW,INPUT_PULLUP);  old_State =digitalRead(CLK);  attachInterrupt(digitalPinToInterrupt(CLK), encoder_detect,CHANGE);  attachInterrupt (digitalPinToInterrupt(SW),button_detect, FALLING);}void loop() {  if(!buttonState)  {    if (motor_speed >0)    {     motor.setSpeed(motor_speed);     motor.run(FORWARD);     Serial.print("Move Forward: ");     Serial.println(motor_speed);    }    elseif (motor_speed < 0)    {     motor.setSpeed((motor_speed) * (-1));     motor.run(BACKWARD);     Serial.print("Move Backward: ");     Serial.println(motor_speed);   }  }  if (buttonState == true || motor_speed ==0)  {    motor.run(RELEASE);   Serial.println("Break");  }}void encoder_detect ()  {  buttonState =false;  State = digitalRead(CLK);  if (State !=old_State)  {    if (digitalRead(DT) !=State)    {      motor_speed++;      if (motor_speed >= 255) motor_speed= 255;    }    else {     motor_speed --;      if (motor_speed<= -255) motor_speed = -255;   }  }  old_State = State;}void button_detect(){  buttonState = true;}

在这段代码中,我们使用了一个中断来读取轴和按键的位置。有关中断的更多信息,您可以查看Arduino网站。

通过按下编码器按键或将编码器设置在位置0,电机断开。

后记,小编朋友研发了一个游戏化的少儿编程在线课程(5-12岁),游戏化教学结合scratch(一款在线少儿编程工具,类似乐高的积木拼搭),我家娃娃学了几次课,非常喜欢(超预期),16次课才200多块钱,对锻炼孩子的思维能力和动手动力很有帮助。

欧美思机器人教育加盟 赚钱好项目
上一篇:2.语音板的LED灯编程
下一篇:Arduino vs. micro:bit超级比一比
您可能喜欢
回到顶部