달력

5

« 2024/5 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

'아두이노/출력'에 해당되는 글 14

  1. 2016.02.08 RGB
  2. 2016.02.08 아날로그 출력 밝기 이동시키기
  3. 2016.02.08 기본 1개짜리 아날로그 출력
  4. 2016.02.08 기본 출력 digitalWrite()
2016. 2. 8. 22:44

RGB 아두이노/출력2016. 2. 8. 22:44




RGB LED에서 Red-> Yellow->Green-> Cyan->Blue -> Magenta 순으로 나타내고 싶다.
/*7.4 
control RGB
cookbook code
1*/

const int redPin = 3;
const int greenPin = 5;
const int bluePin = 6;
const boolean invert = true;

int color = 0;
int R, G, B;

void setup()
{
}

void loop()
{
  int brightness = 255;
  hueToRGB( color, brightness);
  
  analogWrite(redPin, R);
  analogWrite(greenPin, G);
  analogWrite(bluePin, B);
  
  color ++;
  if(color > 255)
  color = 0;
  delay(10);
}

void hueToRGB(int hue, int brightness)
{
  unsigned int scaledHue = (hue*6);
  unsigned int segment = scaledHue / 256;
  unsigned int segmentOffset = scaledHue - (segment*256);
  
  unsigned int complement = 0;
  unsigned int prev = (brightness * (255 - segmentOffset)) / 256;
  unsigned int next = (brightness * segmentOffset) / 256;
  if(invert)
  {
    brightness = 255-brightness;
    complement = 255;
    prev = 255-prev;
    next = 255-next;
  }
  
  switch(segment){
    case 0:
    R = brightness;
    G = next;
    B = complement;
    break;
    case 1:
    R = prev;
    G = brightness;
    B = complement;
    break;
    case 2:
    R = complement;
    G = brightness;
    B = next;
    break;
    case 3:
    R =complement;
    G = prev;
    B = brightness;
    break;
    case 4:
    R = next;
    G = complement;
    B = brightness;
    break;
    case 5:
    R = brightness;
    G = complement;
    B = prev;
    break;
  }
}

/*2
my RGB code*/ 

int color = 0;
const int redPin= 3, greenPin = 5, bluePin = 6;
int R, G, B;
const boolean invert = true;

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

void loop()
{
  //dicide each brightness of RGB
  brightOfRGB( color);
  
  analogWrite(redPin, R);
  analogWrite(greenPin, G);
  analogWrite(bluePin, B);
  
  color ++;
  if(color > 255)
  color = 0;
  delay(10);
}

void brightOfRGB(int color)
{
  //dicide the color
 long domain = color*6;
 long segment = domain/256;
 long segmentOffset = domain-segment*256;
 
  //value of each kind of brightness
  long brightness=150;
  long prev=(150*(255-segmentOffset))/255;
  long next = (150*segmentOffset)/255;
  int complement =0;
  
  //because of common anode
  if(invert)
  {brightness = 255 - brightness;
   complement = 255 - complement;
   next = 255 - next;
   prev = 255 - prev;}
  
 
  //output each brightness from color
  switch(segment)
  {
    //RED
    case 0:
    R = brightness;
    G = next;
    B = complement;
    break;
    //YELLOW
    case 1 :
    R = prev;
    G = brightness;
    B = complement;
    break;
    //GREEN
    case 2:
    R = complement;
    G = brightness;
    B = next;
    break;
    //CYAN
    case 3:
    R = complement;
    G = prev;
    B = brightness;
    break;
    //BLUE
    case 4:
    R = next;
    G = complement;
    B = brightness;
    break;
    //MAGENTA
    case 5:
    R = brightness;
    G = complement;
    B = prev;
    break;
  }

/*3
analogcode reference*/

const int redPin= 3, greenPin = 5, bluePin = 6;
int R=255, G=0, B=0;
int r=0, g=0, b=0;

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

void loop()
{

  if(R ==255)
  {r= -1;
   g=1;
   b=0;}
  if(G==255)
  {r=0;
   g=-1;
   b=1;}
  if(B==255)
  {r=1;
   g=0;
   b=-1;}
  
  R +=r;
  G +=g;
  B+=b;
 
  Serial.println(R);
  analogWrite(redPin, 255-R);
  analogWrite(greenPin, 255-G);
  analogWrite(bluePin, 255-B);
  delay(1);  
}

[출처] [아날로그 출력] - RGB|작성자 DEW



:
Posted by youjin.A
문제:
LED 6개를 이용해서, 빛이 지나가면서 뒤에 꼬리가 생기게 하고 싶어요.
 
회로:
아두이노에서 PWM을 지원하는 3,5,6,9,10,11번 핀에 각각 LED를 연결합니다.
 
코드1:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
const int ledpins[] = {3,5,6,9,10,11};
const int SIZE = sizeof(ledpins) / sizeof(ledpins[0]);
int wait = 500;
 
void setup()
{
}
 
void loop()
{
   //first case
  for(int i=0; i<4; i++)
     {
      for(int n=i, m=0; n>=0; n--, m++)
          analogWrite(ledpins[n], 255/pow(3,m));
       
      delay(wait);
      }
      
   //second case   
   for(int n=4, m=0; n>=0; n--, m++)
          {if(n>0)
           analogWrite(ledpins[n], 255/pow(3, m));
           else
           analogWrite(ledpins[n], 0);}
           
   delay(wait);
      
  //third case    
  for(int i=0; i<5; i++)
      {
        for(int limit=i+1, led=5, dark=i; n>=0; led--, dark++)
          {if(led>limit)
           analogWrite(ledpins[led], 255/pow(3, dark));
           else
           analogWrite(ledpins[led], 0);}
           
        delay(wait);
      }
}
코드1 설명:
loop()함수를보면 first case와 second case, third case로 나누어져 있습니다.
first case는 빛의 머리부분이 0~4까지 오는 부분으로 
빛의 개수가 1개에서 4개로 증가하는 부분입니다.
second case는 빛의 머리부분이 5에 오는 부분입니다.
third case는 빛의 꼬리부분이 2~5를 지나 없으질 때까지의 부분으로
빛의 개수가 4개에서 0개로 줄어드는 부분입니다.
 
first case에서는 
i=0일 때, for문의 초기화 부분에서 n=0이니까 ledpins[0]이 머리가 됩니다.
그리고 조건 i>=0 때문에 for문이 종료됩니다.
i=1일 때, for문의 초기화 부분에서 n=1이니까 ledpins[1]이 머리가 되고,
증감연산에 의해 n=0이 되어 ledpins[0]은 밝기가 255/3으로 줄어듭니다.
그리고 조건 i>=0 때문에 for문이 종료됩니다.
i=2일 때, for문의 초기화 부분에서 n=2이니까 ledpins[2]가 머리가 되고,
증감연산에 의해 n=1이 되어 ledpins[1]의 밝기가 255/3으로 줄어들고,
다시 증감연산에 의해 n=0이 되어 ledpins[0]의 밝기가 255/9로 줄어듭니다.
그리고 조건 i>=0 때문에 for문이 종료됩니다.
i=3일 때, for문의 초기화 부분에서 n=3이니까 ledpins[3]이 머리가 되고,
증감연산에 의해 n=2가 되어 ledpins[0]의 밝기가 255/3으로 줄어들고,
다시 증감연산에 의해 n=1이 되어 ledpins[1]의 밝기가 255/9로 줄어들고,
다시 증감연산에 의해 n=0이 되어 ledpins[0]의 밝기가 255/27로 줄어듭니다.
그리고 조건 i>=0 때문에 for문이 종료됩니다. 
 
second case에서는
4~1의 led까지 점점 어두워 지다가 ledpins[0]에서 꺼집니다.
 
third case에서는 
i=0일 때, limit값이 1입니다. 
limit이하의 led는 꺼집니다.
for문의 초기화 부분에서 led=5이고 dark=0이기 때문에 
5번핀이 가장 밝고 다음 led로 갈수록 어두워 집니다.
그러다가 led가 1이되면 led는 꺼집니다.
i=1일 때, limit값은 2입니다.
for문의 초기화 부분에서 led=5이고 dark=1이기 때문에
5번 핀이 조금 어둡고 다음 led로 갈수록 더 어두워 집니다.
그러다가 led가 1이 되면 led는 limit값 이하이기때문에 꺼집니다.
이렇게 되다가 i=4일 때, limit값은 5가 됩니다.
for문의 초기화 부분에서 led=5이고 dark=4이지만 
모든 led가 limit값 이하이기 때문에 꺼집니다.
 
코드2:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
const int ledpins[10] = {3,5,6,9,10,11};
const int SIZE = sizeof(ledpins) / sizeof(ledpins[0]);
int wait = 500;
 
void setup()
{
}
 
void loop()
{
  for(int i=0; i<10; i++)
     {
      if(0<=i<=5)
         analogWrite(ledpins[i],255/ pow(3,0));
      if(1<=i<=6)
         analogWrite(ledpins[i-1], 255/pow(3,1));
      if(2<=i<=7)
         analogWrite(ledpins[i-2], 255/pow(3,2));
      if(3<=i<=8)
         analogWrite(ledpins[i-3], 255/pow(3,3));
      if(4<=i<=9)
         analogWrite(ledpins[i-4],0);
      
      delay(wait);
     }
}

 

 

코드2 설명:

우선 9~6까지의 가상의 LED를 생각해서 총 LED가 10개 있다고 생각합니다.

그리고 for문의 i는 가장 밝은 머리부분의 LED를 나타냅니다.

for문의 증감연산에 의해서 led의 머리부분이 0~9까지 이동하게 됩니다.

이때 각각의 led는 if문에 의하여 선택적으로 켜지게 됩니다. 

선택적으로 켜지는 것은 각자가 생각해 봅시다~ 


:
Posted by youjin.A
2016. 2. 8. 22:42

기본 1개짜리 아날로그 출력 아두이노/출력2016. 2. 8. 22:42

문제:
LED를 점점 밝아졌다가 어두워졌다 하도록 만들고 싶어요.
 
회로:
 
 
코드1: 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
const int led = 3;
int brightness = 0 , i;
 
void setup()
{
}
 
void loop()
{
 if(brightness  < 1)
 i = 1;
 else if(brightness > 254)
 i = -1;
 //light LED as brightness
 analogWrite(led, brightness);
 delay(10);
 
 brightness = brightness + i;
}

 

코드 설명:

loop()함수에서 맨 처음 brightness값은 0이지요?

그래서 if문에 의해서 i=0이 됩니다.

brightness = brightness + i에 의해서 brightness값이 점점 증가하다가,

brightness값이 255가 되면 i=-1이 되어,

brightness값이 점점 감소하게 됨니다.

그리고 다시 brightness값이 0이되면 i=1이되어,

brightness값이 점점 증가하게 됩니다.

 

코드2: 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
const int led = 3 ;
 
void setup()
{  
}
 
void loop()
{
 for(int i=0; i<255; i++)
  {analogWrite( led, i);
   delay(10);}
 
 for(int i= 255; i>0; i--)
  {analogWrite( led, i);
   delay(10);}

 

코드2 설명:

첫번째 for문에서 i값이 점점 증가합니다.

i가 255가 되면 첫번째 for문은 끝나고

두번째 for문이 시작됩니다.

두번째 for문에서 i값이 점점 감소합니다.

i가 0이 되면 두번째 for문은 끝나고

첫번째 for문이 시작됩니다. 


:
Posted by youjin.A
2016. 2. 8. 22:41

기본 출력 digitalWrite() 아두이노/출력2016. 2. 8. 22:41

문제:

LED3개를 순서대로 깜박이게 하고 싶어요.

 

부품:

LED3개, 330옴 저항 3개

 

회로:

 

 

코드: 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
const int first = 3; 
const int second = 5; 
const int third = 6; 
 
void setup() 
{
 pinMode(first, OUTPUT); 
pinMode(second, OUTPUT); 
pinMode(third, OUTPUT); 
}
 
 void loop() 
{
  //blink LED one by one  
 blinkLED(first, 1000); 
 blinkLED(second, 500); 
 blinkLED(third, 800); 
 
void blinkLED(int pin, int time) 
 digitalWrite(pin, HIGH); 
 delay(time); 
 digitalWrite(pin, LOW); 
 delay(time); 

 

 

코드설명:

loop()함수 내부를 보면,

first, second, third 순으로 LED를 깜박인다는 것을 알 수 있습니다.

blink함수를 자세하게 보자면,

핀과 시간이 입력되면 해당핀에 입력된 시간만큼의 펄스를 주게되는 것입니다.

[출처] [디지털 출력] 1|작성자 DEW


:
Posted by youjin.A