Энэхүү хичээлээр бид эргэдэг энкодер ашиглан алхамт моторыг удирдах бөгөөд үүний үр дүнд эргэдэг энкодер хэрхэн ажилладаг, түүнийг хэрхэн ашигладаг талаар мэдлэгтэй болох юм.
Эргэдэг энкодер бол товчхондоо эргэх механик хөдөлгөөнийг цахилгаан дохио болгох хувиргадаг төхөөрөмж юм. Эргэх хөдөлгөөнийг олон тэнцүү хэмжээтэй алхамуудад хуваан нэг алхам хөдлөхөд нэг пульс дохиог илгээдэг төхөрөмж гэж хэлж болно. Энэхүү дохиог боловсруулан бид байрлалыг тогтоох, хурдыг тооцолох, тоолох, чиглэлийг тодорхойлох шаардлагатай маш олон төслүүд дээр ашиглах боломжтой юм.
Эргэдэг энкодерийг эргүүлэх үед алхамт моторыг түүнийг хаашаа, хэр зэрэг эргүүлсэнээс хамаараад цагийн зүүний дагуу эсвэл цагийн зүүний эсрэг тодорхой алхамаар эргүүлэх нь бидний программын гол зорилго оршино. Бидэнд <Stepper> сан хэрэгтэй болох бөгөөд өмнөх хичээл дээр бид үүнийг ашигласан. Доорх программаас эргэдэг энкодерийн мэдээллийг хэрхэн боловсруулж байгааг харж дүгнэлт хийгээрэй.
#include <Stepper.h>
#define STEPS 2048
#define IN1 11
#define IN2 10
#define IN3 9
#define IN4 8
// initialize stepper library
Stepper stepper(STEPS, IN4, IN2, IN3, IN1);
int8_t quad = 0;
uint8_t previous_data;
void setup()
{
stepper.setSpeed(10); // set stepper motor speed to 10 rpm
// get rotary encoder state
previous_data = digitalRead(A5) << 1 | digitalRead(A4);
// pin change interrupt configuration
PCICR = 2;
PCMSK1 = 0x30;
}
ISR (PCINT1_vect) // ISR for Arduino A4 (PCINT12) and A5 (PCINT13) pins
{
uint8_t current_data = digitalRead(A5) << 1 | digitalRead(A4);
if( current_data == previous_data )
return;
if( bitRead(current_data, 0) == bitRead(previous_data, 1) )
quad -= 1;
else
quad += 1;
previous_data = current_data;
}
int8_t encoder_update(void)
{
int8_t val = 0;
while(quad >= 4){
val += 1;
quad -= 4;
}
while(quad <= -4){
val -= 1;
quad += 4;
}
return val;
}
// main loop
void loop()
{
int8_t stp = encoder_update();
while(stp != 0)
{
int8_t dir = (stp > 0) ? -1 : 1;
stepper.step( 20 * dir );
stp += dir;
stp += encoder_update();
}
digitalWrite(IN1, LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3, LOW);
digitalWrite(IN4, LOW);
delay(100);
}
// end of code.