2019/01/30에 해당하는 글 2

[아두이노] 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

댓글()

Tinkercad로 온라인 3D 디자인 하기

유용한팁|2019. 1. 30. 11:26

Tinkercad로 온라인 3D 디자인 하기






오늘은 즐거운 토요일입니다. 매주 토요일이면 하나씩 무료로 사용할 수 있는 프로그램을 소개하는데 이번주 소개할 무료 툴은 팅커캐드입니다. 초보자도 쉽게 3D 디자인할 수 있는 입문자용으로 딱 좋은 프로그램입니다. 물론 윈도우 10이 설치된 분이라면 앱으로 3D 디자인 할 수 있는 무료 프로그램이 몇개 있지만 오늘 소개하는 프로그램은 설치 없이 온라인상에서 3D 디자인 편집이 가능하고 아이들도 쉽게 조작할 수 있는 프로그램일 것 같아서 소개합니다.

1. 팅커캐드 사이트




간단히 이메일 계정으로 회원가입하시면 됩니다.

갤러리 누르시면 작품들이 화려하죠. 이걸 다운로드 받을 수 있고 복사해서 내 계정으로 옮겨올 수 있습니다. 작품들을 보면 감히 범접 할 수 없는 화려한 작품들을 소개하고 있네요. 내계정으로 복사해와서 어떻게 만들어졌는데 분해 해보시고 따라하시면 대충 감이 잡히실 꺼에요.

그리고 알아보기에서 샘플 튜토리얼 교육이 있습니다. 그런데 영어로 되어 있어 다소 불편하실 수 있지만 그냥 그림만 보고 대충 따라하실 수 있습니다.

알아보기 페이지 하단에 참고로 단축키 목록이 나와 있으니깐 살펴보시고 이용하시면 편하게 3D 디자인을 할 수 있습니다. 마우스로만 해도 되는데 단축키에서 Ctrl+화살표와 Shift+화살표, Shift 누른상태에서 물체들을 클릭이나 Shift+마우스왼쪽키, Ctrl+마우스왼쪽키 등 몇개가 더 있는데 연습하시다 보면 단축키를 사용으로 편하게 편집을 할 수 있다는 것을 느끼실 꺼에요. 마우스 하나로 해도 되기는 하는데 나중에 좀 불편해지니깐 꼭 단축키를 숙지하세요.

2. 팅커링 편집해보기





딱 계정을 만들면 디자인(팅커링), Circuits(아두이노편집기), 교육(알아두기튜토리얼을 클릭하면 자동으로 여기 저장) 이렇게 구성되어 있습니다. 디자인을 누르면 편집창을 새로 만들 수 있습니다. 2달전 만져보고 포스팅 할려고 잠깐 만져 봤네요.

편집창

기본창에서 보면 기본 쉐이프가 몇개 없고 덩그러니 창 하나만 있습니다. 갤러리에서 본 작품들은 화려한데 도대체 이걸로 어떻게 만들었지 하고 의문이 들꺼에요. 저도 처음에 기본 쉐이프을 가지고 어떻게 모먕을 만들지 갑갑 했었습니다. 모양을 만드는 것이 참 도특한 방식이더군요. 모양을 만들때 이게 모양을 만드는 것이 아니라 모양을 깍는다는 원리로 모양을 만들더군요. 아래 모양을 만드는 과정을 자세히 보시면 왜 모양을 깍는다란 표현인지 아실거에요.

어떻게 모양을 만드는지 과정을 설명하겠습니다.

(1) 사각형과 원형의 모형이 있습니다.

(2) 원형안에 사각형을 배치하고 속성창에서 솔리드와 구멍이 있는데 구멍을 클릭하여 변경합니다.

여기서 물체가 정상적으로 보이는 상태는 솔리드이고 물체를 투명하게 보이게 하는게 구멍입니다. 구멍이라는 표현이 번역이 좀 이상하게 된건지 좀 우낀 표현이지요.

(3) Shift 누른상태에서 두 물체를 클릭해줍니다. 범위가 지정되면 위쪽 상단에 그룹만들기가 활성화 되어 있고 그걸 눌러주면 묶여집니다.

(4) 완성


이렇게 모양이 하나 완성됩니다. 이게 팅커벨의 핵심입니다. 이런식으로 해서 독특한 모양을 만들어 냅니다. 여러개의 쉐이프 들을 붙이기 해서 하나로 그룹화하고 거기서 구멍을 파거나 깍을때 그 위치에 도형들을 배치하고 솔리드 대신 구멍 속성을 변경하고 파거나 깍는 부분에 덮어 씌우면 덮어진 범위은 사라지게 됩니다.

참 쉽죠. 이런식으로 작품을 만들어 내면 됩니다. 쉽기는 한데 이게 웹상에서 하기 때문에 컴 사양을 좀 타는 것 같아요. 웹브라우저 인터넷 성능이 느릴때는 좀 버벅거릴 꺼에요. 다 좋은데 이게 단점이네요. 온라인상에서 설치 없이 하는거라 그정도 단점은 감수할 만 할거에요. 아이들 작품도 꽤 잘 만든것 봐서는 쉽게 아이들도 3D 디자인을 할 수 있는 편집기인것 같아요.

3. 짧게 연습해서 만들어 봤어요.




초보수준으로 연습없이 사용법도 간단하고 무대포로 대충 만들어 봤네요. 포스팅 할려고 잠깐 짬내서 짧게 대충 만들었습니다. 공부안하고 이정도로 만들어지는 걸 봐서는 아마 아이들도 사용법만 알면 무자 쉽게 3D 디자인을 할 수 있을 거라 생각되네요.

마무리




전문적으로 하시고 싶다면 3D 게임엔진인 블렌드와 유니티 프로그램을 다운 받아서 설치하시면 되고요. 건축캐드용인데 아주 쉬운 툴로는 스케치업이 있는데 한달 무료 사용이라서 이걸 작년에 한달 놀았는데 아쉽더군요. 더 사용은 되는데 한달 후에는 다른 일부는 사용 못하게 되더군요. 이것도 전문 3D 캐드가 어려운분들이 스케치업으로 공부하면 꽤 쉽게 3D 디자인을 할 수 있어 편집기로 매리트가 있는 프로그램 입니다. 여기서 만든 건물들을 유니티 게임엔진으로 옮겨와서 게임에 사용되는 건물로 쓸 수 있어서 만들기도 쉽고 게임개발 공부할 때 사용하면 괜찮은 프로그램 같아요.

댓글()