Lesson 7. Encoder
Key Point
You have learned how to control the speed of motors, but the speed depends on the power you give. When something happens to your battery, the speed will also change at the same time. So if we want to control the speed accurately, we need real time speed of motors, thus we need a new device: encoder.
You Will:
1. Learn how to use the encoder and review how to use interrupt function
2. Know how an encoder work
3. Get the speed of motors and control it
4. Equipment needed: Micro USB Cable,MiniQ 2WD Complete robot Kit v2.0
Upload Sample Code
Open the sample code: speed.ino
1) Sample code
Upload the code and open the serial monitor, you will see:
3) Data when right motor runs
You can change the speed(PWM) of motors in the code( this is not the real speed), thus to measure the real speed in different PWM. For example: calculate the number of times which the voltage change in 100ms, if 100 times changing, it means in 1s it will change 1000 times, and if the gear has 50 teeth, it will be run 1000/50=20 circle in 1 second, just get the diameter of the wheel and you will know the real speed.
Principle
1. Encoder
It is easy to understand that two motors will run differently through they have the same power and the same parameter, takes your robot for example, if you make both of the motors run at the same PWM, the robot can not run exactly straightly. So we need to know the real speed of motors. Thus encoder comes here.
4) Encoder Principal
The principle of encoder is the same as the infrared line tracking sensor, it just output the state of whether it has gear teeth in front. And for, MCU, just calculate these data.
1. Interrupt
We have learned about interrupt, and the picture below shows which pin can be used as interrupt input of the number of interrupt in different kinds of Arduino boards.
Pin 2 in Uno or Mega2560 can be used as number 0 interrupt but in Leonardoit is Pin 3.
5) Interrupt number and Pin number of different borads
Interrupt helps us do something in time, and it also receives several kinds of input for trigger:
LOW: when it has low input, trigger the interrupt CHANGE: when the input change its voltage
RISING: when the input changes from low voltage to high voltage FALLING: when the input changes from high voltage to low voltage
Interrupt function:
attachInterrupt(interrupt, function, mode) interrupt:number of interrupt
function:the name of your function when interrupt was triggered, this function can’t return or receive any parameters.
mode:Which kind of input can trigger the interrupt For example:
attachInterrupt(R,right_count , CHANGE); //attach isr function R=2,right_count is the function,CHANGE is the kind of trigger.
And notice that when interrupt function runs, the program in the loop will stop.
6) How does an encoder work
Encoder is widely used in many place, if you want to control your speed well, you can learn more about the arithmetic about PID or fuzzy.
Code Analysis
Define the data about the interrupt
attachInterrupt(R,right_count , CHANGE); //attach isr function
attachInterrupt(L,left_count, CHANGE); //attach isl function
Print the speed of right motor
r_speed_reality=r_val/(time_step/1000);
Serial.print("r_val:");
Serial.print(r_val);
Serial.print("\t r_speed_reality:");
Serial.print(r_speed_reality);
// calculate speed
The interrupt function of the right motor
void right_count()
{
//Serial.println("r");
r_val++;
}
Circuit Design
7) Encoder circuit
The circuit is just use a chip SN74LVC1G14DBV to deal with the signal that infrared sensor gives, and transmit to Arduino. The chip can make the signal received from infrared sensor more stable.
You may face these questions:
The speed is always showing 0,
First, check the program, if someone changed your code, you need to get your precious one back.
If the first step didn’t work, it is usually because of the location of the wheel, they didn’t fit the infrared sensors well by transport or any other reasons. Now let’s try to solve this problem.
Upload the code below to for print the value in computer:
void setup()
{
pinMode(0,INPUT);//right encoder
pinMode(1,INPUT);//left encoder
Serial.begin(9600);//Serial initiation
}
void loop()
{
int x=digitalRead(0);//Read the value of right encoder
int y=digitalRead(1);//Read the value of left encoder
Serial.print(x);//print the value through computer
Serial.print(" ");
Serial.println(y);
delay(500);
}
Open the serial monitor and you will see:
8) Unchanged value
Adjust the location of wheel
Pull out or push into the wheel a little,then turn the wheel, if you see the value changes, the situation is OK:
9) The left side is OK
Generally the location is where the wheel starts to meet the sensor:
10) The location of IR sensor