전 질문에 수박쨈님의 도움으로 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로 쓰고 있는데 이것이 모든 스텝모터에서 동일한 조건인지 궁금합니다.
|