본문 바로가기
Arduino(아두이노) 기초 강좌

아두이노(Arduino) 퀵 레퍼런스

by 오마이엔지니어 2015. 11. 25.
반응형

1.구조

아두이노 스케치는 두 부분에서 실행이 됩니다


void setup()

초기화 코드, 즉 스케치가 시작되어 주 작업을 반복(loop) 하기에 앞서 보드를 셋업하는 코드 입니다


void loop()

주 작업 코드 부분 입니다, 이 코드의 명령문들은 보드의 전원이 나가거나 다른 코드를 스케치 하기 전까지

계속해서 반복 됩니다


2.특수기호

아두이노에는 코드 줄, 주석, 코드 블록을 나타내기 위해 특수기호를 사용 합니다


2-1. ;(세미콜론)

모든 명령문(코드 줄)은 세미콜론으로 끝납니다

이문법에 따라 자유롭게 코드를 구성할 수 있습니다

세미콜론으로 분리해 둔다면, 명령문 두 개를 같은 줄에 두는 것도 가능합니다

하지만 코드를 읽기가 힘들어 집니다


delay(100);


2-2. {}(중괄호)

코드 블록을 표시 합니다

예를 들어 loop() 함수에 코드를 쓰려면, 코드 앞뒤로 중괄호를 사용해야 합니다


void loop() {

      Serial.println("ciao");

{


2-3. 주석

주석문은 아두이노 프로세서에서 무시하는 문장 열이지만

사용자 자신이 코드 조각이 무엇을 의미하는 것인지를 기억하고 확인 하는 데 유용합니다

아두이노에서 주석문은 다음 두가지 방식으로 작성 가능합니다


// 한줄주석: 이문장은 줄의 끝까지 무시 됨

/* 여러 줄 주석:

    여러 줄을 사용해

    문장을 작성할 수 있음

*/


3.상수

아두이노에는 특별한 값으로 미리 정의된 키워드들이 포함되어 있습니다

예를 들어

HIGH - 아두이노 핀을 켜기

LOW - 아두이노 핀을 끄기

INPUT - 특정핀을 입력

OUTPUT - 특정핀을 출력

true - 조건문이나 표현식이 참

false - 조건문이나 표현식이 거짓


4.변수

변수는 스케치에서 사용하거나 변경하는 데이터를 저장하기 위해서

아두이노의 메모리에 이름을 할당한 메모리 영역 입니다

변수는 사용자가 원하는 대로 값을 바꿀수 있습니다


아두이노는 아주 간단한 프로세서이기 때문에 변수를 선언할 때는 그 종류(타입)를 지정해 주어야 합니다

이렇게 함으로써 사용자가 저장할 값의 크기를 프로세서에 알려 주는 것 입니다


다음은 사용 가능한 데이터 타입 입니다


4-1. bloolean

참 아니면 거짓을 의미하는 true 또는 false 두 값 가운데 하나를 담을 수 있습니다


4-2. char

A 같은 영문 한 글자를 담을 수 있다

모든 컴퓨터가 그러하듯이 사용자가 글자를 볼 수 있어도 아두이노는 글자를 숫자로 저장합니다

글자를 숫자로 저장하기 위해서 char를 사용할 때는 -128 ~ 127 범위의 값을 담을 수 있습니다


*컴퓨터에서 주로 사용하는 문자 세트(set)는 크게 두 종류 입니다

아스키(ASCII) - 127개 글자의 모음(세트)로 시리얼 터미널 간 텍스트를 전송하거나, 메인프레임과 미니컴퓨터 같은 시간-공유(time-shared)

                       컴퓨터 시스템 등에서 사용 됩니다

유니코드(UNICODE) - 아스키에 비해 훨씬 큰 값의 모음으로 현대의 컴퓨터 운영체제에서 넓은 범위의 언어(다국어)를 표현하는데

                               사용 됩니다

아스키는 여전히 라틴어와 아라비아 숫자, 구두점 같은 일반적인 타자기 기호를 사용하는 영어나 이탈리아어처럼 비트수가 짧은

언어를 주고 받기에 유용 합니다*


4-3. byte

0~255 사이의 숫자를 담습니다

char 타입처럼 byte 타입은 메모리에서 1바이트만 사용 합니다


4-4. int

2바이트 메모리를 사용하며 -32768 ~ 32767 사이의 숫자를 표현할수 있습니다

아두이노에서 가장 흔히 사용되는 데이터 타입 입니다


4-5. unsigned int

int 같이 2바이트를 사용하지만 unsigned(부호 없음)라는 전치사에서 알수 있듯이

음수를 담지 못 합니다

따라서 0~65535 사이의 숫자를 담을 수 있습니다


4-6. long

크기가 int 의 두배이며, -2147483648 ~ 2147483647 사이의 숫자를 담을 수 있습니다


4-7. unsigned long

long 의 unsigned(부호 없는) 버전으로 0~4294967295 사이의 값을 담을 수 있습니다


4-8. float

이 타입은 꽤 크며 실수(floating point)를 담을 수 있습니다

다시 말해서 소수점을 포함하는 숫자를 담는 데 사용할 수 있습니다

float는 귀중한 램을 4바이트 사용하며, 이 타입을 다루는 함수를 잘 작동하게 하려면

더 많은 코드 메모리가 필요하므로, float 타입은 아껴서 사용하는게 좋습니다


4-9. double

두배로 정밀한(double-precision) 실수로, 최대 1.7976931348623157 X 10~ 까지 담을 수 있습니다


4-10. string

아스키 글자의 모음으로, 문자로 된 정보를 담는 데 사용합니다

시리얼 포트를 사용하거나, LCD 디스플레이에 메세지를 전달할 때 string을 사용하게 됩니다

저장공간으로 string의 각 글자(char)는 한 바이트를 사용하며, 문자열의 끝을 아두이노에 알려주기 위해

널 문자(아스키코드 중 0)하나가 추가로 쓰입니다


char string1[] = "Arduino";    // char 문자 7개 + null 문자 1개

char string2[8] = "Arduino";    // 위와 동일


4-11. 배열(array)

인덱스 값으로 접근할 수 있는 변수의 목록입니다

array는 쉽게 접근할 수 있는, 값으로 된 테이블을 만드는 데 사용합니다

예를 들어, LED 밝기를 조절하기(fade) 위해 밝기 정도를 저아하려고 light01, light02,... 같은

여섯 개의 변수를 만들 수도 있습니다

하지만 다음처럼 간단한 배열을 사용하는 것이 더 좋은 방법 입니다


int light [6] = {0, 20, 50, 75, 100}


배열을 선언하는 데 배열(array)이라는 단어는 실제로 사용되지 않습니다

[] 와 {} 기호들이 배열을 선언하는 일을 합니다


5.제어문

아두이노는 스케치의 논리 흐름을 제어하기 위한 키워드가 포함되어 있습니다


5-1. if...else

사용자의 프로그램에서 의사결정을 하는데 사용합니다

if 뒤에는 반드시 괄호로 둘러싼 질문이 따라와야 합니다

만약(if) 문장이 참(true)이면, 그 다음에 나열된 코드들이 실행 됩니다

만약 거짓(false) 이라면, else 문 다음에 따라오는 코드 블록이 실행 됩니다

else 문 없이 if 문만 쓰는 것도 가능합니다


if (val == 1) {

   digitalWrite(LED, HIGH);

}


5-2. for

지정한 수만큼 코드 블록을 반복합니다


for (int i = 0; i <10; i++) {

        Serial.print("ciao");

}


5-3 switch case

프로그램에서 if문이 도로상의 분기점 같은 역할을 한다면, switch case 문은 복잡한 로터리 같은 역할을 합니다

이 구문은 프로그램을 변수의 값에 따라서 다양한 방향으로 이끌어 주게 됩니다

긴 if 문 리스트를 대치해서 코드를 간소하게 유지할 수 있기 때문에 switch case 문은 아주 유용 합니다


switch (sensorValue) {

       case 23:

            digitalWrite(13,HIGH);

            break;

       case 46;

            digitalWrite(12,HIGH);

            break;

       default: // 맞는 것이 없으면 이 내용이 실행됨

            digitalWrite(12,LOW);

            digitalWrite(13,LOW);

}


5-4. while

if 문과 비슷하지만, 코드 블록을 지정한 상태가 참(true)인 동안(while) 계속 반복됩니다

 

//센서 값이 512 미만일때 LED를 깜박이기

sensorValue = analogRead(1);

while (sensorValue < 512) {

digitalWrite(13,HIGH);

delay(100);

digitalWrite(13,HIGH);

delay(100);

sensorValue = analogRead(1);

}


5-5. do...while

while 문과 같지만, 상태를 평가하기 전에 코드를 먼저 실행합니다

상태를 검사하기에 앞서 코드 블록을 적어도 한 번 수행해야 하는 경우에 사용합니다


do  {

   digitalWrite(13,HIGH);

   delay(100);



   digitalWrite(13,HIGH);

   delay(100);

sensorValue = analogRead(1);

} while (sensorValue < 512);



5-6. break

반복문에서 빠져나와 그 아래에 있는 코드를 수행하게 합니다
또한, switch case 문구에서 각 섹션을 분리하기 위해서도 사용됩니다


// 센서 값이 512 미만일 때 LED를 깜박이기

do {

   //버튼이 눌리면 반복문을 빠져나감

  if (digitalRead(7) == HIGH)

     break;

digitalWrite(13,HIGH);

delay(100);

digitalWrite(13,LOW);

delay(100);

sensorValue = analogRead(1);

} while (sensorValue < 512);


5-7. continue

반복문 안에서 사용하면, 그 안의 남은 코드를 건너뛰고 강제로 다시 상태를 검사합니다


for (light = 0; light < 255; light++)

{

  // 140보다 크고 200보다 작은 광도는 생략

 if ((X > 140) && (X < 200))

    continue

analogWrite(PWMpin, light);

delay(10);

}


5-8. return

실행중인 함수를 멈추고 함수에서 되돌아가도록(return) 합니다

또한 함수 안에서 반 값을 반환하는 데 이 명령어를 사용할 수 있습니다

예를 들어 computeTemperature()라는 온도를 계산하는 함수를 호출하고, 결과 값을 코드로 반환하게 하려면,

다음과 같은 함수를 작성헤야 합니다


int computeTemperature() {

     int temperature = 0

     temperature = (analogRead(0) + 45) / 100;

     return temperature;

}


6.계산과 수식

특별한 문법을 사용해서 복잡한 계산을 아두이노에 시킬 수 있습니다

더하기 빼기는 + 와 - , 곱셈은 * 로 표시하고 나눗셈은 / 로 표시 합니다

추가로 모듈로(%)라 불리는 특별한 연산자가 있습니다

이 연산자는 정수로 나눈 나머지를 반환 합니다

수식들을 그룹화 하기 위해 얼마든지 괄호를 사용할 수 있습니다

단 대괄호와 중괄호는 다른 용도(각각 배열의 인덱스와 코드 블록으로 쓰임)로 사용되므로 수식에 사용하지 못합니다


a = 2 + 2;

light = ((12 * sensorValue) - 5) / 2;

remember = 3 % 2; // 3/2의 나머지는 1이므로 remember는 1 이 됨


7.비교연산자

if 문과 while 문, for 문에서 조건문을 기술할 때 다음 연산자를 사용할수 있습니다


== 같다

!= 다르다

< 작다

> 크다

<= 작거나 같다

>= 크거나 같다


8.논리 연산자

여러 조건문을 조합할 때 사용합니다

예를 들어, 센서에서 받은 값이 5 에서 10 사이인지 검사하고자 한다면 다음처럼 작성하면 된다


if ((sensor =>5) && (sensor <=10))


논리 연산자는 세가지 종류가 있습니다

and는 모든 조건이 참 이어야 하며, &&로 표기 합니다

or는 조건 가운데 하나가 참이면 참이며, II로 표기 합니다

not은 조건의 역이며, !로 표기 합니다


9.복합 연산자

값을 증가 시키는 것 같은 매우 빈번한 동작을 좀 더 간결하게 표한 하고자 할 때 쓴다

예를 들어 value 값을 1 증가 시키려면 다음과 같이 쓸 수 있지만

 

value = value +1;

 

복합 연산자를 쓰면 다음과 같이 줄일 수 있다

 

value++;

 

9-1.증가와 감소 (++ 와 --)

이 연산자들은 값을 1만큼 증가 또는 감소 시킨다

주의해야 할 점은 i++ 는 값을 먼저 평가하고 i를 1만큼 증가 시키는 반면, ++i 는 먼저

i를 1만큼 증가시킨 다음 값을 평가한다

-- 에도 동일한 규칙이 적용 된다

 

*반복문과 비교문에서 값의 평가 순서가 문제가 될수 있습니다

어떤 줄임식을 써야 하는지 확실하지 않다면, 비슷한 일을 하는 다른 코드에서 어떻게 쓰였는지 확인해 보자

 

9-2. +=, -=, *=, /=

특정 수식을 더 짧게 쓸수 있도록 해줍니다

다음 두 표현은 결과가 동일 합니다

 

a = a + 5;

a += 5;

 

10.입출력 함수

아두이노에는 입력과 출력을 처리하는 함수가 있습니다

 

10-1. pinMode(pin, mode)

디지털 핀을 입력이나 출력으로 재설정 합니다

 

pinMode(7, INPUT); // 7번 핀을 입력으로 설정

 

10-2. digitalWrite(pin, value)

디지털 핀을 켜거나(HIGH) 끈다(LOW), digitalWrite 함수를 사용하려면

우선 pinMode 함수를 써서 명시적으로 핀을 출력(OUTPUT)으로 설정 해야 합니다

 

digitalWrite(8, HIGH); // 8번 핀을 켬

 

10-3. int digitalRead(pin)

입력 핀의 상태를 읽습니다

핀에 전압이 인가되어 있으면 HIGH를, 전압이 없으면 LOW를 반환합니다

 

val = digitalRead(7); // 7번 핀을 읽어 val 에 저장

 

10-4. int analogRead(pin)

아날로그 입력 핀에 인가된 전압을 읽어 0V를 의미한는 0과, 5V 전압을 의미하는 1023 사이의 값을 반환합니다

 

val = analogRead(0); // 아날로그 입력 핀 0번을 읽어 val 에 저장

 

10-5. analogWrite(pin, value)

펄스 폭 변조(PWM) 표시가 있는 핀의 PWM 비율을 변경 합니다

11, 10, 9, 6, 5, 3번 핀이 PWM을 지원 합니다

인자 value에는 0에서 255 사이의 값을 쓸 수 있으며, 각각 0 에서 5V 전압을 의미합니다

 

analogWrite(9,128); // 9번 핀에 연결된 LED를 50% 밝기로 함

 

10-6. shiftOut(dataPin, clockPin, bitOrder, value)

디지털 출력의 개수를 확정하는 시프트 레지스터에 데이터를 전달 합니다

이 프로토콜은 하나의 핀으르 데이터(dataPin)로, 또 하나의 핀을 클록(clockPin)으로 사용 합니다

bitOrder는 바이트 순서, 즉 가장낮은 비트가 먼저 오는지 가장 높은 비트가 먼저 오는지를 정합니다

value는 실제로 전달할 바이트 입니다

 

shiftOut(dataPin, clockPin, LSBFIRST, 255);

 

10-7. unsigned long pulsein(pin, value)

디지털 입력 핀으로 들어오는 펄스의 길이를 측정합니다

적외선 센서나 가속도 센서(accelerometers)같이 출력 값을 펄스의 길이 변화로 내는 센서를 읽을 때 유용 합니다

 

time = pulsein(7,HIGH); // 펄스가 얼마나 오랫동안

                                 // high인지를 측정

 

11.시간 함수

아두이노에는 시간이 얼마나 흘렀는지 측정하느 함수와, 스케치를 잠시 멈추는 함수가 있습니다

 

11-1. unsigned long millis()

스케치가 시작한 뒤로 흐른 시간을 밀리초(ms) 단위로 반환 합니다

 

duration = millis()-lastTime; // 지난 시간 'lastTime'에서

                                       // 시간이 얼마나 흘렀는지 계산

 

11-2. delay(ms)

입력된 밀리초만큼 프로그램을 잠시 멈춘다

 

delay(500); // 0.5초간 프로그램을 멈춤

 

11-3. delayMicroseconds(us)

입력된 마이크로초(us)만큼 프로그램을 잠시 멈춘다

 

delayMicroseconds(1000); // 1밀리초 대기

 

12.수학함수

아두이노에는 많은 일반 수학 함수와 삼각 함수가 있습니다

 

12-1. min(x , y)

두 값 x 와 y 가운데 작은 값을 반환 합니다

 

val = min(10,20); // val 값은 10이 됨

 

12-2. max(x , y)

두 값 x 와 y 가운데 큰 값을 반환 합니다

 

val = max(10,20); // val 값은 20이 됨

 

12-3. abs(x)

x의 절대값, 음수인 경우 양수로 변환한 값을 반환 합니다

x가 5인 경우 5가 반환되며, x가 -5인 경우에도 5가 반환 됩니다

 

val = abs(-5); // val 값은 5가 됨

 

12-4. constrain(x, a, b)

a와 b 사이로 제약된 x값을 반환 합니다

x가 a보다 작으면, 이 함수는 그냥 a를 반환 합니다

x가 b보다 크면, 반환 값은 b가 됩니다

 

val = constrain(analogRead(0), 0, 255);

                    // val 값이 255를 넘지 않도록 함

 

12-5. map(value, fromLow, fromHigh, toLow, toHigh)

fromLow 부터 fromHigh 사이에 있는 값을 toLow에서 toHigh 범위에 맞게 조정합니다

아날로그 센서에서 읽어 온 값을 처리하는 데 매우 유용합니다

 

val = map(analogRead(0),0,1023,100,200);

                                    // 아날로그 핀 0번에서 읽은 값을

                                    // 100에서 200 사이로 조정(mapping)

 

12-6. double pow(base, exponent)

기수(base)의 지수(exponent) 제곱을 반환 합니다

 

double x = pow(y, 32); // y의 32승 값을 x에 저장

 

12-7. double sqrt(x)

x의 제곱근(square root)을 반환한다

 

double a = sqrt(1138); // 대략 33.73425674438

 

12-8. double sin(rad)

주어진 각의 사인(sine) 값을 라디안 단위로 반환 합니다

 

double sine = sin(2); // 대략 0.90929737091

 

12-9.double cos(rad)

주어진 각의 코사인(cosine)값을 라디안 단위로 반환 합니다

 

double cosine = cos(2); // 대략 -0.41614685058

 

12-10. double tan(rad)

주어진 각의 탄젠트(tangent) 값을 라디안 단위로 반환 합니다

 

double tangent = tan(2); // 대략 -2.18503975868

 

13.난수 함수

무작위로 추출한 숫자(난수)를 사용하려면, 아두이노의 유사 난수 생성기를 쓰면 됩니다

 

13-1. randomSeed(seed)

아두이노의 유사 난수 생성기를 초기화 합니다

비록 random()으로 발생한 수의 분포가 기본적으로 무작위 일지라도, 어떤 순서로 발생하는지는 예측 가능합니다

그래서 난수 생성기를 특정 난수 값으로 초기화할 필요가 있습니다

만약 연결하지 않은 아날로그 입력 핀이 있다면, 이 핀이 주변환경 (라디오 신호, 우주선, 팬드폰에서 나오는 전자기적 간섭, 형광등)

에서 영향을 받아서 임의의 노이즈 값을 반환하므로 이를 사용하는 것이 좋습니다

 

randomSeed(analogRead(5));

          // 아날로그 핀 5번의 노이즈에서 랜덤 사용

 

13-2. long random(max)

        long random(min, max)

정해 준 최소(min)와 최대(max - 1) 값 사이의 long integer 타입의 유사 난수를 반환 합니다

 

최소값을 지정하지 않으면, 최소값은 0이 된다

 

long randnum = random(0, 100); // 0부터 99 사이의 수

long randnum = random(11);     // 0부터 10 사이의 수

 

14.시리얼 통신

USB 포트를 통해 시리얼 통신 프로토콜 아두이노와 통싱할 수 있습니다

다음이 시리얼 함수 입니다

 

14-1. Serial(speed)

시리얼 데이터를 주고받을 수 있도록 아두이노를 준비 합니다

흔히 이 함수를 쓸 때 아두이노 IDE 시리얼 모니터에 나오는 시리얼 포트의 속도 (speed)로 초당 9600비트(9600bps)를 사용하지만

다른 속도를 사용할수도 있습니다

보통 115200bps 이상은 사용하지 않습니다

 

Serial.begin(9600);

 

14-2. Serial.print(data)

Serial.print(data, encoding)

데이터를 시리얼 포트로 전송 합니다

인코딩(encoding)은 옵션이며, 지정하지 않았을 때는 데이터를 가능한 한 평범한 텍스트처럼 취급 합니다

 

Serial.print(75);                   //75 출력

Serial.print(75, DEC);          //위와 동일

Serial.print(75, HEX);          //4B (75의 16진수)

Serial.print(75, OCT);          //113 (75의 8진수)

Serial.print(75, BIN);           //1001011 (75의 2진수)

Serial.print(75, BYTE);        //K (바이트를 그대로 전송하면

                                       //결국 ASCII 값 75, K가 된다)

 

14-3. Serial.printIn(data)

Serial.printIn(data, encoding)

데이터를 입력하고 리턴이나 엔터를 눌렀을때처럼 캐리지 리턴과 줄바꿈(\r\n)이 추가된다는 점을 제외하면 Serial.print() 와 동일 합니다

 

Serial.print(75);                   //75r\n 출력

Serial.print(75, DEC);          //위와 동일

Serial.print(75, HEX);          //4B\r\n

Serial.print(75, OCT);          //113\r\n

Serial.print(75, BIN);           //1001011\r\n

Serial.print(75, BYTE);        //K\r\n

 

14-4. int Serial.available()

read() 함수에서 사용하기 위해 시리얼 포트에 읽지 않은 바이트가 얼마나 있는지를 반환 합니다

활용 가능한 모든 데이터를 read()로 읽은 뒤에는 새로운 데이터가 시리얼 포트에 올 때까지 Serial.available()은 0을 반환 합니다

 

14-5. int Serial.read()

도착하는 시리얼 데이터에서 한 바이트를 읽어(fetch) 온다

 

int data = Serial.read();

 

14-6. Serial.flush()

시리얼 포트로 도착하는 데이터가 프로그램이 처리할 수 있는 것보다

빨리 들어오기 때문에, 아두이노는 들어오는 데이터를 모두 버퍼에 보관 합니다

이 버퍼를 깨끗이 비우고 앞으로 새로운 데이터로 채우고자 한다면, flush() 함수를 사용해야 합니다

 

Serial.flush();

 


반응형

댓글