Cyfinity의 주저리주저리

cyfinity.egloos.com

포토로그


Banner


나의 캔셋 제작기 01 - LED 깜박거리는 회로 만들기 만든것

2009년 당시 동아리에서 만들었던 캔셋 (Cansat, 깡통 사이즈의 초소형 위성) 제작기입니다.

귀찮으니 반말체로 하겠습니다.

---------------

때는 2009년.

같은 학과 로켓동아리에서 전국 대학생 로켓 연합(NURA) 에서 주최하는 소형로켓발사대회에 참가한다고, 우리 동아리에 연합을 의뢰해 왔다.

그리하여 시작된, 시작은 미약(?)하였으나 끝도 미약했던 .... orz.... 캔셋 제작.

개인적으로 소중한 경험이었지만 졸업후 차츰 잊혀져가는 기억이 안타깝기도 했고..
이러다 진짜, 정말로 다 잊어버리기 전에 기록으로 남겨둔다.


1. Atmega (AVR) 과의 첫만남

당시 자료를 검색하다 찾아냈던 AVR은 한마디로, 놀라운 기기였다.

무려 C언어가 지원되는 IC칩이라니!
게다가 개당 가격이 만원도 안해!

보니까 Atmega 128을 많이들 쓰는거 같길래 디바이스마트 (devicemart.co.kr)에서 dr kim atmega128이라는 미리 조립된 모듈을 하나 질렀다.

...당시 학과에서 학생들이 진행하는 프로젝트에 거의 무제한으로 자금을 지원해줬었는데 정말 감사합니다.
이런 오픈마인드가 유지되는 한 부산대 물리학과의 미래는 영원할 것임.
학과 도움이 없었다면 손도 못댔을, 아니 꿈도 못꿨을 프로젝트.

Atmega가 도착한 첫날 제작한 회로는 1초에 한번씩 LED를 깜박거리게 만드는 회로.
회로도는 다음과 (거의) 같다.

물론 이 회로도는 내가 그린거 아니다. 그치만 똑같은 회로임 ㅋ
Dr. Kim모듈이 짱 좋은게, 크리스탈이랑 리셋회로랑 다운로드 회로랑 다 들어있고
빵판에 딱 꽂아서 테스트하기 좋게 세로로 길어서 진짜 최고다. 처음 AVR다룬다면 적극추천.

여튼 회로도에 보면 이것저것 막 적혀있는데 중요한건 PB에 꽂혀있는 LED들이다.
PB는 Port B의 약자임.

즉 이것은 B번 포트에 0번부터 7번까지 LED랑 330옴의 저항을 꽂은 것.
회로도에 보면 LED들을 PA냅두고 궂이 PB에 꽂았는데 아마 회로도 그리기 편해서 그런거같다.
맘에 안들면 PA에 꽂아도 됨.
(5V일때 LED랑 같이쓰는 저항으로 330옴을 많이 쓰는데 왜 그런지 모르겠다. 330옴이 적당한가봄?)

일단 이렇게 꽂으면 회로도는 완료.

이제 Atmega가 어떻게 동작하는지 간략하게 알아보자.

먼저 dr. kim보드에 보면 은색 동그란거 16.000이라고 적힌게 있다. 그게 크리스탈이다 (안에 수정이 들었음).
Atmega는 기본적으로 프로그램을 실행하는 CPU비슷한건데
그 숫자는 1초에 실행할 수 있는 명령의 개수를 의미한다. 16.000은 16MHz라는 뜻임.

Atmega는 짱 좋아서 내부에 자체 발진회로도 갖고 있어서 외부 크리스탈 없이도 동작한다. 근데 느림 ㅋ
그래서 Dr. Kim보드는 미리 외부 크리스탈을 달아 최고 속도 (16MHz)로 동작하도록 세팅 완료되어 있다.

나중에 보드 안사고 AVR 칩만 달랑 사서 크리스탈을 달아서 썼던 적도 있는데,
칩에 크리스탈을 그냥 단다고 동작 안하고 컴퓨터로 셋팅을 해줘야 동작한다.
그리고 셋팅 해줬는데 크리스탈 없으면 AVR이 뻗어버리니까 (심지어 컴퓨터 연결도 안됨) 크리스탈은 꼭 여분을 챙기던가 하는게 좋다.

마지막으로 Atmega는 디지털 회로이다.
즉 Atmega에 들어오거나 Atmega로부터 나가는 신호는 항상 2가지 상태밖에 없다. 0 또는 1.
이것은 각각 0볼트와 VCC전압 (보통 5볼트)에 대응한다.

다음 C 언어. 컴퓨터에 C언어 사용 셋팅을 해줘야 한다.

윈도우 유저는 AVR Studio랑 AVR-GCC를 깔아야 함.
AVR Studio다운받으려면 뭐 가입해야되고 따로 설정도 해줘야 됨. 잡다한 버그도 열라게 많음. 제일 맘에 안드는 버그가 다운로딩 프로그램에 COM포트가 4번까지인가밖에 지원이 안되서 usb다운로더가 막 com8번 이런걸로 잡히면 안구워짐. 여러모로 귀차늠. 자세한건 검색 ㄱㄱ

나는 리눅스를 썼다. 특히 우분투가 참 편한게, 

sudo apt-get install gcc-avr binutils-avr gdb-avr avr-libc avrdude

하면 설치끝.

자 vi를 켜고 코딩을 시작.

먼저 필요한건 포트를 제어하는 것 + 1초를 기다리는 것.

특히 1초 기다리도록 하는거 중요하다.
AVR은 기본적으로 아무것도 안하고 기다리는 기능같은거 없다.
무조건 얘들은 16MHz, 즉 1초에 1천 6백만번 무슨 명령이건간에 실행을 해야 한다.
그래서 1초를 기다리려면 뭔가 뻘짓(0에 0을 곱한다던가)을 1천 6백만번 해줘야 비로소 1초를 기다릴 수 있는거다.

물론 몇초동안 기다리라는 건 정말 많이 쓰는 명령이니까
매번 이걸 만드는건 미친짓이고 누가 미리 만들어둔 것이 있을 것 같다.

빙고. 있다. 바로

util/delay.h

다.

포트를 제어하는 것은 인풋 아웃풋이니까.
avr/io.h에 선언되어 있다.

그럼 본격적인 코딩.

#include <util/delay.h>
#include <avr/io.h>

int main(void) {
DDRB=0xff;
PB=0x00;
while (1) {
PB=0x00;
delay_ms(1000);
PB=0xff;
delay_ms(1000);
}
return 0;
}

자 delay_ms는 이름에서 쉽게 알수 있듯이 몇 밀리세컨드 만큼 기다려라 하는 함수이다.
1000을 줬으니 1000ms = 1초 기다리는것이다.

Datasheet를 읽어보니 AVR의 각 포트는 외부 신호를 받던가 내보내던가 둘중 하나만 할 수 있고,
그걸 설정하는게 DDRX이며 얘는 포트X의 방향을 결정하는 애란다.

그럼 DDRB=0xff는 뭔가?

FF는 2진수로 표현하면 1111 1111이다.
8개다. 앗 포트의 개수와 같다!

그렇다. 이것들은 차례대로 PB0부터 PB7까지 대응되며,
DDRB=0xFF는 포트B의 모든 핀에 전부 1을 대응시킨 것이다.
즉, 모든 포트를 신호를 내보내는 용도로 사용하겠다는 말이다.

이제 PB=0x00과 0xFF는?
포트 B에 신호를 설정하는 것이다.

즉 PB=0x00은 모든 포트에 0V가 걸리고, 0xFF는 모든 포트에 5V가 걸리는 것이다.
따라서 PB=0xff일때 모든 LED에 불이 들어올것이다!

자 이제 프로그램 분석이 끝났다.

이제 컴파일을 하고 Atmega에 프로그램을 넣어줘야 한다. 컴파일은 avr-gcc로 gcc컴파일하듯이 하면 그냥 된다.

컴파일된 바이너리를 넣을려면 ISP다운로더라는게 있어야한다. 나는 로보블럭꺼 usb되는거! 저렴한거 하나 구입했다.
연결하고 Avrdude를 실행한 뒤, 파일을 골라주면 띠릭~ 금방 구워진다.

전원을 넣으니 깜박깜박 잘도 깜박거렸더랬다.
PB에 넣는값을 바꾸면 꺼졌다 켜졌다 하는 LED도 바꿀수있고
깜박거리는 시간도 바꿀수있고
심지어 도미노도 탈수있다. ㅋㅋ

이렇게 첫 회로가 끝났다.

음 이걸로 뭘 할수 있을까.
알아보니 AVR에는 ADC란게 있어서 아날로그 신호도 받을 수 있단다.

오호 그럼 기압계를 달아서 그 신호를 읽으면 로켓의 고도를 잴 수 있겠구나.
그래서 다음날부터 기압계를 구입해서 동작 테스트를 시도하였다.

그것은 다음에 또 올리겠음.

덧글

댓글 입력 영역



통계 위젯 (화이트)

02
10
4008

수평형 스카이스크래퍼

ga

mathjax