728x90

 오늘 3D 프린팅을 할수 없게되서 대신 코드 정리부터 해보려고한다. 어떻게 정리해나갈지 생각하고자 우선 로터리 엔코더, PID, 모터 제어 코드들을 가져 온 후 어떻게 연동시킬지 생각해본다.

 

 

1. 로터리 엔코더

https://howtomechatronics.com/tutorials/arduino/rotary-encoder-works-use-arduino/

 #define outputA 6
 #define outputB 7
 int counter = 0; 
 int aState;
 int aLastState;  
 
 void setup() { 
   pinMode (outputA,INPUT);
   pinMode (outputB,INPUT);
   
   Serial.begin (9600);
   // Reads the initial state of the outputA
   aLastState = digitalRead(outputA);   
 } 
 void loop() { 
   aState = digitalRead(outputA); // Reads the "current" state of the outputA
   // If the previous and the current state of the outputA are different, that means a Pulse has occured
   if (aState != aLastState){     
     // If the outputB state is different to the outputA state, that means the encoder is rotating clockwise
     if (digitalRead(outputB) != aState) { 
       counter ++;
     } else {
       counter --;
     }
     Serial.print("Position: ");
     Serial.println(counter);
   } 
   aLastState = aState; // Updates the previous state of the outputA with the current state

 

2. PID 예제

https://www.teachmemicro.com/arduino-pid-control-tutorial

//PID constants
double kp = 2
double ki = 5
double kd = 1
 
unsigned long currentTime, previousTime;
double elapsedTime;
double error;
double lastError;
double input, output, setPoint;
double cumError, rateError;
 
void setup(){
        setPoint = 0;                          //set point at zero degrees
}    
 
void loop(){
        input = analogRead(A0);                //read from rotary encoder connected to A0
        output = computePID(input);
        delay(100);
        analogWrite(3, output);                //control the motor based on PID value
 
}
 
double computePID(double inp){     
        currentTime = millis();                //get current time
        elapsedTime = (double)(currentTime - previousTime);        //compute time elapsed from previous computation
        
        error = Setpoint - inp;                                // determine error
        cumError += error * elapsedTime;                // compute integral
        rateError = (error - lastError)/elapsedTime;   // compute derivative
 
        double out = kp*error + ki*cumError + kd*rateError;                //PID output               
 
        lastError = error;                                //remember current error
        previousTime = currentTime;                        //remember current time
 
        return out;                                        //have function return the PID output
}

 

3. DC 모터 제어예제

https://deneb21.tistory.com/281

void setup() {
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
}
 
void loop() 
{
        //최대속도의 50%로 정회전
        digitalWrite(7, HIGH);
        digitalWrite(8, LOW);
        analogWrite(6, 127);
        delay(3000);
 
        //최대속도의 50% 역회전
        digitalWrite(7, LOW);
        digitalWrite(8, HIGH);
        analogWrite(6, 127);
        delay(3000);
 
        //최대속도로 정회전
        digitalWrite(7, HIGH);
        digitalWrite(8, LOW);
        analogWrite(6, 255);
        delay(3000);
 
        //최대속도로 역회전
        digitalWrite(7, LOW);
        digitalWrite(8, HIGH);
        analogWrite(6, 255);
        delay(3000);
 
        //정지 (7번핀에 HIGH를 주어도 PWM 핀에 값을 0을 주었기 때문에 정지함)
        digitalWrite(7, HIGH);
        digitalWrite(8, LOW);
        analogWrite(6, 0);
        delay(3000);
}

 

 

 

 준비는 거의 다되서 진행하려고 하였으나 하필이면 너무 저가의 로터리 엔코더를 사용하다가 제대로 각변화를 측정할수가 없어 더이상 본 과제는 진행할 수가 없다.

 

 상세한 테스트 내용은 오늘 자 문서에 남기고 할수 없이 스테핑 모터를 이용한. 저거 볼 밸런싱 로봇으로 변견해보아야 되겠다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

300x250

+ Recent posts