아두이노 기초 수업

생태전환 프로그래밍 동아리 아두이노 수업을 위한 자료입니다.

아두이노 IDE 설치하기

  1. 아두이노 누리집(www.arduino.cc) 접속
  2. 상단 메뉴 -> Software 접속
  3. 본인 운영체제 선택
  4. Just download 클릭
  5. 설치 진행
  6. 실행

Hello, World!

아두이노의 Hello, World! 프로그램에 해당하는 Blink 예제를 실행시켜보겠습니다.

  1. 아두이노를 컴퓨터에 연결합니다.
  2. 상단 메뉴 -> File -> Examples -> 01.Basics -> Blink 선택 다음과 같이 새 창이 열리면서 예제 코드가 로드됩니다.
  3. 소스 코드를 업로드할 아두이노 보드를 선택합니다. IDE 창 상단의 Select Board 버튼을 눌러 'Arduino Uno'를 선택하세요.
  4. 확인 버튼을 눌러 소스코드를 컴파일하고 오류가 없는지 확인합니다. 하단 output 창에 별다른 에러 메시지가 표시되지 않으면 컴파일에 성공한 것입니다. 에러가 있다면 이곳에 에러가 표시됩니다.
  5. 에러가 없다면 업로드 버튼을 눌러 소스코드를 컴파일하고 보드에 업로드하세요.
  6. 아두이노가 잘 작동하는지 확인합니다. 아래와 같이 보드의 LED가 깜박이면 됩니다.

축하합니다! 🎉 첫 아두이노 프로젝트를 완료했습니다!

아두이노 기초

아두이노란

아두이노 누리집에는 다음과 같이 소개되어 있습니다.

Arduino is an open-source electronics platform based on easy-to-use hardware and software. Arduino boards are able to read inputs - light on a sensor, a finger on a button, or a Twitter message - and turn it into an output - activating a motor, turning on an LED, publishing something online. You can tell your board what to do by sending a set of instructions to the microcontroller on the board. To do so you use the Arduino programming language (based on Wiring), and the Arduino Software (IDE), based on Processing.

https://www.arduino.cc/en/Guide/Introduction

아두이노는 쉽게 사용할 수 있는 하드웨어와 소프트웨어를 바탕으로 한 오픈소스 전자 공학 플랫폼입니다. 아두이노 보드는 입력(센서의 빛, 버튼을 누르는 손가락, 트위터 메시지 등)을 읽을 수 있고 그것을 출력(모터를 작동시키고, LED를 키고, 무언가를 온라인으로 내보내기 등)으로 바꿀 수 있습니다. 여러분은 보드의 마이크로컨트롤러에 일련의 명령을 전송함으로써 아두이노 보드에게 무엇을 할지 말해줄 수 있습니다. 이를 위해 여러분은 아두이노 프로그래밍 언어와 아두이노 소프트웨어(IDE)를 사용합니다.

마이크로컨트롤러

마이크로컨트롤러(microcontroller) 또는 MCU(microcontroller unit)는 마이크로프로세서와 입출력 모듈을 하나의 칩으로 만들어 정해진 기능을 수행하는 컴퓨터를 말한다.

CPU 코어, 메모리 그리고 프로그래밍 가능한 입/출력을 가지고 있다.

MCU는 임베디드 장치을 위해 디자인되었으며 임베디드 시스템에 널리 사용된다. 개인용 컴퓨터가 다양한 요구에 따라 동작하는 범용적인 일에 사용된다면, MCU는 기능을 설정하고 정해진 일을 수행하도록 프로그래밍되어 장치 등에 장착되어 동작한다. 냉장고, 전자레인지, 사무용 전자기기, 리모컨 등의 기기에 사용된다.

위키피디아(한국어) https://ko.wikipedia.org/wiki/마이크로컨트롤러 (일부 수정)

IDE(통합 개발 환경)

통합 개발 환경(IDE)이란 프로그래머가 소프트웨어 코드를 효율적으로 개발하도록 돕는 소프트웨어 애플리케이션입니다. 이는 소프트웨어 편집, 빌드, 테스트, 패키징과 같은 기능을 사용하기 쉬운 하나의 애플리케이션에 통합하여 개발자 생산성을 높입니다. 작가가 텍스트 편집기를 사용하고 회계사가 스프레드시트를 사용하는 것처럼 소프트웨어 개발자는 IDE를 사용해 작업을 쉽게 처리합니다.

https://aws.amazon.com/ko/what-is/ide/

아두이노 IDE의 경우, 소스코드 편집기, 컴파일 및 업로드 기능, 시리얼 모니터, 라이브러리 관리자 등 여러 도구를 GUI로 사용할 수 있게 제공하고 있어 추가적인 프로그래밍 지식 없이도 쉽게 아두이노 소스 코드를 작성하고 디버깅 할 수 있게 도와줍니다.

아두이노 우노 (UNO)

아두이노는 다양한 모양과 사양의 보드가 있습니다. 우노(UNO)는 그 중 가장 기본적인 보드로 아두이노 입문 시 가장 많이 사용합니다. 저희도 우노를 사용할 것입니다.

회로

아두이노의 핀과 센서, 모터 등 부품의 핀을 연결해 회로를 만듭니다.

회로를 만들 때는 아두이노를 컴퓨터에서 분리해주세요.

아두이노 핀

  • 디지털 핀(D_): 위의 사진 기준 오른쪽에 있는 핀. HIGH/LOW 두 개의 디지털 신호를 입/출력 할 수 있는 핀
  • PWM: 틸트(~)가 있는 디지털 핀. PWM 제어 가능
  • 아날로그 핀(A_): 위의 사진 기준 왼쪽 하단에 있는 핀. 0~1023 사이의 연속적인 아날로그 신호를 입력 받을 수 있는 핀
  • 3.3V/5V: 위의 사진 기준 왼쪽 상단에 있음. 해당 전압을 내보내는 핀.
  • GND: 위의 사진 기준 왼쪽 상단에 2개, 오른쪽 상단에 1개 있음. GROUND 핀. 0V에 해당.

브레드보드 (빵판)

납땜 없이 전선을 연결하기 위해 사용합니다. 학습 시나 프로토타이핑 시 주로 사용합니다.

저희는 400핀짜리 브레드보드를 사용합니다.

빨간 선으로 연결되어 있는 홈들이 서로 연결되어 있습니다.

점퍼 와이어

아두이노와 브레드보드로 작업할 때 사용하는 전선. 하나씩 떼서 양 끝을 각각 아두이노와 브레드보드, 센서 등에 연결하면 됩니다.

저항

통합과학/물리 시간에 이야기하던 그 저항. 띠의 색에 따라 저항 크기가 다릅니다. 읽는 법 궁금하면 구글링 해보세요.

보통 양 끝을 접어서 자를 만들어서 브레드보드에 연결해 사용합니다.

아두이노 프로그래밍 언어

아두이노 프로그래밍 언어는 C++언어와 유사합니다.

기본

기본 골격은 다음과 같습니다.

void setup() {
  // 이 함수는 아두이노가 실행되었을 때 처음 한 번만 실행됩니다.
  // 한 번만 실행하고 싶은 코드를 이곳에 작성합니다.
  // 보통 초기화, 센서 연결 등의 작업을 수행합니다.
}

void loop() {
  // 이 함수는 계속 반복해서 실행됩니다.
  // 센서로부터 값을 읽고, 처리하고, 다른 장치로 출력하는 등 메인 작업을 이곳에 작성합니다.
}

setup 함수와 loop 함수는 c언어의 main 함수처럼 아두이노가 자동으로 호출합니다.

setup() -> loop() -> loop() -> loop() -> ... 와 같은 느낌으로 생각하면 됩니다.

변수

    int foo;
//  ^^^ ^^^
//  타입  변수명
foo = analogRead(0); // 대입

int foo = 5; // 한번에

// 타입: int, long, bool, String 등

함수 호출

// 세미콜론 필요하다는 점 주의
함수명(인자1, 인자2, ...);

제어문

조건문

if (condition1) {
  // do Thing A
}
else if (condition2) {
  // do Thing B
}
else {
  // do Thing C
}

반복문(for)

for (initialization; condition; increment) {
  statement(s);
}
for (int i = 0; i <= 255; i++) {
  analogWrite(PWMpin, i);
  delay(10);
}

레퍼런스에서 더 자세히 알아보세요.

LED 제어하기

1초 간격으로 LED를 켰다가 끕니다.

디지털 출력하는 방법을 알아봅니다.

준비물

  • 아두이노 우노
  • LED
  • 220옴 저항
  • 수수 점퍼와이어

회로도

소스코드

int LED_PIN = 2;

void setup() {
  pinMode(LED_PIN, OUTPUT);
}

void loop() {
  digitalWrite(LED_PIN, HIGH);
  delay(1000);
  digitalWrite(LED_PIN, LOW);
  delay(1000);
}

설명

pinMode 함수

특정 핀이 입력 모드로 작동할지, 출력 모드로 작동할지 지정합니다.

pinMode(핀번호, 모드)
  • 핀번호: 입력 모드를 지정할 아두이노 핀의 번호
  • 모드:
    • INPUT: 입력 모드 (= 이 핀으로 디지털 신호를 입력받을 거에요!)
    • OUTPUT: 출력 모드 (= 이 핀으로 디지털 신호를 출력할 거에요!)
    • INPUT_PULLUP

레퍼런스

digitalWrite 함수

디지털 핀을 HIGH 또는 LOW로 설정합니다. 핀이 OUTPUT으로 설정되어 있다면, HIGH일 때 5V(UNO 기준)를 출력하고, LOW일 때 0V를 출력합니다.

digitalWrite(핀번호, 값)
  • 핀번호: 아두이노 핀 번호
  • 모드:
    • HIGH
    • LOW

레퍼런스

delay 함수

프로그램을 입력된 시간만큼 멈춥니다.

delay(시간)
  • 시간: 기다릴 시간(밀리초, 1000ms == 1s)

레퍼런스

결과

버튼 사용하기

버튼을 누르면 LED가 켜지도록 만들어봅시다.

디지털 입력을 받는 법과 시리얼 통신에 대해 알아봅니다.

준비물

  • 아두이노 우노
  • LED
  • 220옴 저항
  • 수수 점퍼와이어
  • 푸시 버튼
  • (선택) 10k옴

회로도

소스코드

int LED_PIN = 2;
int BUTTON_PIN = 8;

void setup() {
  pinMode(LED_PIN, OUTPUT);
  pinMode(BUTTON_PIN, INPUT_PULLUP);

  Serial.begin(9600);
}

void loop() {
  int button_state = digitalRead(BUTTON_PIN);
  
  Serial.println(button_state);

  if (button_state == LOW) {
    digitalWrite(LED_PIN, HIGH);
  } else {
    digitalWrite(LED_PIN, LOW);
  }
}

설명

푸시 버튼

버튼 내부 회로가 H자로 구성되어 있어 버튼을 누르면 다리 4개가 모두 연결되어 전류가 흐르고, 버튼을 누르지 않으면 전류가 흐르지 않습니다.

INPUT_PULLUP

버튼과 연결된 디지털핀의 핀모드를 INPUT_PULLUP으로 설정했습니다. 이는 해당 핀을 입력 모드로 사용할건데, 내장된 풀업 회로를 사용할거야 라는 의미입니다.

왜 풀업 회로를 사용하지 않을 경우, 버튼을 누르지 않았을 때 입력값이 HIGH와 LOW 사이에서 무작위로 계속 바뀌는 floating 현상이 나타납니다. 이를 방지하기 위한 회로가 풀업 회로입니다. 참고로 풀다운 회로도 있으며, 역할은 풀업 회로와 동일합니다.

만약 내장 풀업 회로를 사용하지 않고 직접 회로를 구성한다면 다음과 같습니다.

참고로 풀업 회로는 회로가 연결되지 않았을 때(버튼이 눌리지 않았을 때) HIGH로 고정시키는 회로이므로, 위 코드에서 버튼에서 읽은 디지털 값이 LOW일 때 LED가 켜지도록 했습니다.

digitalRead 함수

특정 핀으로부터 디지털 값을 읽습니다.

digitalRead(핀번호)
  • 핀번호: 값을 읽고 싶은 핀 번호

레퍼런스

Serial 통신

통신 규약 중 하나로 아두이노와 컴퓨터가 서로 통신할 때 사용할 수 있습니다. 파이썬에서 print 함수로 값을 출력하며 디버깅 하듯이 아두이노에서는 시리얼 통신을 통해 값을 출력하며 디버깅 할 수 있습니다.

시리얼 통신을 위해선 우선 시리얼 통신을 하겠다고 이야기하며 설정을 해주어야 합니다. 위 코드 중 setup 함수의 Serial.begin(9600)이 바로 그것입니다. 여기서 9600은 통신 속도로 초당 비트수(bps) 단위로 작성합니다. 통신 상대도 같은 속도로 지정해야 올바르게 정보를 주고받을 수 있습니다.

Serial.println 함수를 통해서 값을 컴퓨터로 보낼 수 있습니다. 인자로 전송하고 싶은 값을 넣으면 됩니다.

아두이노 IDE의 상단 메뉴 -> Tools -> Serial Monitor를 통해 시리얼 모니터를 키면 아두이노가 전송한 값들을 확인 할 수 있습니다.

더 나아가기

  • 토글 버튼으로 만들기

    버튼을 한 번 누르면 LED가 켜지고, 다시 한 번 누르면 LED가 꺼진다.

조도 센서 사용하기

조도 센서를 이용해 주변 빛의 세기를 알아내봅시다.

아날로그 입력 받는 방법을 알아봅니다.

준비물

  • 아두이노 우노
  • 조도 센서
  • 10k옴
  • 수수 점퍼와이어

회로도

소스코드

int LIGHT_PIN = A0;

void setup() {
  Serial.begin(9600);
}

void loop() {
  int light = analogRead(LIGHT_PIN);
  Serial.println(light);
}

설명

조도 센서

빛의 크기에 따라 저항 값이 바뀌는 센서입니다.

analogRead 함수

특정 핀으로부터 아날로그 값을 읽습니다. 0 ~ 1023 사이의 값을 반환합니다.

analogRead(핀번호)
  • 핀번호: 값을 읽고 싶은 핀 번호 (A + 숫자 형식. eg. A0)

레퍼런스

서보 모터 제어하기

서보 모터 사용법을 알아봅니다.

준비물

  • 아두이노 우노
  • 수수 점퍼와이어
  • 서보 모터

회로도

소스코드

// 라이브러리 불러오기
#include <Servo.h>

Servo servo; // 서보를 제어할 변수 생성

void setup() {
  servo.attach(9); // "9번 핀에 서보 모터 연결했어"
}

void loop() {
  servo.write(90); // 90도로 회전
  delay(1000);
  servo.write(0);
  delay(1000);
}

DC 모터 제어하기

더 알아보기