정보나눔

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

스마트 커튼 거의 다 완성했는데, 마무리 쯤에서 스텝모터에 대하여 궁금한 점이 있습니다.
김동한 | 2016-11-29

전 질문에 수박쨈님의 도움으로 map으로 각도로 변환 후, 원하는 각도에서 제어하도록 코드를 완성하였습니다.

(수박쨈님 조언 감사드립니다. :D )

밑에가 저의 코드입니다.

 

#include <Stepper.h>
#define STEPS 1024
#define Fangle 360 // 스텝모터 전체 각도 360도
int val;
int val2;
int angle;
int Nangle; // Next angle
int in1Pin=8;
int in2Pin=9;
int in3Pin=10;
int in4Pin=11;
int cds=A0;
int a=800;
int b=1024;
int c=600;
int d=799;
int e=400;
int f=599;
int g=200;
int h=399;
int i=0;
int j=199;

Stepper motor(STEPS, in4Pin, in2Pin, in3Pin, in1Pin);


void setup() {
  pinMode(in1Pin,OUTPUT);
  pinMode(in2Pin,OUTPUT);
  pinMode(in3Pin,OUTPUT);
  pinMode(in4Pin,OUTPUT);
  motor.setSpeed(30);
  Serial.begin(9600);
}

void loop() {
  val=analogRead(cds);
  angle=map(val,0,1023,0,360);
  Serial.print("cds value= ");
  Serial.print(val);
  Serial.print("     angle= ");
  Serial.println(angle);

  

  if((val>a) && (val<b)){
    if((val2>a) && (val2<b)){
      motor.step(0);
      Serial.println("stop!");
    }
    else{
      motor.step((angle-Nangle)*(STEPS*2/Fangle));
      Serial.println("good calculation!");
      }
    }

 

  else if((val>c) && (val<d)){
    if((val2>c) && (val2<d)){
      motor.step(0);
      Serial.println("stop!");
    }
    else{
      motor.step((angle-Nangle)*(STEPS*2/Fangle));
      Serial.println("good calculation!");
    }
  }

  
  else if((val>e) && (val<f)){
    if((val2>e) && (val<f)){
      motor.step(0);
      Serial.println("stop!");
    }
    else{
      motor.step((angle-Nangle)*(STEPS*2/Fangle));
      Serial.println("good calculation!");
    }

  }  
  else if((val>g) && (val<h)){
    if((val2>g) && (val2<h)){
      motor.step(0);
      Serial.println("stop!");
    }
    else{
      motor.step((angle-Nangle)*(STEPS*2/Fangle));
      Serial.println("good calculation!");
    }
  }
  
  else {
    if((val2>i) && (val2<j)){
      motor.step(0);
      Serial.println("stop!");  
    }
    else{
      motor.step((angle-Nangle)*(STEPS*2/Fangle));
      Serial.println("good calculation!");
    }
  }
  
  delay(10000);
  val2=val;
  Nangle=angle;
}

 

 

즉, 조도값에 따라 원하는 각도에서 제어가 가능하도록 완성하였습니다.

 

근데, 저희가 쓰는 모터가 '스텝모터'입니다.

 

문제는, 실제 커튼에 적용할 시 전원이 reset이 되면 스텝모터가 이전의 각도 즉, 코드상 Nangle도 reset이 되기때문에 마지막 위치를 다시 새로운 시작점이라고 생각하여 전원이 on 일 때 기억하던 절대적인 위치를 다 까먹고 이전의 위치가 전부 reset이 되어버립니다.

 

전원이 꺼진 상태에서도 전원이 켜졌을 때의 위치 즉, 절대적인 위치를 더욱 상세하게 설정하는 방법이 있나요?

 

예를들면 전원이 꺼지기 바로 전 120도 쯤에서 멈췄다면, 전원이 켜진 후 120도 위치에서 0도로 시작하는 것이 아니라 120도 위치(즉, 해당 조도센서 값도 기억을 해야겠지요.)를 인식하고 다음 조도센서 값에 알맞게 다시 loop를 돌게 할 수는 없나요??

 

제가 알기론 서보모터의 각도 하나하나가 마치 좌표처럼 설정되어 있어서 저런 기능이 가능하다던데 맞나요?

답변 부탁드리겠습니다!!

 

 

cf) 그리고 혹시 stepper library에서 step motor 설정시 핀 번호를 1,3,2,4 순서냐 4,2,3,1 순서냐, 또는 1,2,3,4와 4,3,2,1 일 때 시계방향, 반시계 방향 등등 핀 번호를 부여하는 순서에 따라 모터의 작동이 달라지던데, 각각 어떻게 해석해야 하나요? 저는 시계/반시계가 모두 필요해서 4,2,3,1로 쓰고 있는데 이것이 모든 스텝모터에서 동일한 조건인지 궁금합니다.

이전글   |    온습도 센서 + 부저 코딩 질문 2016-11-28
다음글   |    안녕하세요 토양수분세와 피에조부저 관련 질문입니다... 2016-11-30