문서를 다 만들고 나니 좀 더 멋지게 보이도록 복잡한 알고리즘을 적용해볼 껄 이라는 아쉬움이 남지만..제가 나름 이해한 것만 기억하면 좀더 멋지게 LED가 켜지고 꺼지는 것은 나중에 알고리즘만 바꾸어서 구현해도 될 듯해서 이 정도에서 마무리를 지어놓았습니다. 아직 아두이노에 익숙하지 않아서 틀린 점이나 부족한 점이 있을 듯합니다.
간단한 이론 설명
아두이노 UNO에는 세 개의 포트( Port B, Port C, Port D )가 있다.
빨간색과 노란색 네모 안에 적혀있는 것이 포트에 대응되는 아두이노의 핀 이름이다.
이미지 출처: Arduino UNO Atmega328 Pinout
http://www.hobbytronics.co.uk/arduino-atmega328-pinout
이 세 개의 포트들은 세 개의 레지스터들(DDR, PORT, PIN )에 의해서 제어되어진다.
DDR 레지스터는 핀들을 입력으로 사용할지 출력으로 사용할지 결정한다.
PORT 레지스터는 핀이 High 또는 Low인지를 결정한다.
PIN 레지스터는 핀이 입력일 때 핀의 상태를 읽어올 때 사용되어 진다.
실제 구현된 결과
참고한 문서의 예제를 따라 적어서 실행해보기만 해볼까 하다가 간단하게 LED가 5개가 순차적으로 켜지는 걸 구현해보기로 했습니다. 생각한 구현을 말로 표현하면 첫번째 LED 켜짐 →1초후 두번째 LED 켜짐→1초후 세번째 LED 켜짐→ ∙∙∙∙∙∙∙ →1초후 다섯번째 LED켜짐 →1초후 전부다 꺼짐→1초후 다시 첫번째 LED부터 켜지는 것 반복.
아래는 구현한 결과를 사진으로 찍어 본건데 프로그래밍한 결과를 모르는 사람이 봐도 이해하기 쉽게 불이 켜지는 게 마냥 좋을 따름.. 아래에서 구현과정을 설명합니다.
5개의 LED를 제어하기 위해서 Port B 13번에서 9번까지를 사용하기 위해 선을 연결하고 공통으로 사용되어질 GND(그라운드)를 연결했습니다..
그리고 LED 5개를 브레드 보드에 연결하고 Port B핀과 LED 사이에 330옴 저항을 배치되도록 했습니다. 그리고 포트B에서 오는 점퍼선들을 저항에 연결해주고 보드의 그라운드가 5개의 LED의 –극에 연결되도록 검은색 점퍼선을 이용해서 연결했습니다.
아직 익숙하지 않지만 회로도를 그려보면 아래와 같이 됩니다.
DDRB 설정
위에서 사용하는 9~13번 핀은 포트B에 해당이 되며 각 핀의 대응은 다음과 같습니다.
위에서 언급했듯이 DDR을 이용하여 포트의 핀을 입력으로 사용할지 출력으로 사용할지 결정하는데.. LED를 켜기 위에서는 전원을 공급해줘야 하므로 출력으로 설정해야 하므로 해당되는 핀들을 모두 1로 설정하고 안 사용하는 핀은 0으로 두었습니다.
예제를 봤을 때나 AVR이 8비트인 점을 고려해서 DDR레지스터 설정을 위해서 한 바이트를 사용해야 하므로.. 사용 안하지만 상위비트를 모두 0으로 채웠습니다.
이제 프로그래밍 코드에서 DDRB에 값을 넣을 때 이진수이므로 앞에 B를 붙여서 다음처럼 하면 동작이 제대로 될 거 라고 예상하게 됩니다.
DDRB = B000111110
PORTB 설정
PORTB는 포트 B의 핀을 High로 둘지 Low로 둘지 결정하는데 켜고 싶은 LED가 연결된 핀에 1을 주면 High상태가 되어서 켜지게 되고 다시 0을 주면 꺼지게 됩니다.
실제로 다음과 같이 프로그래밍하면 포트 B1이 High상태가 되어 연결된 LED가 켜지게 됩니다. LED가 330옴 저항과 연결되어 있을 때에는 2V정도의 전압이 측정됩니다.
PORTB = B00000010;
그리고 다시 다음과 같이 하면 포트 B2에 대응되는 LED가 추가로 켜지게 되고…
PORTB = B00000110;
중간 단계를 건너 띄고 LED 5개가 모두 켜지게 하려면 아래처럼 하면 됩니다.
PORTB = B00111110;
그리고 마지막으로 모두 끄기 위에서 모든 포트를 Low상태로 하기 위해서 0값을 주면 모든 LED가 꺼지게 됩니다.
PORTB = B00000000;
마지막으로 구현한 전체 코드입니다. 코드를 더 짧게 만들기 보다는 이해하기 쉬운 쪽을 택해서 작성했습니다.
참고
http://www.hobbytronics.co.uk/tutorials-code/arduino-tutorials/arduino-tutorial4-cylon
'Arduino Uno' 카테고리의 다른 글
Arduino 예제 – cds + 캐릭터 lcd (0) | 2015.01.20 |
---|---|
아두이노 시리얼 명령으로 LED 켜고 끄기 (1) | 2015.01.20 |
아두이노에서 PWM을 이용하여 LED 밝기 조정하기 (0) | 2014.12.17 |
아두이노 예제 - 풀다운 저항과 버튼 (0) | 2014.12.09 |
Arduino Uno 개봉기 (2) | 2014.09.21 |
시간날때마다 틈틈이 이것저것 해보며 블로그에 글을 남깁니다.
블로그의 문서는 종종 최신 버전으로 업데이트됩니다.
여유 시간이 날때 진행하는 거라 언제 진행될지는 알 수 없습니다.
영화,책, 생각등을 올리는 블로그도 운영하고 있습니다.
https://freewriting2024.tistory.com
제가 쓴 책도 한번 검토해보세요 ^^
그렇게 천천히 걸으면서도 그렇게 빨리 앞으로 나갈 수 있다는 건.
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!