[아두이노] LED 제어

IOT/아두이노|2019. 1. 30. 19:45

LED 제어(아두이노)




1. 발광다이오드(LED)



다리가 긴쪽이 +(애노드), 짧은 쪽 -(캐소드) 이다. 애노드와 캐소드 용어로 구지 생각하지 말고 다리길이에 따라 +, -만 구분하시면 된다.

참고로 발광다이오드는 색깔에 따라 필요한 전압이 다릅니다. 일일히 표로 만들기 귀찮아서 괜찮은 표가 있어서 해당 블로그 표를 인용합니다.


출처 : Arduino - LED 저항값 달기
기본적으로 필요 전압이 golsufan09 블로그의 발광다이오드 표를 인용했습니다.

계산법 - 옴의 법칙


V(전압)=I(전류) * R(저항)

R= V/I = (5V-1.8V)/20mA

기본적으로 LED은 표에서 보는 것 처럼 약 2~3V의 전압에 작동을 하는데 아두이노가 5V의 전압을 제공함으로 최소 100옴을 저항이 필요합니다.

그냥 5V의 전압이 공급되면


감당할 수 없는 전압 LED은 그냥 터지고 만다. 그래서 저항을 붙이는데 저항은 흐르는 전류의 양을 조절해주는 수도꼭지 같은 역활을 한다. 즉, 수도꼭지를 돌리면 물의 양을 조절하는 것처럼 저항의 값에 따라서 전류의 양을 조절 가능하다. 그래서 아두이노에서 부품과 모듈을 사용할때에 아두이노의 나오는 전압과 부품과 모듈에서 필요로 하는 전압이 다를때 저항을 사용한다. 특수한 경우를 제외하고는 거의 모듈 형식의 부품을 사용하기 때문에 초보분들은 그렇게 깊게 생각 안하셔도 된다. 그냥 머리속에서 수도꼭지만 생각하시면 된다.

5V의 전압에 저항(220옴)을 붙이면



위 사진과 전류의 변화를 잘 비교하면 된다.

참고로 직접 회로도를 제작하지 않는 이상은 그냥 모듈로 만들어진 부품을 아두이노와 연결해서 자신이 원하는 표현만 잘 해내면 된다.

2. 뻥판



구멍이 촘촘히 뚤려 있다. 여기서 각 점에서 파란선을 주목하길 바란다. 뻥판 내부에 파란선이 그어진 만큼 각 점들은 내부선으로 연결되어 있다. 그래서 LED와 저항을 배치할때에 겹치지 않고 분리 해서 구분하여 배치해야한다.
점들 내부에는 선으로 저런식으로 연결되었구나를 머리속에 담아 놓으시면 됩니다.

실제로


이렇게 연결된 느낌으로 이해하시면 된다. 하지만 이렇게 할려면 각 부품을 납땜해야 한다. 부품마다 분리 되어 있는데 납땜하면 한번 실험하고 말것도 아니고 계속 다양한 실험을 하기 위해서 뻥판을 사용한다. 뻥판에 부품을 꼽기만 하면 납땜을 하지 않아도 부품간 연결을 쉽게 할 수 있어 주로 뻥판을 사용한다.

3. LED 실험



이전 시간에 13번 핀을 출력모드로 깜박이는 실험을 하였다. 아래와 같이 회로도를 배치하고 코딩도 1초 단위로 깜박이는 예제이다.



void setup() {
pinMode(13, OUTPUT);
}

void loop() {
digitalWrite(13, HIGH);
delay(1000);
digitalWrite(13, LOW);
delay(1000); 
}


여기서 여러개의 LED를 제어해보자

회로도


  • 준비물 : led 5개, 저항 220옴 5개, 뻥판, 아두이노우노

components 클릭하시면 부품 이미지들이 하단에 나오고 해당 부품을 드래그 하시면 자동으로 불러오게 된다.
그리고 뻥판에 배치하시고 저항값을 지정하고 선은 마우슨 왼쪽으로 클릭해서 선을 연결하시면 됩니다. 자동으로 마우스 왼쪽 버턴을 누르면 해당 위치에 선이 생성되고 다음 마우스 왼쪽 누른 위치에 끝점이 되어 선이 생성된다.

코딩 - 블록 체크되어있는 걸 누르면 해제된다. 순수 코딩창으로 넘어간다.


  • 내용 : 순차적으로 LED 깜박이기



void setup()
{
  pinMode(13, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(11, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(9, OUTPUT);
}

13,12,11,10,9번 핀을 출력모드로 선언한다. pinMode()함수는 이전 시간에 공부했기에 출력모드로 5핀을 지정만 해주면 된다.

void loop()
{
  digitalWrite(13, HIGH);
  delay(1000); 
  digitalWrite(13, LOW);
  digitalWrite(12, HIGH);
  delay(1000); 
  digitalWrite(12, LOW);
  digitalWrite(11, HIGH);
  delay(1000); 
  digitalWrite(11, LOW);
  digitalWrite(10, HIGH);
  delay(1000); 
  digitalWrite(10, LOW);
  digitalWrite(9, HIGH);
  delay(1000); 
  digitalWrite(9, LOW);  
}

로직은 13번 핀이 5V가 전류가 공급되고 1초 대기했다가 13번핀을 0V를 보내고 동시에 12번핀에 5V의 전류를 보낸다. 이런식으로 1초 단위로 13번에서 부터 9번핀까지 순차적으로 전류를 공급했다가 끊어주기만 하면 간단한 원리이다.

자세히 보면 뭔가 함수명이 중복해서 코드를 선언하고 실행 명령을 내리는 느낌을 받았을 것이다.10개이상의 LED를 깜박인다고 생각해보자. 10개이상의 핀을 선언하고 10개 이상의 핀을 HIGH, LOW를 시키는 코딩을 일일히 표현해야 한다면 얼마나 비 효율적인 코딩이겠는가 여기서 C언어 문법 하나를 배워서 간단히 코딩을 바꿔 보자.

C언어 문법


  • 구조
    for(초기값1, 조건식2, 증감연산4){
    처리문3;
    }

예) 1부터 10까지 더하기
int i,sum;
sum=0;
for(i=1;i<=10;i++){
sum=sum+i;
}

int i, sum; 에서 자료형 int은 담을 수 있는 그릇의 크기이고, i와 sum은 변수명으로 어떤 값을 저장하는 그릇으로 생각하면 된다.
자료형이랑 작은 접시냐 큰 접시냐로 값을 저장할 수 있는 크기를 결정하는 표현으로 생각하면 된다. i와 sum의 변수의 그릇을 int형 크기의 그릇으로 선언했다는 정도만 지금은 이해하면 된다.

for문은 동작 순서는 1->2->3->4->2->3->4->2->3->4.... 이렇게 순차적으로 반복 수행한다. 2번의 조건식이 참이면 처리문을 반복 수행하고 거짓이면 for문을 빠져나오게 된다.

그래서 for문 i은 1로 초기값을 지정되고 조건식 i<=10로 i가 10보다 작거나같은가 묻는다. 조건식이 참인가 거짓인가 비교하게 된다. 초기값이 1이기 때문에 조건식은 참이 되어 처리문3을 수행한뒤 i++(증감) i=i+1과 같다. 1씩 증가하는 증감연산자이다.
초기값이 1이고 조건식이 참이여서 sum = sum +1이 된다. sum은 초기값이 0이기 때문에 sum=0+1로 sum=1이 된다.
i++로 i은 2가 되고 다시 2은 10보다 작거나같냐고 물으면 참이기 때문에 sum=sum+2로 이전 sum값이 1이기 때문에
sum=1+2로 sum=3이 저장된다.
이런식으로 i는 다시 1이 증가하여 1, 2, 3, 4, 5, 6, 7, 8, 9, 10이 될때까지 반복하게 된다. i가 11이 되면 거짓으로 for문은 더이상 수행하지 않고 빠져나오게 된다.
그래서, 1부터 10까지의 합 55가 최종적으로 sum에 저장된다.

sum = 1+2+3+4+5+6+7+8+9+10; 이렇게 일일히 다 표현한다면 10개니깐 이렇게 했지만 1000까지 합으로 구한다고 생각해보자 1000개의 숫자를 다 코딩한다고 상상해 보자 엄청 힘들고 비효율적이게 된다.
간단히 sum=sum+i로 i를 1000번 반복해서 sum에 누적 합계를 구하면 쉽고 간단하게 코딩으로 해결이 가능하다.

이처럼 아두이노에서 led가 5개면 대충 위 코딩처럼 일일히 표현이 가능하겠지만 10개이상이면 저걸 다 일일히 코딩하는 건 엄청 비효율적이다. 이럴때 for문을 사용한다면 단 몇줄로 쉽게 해결할 수 있게 된다.

int i;
void setup()
{
  for(i=13;i>8;i--){
    pinMode(i, OUTPUT);
  }
}

i 변수가 13으로 초기화 하고 i는 8보다 크다가 조건식이다 참임으로 처리문 pinMode()함수에서 13번 핀을 출력모드로 선언한다. 여기서는 감소연산자 i--은 i=i-1이다. 1씩 감소한다. 즉 다음핀 12번이 8보다 큰가 조건식이 된다. 참임으로 12번핀이 출력모드로 선언된다. 이런식으로 13번핀부터 9번핀까지 출력모드로 선언하게 된다.
pinMode()함수를 중복해서 코딩할 필요 없이 for문으로 5번 반복하게 된다.

이와 같이 5개핀을 이제 깜박이게 하는 원리도 동일하다.

void loop()
{
  for(i=13;i>8;i--){
    digitalWrite(i, HIGH);
    delay(1000); 
    digitalWrite(i, LOW);    
  }
}

동일한 for문으로 13번 핀을 5V전원을 공급하고 1초 대기했다가 13번핀을 0V가 된다. 이때 다시 i가 12로 감소하고 12번핀에 5V의 전원이 공급되고 1초 대기했다가 다시 0V가 된다. 이런식으로 9번핀까지 깜박이고 i가 8이 되면 for문을 빠져나오고 loop()문이 끝나고 다시 재 반복되게 된다. 계속 13번핀에서 9번핀까지 1초 단위로 깜박이게 된다.

4. 결과




마무리


처음 Led 한개를 깜박였다면 순차적으로 5개의 led를 깜박이게 했다. 그러면 한번 상상을 해보자 홀짝으로 깜박이게 한다면 어떻게 해야할지를 핀 값을 홀짝만 나눠서 전원을 공급하면 되겠죠.
5개 핀이니깐 홀수 3개핀 짝수 2개핀으로 정해서 3개핀에 전원을 동시게 5V공급했다가 1초후 전원을 OV로 한뒤에 짝수 2개핀을 5V로 공급하면 되겠죠.
이걸 홀짝으로 나눠서 반복하면 홀짝으로 깜박이게 됩니다.
그럼 다시 정순으로 순차적으로 깜박이게 했는데 정순으로 깜박인 후 다시 역순으로 깜박이게 한다면 로직을 상상해 보세요.
또 다른 방식으로 Led를 깜박이게 상상해보세요.
그리고 led을 깜박이는 원리를 적용가능한 것들을 현실세계에서 찾아보세요.
대표적인 예로 신호등 제어를 들 수 있겠죠.
만약 led를 이용해 신호등을 만든다고 상상해보세요. 신호등의 원리를 이해하면 그 원리에 맞게 led를 깜박이게 하면 되겠죠.
이외도 한번 led를 깜박이게 한다 그러면 현실에서는 어떤 것들이 이와 유사한 것들이 있는지 상상해 보세요.
다음에는 led가 과연 어떠한 표현이 있는지를 살펴보도록 하죠.


'IOT > 아두이노' 카테고리의 다른 글

[아두이노] 스위치 버턴 제어  (0) 2019.02.03
[아두이노] 3색 LED 제어  (0) 2019.02.02
[아두이노] 코딩 구조  (0) 2019.01.31
아두이노의 기초  (0) 2019.01.27
아두이노 가상시뮬레이터  (0) 2019.01.24

댓글()