[아두이노] 코딩 구조
[아두이노] 코딩 구조
- 온라인 가상시뮬레이터 : https://www.tinkercad.com
void setup() {
//초기화 작업
}
void loop() {
//수행한 명령어 로직
}
setup()함수와 loop()함수로 구성되어 있는데 아두이노에 전원이 공급되면 처음 한번만 setup()함수가 수행되고 난 뒤 loop()함수가 전원이 공급되는 동안 무한 반복 호출 된다.
그래서 setup()함수에는 한번만 수행할 명령 코드를 이곳에다 표현하고 계속 반복되는 동작의 명령 코드를 loop()함수에 표현하게 된다.
1. 코딩 연습
- 주제 : 아두이노에서 LED를 깜박이게 하고자 한다.
- 명령어 : pinMode(), digitalWrite(), delay()함수
원래는 회로를 먼저 설계한 뒤에 설계한 회로가 원하는 동작을 수행하도록 코딩을 그 다음에 한다. 하지만 여기서는 코딩을 연습하는게 목적임으로 코딩하는 법을 먼저 배워보자.
세개의 함수에 대해서 간단히 이해하자.
pinMode(핀번호, 모드)로 아두이노 해당 핀번호를 입력/출력 모드를 지정하는 함수이다. 즉, 해당 핀을 전류를 받는 입력모드로 쓸지 전류를 내보내는 출력모드로 쓸지를 정하는 것이다. 여기서 LED를 깜박이게 하는건 LED로 전류를 보내야 한다. 그렇기 때문에 LED와 연결된 핀을 출력모드로 지정해야 합니다.
만약 13번핀을 이용해서 LED에 전류를 공급하고 싶다면
pinMode(13,OUTPUT); 라고 표현이 됩니다. 13번 핀을 통해서 LED로 전류를 공급하겠다는 의미인거죠.
13번 핀을 출력모드로 준비상태가 되었습니다. 그러면 이제 깜박이게 한다는 것은 전류가 흐를때 LED 불은 켜지고 전류가 흐르지 않을때 LED 꺼지겠지요.
이제 전류를 보내는 명령을 써야겠지요. 13번 핀을 출력모드로 전류를 외부로 보내는 준비 상태였다면 이제 전류를 실제 공급하는 명령어를 표현해야 됩니다.
digitalWirte(13, HIGH); 라고 표현을 하게 되면, 디지털13번 핀을 HIGH로 한다는 명령어 입니다. HIGH은 매크로 상수로 고정 숫자값인데 그 값을 우리가 이해하기 쉬운 네임으로 지정한 것이죠. (HIGH=TRUE=1) 와 (LOW=FALSE=0)의 표현으로 1과 0을 매크로(#define선언 된) 네임으로 생각하시면 됩니다. 여기서 중요한게 아니라 HIGH은 1로 5V의 전류란 의미로 이해하시고 LOW은 0으로 0V의 전류라고 생각하시면 됩니다.
결론은 13번 핀에 5V의 전류를 보내라는 뜻인거죠.
1초 단위로 LED를 깜박이게 하고 싶다고 상상을 해보세요. 13번핀에 5V의 전류가 흘렀다가 1초후 0V로 전류가 안흘렀다가 다시 1초후 5V가 흐르게 하면서 이렇게 반복적인 수행을 하면 1초 단위로 LED를 깜박이게 되겠죠.
delay(1000); 함수는 1000은 1초를 나타납니다. delay=대기 1초간 대기하라는 뜻이죠. LED를 1초 단위로 깜박이고 싶다면 1초동안 켜지고 1초동안 꺼져야 겠죠. 즉, 1초동안 전원이 공급된 상태로 대기해야 한다는 뜻이죠. 그래서 이 함수를 사용하게 됩니다.
이 세개의 함수를 이제 배치를 해야합니다. setup()함수와 loop()함수에 배치해야 하는데 어떻게 해야할까요.
처음 한번만 수행하는 함수는 setup()함수에 코딩한다고 했죠. 13번이라는 핀을 전류를 밖으로 내보내는 출력모드로 사용한다고 했습니다. 그런데 매번 13번을 출력모드를 쓸거야 하고 반복할 필요가 없죠.
그래서
void setup() {
pinMode(13, OUTPUT);
}
이렇게 한번만 수행해도 되니깐 setup()함수에 넣으면 좋겠죠. 다음으로는 LED를 1초 단위로 깜박이는 하는데 한번만 깜박이는게 아니고 계속 반복해서 깜박이잖아요. 그래서 setup()함수에 넣어서 한번만 깜박일 이유가 없죠. loop()함수에서 반복해야지 1초 단위로 깜박이게 되는 것이죠. 그래서 loop()함수에 코딩하는 것이죠.
배치가 가장 중요합니다. 함수의 기능에 대해서 잘 이해하시고 나면 배치가 무난할 거에요.
void loop() { digitalWrite(13, HIGH); delay(1000); digitalWrite(13, LOW); delay(1000); }
코드를 자세히 보면 13번핀을 HIGH(5V)의 전류을 내보내라고 명령합니다. delay()함수로 1초동안 대기하게 됩니다. 그러면 1초동안 아두이노에서 5V의 전류가 외부로 1초동안 공급하게 됩니다. 다시 13번핀을 LOW(0V)의 전압을 내보내라고 명령합니다. 이말은 0V니 전류가 흐르지 않는 것이죠. delay()함수로 1초동안 대기하게 됩니다. 1초동안 LED에 전류가 공급 안되니 꺼져있겠죠. 반복함수이니 다시 loop() 첫문장 13번에 HIGH(5V)의 전류를 내보내는 명령을 반복 수행합니다.
결론은 1초 단위로 LED는 깜박이게 되는 것이죠.
setup()함수와 loop()함수의 사용 목적을 잘 이해하고 거기에 맞게 명령어를 잘 배치하여 로직을 설계하시면 됩니다.
13번 핀을 출력모드로 지정한 후 13번 핀에 1초동안 5V의 전류를 공급과 0V의 전류 공급을 반복하는 코딩을 해 보았습니다. 핀 모드를 지정하는 법과 디지털핀에 전류를 공급하게 하는 명령어와 대기함수만 잘 사용하면 아두이노를 이미 절반은 배웠다고 생각하시면 됩니다.
2. 회로 설계
- 재료 : LED 1개 , 저항 220옴 1개, 아두이노보드, 뻥판
3. 결과
실제 시뮬레이터를 돌리면 빨간 LED가 1초 단위로 무한 깜박이게 됩니다.
보는 것 같이 깜박이면 정상적으로 동작된 것이죠. 여기서 유심히 보면 보드 자체에 작은 LED 전구가 깜박이는걸 보실꺼에요.
이건 13번 핀에 보드 자체가 연결되어 있는 LED라서 특이 사항은 아니고 원래 13번 핀 자체가 특정한 목적 기능을 가진 핀이라서 그걸 보드상에서 확인하기 위한 LED라서 나중에 13번을 구지 선택해서 쓸 필요 없고요. 다른 핀으로 실험하시는걸 추천 드려요.
마무리
코딩을 잘 하기 위해서는 C언어의 변수와 상수란 개념과 문법은 IF, FOR, WHILE문의 개념만 잡으시면 왠만한 표현을 자유자재로 표현이 가능합니다. 몇가지 실험을 하다보면은 자연스럽게 해당 문법을 다루다보면 이해가 가게 됩니다. 구지 프로그램언어를 모른다고 해서 코딩을 못하는게 아니고 단순히 블록처럼 함수 단위로 코드를 상상하시면 됩니다.
우리가 일기장에 일기를 쓰듯이 어떤 동작을 글로 써서 그 글에 맞게 명령어함수를 순차적으로 배치만 하시면 됩니다.
코딩은 어렵지 않고 너무 깊은 사고를 요구하지도 않으면 쉽게 상상을 코딩화 하면 됩니다.
'IOT > 아두이노' 카테고리의 다른 글
[아두이노] 스위치 버턴 제어 (0) | 2019.02.03 |
---|---|
[아두이노] 3색 LED 제어 (0) | 2019.02.02 |
[아두이노] LED 제어 (0) | 2019.01.30 |
아두이노의 기초 (0) | 2019.01.27 |
아두이노 가상시뮬레이터 (0) | 2019.01.24 |