아두이노 프로그래밍

website = arduino.cc **아두이노**(Arduino)는 마이크로컨트롤러이므로 원하는 기능을 먼저 설정하고 이에 맞는 프로그래밍을 통해 기능을 구현한다. 사용 언어는 C/C++을 사용하고 컴파일러 및 라이브러리는 AVR-GCC을 사용한다.확인날짜=2015년 6월 19일 아두이노는 공식적으로 오픈소스로 이러한 통합개발환경(IDE)인 아두이노 소프트웨어를 제작하여 무료로 배포하고있다. avr-gcc(AVR Libs) 함수에 존재하는 표준함수의 라이브러리와 아두이노에서 제공하는 함수 등 다양한 함수를 적용 시킬 수 있다. gcc 컴파일러를 기본으로 하지만 일반 범용의 컴퓨터와 다른 부분을 수정하여 만들어진 것이므로 이를 고려해야 한다. 예를 들어 입출력 장치가 아두이노와 범용의 개인용 컴퓨터와 다르다. 따라서 몇몇 함수는 특수한 처리를 해야 하고 어떤 것은 사용이 불가능하다. 아두이노 설치 시, 이미 존재하는 함수도 있지만, 그 외의 많은 기능들은 함수가 없는 경우도 있다. 그러나 아두이노의 활발한 사용으로 많은 오픈 소스 함수 들이 존재하므로 검색을 통해 찾아, 파일을 받아 라이브러리 함수를 등록해서 사용할 수 있다. 내장된 함수 사용 시, 마이크로컨트롤러의 모델에 따라 해당 함수나 클래스가 지원되지 않는 경우가 있으므로 우선 사용하는 모델 파악이 필요하다. 아두이노 우노는 시리얼 포트가 아두이노 메가에 비해 적다. 따라서 우노에서는 Serial1,2,3 등이 존재하지 않으므로, 이것을 사용하면 안된다.
# 함수와 연산자
* 아두이노는 C/C++언어 기반으로 작성하고, 표준 C와 일부 C ++의 모든 기능을 지원한다."아두이노 언어 API", 확장 아두이노 API. http://arduino.cc/en/reference/extended url=https://web.archive.org/web/20120428025014/http://arduino.cc/en/reference/extended
## 기본 문법
* 구분 기호 : {} , ; * 주석 : //, /* */ * define : #define, #include * 산술 연산자 : +, -, *, /, % * 할당 연산자 : = * 비교 연산자 : ==, !=, , = * 부울 연산자 : &&, ||, ! * 포인터 연산자 : *, & * 비트와 쉬프트 연산자 : &, |, ^, , > * 증감 연산자 : ++, -- * 결합 산술 연산자 : +=, -=, *=, /=, &=, |=
## 조건 및 반복
* 조건 : if, if...else, switch case * 반복 : for, while, do... while * 분기 및 점프 : break, continue, return, goto
## 변수
C++을 사용하므로 이 언어의 변수 사용과 같다.
### 상수
* HIGH / LOW : 입출력 핀의 상태를 말하며, 디지털 회로의 논리 표현과 같다. LOW(논리 0, 0 V 근처), HIGH(논리 1, 높은 전압, 5 V 또는 3.3 V 논리 게이트 VCC 전압) * INPUT / OUTPUT: 입출력의 방향으로 입력과 출력. INPUT (입력), OUTPUT(출력) * true / false : 논리의 부울
### 변수 데이터 유형 및 C++ 클래스
* void, boolean, char, unsigned char, byte, int, unsigned int, word, long, unsigned long, float, double * string, array
### 형 변환 함수
다음 형 변환 함수는 인수로 받은 형의 데이터를 형 변환하여 반환한다. * char(), byte(), int(), word(), long(), float()
### 변수의 특성 정의 예약어
* static, volatile, const
### 유틸리티
* sizeof() - C/C++에서 함수가 아니라 변수나 형의 크기를 측정하는 도구이다. 따라서 변수의 크기를 컴파일러가 알고 있기 때문에 바이트 단위로 변환한다. C/C++의 모든 정적 변수는 선언 시, 크기가 정해지기 때문이다. 활용 예: const int pinSens = A0; // 아두이노 우노의 A0 포트 사용 예 int gdata[] = { 1, 2, 3, 4, 5, 3}; const int SZARR_DATA = sizeof(gdata)/sizeof(gdata[0]); // 배열 크기 6개를 얻는 경우 #define SZ_IARRDATA (sizeof(gdata)/sizeof(gdata[0])) const int sz_int = sizeof(int); // 8비트 CPU에서는 주로 2바이트 void loop() { char cnt; for (cnt = 0;cnt >=2; unsigned char u8val = (unsigned char) val;
## 삼각함수
* sin(rad), cos(rad), tan(rad)
## 랜덤 함수
* randomSeed(seed), long random(max), long random(min, max)
## 비트 바이트 함수
* lowByte(), highByte(), bitRead(), bitWrite(), bitSet(), bitClear(), bit()
## 외부 인터럽트 함수
* attachInterrupt(interrupt, function, mode)확인날짜=2015년 7월 9일 : 외부 인터럽트가 발생했을 때, 처리를 하기 위해 설정하는 함수이다. 여기서 function은 인터럽트가 발생했을 때 기능을 처리하기 위한 인터럽트 핸들러이다. :인수 : # interrupt : 인터럽트 구분용 숫자이다. 아두이노 우노의 경우 0(핀 2번)과 1(핀 3번) 2개의 외부 인터럽트가 있다. 마이크로컨트롤러에 따라 개수가 정해져 있다. # function : 인터럽트 핸들러로 void 타입의 함수로 정의해야 한다. 인터럽트가 걸리면 이 함수가 자동 호출된다. # mode : 인터럽트 접수 방법을 지정한다. 디지털 입력이기 때문에 각각의 상황을 정의한다. ## LOW : 핀이 LOW일 때, 인터럽트가 걸린다. ## CHANGE : 핀의 입력 상태가 변하면 인터럽트가 걸린다. ## RISING : 상승 엣지(LOW -> HIGH)일 때, 인터럽트가 걸린다. ## FALLING : 하강 엣지(HIGH -> LOW)일 때, 인터럽트가 걸린다. * detachInterrupt(interrupt) - 인터럽트 실행을 중지한다.
## 인터럽트 함수
* interrupts(), noInterrupts()
## 시리얼 통신 함수
시리얼 포트의 통신을 위해 데이터를 보내기 전에 우선 설정 함수를 사용하여 통신 채널을 설정한다. 설정 완료 후, 관련 입출력 함수를 사용한다.시리얼 통신 사용법 * begin() - 통신 설정 * available() - 통신 수신 여부에 따라 함수 자동 호출됨. * read(), flush(), print(), println(), write() - 데이터 읽거나 쓰기
## 포트 조작 관련
마이크로컨트롤러의 포트를 조작할 때, 하나의 핀을 사용할 경우 입출력 모드 함수로 설정하고 입출력 함수를 데이터를 입출력 할 수 있다. 그러나 포트를 동시에 한 묶음으로 조작 하거나 분산된 입출력 이라면 마이크로컨트롤러의 레지스터를 직접 조작하여 사용할 수 있다."아두이노 포트 조작 ", 아두이노 포트. https://www.arduino.cc/en/Reference/PortManipulation 다음과 같은 레지스터 조작을 통해 포트를 사용할 수 있다: * DDR[B/C/D] : 데이터 방향 레지스터로 각 포트의 방향을 지정한다. 주로 각 비트의 값이 1은 출력, 0은 입력이다. * PORT[B/C/D] : 디지털 출력 레지스터로 여기에 써지면 바로 핀으로 논리 상태가 출력 된다. * PIN[B/C/D] : 핀으로부터 디지털 입력 레지스터로 디지털 상태를 읽는다.
### 포트 조작 예
아두이노 우노는 디지털 출력 핀 0~7까지 PORTD에 연결되어 있다. 만약 디지털 출력 핀 1부터 7까지 출력으로 설정하고, 데이터를 출력 한다면 다음과 같은 예를 생각할 수 있다. void setup() { char cnt; for (cnt =1;cnt >= 1; if (data & 0x01) digitalWrite(cnt, HIGH); else digitalWrite(cnt, LOW); } } 그러나 마이크로컨트롤러의 포트 구조상 8비트 CPU는 포트 묶음이 8비트로 처리되고, 조작도 8비트 단위로 할 수 있다. 따라서 위의 코드의 기능을 다음과 같은 방법으로 구현할 수 있다 : void setup() { DDRD = B11111110; } void loop() { PORTD = 0xFE; } 위의 2가지 코딩 방법을 비교할 때, 묶음으로 처리하는 것이 실행 시간 측면이나 기계어 코드 크기 측면에서 효율적일 수 있다. 특정 핀 만을 재 설정하는 예: DDRD = DDRD | B11111100; // 포트 D의 핀 2부터 7까지 출력 설정, 핀0과 1은 시리얼 통신의 RX와 TX으로 사용한다. PORTD = B10101000; // 핀 7,5,3을 HIGH 그리고 핀 6,4,2는 LOW로 출력, 위의 DDRD 설정에 따라 PORTD0-1은 무시 된다. 주어진 함수 만 사용할 수 있는 것이 아니고 마이크로컨트롤러의 레지스터를 직접 제어할 수 있다. 이 레지스터 명과 정의는 마이크로컨트롤러 마다의 헤더파일에 이미 지정되어 있다. 이렇게 포트를 비트 별로 설정을 하려면, 우선 아두이노의 회로를 확인하여 어떤 포트가 어느 커넥터에 연결되었는지 인지하고 입출력 회로의 기능이 동작하도록 포트를 조작할 수 있다.
# AVR Libc
AVR-gcc는 gcc를 Atmel AVR적용하기 위해 만들어졌다. 일반 컴퓨터와 마이크로컨트롤러의 개발 특성이 다른 부분이 있기 때문에, AVR 특성에 맞는 몇가지가 추가되거나 변형 되었다.AVR code 각 마이크로컨트롤러의 레지스터, 사용하는 마이크로프로세서 체계 등에 적합하도록 변형 및 추가 되었다. 예를 들어 사용하는 AVR의 SFR 레지스터가 정의되어 있다. gcc도구로부터 변형 되었으므로 틀의 유사성이 있으며, 다음 3부분으로 구성 된다: * avr-binutils * avr-gcc * avr-libc AVR을 기반으로 하는 아두이노 프로그래밍은 AVR-gcc를 아두이노 통합 개발 환경에 결합하여, 개발 환경을 설치하면 별도의 추가 설치없이 사용할 수 있다.
## 인터럽트
마이크로컨트롤러의 인터럽트 처리를 허용할 것인지를 설정한다. 전체 인터럽트 요청 신호를 무시: cli(); // CPU가 인터럽트 요청을 무시 전체 인터럽트 요청 신호를 허용 : sei(); // CPU는 인터럽트 요청을 허용하여 인터럽트 핸들러를 실행한다. delayMicroseconds()나 시리얼 통신은 인터럽트의 cli()에 의한 비활성화에 영향을 받는다.
## 시간 지연
delayMicroseconds()는 가장 작은 시간 지연이 2μs 정도이다. 이것보다 짧은 시간을 지연할 때는 어셈블리어의 'NOP' 명령을 사용할 수 있다. 'NOP' 명령 실행에 걸리는 시간은 16 Mhz을 사용할 경우 62.5ns 정도의 지연 시간을 얻을 수 있다. 이를 위해 다음과 같이 코딩한다: __asm__("nop\n\t");
## 포트 조작
이미 언급했듯이, AVR 포트 제어 시, 레지스터를 직접 제어하여 빠른 포트 제어를 실현 할 수 있다.
## 특수 레지스터의 조작 (SET/RESET)
AVR의 SFR(특수 기능 레지스터)의 비트 단위 조작이 가능하다. 다음 헤더에 정의된 정의 구조를 사용할 수 있다: # ifndef cbi # define cbi(sfr, bit) (_SFR_BYTE(sfr) &= _BV(bit)) # endif # ifndef sbi # define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) # endif