여기에서는 AVR에 입문하는데 적합한 디바이스로 ATmega8(A)의 개략적인 특징에 대해서 설명하도록 하겠다. AVR의 이름을 보면 끝에 A가 붙는 것들이 있는데 (ATmega8A, ATmega128A등) 이것은 기존에는 5V용과 저전압(3.3V)용이 따로 구분되어 있었는데 (ATmega8, ATmega8L이 각각 존재했었다.) ATmega8A는 이 두 AVR을 하나의 uC로 통합한 것이다. 즉, ATmega8A는 5V와 3.3V 두 전압에서 모두 구동이 가능하고 (데이터쉬트상의 구동전압은 2.7V~5.5V이다.) 전력 특성을 개선하였으면서 사용법은 기존의 ATmega8/8L과 동일하다.


 실습용으로 ATmega8A를 선택한 이유는 일단 28핀 PDIP패키지가 제공되어 (TQFP, MLF패키지도 있음) 초보자들이 납땜을 해서 (혹은 빵판에 꽂아서) 실험을 하기에 편리하며 이 칩과 내장 주변기기를 제어하는 방법을 잘 알아두면 상위계열이나 하위 계열의 디바이스들을 모두 쉽게 다룰 수 있게 된다는 점이다. 따라서 만약 ATmega8A의 하드웨어를 충분히 숙지하고 개발이 익숙해진다면 거의 모든 (ATmega2560과 같은 최상위의 디바이스도 포함해서) AVR디바이스를 별다른 추가 학습 없이 다룰 수 있게 된다. 본 절에서는 ATmega8A의 특징에 대해서 알아보도록 한다.


[그림 1] ATmega8(A)의 외형. 좌측으로부터 PDIP, TQFT,  MLF


 ATmega8(A)는 AVR RISC 구조로 제조된 저전력 소모용 CMOS 8bit μC이다. 한 개의 클록 사이클 안에 강력한 명령을 수행하여 1MHz 당 최대 1MIPS(million instructions per second)의 처리속도를 낼 수 있으며 시스템 디자이너가 처리속도 대비 전력 소모를 최적화 할 수 있도록 제조되었다. AVR의 핵심은 산술연산장치 (ALU)에 직렬로 연결된 32개의 범용레지스터를 가지며 이들을 이용한 풍부한 명령어들이 마련되어 있다는 것이다. 단일 클록 사이클 이내 실행되는 한 개의 단일 명령어로써 두 개의 독립적인 레지스터를 처리할 수 있도록 하였다. 이러한 구조는 재래식 CISC uC보다 10배 이상 빠른 처리속도를 낼 수 있을 정도로 보다 효과적인 코드 방식을 지원한다.


 ATmega8(A)는 내부에 프로그램 가능한 8K바이트의 프로그램 가능한 플래시 메모리, 128byte 의 SRAM이 있고 128byte의 프로그램 가능한 EEPROM이 내장되어 있다. AVR계열의 μC는 ISP (in-system programming) 기능을 가지고 있다고 앞에서 말한 바가 있다. 즉 롬라이터(rom writer)같은 부가적인 장비 없이 PC와 연결하여 SPI 직렬 인터페이스를 통해서 내부의 플래시메모리에 프로그램을 써 넣을 수 있어서 편리하게 실험하는데 아주 유용한 기능이다. 한 개의 단일 칩에 기능이 향상된 RISC 8bit μC를 내장형 프로그래머블 플래시 및 다양한 부가장치를 조합함으로 사용자가 사용하기 쉽고 수많은 다른 제어 응용 분야에서도 비용면에서 효과적인 강력한 uC이다.


 데이터쉬트에 소개된 ATmega8A의 하드웨어 특징을 정리하면 다음과 같다.

  • 고성능, 저전력 소모용 RISC 구조 설계

  • 130개의 강력한 명령어 (대부분 단일 클록에 실행 가능)

  • 32×8 범용 레지스터

  • 16MHz에서 최대 16MIPS의 처리 속도

  • 2사이클 곱셈기 내장

  • 데이터와 비휘발성 프로그램 메모리 구조

  • 8K byte 플래시메모리 내장 (최대 10,000번 읽기/쓰기 가능)

  • 512 byte EEPROM 내장 (최대 100,000번 읽기/쓰기 가능)

  • 1K byte의 내부 SRAM

  • 상온(25도)에서 100년간 데이터 보존 (플래시롬/EEPROM)

  • 크기 조절 가능한 부트로더 영역 (부트 프로그램에 의한 ISP가능)

  • 플래시롬과 EEPROM 데이터 보호용 프로그래밍 잠금 기능.

  • 주변장치의 특성

  • 23개의 프로그램 가능한 I/O 포트

  • 2개의 8bit 타이머/카운터 내장

  • 1개의 16bit 타이머/카운터 내장

  • 별도의 오실레이터 연결 가능한 실시간 카운터

  • 6채널(PDIP) 10bit ADC 내장

  • 별도의 오실레이터가 내장된 프로그램 가능한 워치도그 타이머

  • 마스터/슬레이브 SPI (serial programming interface) 내장

  • 프로그램 가능한 직렬 USART 내장

  • 아날로그 비교기 내장

  • 휴식모드 (idle mode) 및 절전모드 (power down mode)로 전환 가능

  • 동작 전압 및 클럭 주파수 : 2.7~5.5V, 0~16 MHz

  • 패키지 : 28핀의 PDIP형, 32핀의 TQFP와 MLF


초보자가 실험하기에는 28핀을 갖는 PDIP 패키지가 좋은데 빵판에 꼽아서 회로를 꾸밀수 있기 때문이다.



Posted by 살레시오
,

 AVR은 미국의 Atmel사에서 제공하고 있는 8비트 마이크로컨트롤러(이하 uC)이다. Atmel은 마이크로프로세서, 플래시메모리, 센서 등을 개발하여 공급하고 있는 다국적 반도체 회사로서 플래시 메모리의 기술과 장점을 살린 다양한 uC를 출시하고 있다. 그중 AVR은 저가형 8비트 마이크로컨트롤러로서 1990년에 Norwegian 공과대학의 컴퓨터 일렉트로닉스/ 컴퓨터 사이언스 과의 학생인 Alf Bogen과 Vegard Wollan의 두 사람이 연구한 RISC CPU가 원형이다. 이 후 Atmel사에 입사해서 연구된 CPU가 AVR uC가 되어 1997년 출시된 이후 현재 산업계 및 교육 현장에서도 폭넓게 보급되어 사용되고 있다.


[그림 1] www.atmel.com 홈페이지


 AVR은 Atmel사의 비휘발성 메모리 기술을 기반으로 플래시 메모리, SRAM, 그리고 EEPROM을 기본적인 사양으로 내장하도 있으며 개발/양산의 편의성과 외부 회로를 최소화할 수 있도록 고려하여 설계하였다는 특징이 있다, 특히 ISP (in-system programming)가 가능하다는 큰 장점을 가지고 있다으며 개발자는 이 기능을 이용하여 uC에 프로그래밍하는데 별도의 롬라이터 없이 타겟 보드 상에서 PC의 직렬/병렬 포트와 연결하여 프로그램/데이터를 플래시롬/EEPROM에 다운로드할 수 있다.


 AVR은 프로그램 메모리와 데이터 메모리를 접근하기 위한 버스를 독립적으로 사용하는 하바드 구조(Harvard architecture)와 파이프라인 처리 방식을 기반으로 하는 RISC(reduced Instruction set computer) 기술을 적용하여 1명령 싸이클이 내부 클록의 1클록에 의해 처리되는 매우 높은 성능을 발휘한다. 또한 Atmel사에서 개발하여 무료로 공급하고 있는 Atmel Studio (예전에는 AVR Studio라는 avr 전용 IDE가 있었으나 요즘에는 ARM 개발도구와 통합되어 Atmel Studio라는 이름으로 배포하고 있다.) 라는 강력한 IDE가 있으며 역시 무료로 사용할 수 있는 C/C++ 컴파일러가 있어서 손쉽게 저가로 개발 환경을 갖출수 있다는 큰 장점을 가지고 있다.


 이러한 장점으로 인해 AVR은 가장 늦게 출시되었음에도 불구하고 8051시리즈나 PIC계열의 uC를 능가하는 인기를 단시간에 얻게 되었다. 또한 2007년에 출시되ㅓㅇ 전세계적으로 널리 사용되고 있는 아두이노(arduino)라는 프로토타이핑(prototyping) 보드의 메인 프로세서로 사용되면서 그 인기를 이어가고 있다.



Posted by 살레시오
,

 파이썬은 클래스를 지원하므로 객체 지향적인 프로그래밍을 할 수 있다. 사실 지금까지 다뤄온 기본 자료형도 다 클래스이다. 클래스는 새로운 자료형을 정의하는 것이고 객체(object)는 클래스의 인스턴스(instance, 클래스가 구체화된 것)를 의미한다.


클래스는 다음과 같이 정의한다.


class 식별자:
클래스 본체


보통 클래스의 식별자는 대문자로 시작한다. 예를 들어 Person, Robot, Car, Point 등이다. 클래스 본체는 이 클래스에 속하는 변수와 함수를 정의하게 된다. 특별히 클래스에 속한 변수들을 필드(field), 클래스에 속한 함수들을 일반 함수들과 구분하기 위해서 메소드(method)라고 부르며 이 둘을 통칭하여 속성(attribute)라고 한다.


이 용어들에 대해서는 숙지해 두는 것이 좋다.


  • 필드 (field) : 클래스에 내장된 변수

  • 메쏘드 (method) : 클래스에 속하는 함수

  • 속성 (attribute) : 필드와 메쏘드를 통칭하여 속성이라 한다.


가장 간단한 형태의 클래스를 다음과 같이 정의해 보자.


class Robot:
pass


이 클래스는 보면 알겠지만 본체가 없다. 이 클래스의 인스턴스를 생성하려면 다음과 같이 하면 된다.


>>> asimo = Robot()


이제 asimo 는 Robot 클래스의 객체가 되었다. 이와 같이 어떤 클래스의 객체(인스턴스)를 생성하려면 다음과 같이 한다.


변수명 = 클래스명()


마치 함수를 호출하는 것과 유사하다.



Posted by 살레시오
,

 아두이노로 TWI (또는 I2C) 통신을 하기 위해서는 Wire 라는 라이브러리를 이용해야 한다. 시리얼 통신이 1:1 통신 규약인 반면, TWI는 1:n 통신 규약으로서 하나의 마스터(master) 기기가 여러 개의 슬레이브(slave) 디바이스들과 통신을 할 수 있다는 장점이 있다. Wire라이브러리는 아두이노의 표준 라이브러리이므로 아두이노 IDE에 기본으로 내장되어 있다.


#include <Wire.h>


그리고 통신을 하는 기기들 간에 SDA, SCL, 그리고 GND 끼리 연결하고 전압 레벨이 맞는지 반드시 확인해야 한다. 즉, 5V 기기는 5V 끼리, 3.3V기기는 3,3V 기기 상호간에 연결해야 하면 3.3V와 5V를 연결하려면 레벨 컨버터를 통해야 한다.


 연결된 기기는 하나의 마스터와 다수의 슬레이브로 구분하고 슬레이브들은 7bit 혹은 8bit 아이디(숫자)로 서로를 구분한다. TWI는 모든 통신 주도권을 master가 가진다. 슬레이브에서 데이터를 읽어올 때도 마스터에서 요구하고 슬레이브로 데이터를 보낼 때도 마찬가지로 마스터에서 통신을 요구한 후 보낸다. 마스터에서는 다음과 같이 초기화 함수를 호출한다.


Wire.begin(); // 마스터의 TWI 초기화


슬레이브에서는 다음과 같이 초기화 함수를 아이디를 가지고 호출한다.


Wire.begin(n); //슬레이브의 TWI 초기화


예를 들어서 2번 슬레이브는 Wire.begin(2); 라고 하면 된다. 이 아이디를 가지고 마스터에서 기기간 구별을 하게 된다.

마스터에서 슬레이브로 데이터 보내기

마스터에서 슬레이브로 데이터를 보낼 때는 다음과 같은 순서를 따른다.


//❶ 아이디가 id인 슬레이브와 TWI 통신을 시작한다.
Wire.beginTransmission(id);
Wire.write(by); //❷ byte형 데이터를 보낸다.
Wire.endTransmission(); //❸ 통신을 끝낸다.


Wire.write()함수는 입력 변수의 자료형에 따라 다음과 같이 세 가지가 오버로드 되어 있다.


Wire.write(byte by); // byte형 데이터를 하나를 전송
Wire.write(string str); // 문자열 str을 전송
Wire.write(const byte *ptrByte, int n); // byte형 포인터에 저장된 byte 배열에서 n개의 데이터를 전송


슬레이브 쪽에서는 마스터에서 데이터를 보냈을 때 호출되는 이벤트 함수를 등록해 두면 데이터가 보내졌을 때 이 함수가 호출되어 알맞게 처리를 해주면 된다.


// 데이터가 보내졌을 때 호출될 receiveEvent() 라는 함수를 등록한다.
void setup() {
   Wire.onReceive(receiveEvent);
}
....
....

// 이 이벤트 핸들러는 넘겨받은 바이트 수를 입력으로 건네준다.
void receiveEvent(int iNum)
{
   byte by[iNum];
   for(int n=0; n<iNum; n++)
       by[n] = Wire.read();
}


마스터에서 슬레이브로부터 데이터 읽기

  마스터가 슬레이브에서 데이터를 받을 때도 마스터에서 먼저 요구하며 그 요구에 슬레이브가 반응하도록 되어 있다. 마스터에서 슬레이브에 데이터를 요구하고 읽어오는 과정은 다음과 같다.


byte by[n], m=0;
Wire.requestFrom(id, n); // id를 가지는 슬레이브에 n 바이트를 보내기를 요구한다.
while( Wire.available() ) // 읽어올 데이터가 버퍼에 남아있다면
{
   by[m++]=Wire.read(); // 데이터를 읽는다.
}


슬레이브 측에서는 마스터에서 요구가 올 때 처리할 이벤터 핸들러를 등록해 두면 된다.


// 마스터의 전송 요구시 호출된 requestEvent()라는 함수를 등록
Wire.onRequest( requestEvent );
...
void requestEvent()
{
   Wire.write(100); // (예를 들어) 100이라는 숫자를 전송한다.
}


이와 같이 마스터와 슬레이브 사이에 통신을 할 경우 마스터에서 슬레이브 쪽으로 통신을 하겠다는 요구를 먼저 하게 되어 있다.



Posted by 살레시오
,

 아두이노의 디지털핀은 오직 HIGH(5V) 아니면 LOW(0V) 두 가지 신호 외에는 출력할 수 없으며 전압의 관점에서 보면 5V와 0V만 가질 수 있다. 하지만 PWM (pulse width modulation, 펄스 폭 변조) 기능을 이용하면 마치 아날로그 전압처럼 0V와 5V 사이의 전압으로 (예를 들면 2V, 3.5V 등) 출력을 낼 수 있다. 따라서 LED의 밝기를 제어한다든가 모터의 회전 속도를 제어하는데 사용할 수 있다.

 PWM은 진정한 의미의 아날로그 출력은 아니고 흉내를 내는 것인데 그 원리는 다음 그림과 같다. (출처 : arduino.cc)


[그림 1] PWM의 원리


이 그림에서 보면 주기적인 구형파를 발생하고 이 구형파의 폭을 조절하여 그 듀티비 (HIGH 구간 대비 LOW 구간의 비율)로 아날로그 전압값을 가지도록 한다. 이 구형파의 주기를 매우 빠르게 (아두이노 우노의 경우 490Hz 혹은 980Hz이다.) 하면 상대적으로 반응 속도가 느린 기계 장치(모터 등)는 이것을 아날로그 전압으로 인식하게 된다.


 예를 들어서 그림 1(b)의 경우 주기의 1/4동안만 on 이 되므로 평균 출력 전압도 5V * ¼ 인 1.25V 정도가 된다. 만약 LED가 연결되었다면 LED는 정확하게 on구간에서만 켜지고 off구간에서는 꺼진다. 하지만 눈으로 보기에는 이것이 인식하지 못 할만큼 고속으로 동작하므로 밝기가 다르게 보이는 것이다.


 아두이노의 모든 핀이 PWM 출력을 낼 수 있는 것은 아니고 아두이노 우노의 경우 3, 5, 6, 9, 10, 11번 핀이 PWM출력을 낼 수 있으며 이것은 정품 보드의 경우 다음 그림과 같이 ~로 표시되어 있다.


[그림 2] 아두이노 우노의 PWM 핀들

PWM의 동작 주파수는 다음과 같다.

  • 3, 9, 10, 11번 핀 - 490Hz

  • 5, 6번 핀 – 980Hz (5,6번 핀이 좀 더 고속으로 동작)


PWM기능을 사용하기 위해서는 다음과 같은 analogWrite()함수를 이용한다.


analogWrite(pin, value)

  • pin : 3, 5, 6, 9, 10, 11 중 하나 (아두이노 우노의 경우)

  • value : 0에서 255 사이의 정수.


그리고 PWM 기능을 사용하기 위해서는 해당 핀을 출력으로 설정하여야 한다.



Posted by 살레시오
,

 딕셔너리(dictionary)는 키(key)와 그것에 딸린 값(value)의 쌍들의 집합으로 이루어진 자료형이다. 어떤 사람과 관련된 데이터의 예를 들면 ‘name’은 ‘박장현’ , ‘age’가 ‘44’, 등이 있을 것이다. 여기서 ‘name’, ‘age’ 등이 키가 되고 ‘박장현’은 ‘name’이라는 키에 해당되는 값, ‘44’는 ‘age’라는 키에 해당되는 값이다. 이를 파이썬 문법으로 표현하면 다음과 같다.


>>> man1 = {‘name’:’박장현’, ‘age’:44 }


이렇게 입력하면 man1 이라는 딕셔너리가 생성된다. 딕셔너리는 {...}기호로 생성된다. 이와 같이 딕셔너리는 ‘키:값’ 쌍들의 집합이다. 키와 값은 콜론(:)으로 각 쌍은 콤마(,)로 구분한다.


{ key1:val1, key2:val2, …… }


키로 쓸 수 있는 객체는 숫자와 문자열 등 immutable한 객체라면 무엇이든지 사용할 수 있다. 값에 해당하는 것은 어떤 파이썬 객체라도 올 수 있다.


만약 앞의 예에서 man1의 이름에 해당하는 값객체를 얻고 싶다면 다음과 같이 접근할 수 있다.


>>> man1[‘name’]


이것은 man1 딕셔너리의 ‘name’ 키에 해당하는 값객체를 반환한다.


>>> capital = {‘kr’:’seoul’, ‘jp’:’tokyo’, ‘cn’:’beijing’}


이 예에서도 키가 문자열이고 값도 문자열이다. 딕셔너리는 데이터의 저장 ‘순서’라는 개념이 없다. 따라서 내부적인 인덱스는 없으며 오직 ‘키’로만 연결된 ‘값’에 접근할 수 있을 뿐이다.


>>> color = {0:’red’, 1:’yellow’, 2:’white’, 3:’black’}


위의 예도 딕셔너리이지만 이것은 키로 정수를 갖는다. 따라서


>>> color[1] # ‘yellow’ 값을 읽는다.
>>> x = color[0] # x에 문자열 ‘red’가 저장된다.
>>> color[3] = ‘grey’ # 키 3 에 해당하는 값을 변경한다.
>>> color[4] = ‘blue’ #새로운 키-값 쌍을 추가한다.


전술한 바와 같이 딕셔너리는 인덱스가 없다. 이 예제에서 color[1] 과 같은 용례는 인덱싱이 아니라 1이라는 키를 지정해 준 것이므로 혼동하면 안된다. 딕셔너리는 인덱싱도 할 수 없고 슬라이싱도 당연히 허용되지 않는다. 따라서 color[0:2] 같은 사용은 에러를 발생시킨다.


 또 한 가지 주의할 것은 중복된 키는 허용되지 않는다는 것이다.


>>> a={0:'a', 1:'b', 0:'c'}
>>> a
{0: 'c', 1: 'b'}


위 예에서 딕셔너리 a에 0이라는 키가 중복으로 지정되었는데 결과를 보면 하나는 무시되었다. 딕셔너리는 내부 데이터를 키값으로 구별하기 때문에 중복된 키는 허용하지 않는 것이다.


 딕셔너리의 키로 리스트는 사용 불가지만 튜플은 가능하다. 리스트는 mutable 이고 튜플은 immutable이기 때문이다.


>>> a={(1,):'hi', (1,2):'world'}
>>> a
{(1, 2): 'world', (1,): 'hi'}


값에는 어떠한 파이썬 객체도 올 수 있으며 딕셔너리 안에 값으로 딕셔너리가 다시 올 수도 있는 등 중첩도 얼마든지 가능하다.




Posted by 살레시오
,

1.5 C언어의 표준안들    [DOC]    [SMTS]

 여기에서는 C언어의 국제 표준안들에 대해서 간략히 알아보도록 하겠다.

1.5.1 ANSI C 혹은 C89

 C 언어가 처음으로 만들어진 것은 1970년대초이고 이후 다양한 분야에서 다양한 사람들에 의해 사용되고 또 발전했다, 서로 다른 집단에 의해 변형된 C 언어가 어느 정도 같은 틀을 공유한다고 해도 1980년대에 들어서면서 다양한 C 언어들이 독자적으로 지원하는 확장 기술은 서로 호환되지 않게 되었다. 또한 C 언어가 미국 정부 프로젝트를 위해 사용되기 시작하면서 미국의 표준화 기구인 ANSI에 의해 1980년대 초반에 표준화를 시작되게 된다. 이후에 1989년도에 탄생한 C언어 표준이 지금까지 C언어 서적에서 인용되고 있는 ANSI C(정확히는 ANSI X3.159-1989)이다. 발표된 연도를 이용해서 줄여서 C89라고 불리기도 한다. 1990년도에는 국제 표준화 기구인 ISO가 몇 가지 형식부분만을 바꿔 ISO표준을 발표했고 이를 C90이라고 부르는데 결국 C89와 같은 것이다. ANSI C는 대부분의 컴파일러가 지원한다.

1.5.2 C99

 ANSI의 표준화 이후 C 언어 표준이 상대적으로 정적으로 남아 있었던 동안, C++는 표준화를 위하여 계속 진화하고 있었다. 1995년에 1990년의 C 표준에 대한 규약 수정안 1이 출판되었는데, 이는 약간의 세부 사항을 교정하고 국제적 문자 세트에 대한 보다 확장된 지원을 위한 것이었다. C 표준은 1990년대 후반에 더 개정되어, 1999년 ISO/IEC 9899:1999가 출간되었고, 여기서 명시한 규범을 흔히 C99라 부른다. 몇몇 추가점들을 기술하면 다음과 같다. (http://ko.wikipedia.org/wiki/C99 참조)


  • 인라인(inline) 함수의 지원.

  • 변수의 선언은 더 이상 파일 범위나 복합 명령어의 시작에서만 할 필요가 없음.

  • long long int, 선택적인 확장 정수형, 명시적 불린 자료형, 그리고 복소수를 나타내기 위한 complex 자료형 등 새로운 자료형 도입.

  • 가변 길이 배열(VLA: variable-length array) 지원.

  • // 으로 시작하는 한 줄 주석 지원.

  • IEEE 부동소수점 자료에 대한 개선된 지원.


 본 교재는 바로 이 C99를 기준으로 하여 문법을 설명한다.

1.5.3 C11

 C11은 ISO/IEC 9899:2011의 줄임말로 C 언어의 최신 개정된 표준을 의미한다. 이전까지 표준이던 C99의 후속으로 최종안이 2011년 4월에 제출되었고 검토를 거쳐 2011년 12월 8일에 최종 승인되었다. GCC 4.6, Clang 3.1, IBM XL C 12.1, MSVC 18 등이 C11의 일부 기능을 지원한다.


Posted by 살레시오
,

 파이썬은 인터프리터 언어로서 암스테르담의 귀도 반 로섬(Guido V. Rossum)에 의해서 1990년에 초기 버전이 만들어졌다. (2015년 1월 현재 3.4.x 버전) 파이썬이라는 이름은 본인이 좋아하는 "Monty Python's Flying Circus" 라는 코미디 쇼에서 따왔다고 한다. 파이썬의 사전적인 뜻은 큰 비단뱀인데 대부분의 파이썬 책 표지와 아이콘이 뱀 모양으로 그려져 있는 이유가 여기에 있다.


[그림 1] 파이썬 개발자, 비단뱀 그리고 파이썬 로고


파이썬 프로그램의 가장 큰 특징은 배우기 쉽고 직관적이라는 것이다. 인터프리터 언어이기 때문에 실행 결과를 즉시 확인해 볼 수 있으며 최근에는 실행 속도도 심지어 C/C++ 프로그램과 맞먹을 정도로 성능도 향상되고 있다. 또한 공동 작업과 유지 보수가 매우 쉽고 편하기 때문에 이미 다른 언어로 작성된 많은 프로그램과 모듈들이 파이썬으로 다시 재구성되고 있기도 하다. 국내에서도 그 가치를 인정받아 사용자 층이 더욱 넓어져 가고 있고, 파이썬을 이용한 프로그램을 개발하는 기업체들이 늘어가고 있는 추세이다.


 현재 파이썬은 교육의 목적뿐만 아니라 실용적인 부분에서도 널리 사용되고 있는데 그 대표적인 예는 바로 구글(Google) 이다. 구글에서 만들어진 소프트웨어의 50%이상이 파이썬으로 만들어졌다고 한다. 이 외에도 유명한 것을 몇 가지 들어보면 Dropbox(파일 동기화 서비스), Django(파이썬 웹 프레임워크)등을 들 수 있다. 또한 빅데이터 분석이나 과학 계산 용도로도 활발히 활용되는 등 컴퓨터를 활용한 거의 모든 곳에 사용되고 있다고 해도 과언이 아닐 정도로 인기를 끌고 있다.


[그림 2] 가장 널리 사용되는 프로그래밍 언어들


파이썬의 특징을 정리하면 다음과 같다.


  • 인터프리터(interpreter) 언어이다.(실행 결과를 바로 확인할 수 있다.)

  • 간결하고 쉬운 문법으로 빠르게 학습할 수 있다.

  • 강력한 성능을 가진다.

  • 다양한 분야에 적용할 수 있는 라이브러리가 풍부하다.

  • 개발 속도가 빠르다.

  • 오픈 소스(open source)이며 무료이다.


최근에는 라즈베리파이(raspberry pi)나 비글본 블랙(beaglebone black) 같은 원보드 마이컴이 인기를 끌고 있는데 보통 운영체제로 리눅스를 채용한다. 이러한 시스템에서도 파이썬을 이용하여 전통적인 C/C++/JAVA로 개발하는 것보다 훨씬 더 쉽고 빠르게 응용 프로그램을 제작할 수 있다.

[그림 3] 라즈베리파이와 비글본블랙


 현재 파이썬은 버전이 2.x 대와 3.x 대로 나뉘어 두 가지 버전이 같이 사용되고 있다는 점인데 초보 사용자가 선택하는데 문제가 생긴다. 특이하게도 3.x 버전의 문법이 2.x버전과는 달라서 100% 호환되지 않으므로 같은 언어로 작성한 프로그램인데도 불구하고 2.x 버전에서 잘 작동되는 것이 3.x 버전에서는 작동하지 않거나 반대의 경우도 발생한다.


 본 강좌에서는 3.x 버전의 문법을 기본으로 해서 2.x버전 과의 차이점에 대해서 필요할 때마다 설명하도록 하겠다.


파이썬 강좌 전체 목록 (TOP) >>>


c{pyt},n{py001}


Posted by 살레시오
,

 시리얼 통신(serial communication)은 기기들간 데이터를 주고 받는 방법 중 하나인데 병렬 통신 (parallel communication) 방식에 비해서 통신선의 갯수가 적다는 장점이 있다.  아두이노는 UART (universal asynchronous receiver and transmitter), SPI, I2C 방식의 시리얼 통신을 지원하는데 이중 UART는 주로 아두이노와 PC간의 통신을 하는데 사용된다. 아두이노는 하나 이상의 UART 통신기가 내장되어 있는데  라이브러리와 IDE에 내장된 터미널(terminal, 주고 받는 데이터를 확인할 수 있는 프로그램)을 이용하면 손쉽게 PC와의 통신을  수행할 수 있다.


 아두이노 우노의 경우 0번과 1번핀이 시리얼 통신에 사용된다. 이 핀들은 내부적으로 USB통신을 담당하는 칩과 연결되어서 USB신호로 변환된 후 PC에 전달된다. 반대로 PC에서 보내지는 USB신호는 이 칩에서 시리얼 통신 신호로 변환되어 아두이노의 AVR에 전달된다. 따라서 만약 아두이노가 PC와의 통신을 수행하고 있다면 이 핀들을 다른 용도로 사용하면 안된다. 그리고 통신을 수행할 때에는 TX, RX라고 마킹된 LED가 깜빡인다.  일단 사용자는 아두이노와 PC간에 USB케이블로 연결하면 통신 실습을 할 준비가 끝나게 된다.


  • 시리얼 통신에 사용되는 두 개의 핀(빨간색)과 usb변환 칩(하늘색)

  • 내부적으로 USART 신호는 USB신호로 변환되어 PC에 전송된다.


시리얼 통신 첫 번째 예제

 첫 번째 예제로 아두이노에서 PC로 간단한 데이터를 전송하는 예를 해보도록 하겠다. 단순히 아두이노에게 전원을 인가하면 “I’m ready.” 라는 메세지를 PC에 전송하는 예이다.


void setup() {
 Serial.begin(9600);
 Serial.printl"I'm ready.");
}
void loop() {
}


이 예제를 다운로드 한 후 터미널을 켜고 리셋버튼을 누르면 터미널에 “I’m ready.”라는 문자열이 찍히는 것을 확인할 수 있다. 터미널 실행 버튼을 누르면 아두이노에 자동으로 리셋신호가 걸려서 프로그램이 처음부터 수행된다. 그리고 프로그램 다운로드 중에서는 터미널을 실행시키지 못 한다는 것도 알아두자.



 UART와 관련되 아두이노의 라이브러리는 Serial클래스에 다 모여있다. (자세한 설명을 여기 참조) 일단 이 예제에서 보면 setup()함수내에서 두 개의 함수가 호출되었다.


void Serial.begin(long baud_rate) 함수

  • UART 통신을 초기화 시킨다.

  • 통신 속도(baud rate)를 입력으로 받는다.        

  • 9600, 19200, 57600, 115200 등 여러 baud rate를 지원한다.


long Serial.print(val) 함수

  • 입력값을 ASCII값으로 변환하여 PC쪽으로 출력한다.

  • 전송된 데이터의 바이트 수를 리턴한다. (잘 사용되지 않음)

  • 비동기 통신 방식이므로 데이터가 전송되기 전에 리턴된다.

  • 입력 변수 val은 어떤 데이터 타입도 가능하다. 예를 들면

    • Serial.print(78) gives "78"

    • Serial.print(1.23456) gives "1.23"

    • Serial.print('N') gives "N"

    • Serial.print("Hello world.") gives "Hello world."


  • 두 번째 인수로 출력 형식을 지정할 수 있다. 예를 들면

    • Serial.print(78, BIN) gives "1001110"

    • Serial.print(78, OCT) gives "116"

    • Serial.print(78, DEC) gives "78"

    • Serial.print(78, HEX) gives "4E"

    • Serial.println(1.23456, 0) gives "1"

    • Serial.println(1.23456, 2) gives "1.23"

    • Serial.println(1.23456, 4) gives "1.2346"


첫 번째 예제는 setup() 함수 내에서 UART를 초기화 하고 문자열 하나를 보내는 아주 간단한 예제이다.


아두이노 강좌 전체 목록 (TOP) >>>

C++ 언어 전체 강좌 목록 >>>

c{ard},n{ad012}

Posted by 살레시오
,

 아두이노 우노(uno) R3는 ATmega328P 라는 AVR 8-bit 마이크로콘트롤러를 사용한다. PC와 USB로 연결할 수 있으며 이것으로 프로그램 다운로드 및 시리얼 통신에 사용된다.


전원 연결


 아두이노 우노보드는 내부적으로 5V로 동작한다. 전원은 다음과 같이 두 가지 방법 중 한 가지로 인가하면 된다.


  1. USB로부터 5V 전원을 공급받아서 동작할 수 있다. 따라서 이 보드를 PC와 USB로 연결하면 일단 기본적인 하드웨어 세팅은 끝난 것이다.

  2. 외부 전원을 연결하는 단자가 있는데 이것으로 7~12V 사이의 전원을 인가하면 되며 9V가 권장 전압이다. 일반적인 AA 혹은 AAA 사이즈의 1.5V건전지를 6개를 직렬 연결하거나 1.2V 충전지를 사용해도 된다. 물론 AC어댑터도 전압 범위가 맞으면 사용 가능하다.


만약 USB와 전원 소켓에 둘 다 연결되어 있다면 소켓에서 공급되는 전원을 자동으로 사용하게 된다.


디지털 입출력 핀 14개 (0번~13번 핀)


 디지털(digital) 입출력 핀들을 이용해서 외부의 이진 신호를 읽어들어나 또는 이진 신호를 내보낼 수 있다. 이진 신호란 on/off 와 같이 상태값이 두 가지만을 가지는 신호라는 의미이다. 이 디지털 핀을 이용해서 LED를 켜고/끄거나 외부의 스위치가 눌려져 있는지 아닌지 등을 검출할 수 있다. 구체적으로 0V 와 5V 두 전압중 하나의 값을 가지며 이것은 프로그램으로 제어할 수 있다.


디지털 입출력으로 사용되면서 또한 부가적인 기능을 가지는 핀들은 다음과 같다.


  • 0번과 1번 핀은 시리얼 통신에 사용된다. USB로 PC와 통신을 할 수 있다.

  • 2번과 3번 핀은 인터럽트 기능을 갖는다.

  • 3, 5, 6, 9, 10, 11번 핀은 PWM 기능을 가지며 아날로그 출력을 흉내낼 수 있다.


아날로그 입력 핀 6개 (A0~A5)


 아날로그 입력 핀이란 외부의 아날로그 입력값을 읽어들이는 핀으로서 주로 센서(sensor)와 연결하여 사용된다. 아날로그(analog)신호는 디지털 신호와는 달리 연속값을 의미하면 예를 들어서 온도, 빛의 세기 등이 있다. 이러한 물리량을 센서가 전기 신호로 변환하며 이것을 이 아날로그 핀으로 읽어들일 수 있다. 센서를 통해 읽은 전압값은 0에서 1023 사이의 숫자로 변환된다. 기준 전압은 5V 이지만 1.1V의 내부 전압이 사용될 수 있으며 AREF핀으로 기준 전압을 직접 인가할 수도 있다.


그리고 아날로그 핀은 디지털 입/출력 핀으로도 사용할 수 있다.


아날로그 출력핀 6개 (3,5,6,9,10,11번핀)


 디지털 출력핀이 0V/5V 두 가지 값만을 가질수 있는데 비해서 아날로그 출력핀은 0V~5V사이의 전압 값(256단계)을 가질 수 있다. 엄밀히 얘기하면 PWM방식으로 동작하므로 순수 아날로그 방식은 아니다.


인터럽트 (2, 3번 핀)


 2번핀과 3번핀은 인터럽트(interrupt) 기능을 가진다. 인터럽트 처리(interrupt handling)라는 것은 이벤트를 처리하는 데 사용되는 기능으로서 특정한 신호가 발생했을 때 정해진 동작을 수행하여야 하는 경우 사용되는 방식이다. 예를 들어서 버튼이 눌려진 시점에서 (또는 떼어진 시점에서) 어떤 작업을 수행해야 하는 경우다.


그 외의 기능들


 아두이노 우노 보드는 3.3V의 전압도 공급할 수 있다. 이는 USB만 연결한 경우도 마찬가지이다. AREF 핀은 아날로그 핀의 기준 전압을 설정하는 용도로 사용된다.


다른 기기와의 통신 기능은 다음과 같다.

  • 시리얼 통신 : 0번, 1번 핀

  • SPI 통신 : ICSP 헤더핀

  • TWI (I2C) 통신 : A0, A1 핀


시리얼 통신 방식 외에는 일반적으로 사용 빈도가 낮지만 기기간 통신이나 일대다 통신을 하는 경우 SPI, TWI 통신이 널리 사용된다.


아두이노 강좌 전체 목록 (TOP) >>>

C++ 언어 전체 강좌 목록 >>>

c{ard},n{ad04}

Posted by 살레시오
,