본문 바로가기
Arduino/AVR/2. Arduino프로젝트

아두이노에서 CDS 입력으로 2개의 PWM 동시제어하기

by pepsiman 2009. 8. 26.
CDS는 photo register 또는 photo cell 이라고도 부르며 빛의 밝기를 저항값으로 출력해주는 센서입니다.
PWM이란 펄스의 폭을 조절함으로써 전압을 제어하는 효과를 주는 기능으로 LED의 밝기를 조절한다거나 모터의 회전수를 조절하는등에 사용됩니다.

사용부품 : 220옴 2개, 10k옴 1개, led 2개
CDS가 스위치 역할을하여 초기상태보다 어두워지면 작동을 시작합니다.
즉 CDS의 빛을 가리면 작동을 시작합니다.

10번핀 LED는 천천히 켜졌다 어두워지고, 9번 LED는 빨리 켜졌다 어두워집니다.
두 속도가 다른 LED가 동시에 제어되는 예제입니다.

입력으로 CDS를 아날로그 0번 핀에 사용하고, 출력으로 LED 2개를 PWM 핀 9,10번에 연결했습니다.



      
위 동영상이 동작 모습입니다.

#include <stdio.h>

int photocellPin;
int buttonPin = 2;
int ledValue = LOW;

int cdsInitValue=0;
int fadeVal[12]={0};
long fadeTimer;

void InitCDS(int pin){
  photocellPin = pin;
  cdsInitValue=0;
  int i;
  for (i=0; i<10; i++){
    cdsInitValue +=  analogRead(photocellPin);
  }
  cdsInitValue = cdsInitValue / i;
}

int IsCDSOn(int val){
  int photocellReading = 0, i;
  for(i=0; i<3; i++){
    photocellReading += analogRead(photocellPin);
  }
  photocellReading /= i;
  
  char s[255];
  sprintf(s, "read=%d, initVal=%d\n", photocellReading, cdsInitValue);
  //Serial.print(s);
  
  if (val > 0){
    if (photocellReading > cdsInitValue + val)
      return 1;
    else
      return 0;
  }
  else {
    if (photocellReading < cdsInitValue + val)
      return 1;
    else
      return 0;
  }    
}

void InitFade(int val){
  for(int i=0; i<12; i++){
    fadeVal[i] = val;
  }
  fadeTimer=0;
}

int FadeCore(int pwmPin, int fadeSpeed, long startTime){
  char s[255];
  sprintf(s, "[%2d],timer=%ld, startTime=%ld\n",pwmPin, fadeTimer,startTime);
  Serial.print(s);
  if (fadeTimer < startTime) return fadeVal[pwmPin];
  
  fadeVal[pwmPin] += fadeSpeed;
  //char s[255];
  sprintf(s, "spd=%d, cnt=%d\n", fadeSpeed, fadeVal[pwmPin]);
  Serial.print(s);
  
  if (fadeVal[pwmPin] < 0) fadeVal[pwmPin] = 0;
  if (fadeVal[pwmPin] > 255) fadeVal[pwmPin] = 255;
  
  analogWrite(pwmPin, fadeVal[pwmPin]);
  /*
  if (fadeSpeed > 0){
    if (countFade < 255) return 1;
    else return 0;
  } else {
    if (countFade > 0) return 1;
    else return 0;
  }
  */
  return fadeVal[pwmPin];
}

void FadeDelay(long ms){
    delay(ms);
    fadeTimer += ms;
}

void Init(){
  int cdsPin = 0, startVal = 0;
  
  InitCDS(cdsPin);
  InitFade(startVal);
}

void setup(void) {
  Serial.begin(9600);  
  Init();  
}

void loop(void) {
  int fadeStep=3, fadePin10=10,fadePin9=9, cdsSense=-40, val1=0, val2=255, timeDelay=10;
  
  while (IsCDSOn(cdsSense) == 0);
  
  InitFade(0);
  while(val1 < 255){
    val1 = FadeCore(fadePin10, fadeStep, 0);
    FadeCore(fadePin9, fadeStep*4, 80);
    Serial.println(val1);
    FadeDelay(timeDelay);
  }

  InitFade(255);
  while(val2 > 0){
    val2 = FadeCore(fadePin10, fadeStep * (-1), 0);
    FadeCore(fadePin9, fadeStep * (-4), 80);
    FadeDelay(timeDelay);
  }
}


댓글1

  • 이한샘 2012.09.18 20:00

    제가 이번에 첨으로 프로젝트를 하는데 cds와 pic을 이용해서 밝기를 4~5단계로 제어하려합니다
    근데 진짜 첨이라 회로도나 필요한 부품도 모르겠더라고요
    혹시 정보가 있으시면 좀 알려주세요
    답글