속도 테스트1 No class, No PID - suakii/oddMotorStudy GitHub Wiki

이번 작업은 모터의 속도를 테스팅 하는 것입니다.

여기서 목표 속도와 현재 속도에 대한 정의가 필요합니다.

목표 속도는 모터에 가해지는 pwm value로 간주하며

현재 속도는 100ms 당 측정된 회전수의 값으로 정의합니다.

해당 코드는 아래와 같으면 https://github.com/suakii/oddMotorStudy/tree/master/Chapter3_SpeedTest/SpeedTest_ino 입니다.

/*
 * Speed Test simple
 * class를 사용하지 않는 형태임 
 * 다음 작업에서는 클래스를 사용한 형태로 변환
 * [email protected]
 * 아래 코드 중 switch 부분은
 * [canDynamix] 모터 속도 테스트  (광주로봇동호회_[깡통로봇연구소]) |작성자 Baram
*  코드를 참고하여 작성하였음을 밝힙니다.
 */
#include <MsTimer2.h>

int pulses, currentPulses;
int motorSpeed;
    
int encoderA = 2;//아두이노2번핀 -- 모터의 3번핀 Encoder A Phase
int encoderB = 4;//아두이노4번핀 --- 모터의 4번핀 Encoder B Phase
int motorPlus = 5;//아두이노5번핀 -- 모터 드라이버의 A-1A                      
int motorMinus = 6;//아두이노 6번핀 --모터 드라이버의 A-1B  

int state = 0;
unsigned long pre_time = millis();
unsigned long pre_time_delay = millis();
int  pwm = 0;



void setup() {
  pinMode(encoderA, INPUT_PULLUP);//인코더 값을 읽기 위하여 내부 풀업 저항 사용 
  pinMode(encoderB, INPUT_PULLUP);
 
  
  attachInterrupt(0, A_CHANGE, CHANGE);//
   
  analogWrite(motorPlus, 0);//초기 모터 정지
  analogWrite(motorMinus, 0);
 
  Serial.begin(115200);//시리얼로 값을 보내기 위한 작업
 
}
bool pulsesChanged = false;

void loop() {

  /*
  2초마다 pwm value를 높이면서 모터의 목표 속도를 증가시키고 있음.
  여기에서 목표 속도란 얼밀히 말하면 m/s, rad/s 등이 아닌 0~255 사이의 pwm value임.
  */
   switch(state)
  {
    case 0:
      if (millis()-pre_time_delay >= 2000)
      {
        pre_time_delay = millis();
        state = 1;
        pwm = 50;
        analogWrite(motorPlus, pwm);
      }
      break;

    case 1:
      if (millis()-pre_time_delay >= 2000)
      {
        pre_time_delay = millis();
        state = 2;
        pwm = 100;
        analogWrite(motorPlus, pwm);
      }
      break;

    case 2:
      if (millis()-pre_time_delay >= 2000)
      {
        pre_time_delay = millis();
        state = 3;
        pwm = 150;
        analogWrite(motorPlus, pwm);
      }
      break;
    case 3:
      if (millis()-pre_time_delay >= 2000)
      {
        pre_time_delay = millis();
        state = 4;
        pwm = 200;
        analogWrite(motorPlus, pwm);
      }
      break;
    case 4:
     if (millis()-pre_time_delay >= 2000)
      {
        pre_time_delay = millis();
        state = 5;
        pwm = 250;
        analogWrite(motorPlus, pwm);
      }
      break;
       case 5:
      if (millis()-pre_time_delay >= 2000)
      {
        pre_time_delay = millis();
        state = 0;
        pwm = 0;
        analogWrite(motorPlus, pwm);        
      }
      break;    
  }
	//100ms 당  측정된 회전수 값을 시리얼로 전송
	//즉 셋팅한 pwm value와 실제 회전수의 관계를 보기 위한 것임.
  if (millis()-pre_time >= 100)
  {
    pre_time = millis();
	motorSpeed = pulses - currentPulses;//속도의 정의를 100ms당 회전수로 정의
	currentPulses = pulses;
    Serial.print(pwm);
    Serial.print(" ");    
    Serial.println(motorSpeed);
        
  }
  
}

void A_CHANGE() {                                     
  if ( digitalRead(encoderB) == 0 ) {
    if ( digitalRead(encoderA) == 0 ) {
      // A fall, B is low
      pulses--; // Moving forward
    } else {
      // A rise, B is high
      pulses++; // Moving reverse
    }
  } else {
    if ( digitalRead(encoderA) == 0 ) {
      pulses++; // Moving reverse
    } else {
      // A rise, B is low
      pulses--; // Moving forward
    }
  }
  pulsesChanged = true;

}

위 코드를 아두이노에 업로드 후 아두노가 제공하는 시리얼 플로터를 통해 본 화면은 다음과 같습니다.

pwm value가 증가함에 따라 100ms 당 측정되는 회전 수 역시 증가하는 것을 볼 수 있습니다.

아래 그래프에서 나오는 속도를 조금 더 살펴보겠습니다.

모터의 결과값을 시리얼로 보면 최대 값이 저 같은 경우에는 204가 나옵니다.

204 pulses/ 100ms

2040 pulses/sec

2100/2040 = 1.029 rotation/sec

61 rotation/minute

정도의 속도를 가지게 되는 것을 알 수 있습니다.

구입한 모터의 rpm 값은

Micro Metal Geared motor w/Encoder - 6V 105RPM 150:1

라고 되어 있네요.

⚠️ **GitHub.com Fallback** ⚠️