fbpx
АРВАН ХОЁРДУГААР ДОЛОО ХОНОГ
АРВАН ГУРАВДУГААР ДОЛОО ХОНОГ
АРВАН ДӨРӨВДҮГЭЭР ДОЛОО ХОНОГ
АРВАН ТАВДУГААР ДОЛОО ХОНОГ
АРВАН ЗУРГААДУГААР ДОЛОО ХОНОГ
АРВАН ДОЛООДУГААР ДОЛОО ХОНОГ
АРВАН НАЙМДУГААР ДОЛОО ХОНОГ
Төсөл
2 of 3

Хичээл 33 Алхамт моторыг эргэдэг энкодер ашиглан удирдах

Энэхүү хичээлээр бид эргэдэг энкодер ашиглан алхамт моторыг удирдах бөгөөд үүний үр дүнд эргэдэг энкодер хэрхэн ажилладаг, түүнийг хэрхэн ашигладаг талаар мэдлэгтэй болох юм.

Хэрэглэгдэхүүн:

  1. Ардиуно 1ш
  2. Туршилтын хавтан 1ш
  3. Энкодер 1ш
  4. ULN2003 stepper motor driver module 1ш
  5. Stepper motor 1ш
  6. Тэжээлийн блок 1ш
  7. 9V 1A adapter 1ш
  8. F-М утас 9ш
  9. М-М утас 1ш

Rotary encoder гэж юу вэ?

Эргэдэг энкодер бол товчхондоо эргэх механик хөдөлгөөнийг цахилгаан дохио болгох хувиргадаг төхөөрөмж юм. Эргэх хөдөлгөөнийг олон тэнцүү хэмжээтэй алхамуудад хуваан нэг алхам хөдлөхөд нэг пульс дохиог илгээдэг төхөрөмж гэж хэлж болно. Энэхүү дохиог боловсруулан бид байрлалыг тогтоох, хурдыг тооцолох, тоолох, чиглэлийг тодорхойлох шаардлагатай маш олон төслүүд дээр ашиглах боломжтой юм.

Энкодер

Зарчмын схем

Зарчмын схем
Зарчмын схем

Программ

Эргэдэг энкодерийг эргүүлэх үед алхамт моторыг түүнийг хаашаа, хэр зэрэг эргүүлсэнээс хамаараад цагийн зүүний дагуу эсвэл цагийн зүүний эсрэг тодорхой алхамаар эргүүлэх нь бидний программын гол зорилго оршино. Бидэнд <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.
Бодит зураг