정보나눔

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

EEPROM 사용시 로직이 맞는지 궁금합니다.
김동한 | 2016-12-01

전에 스마트 커튼에 대하여 질문을 올린 후 피드백을 받았습니다.

이번엔 전원이 off된 후 다시 on 되었을 때 마지막으로 읽었던 값을 EEPROM으로 저장하여 다시 값을 불러들이는 EEPROM을 공부하였습니다.

 

조도센서의 값을 val로 읽고 그것을 마지막에 val2로 똑같이 저장 후 val2를 loop에서 피드백을 하는 방식입니다.

이제 이 val2를 EEPROM에 저장하여 전원을 off 후 다시 on하여도 voide setup에서 마지막에 저장된 val2를 불러 일으켜서 그 만큼 스텝모터의 각도를 빼줬습니다.

즉, 마지막에 val2만큼 돌았던 스텝모터의 축을 다시 void setup에서 -val2만큼 각도를 해주면 정확히 처음 위치 0도에 도달하겠지요.

그러고 난 후 다시 void loop에서 새로운 val을 받고 똑같이 loop를 돌고... 이런 로직을 짰는데, 실행시 되긴 됩니다. 근데 마지막 데이터 값이 아닌 다른 값을 저장해서 다른 값만큼 회전하더라고요.

그래서 로직이 잘못 된건지, 아니면 제가 실험 결과를 확인하기 위한 방법을 잘못했을수도 있고.. 궁금합니다.

 

또한, 조도센서의 값이 0~1023이라서 address를 0과 1로 두개를 설정했습니다. 즉, hiByte와 loByte를 사용하여 1024를 모두 읽었는데, 이것도 정확하게 로직을 설정했는지도 궁금합니다.

 

밑에는 제가 짠 코드입니다.

전부 정확한데, 위에서 언급했듯이 EEPROM에 관련된 것만 원하는 대로 Feedback이 되질 않습니다.

 

논리적으로 잘못되거나 함수를 잘못 사용한 것이 있다면 알려주시면 감사하겠습니다.

 

(참고로 Rangle에서 x2를 해준 이유는 Rangle은 결국 val2 값으로써 0~1023사이의 값이고, 제가 쓰는 스텝모터의 한 바퀴가 2048 STEP이기 때문에 저렇게 해줬습니다.)

 

 

 

#include <Stepper.h>
#include <EEPROM.h>
#define Fangle 360 // 스텝모터 전체 각도 360도

const int STEPS=2048;
int angle;
int Nangle; // Feedback angle (바로 이전 위치의 angle)
int Rangle; // ROM angle
int val; // angle
int val2; // Nangle
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;
int hiadrr=0;
int loadrr=1;
int hiByte;
int loByte;

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


void setup() {
  pinMode(in1Pin,OUTPUT);
  pinMode(in2Pin,OUTPUT);
  pinMode(in3Pin,OUTPUT);
  pinMode(in4Pin,OUTPUT);
  motor.setSpeed(14);
  Serial.begin(9600);
  byte hiByte=EEPROM.read(hiadrr);
  byte loByte=EEPROM.read(loadrr);
  Rangle=word(hiByte, loByte);
  motor.step(-Rangle*2);

  delay(5000);
}

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!");
      angle=Nangle;
      Serial.print("angle :  ");
      Serial.println(angle);
      Serial.print("Nangle :  ");
      Serial.println(Nangle);
      Serial.println("    ");
    }
    else{
      motor.step((angle-Nangle)*(STEPS/Fangle));
      Serial.print("angle : ");
      Serial.println(angle);
      Serial.print("Nangle : ");
      Serial.println(Nangle);
      Serial.print("Shade moves!  ");
      Serial.print(angle-Nangle);
      Serial.println(" moves");
      Serial.println("    ");
      
      }
    }

 

  else if((val>c) && (val<d)){
    if((val2>c) && (val2<d)){
      motor.step(0);
      Serial.println("stop!");
      angle=Nangle;
      Serial.print("angle :  ");
      Serial.println(angle);
      Serial.print("Nangle :  ");
      Serial.println(Nangle);
      Serial.println("    ");
    }
    else{
      motor.step((angle-Nangle)*(STEPS/Fangle));
      Serial.print("angle : ");
      Serial.println(angle);
      Serial.print("Nangle : ");
      Serial.println(Nangle);
      Serial.print("Shade moves!  ");
      Serial.print(angle-Nangle);
      Serial.println(" moves");
      Serial.println("    ");
    }
  }

  
  else if((val>e) && (val<f)){
    if((val2>e) && (val2<f)){
      motor.step(0);
      Serial.println("stop!");
      angle=Nangle;
      Serial.print("angle :  ");
      Serial.println(angle);
      Serial.print("Nangle :  ");
      Serial.println(Nangle);
      Serial.println("    ");
    }
    else{
      motor.step((angle-Nangle)*(STEPS/Fangle));
      Serial.print("angle : ");
      Serial.println(angle);
      Serial.print("Nangle : ");
      Serial.println(Nangle);
      Serial.print("Shade moves!  ");
      Serial.print(angle-Nangle);
      Serial.println(" moves");
      Serial.println("    ");
   }

  }
  else if((val>g) && (val<h)){
    if((val2>g) && (val2<h)){
      motor.step(0);
      Serial.println("stop!");
      angle=Nangle;
      Serial.print("angle :  ");
      Serial.println(angle);
      Serial.print("Nangle :  ");
      Serial.println(Nangle);
      Serial.println("    ");
    }
    else{
      motor.step((angle-Nangle)*(STEPS/Fangle));
      Serial.print("angle : ");
      Serial.println(angle);
      Serial.print("Nangle : ");
      Serial.println(Nangle);
      Serial.print("Shade moves!  ");
      Serial.print(angle-Nangle);
      Serial.println(" moves");
      Serial.println("    ");
    }
  }
  
  else {
    if((val2>i) && (val2<j)){
      motor.step(0);
      Serial.println("stop!");
      angle=Nangle;
      Serial.print("angle :  ");
      Serial.println(angle);
      Serial.print("Nangle :  ");
      Serial.println(Nangle);
      Serial.println("    ");
    }
    else{
      motor.step((angle-Nangle)*(STEPS/Fangle));
      Serial.print("angle : ");
      Serial.println(angle);
      Serial.print("Nangle : ");
      Serial.println(Nangle);
      Serial.print("Shade moves!  ");
      Serial.print(angle-Nangle);
      Serial.println(" moves");
      Serial.println("    ");
    }
  }
  
  delay(5000);
  val2=val;
  Nangle=angle;

  
  byte hiByte=highByte(val2);
  byte loByte=lowByte(val2);
  EEPROM.write(hiadrr, hiByte);
  EEPROM.write(loadrr, hiByte);

}

이전글   |    아두이노간 통신 2016-11-30
다음글   |    네오픽셀 라이브러리 질문 있습니다. 2016-12-01