정보나눔

오픈소스하드웨어 프로젝트에 대한 다양한 정보를 나누는 공간입니다.

엔코더 모터 입력한 각도만큼 움직이기
난폭한할아버지 | 2021-03-11

const int motorDirPin3 = 8; //Dir은 방향
const int motorDirPin4 = 9; //Dir은 방향
const int motorPWMPin = 10; //속도 조절

const int encoderPinA = 3;
const int encoderPinB = 2;

int encoderPos = 0;

int value;

const float ratio = 360. / 42. / 12.;

void FA() {
  encoderPos += (digitalRead(encoderPinA) == digitalRead(encoderPinB)) ? -1 : 1;
}

void FB() {
  encoderPos += (digitalRead(encoderPinA) == digitalRead(encoderPinB)) ? 1 : -1;
}

void setup() {
  pinMode(encoderPinA, INPUT_PULLUP);
  pinMode(encoderPinB, INPUT_PULLUP);

  attachInterrupt(0, FA, CHANGE);
  attachInterrupt(1, FB, CHANGE);

  pinMode(motorDirPin3, OUTPUT);
  pinMode(motorDirPin4, OUTPUT);

  Serial.begin(9600);


}

void loop() {

  while (!Serial.available()) {}

  value = Serial.parseInt();

  Motor((value >= 0) ? HIGH : LOW, 0);

  Serial.print("encoderPos  :  ");
  Serial.print(encoderPos);
  Serial.print("  motorDeg : ");
  Serial.println(float(encoderPos)*ratio);
}

void Motor(bool dir, int vel) {

  float Degree = (float)encoderPos * ratio;

  analogWrite(motorPWMPin, 0);

  while (!(value == Degree)) {

    digitalWrite(motorDirPin3, dir);
    digitalWrite(motorDirPin4, dir ? LOW : HIGH);
    analogWrite(motorPWMPin, vel);

    if (vel == 0) {
      for (vel = 1; vel <= 100; vel++) {
        analogWrite(motorPWMPin, vel);
        delay(100);
      }
    }
  }

  analogWrite(motorPWMPin, 0);

}

 

 

제가 생각한 대로하여 360입력하면 한바퀴 돌고 끝나야하는데 왜 계속 도는지 모르겠습니다ㅠㅜ

이전글   |    아두이노 업로드 문제 .. 2021-02-27
다음글   |    도와주세요!! 2021-03-20