Physical Computing for Artists & Designers 연세대학교디지털아트학과 Earl Park
마이크로컨트롤러 Microcontroller LED 를단순히켜는것이아닌깜빡깜빡빛나게하고싶다면, 혹은서서히켜지게하고싶다면, 더나아가모터를원 하는각도로돌리거나, 사람의움직임을감지하고싶다면어떻게할것인가? 이번시간에는이러한모든것을제어할수있는마이크로컨트롤러에대해배워보도록하자. 그리고마이크로컨트롤러와컴퓨터 ( 혹은다른디바이스들 ) 가어떤식으로대화를주고받는지도알아보도록한다. Physical Computing 2
집적회로 IC : Integrated Circuit 외형에따른분류 집적회로 ( 集積回路 ) 는특정기능을수행하는전기회로와반도체소자를하나의칩에모아구현한것을말한다. 수백 ~ 수십만개의트랜지스터와다이오드, 저항, 커패시터등다른전자요소들을포함하는반도체회로부품이들어있으며초소형구조의전자회로구조때문에마이크로칩혹은칩이라고불린다. 작은면적에많은전자회로가서로연결되어하나의회로로서기능한다. 우리가사용하게될마이크로컨트롤러도 IC 의일종이다. 아래는우리가쓰게될 ATmega328 chip 의내부구조 (Block Diagram) 이다. DIP(Dual Inline Package) type IC 우리가가장많이사용하게될패키지로브레드보드에꽂아사용할수있다. 핀간격은 2.54mm (1/10인치) 이며 2줄로이루어져있다. 핀번호의시작점은보통왼쪽위에작은원이나반원으로표시되어있으며 1번부터반시계방향으로읽는다. SMD(Surface Mounted Device) type IC 표면실장용패키지이며기계화로 PCB 양산이가능하다. 핀간격에따라 TQFP, SOP, SSOP 등여러가지가있으며패키지가작아작은디바이스를만들때나회로를집적구성할때사용된다. 핀번호읽는법은 DIP type IC와같다. Physical Computing 3
아두이노 Arduino 아두이노 (Arduino) 는오픈소스를기반으로한피지컬컴퓨팅플랫폼으로, AVR 을기반으로한하드웨어인 Arduino board와컴퓨터에서구동하기위한소프트웨어인 Arduino IDE(Integrated Development Environment, 통합개발환경 ), 두가지주요한파트로구성되어있다. IDE를이용해 Arduino Board에업로드시킬스케치 ( 작은컴퓨터프로그램 ) 를만들수있다. 스케치는보드에게뭘해야하는지말해준다. 아두이노의가장큰장점은마이크로컨트롤러를쉽게동작시킬수있다는것이다. 일반적으로 AVR 프로그래밍이 WinAVR로컴파일하여, ISP장치를통해업로드를해야하는등번거로운과정을거쳐야하는데비해, 아두이노는 USB를통해컴파일및업로드 를쉽게할수있다. 또한아두이노는다른모듈에비해비교적저렴하고, Windows를비롯해 Mac OS X, 리눅스와같은여러 OS를모두지원한다. 아두이노보드의회로도가 CCL에따라공개되어있으므로, 누구나직접보드를직접만들고수정할수있다. 아두이노사이트를둘러보자. http://arduino.cc/ 아두이노프로그램다운받기 http://arduino.cc/en/main/software Arduino board Arduino IDE Physical Computing 4
아두이노프로그래밍 Arduino Programming 변수 Variables { } ( 중괄호 ) : 함수정의부분에함수의시작및끝을나타내는데, 배열선언부에초기화값들을지정할때, 여러명령을하나의블록으로묶을때사용한다. ; ( 세미콜론 ) : 라인의끝에붙어문장의종료를나타내준다. 안써줄경우컴파일에러가나며프로그래밍을하는데가장흔한실수이기도하다. 변수는말그대로변하는수로메모리공간에방을만들어원하는값을집어넣을수있다. 예를들어커피잔이있다고하자. 커피잔의용량을데이터형이라고한다면커피잔에붙이는레이블명을변수명이라고하자. 커피잔안에는커피잔이허용하는범위안의숫자를넣을수있다. // : 싱글라인주석 /* */ : 멀티라인주석 데이터형변수명 ; 데이터형은프로그래밍언어에서미리종류가정해져있고, 변수명은작성자가지정 해주어야한다. 변수선언과초기화의예는아래와같다. // 프로그래밍에필요한변수에대한선언 // 변수, 상수선언및초기화 // 라이브러리사용 void setup() { // 이안의내용은한번만실행된다. // 포트 ( 핀모드 ) 설정 // 시리얼통신설정 } void loop() { // 이안의내용은반복되어실행된다. // 시스템이해야할기능에대한프로그래밍 // 입력대기, 입력분석, 부가적인로직, 컴퓨터로전송 } // 사용자정의함수 예 ) int a = 15; 예 ) int a; a = 25; 다양한데이터형 ( 부호가있는데이터형앞에 unsigned 를붙이면양수로바뀐다 ) 데이터형 내용 범위값 boolean true/false 값만가진변수 0, 1 char 16비트 (2바이트) 문자데이터 -127 ~ 128 byte 8비트 (1바이트) 정수 0~255 word 16비트 (2바이트) 정수 0~65,535 int 16비트 (2바이트) 정수 -32,768 to 32,767 float* 32비트 (4바이트) 부동소수점 -3.4028235E+38 ~ 3.4028235E+38 long 32비트 (4바이트) 정수 -2,147,483,648 ~ 2,147,483,647 double* 64비트 (8바이트) 부동소수점 float보다유효자리수가더많다. * float 와 double 은유효자리수에따른정확도의차이가있다. Physical Computing 5
조건문 if, if/else 반복문 for, while, do/while if(){ } 만약 () 안의내용이맞다면 { } 안의내용을실행해라. if(){ 1 } else { 2 } 만약 () 안의내용이맞다면 { 1 } 안의내용을실행하고그렇지않다면 { 2 } 를실행해라. if(a){ 1 } else if (b) { 2 } else if (c) { 3 } else { 4 } 만약 (a) 안의내용이맞다면 { 1 } 안의내용을실행하고, 만약 (a) 가틀리다는가정하에 (b) 안의내용이맞다면 { 2 } 를실행하고, (a) 와 (b) 가틀리다는가정하에 (c) 가맞다면 { 3 } 을실행하고, 모두만족하지않는다면 { 4 } 를실행하라. () 안에들어가는비교 ( 관계 ) 연산자 기호 의미 == 같다!= 같지않다 < 작다 <= 작거나같다 > 크다 >= 크거나같다 () 안에들어가는논리연산자기호의미 && 그리고 또는! 반대 산술연산자기호의미 + 더하기 - 빼기 / 나누기 * 곱하기 % 나머지 복합연산자 기호 의미 ++ 증가 -- 감소 a=+b a=a+b a=-b a=a-b for(a ; b ; c){ } 처음 a를실행하고, b가사실이라면, { } 안의문장을실행해라. 그후 c를실행해라. b를만족하지않을때까지계속이연산을반복하라. 예 ) for(int i=0; i<20; i++){ } a부분은초기화로 1번만실행된다. 정수형변수 i를 0으로초기화한다. b부분이사실이아닐때까지반복한다. i가 20미만을만족할때 { } 를실행하고아니면종료된다. { 부분에서실행된다. 총 20번이실행된다. c부분은 b부분이참일때반복한다. b부분을만족할때 i를 1씩증가시킨다. i++ 은 i=i+1과같은뜻이다. } 부분에서실행된다. while(){ } () 가참이아닐때까지 { } 안을반복한다. do { } while (); () 가참이아닐때까지 { } 안을반복한다. 주의 : 반복문은무한루프에서빠져나올수있는명령어가꼭들어가야한다. Physical Computing 6
스케치업로드하기 Uploading the Sketch Tools > Board Tools > Processor Tools > Serial Port < 하단창에서보드, 프로세서, 포트확인 > Arduino Duemilanove or Diecimila 을선택 ATmega328 을선택 Windows : 장치관리자의포트확인후 COM# 선택 Mac : /dev/...usb... 을선택 Verify : 코드의에러를체크 Upload to I/O Board : 코드를컴파일하고마이크로컨트롤러에업로드한다. Physical Computing 7
ATmega168/328 Pin Mapping ATmega168/328 DIP type 칩을위한핀매핑이다. 검정색이 ATmega168/328의포트번호및기능이고, 빨간색이아두이노에서사용하는핀번호및기능이다. * 핀에붙은번호에는두가지가있다. 하나는칩에있는모든핀에시계반대방향으로붙인일련번호이다. 다른하나는소프트웨어가입 / 출력핀을가리키는데사용되는번호들이다. 여기서는 Arduino 소프트웨어에서지정한번호가가장중요하다. Reset : 그라운드로연결되면칩이리셋된다. VCC,GND : 칩에파워를공급하기위한핀이다. Serial (pin#0,1) : 통신핀으로 RX, TX핀을통해데이터를비동기로주고받는다. Digital I/O (pin#0~13) : 디지털인풋 / 아웃풋으로사용할수있다. (2bit, 0~1) Analog In (pin#0~5) : 아날로그인풋핀으로사용된다. (10bit, 0~1023) Analog Out (pin#3,5,6,9,10,11) : 아날로그아웃풋을위한핀으로사용된다. (8bit, 0~255) Physical Computing 8
마이크로컨트롤러유닛 Microcontroller Unit MCU는대부분의전자제품에채용돼전자제품의두뇌역할을하는핵심칩으로단순시간예약에서부터특수한기능에이르기까지제품의다양한특성을컨트롤하는역할을하는비메모리반도체 ( 시스템반도체 ) 이다. 마이크로컨트롤러유닛은단일칩내부에프로세서, 메모리, 입출력장치를갖추고있다. 에너지형태를하나에서다른것으로바꾸어주는부품을트랜스듀서 (Transducer) 라한다. 예를들어마이크는소리를전기신호로, 모터는전기신호를움직임으로, LED는전기신호를빛으로바꾸는트랜스듀서이다. 마이크로컨트롤러는입력, 출력트랜스듀서를감지하고컨트롤하는아주간단한컴퓨터역할을하게된다. 우리가사용할마이크로컨트롤러는 Atmel사에서나온 ATmega328이며프로그래밍에쉽게접근하기위하여 Arduino 부트로더로이용해 Arduino 코드프로그래밍을하게될것이다. 브레드보드에 ATmega168 chip 을꽂고 Pin Mapping 을참고하여전원과 Reset 을연결 하자. Reset 핀은 Ground 가연결되면초기화되어버리므로 10K 저항으로 +5V 로연결 함으로써 reset 핀에고정시켜놓아야한다. 마이크로컨트롤러를꽂고, +5V, Ground, Reset 배선을한다 Physical Computing 9
크리스탈 Crystal 모든마이크로컨트롤러는일정한템포에맞춰동작하기위해전압의펄스를필요로한다. 크리스탈을붙여서클락 (Clock) 으로사용할수도있고, 칩에내장되어있는저항 / 커패시터회로를사용할수도있다. 그러나내장되어있는저항 / 커패시터 (R/C) 회로는그다지정확하다고할수없어별도의크리스탈을사용하는방식을권한다. 크리스탈은전원이연결되어있을때일정한속도로펄스를내도록만들어져있다. 두개의다리를가지고있는데, 방향성같은것은없다. ATmega328의 Crystal핀에 16MHz의크리스탈을연결하고 22pF의커패시터를통해그라운드에이어주면크리스탈은고유한진동수에따라진동하면서 ATmega328에대한클럭으로작용하게된다. 여기서커패시터는발진주파수안정화에도움을준다. 칩의 9,10 번핀에크리스탈을꽂고 22pF 2 개를그라운드에연결한다 Physical Computing 10
USB to Serial 변환기 U SB to Serial Convertor 컴퓨터에서 나온 USB 직렬통신 신호를 RS-232C 직렬통신 신호로 변환해준다. 여기서는 http://www.neromart.co.kr/goods/view?no=1143의 제품을 사용했다. Convertor의 RXD(Receive Data, 수신데이터선)를 마이크로컨트롤러의 디지털핀 1번 핀 TXD에, TXD(Transmit Data, 송신데이터선)는 0번핀 RXD에 각각 연결해 준다. Convertor의 DTR은 104(100 )커패시터를 거쳐 Reset핀으로 이어준다. 이는 오토리 셋 기능으로, 리셋스위치를 누르지 않고 마이크로컨트롤러에 바로 스케치(아두이노 IDE에서 짠 프로그래밍)를 업로드할 수 있게 해 준다. USB to Serial Convertor를 위와 같이 연결한다 Physical Computing 11
시리얼통신 Serial Communication 기기 (Device) 간의통신에는여러가지가있겠지만크게시리얼 (Serial) 통신과패러랠 (Parallel) 통신으로나누어볼수있다. 시리얼통신은우리나라말로는직렬통신으로데이터를한선을통해차례차례보내는것이고, 패러랠통신은병렬통신으로여러선을통해동시에데이터를보내는것이다. 병렬통신은구현하기힘들고고가이다. 그리고, 거리또한제한이된다. 이에반해서시리얼통신은구현하기쉽고, 저가이고, 거리제한이패러렐보다덜제한을받는다. 통신이라는것은언제나미리정해진규약에따라일어나게되며이를프로토콜이라한다. Serial 통신중대표적인프 로토콜이 RS232C 이며우리는이를 USB 신호로변환하여마이크로컨트롤러와통신하게된다. Physical Computing 12
깜빡깜빡 Blink the LED int ledpin = 13; // LED connected to digital pin 13 < 프로그래밍 > 마이크로컨트롤러를이용한프로그래밍첫번째. void setup() { pinmode(ledpin, OUTPUT); } // sets the digital pin as output LED를깜빡깜빡빛나게해보자. 어떻게하면될까? LED를일정한시간켰다가, 일정한시간끄는것을반복하게하면될것같다. 프로그램업로드에성공했다면딜레이시간을바꿔서다시프로그래밍을해보자. 심장박동 (heart beats) 처럼 LED가켜지게도한번해보자. void loop() { digitalwrite(ledpin, HIGH); // sets the LED on delay(1000); // waits for a second digitalwrite(ledpin, LOW); // sets the LED off delay(1000); // waits for a second } < 회로구성 > 마이크로컨트롤러의한핀에서는최대 40mA의전류를내보낼수있다. 그리고핀이 High일때 5V, Low일때 0V가나가게된다. 그렇다면 LED가원하는전압과전류를맞춰주기위해저항을써야할것같다. 옴의법칙을아는사람은계산을해보자. Digital pin 13번에 220Ω의한쪽끝을연결, 다른쪽끝과 LED의긴핀 (+ 극 ) 을연결하고짧은핀 (-극) 을그라운드로연결한다. Physical Computing 13
시리얼통신 Serial Communication int ledpin = 13; // output pin for the LED int inpin = 2; // input pin (for a switch) < 프로그래밍 > 디지털인풋을이용한프로그래밍. 가장간단한부품인스위치를이용해 LED를제어해보자. 맨먼저스위치를눌렀을때 LED가켜지고, 누르지않으면꺼지게해보자. 아두이노시리얼화면을띄워마이크로컨트롤러에서보내오는값을받아보자. 스위치를누를때마다 1의값을확인해보자. HIGH는 1이다. 왼쪽의시리얼통신코드에서 9600은 Baud Rate로 1초에단위시간당 1bit씩 9600bit를전송한다는뜻이다. 데이터전송속도를나타내는 BPS(Bit Per Second) 는초당전송되 void setup() { pinmode(ledpin, OUTPUT); // declare LED as output pinmode(inpin, INPUT); // declare switch as input Serial.begin(9600); // sets serial to 9600bps } void loop() { Serial.println(digitalRead(inPin)); // sends digital value if (digitalread(inpin) == HIGH) // check if input is HIGH { digitalwrite(ledpin, HIGH); // turns the LED on } else { digitalwrite(ledpin, LOW); // turns the LED off } } 는비트수를나타내며, Baud Rate 는초당전송되는단위신호의수를나타낸다. 시리 얼통신에서는둘이같다고생각해도무방하다. < 회로구성 > Digital pin 2번에오른쪽과같이풀다운저항을단스위치회로를연결한다. 스위치를누르면인풋핀은 HIGH를읽고, Digital pin 13번에연결된 LED를켤것이다. 반대로스위치를누르지않으면 LOW를읽고, LED가꺼질것이다. Physical Computing 14