재밌는 컴퓨팅, 신나는 메이킹, 즐거운 소프트웨어를 추구하는 모두를 위한 코딩 커뮤니티 '코딩클럽'의 왕초보 아두이노따라잡기 워크샵 자료입니다. 아두이노와 오픈소스하드웨어의 기본개념, 아두이노 설치, 구동 방법, C 코딩, LED, 센서 활용법 등을 쉽게 이해할 수 있도록 소개하였습니다. by 코딩클럽의 신송섭 선생님
3. 코딩클럽 신송섭 (ssshin22@naver.com)3
목차
• 오픈소스/아두이노
• 개발환경에 대하여
• 프로그래밍 기초
• LED Blink
– 실습 #1 - LED On/Off
– 실습 #2 - LED 부드럽게 On/Off
– 실습 #3 - RGB LED Control
• 외부입력으로 LED 제어하기
– 실습 #4 – 버튼으로 LED On/Off
– 실습 #5 - 기울기 스위치(Tilt switch)로 On/Off
– 실습 #6 – 가변저항으로 LED On/Off 제어
– 실습 #7 – 가변저항으로 LED 밝기 제어
• 센서로 LED 제어하기
– 실습 #8 – 빛센서
– 실습 #9 - 온도센서
4. 코딩클럽 신송섭 (ssshin22@naver.com)4
Open Source
• Open Source
= Open Source H/W + Open Source S/W
– Open Source SW : Linux, Inkscape, Ecllips, ………
– Open Source HW :
• 정의 : 오픈소스문화에서 비롯되어 생성된 소스를 공개
• 공개범위 : 회로도, PCB 거버화일, BOM, 기구도면, HDL, IC Circuit Layout data, 하드웨어
를 구동하기 위한 소프트웨어
• 오픈소스 하드웨어 프로젝트 리스트
(http://en.wikipedia.org/wiki/List_of_open-source_hardware_projects)
• Arduino, 3D Printer, Quadcopter, Robot 등등
• Raspberry Pi는 오픈소스일까?
– 오픈소스 라이선스
https://wiki.kldp.org/wiki.php/OpenSourceLicenseGuide
http://www.oshwa.org/http://opensource.org/
6. 코딩클럽 신송섭 (ssshin22@naver.com)6
아두이노 - History
• 아두이노 시작
– Ivrea, Northern Italy
– Interaction Design Institute Ivrea (IDII), Masimo Banzi
– Hernando Barragan(학생) : Wiring( http://www.wiring.org.co )
– Processing : MIT Media Lab
– 2005년 IDII 학생들의 위해서 Release
Wiring Processing
Arduino
H/W
Ardiono
IDE
Arduino Platform
7. 코딩클럽 신송섭 (ssshin22@naver.com)7
아두이노 – Core team
The Arduino core team [from left]—
David Cuartielles, Gianluca Martino, Tom Igoe, David Mellis, and Massimo Banzi
http://spectrum.ieee.org/geek-life/hands-on/the-making-of-arduino
11. 코딩클럽 신송섭 (ssshin22@naver.com)11
Arduino UNO R3 Board
디지털 입출력/PWM 핀
아날로그 입출력 핀전원입출력
MicroController
USB 커넥터
외부전원입력
리셋버튼
I2C, AREF
ICSP
USB to Serial
리셋버튼
전원 LED
13. 코딩클럽 신송섭 (ssshin22@naver.com)13
Arduino IDE
(Intergrated Development Environment)
코딩
(텍스트 편
집기)
컴파일
(컴파일러)
링크
(링커)
디버깅
(디버거)
다운로딩
(임베디드시
스템)
실행
이클립스
AVR Studio
Visual Studio
24. 코딩클럽 신송섭 (ssshin22@naver.com)24
부품 – LED
• LED : 전기에너지를 빛에너지로 변환하는 부품
• 기호 :
• LED는 두종류의 물질을 가지고 만드는 반도체
• 갈륨비소(GaAs), 갈륨인(GaP), 갈륨비소인(GaAsP), 갈륨질소(GaN)등
• LED를 사용하는 이유
– 에너지 효율 Up, 전력소모는 Down
– 백열등에 비해 1/5 수준의 전력만 소비
– 백열등에 비해 15배 이상의 긴 수명
– 지구를 살리는 친환경 기술
– 다양한 색깔을 표현할 수 있음
– 빛의 색상, 밝기등을 손쉽게 제어할 수 있음
27. 코딩클럽 신송섭 (ssshin22@naver.com)27
Arduino – 프로그래밍 기초
• http://arduino.cc/en/Reference/HomePage
• 구조
– 기본 구조문 : setup(), loop(),
– 제어구문 : if, if … else…, for, switch, while, do while, break, continue, return, goto
– 기타구문 : ;, {}, //, /* */, #define, #include
– 수연산자 : =, +, -, *, /, %
– 비교연산자 : ==, ~=, <, >, <=,>=
– 논리연산자 : &&, ||, !
– 포인트연산자 : *, &
– 비트연산자 : &, |, ^, ~, <<, >>
– 합성연산자 : ++, --, +=, -=, *=, /=, &=, |=
• 변수 : 상수, 변수, 데이터 타입, 형변환, …
• 함수
– 기본 제공함수 : 디지털 입출력함수, 아날로그 입출력 함수, 시간함수, 수학함수, …
– 사용자 함수
• 라이브러리
– 함수들의 집합
– 기본함수 : EEPROM, Ethernet, Firmata, GSM, LCD, SD, Servo, SPI,…
– ..Arduinolibraries
– http://arduino.cc/en/Reference/Libraries
28. 코딩클럽 신송섭 (ssshin22@naver.com)28
C 프로그래밍 기초 - 기본
• 주석
– /* 주석 */ : 여러줄 주석
– // 주석 : 한줄 주석
• 세미콜론( ; ) : 문장의 끝
– 문자의 끝을 의미
• { } : 함수, 반복문, 조건문 등에서 블럭을 정의할때 사용함
시작/끝을 나타내며 항상 쌍으로 이루어져야 함
– void setup(){ }
– void loop(){ }
– for( ){ ~ }
– If( ){ ~ } else { ~ }
if( ){
if( ){
if( ){
}
}
}
else{
}
29. 코딩클럽 신송섭 (ssshin22@naver.com)29
C 프로그래밍 기초 – 상수/변수
• 상수와 변수?
– 상수란 : 항상 일정한 값.
– 변수란 : 변하는 데이터, 데이터를 저장할 수 있는 공간,
• 선언과 초기화
– 선언 : ‘데이터형’’변수이름’ = ‘초기값’;
const int led=13; <- 상수선언
int led=13; <- 변수선언
– 초기화
• 상수는 선언하면서 값을 주어짐
• 변수는 선언하면서 초기화해도 되고 프로그램 중간에 넣어도 된다.
• 상수/변수 이름 짓기
– 영문 대소문자, 숫자, ‘_’만 사용함, 대소문자 구분됨
ex) a, A, Show_Me_The_Money, showmethemoney, showMEtheMoney …
– 특수문자안됨 ex) A#212, B@4%6, …
– 띄어쓰기가 있으면 안됨 ex)add num, show me the money, …
– 숫자가 맨앞에 오는 것은 안됨 ex) 1aA
– 실제변수의 기능에 따라 이름을 작명 ex) VResistorVal, RLedPort, BLedPort, …
30. 코딩클럽 신송섭 (ssshin22@naver.com)30
C 프로그래밍 기초 - 연산자
연산자 연산의 예 의미
< a<b a가 b보다 작으면
> a>b a가 b보다 크면
== a==b a와 b가 같으면
!= a!=b a와 b가 같지 않으면
<= a<=b a가 b보다 작거나 같으면
>= a>=b a가 b보다 크거나 같으면
연산자 연산의 예 의미 연산자 연산의 예 의미
+ a+b a 더하기 b / a/b a 나누기 b
- a-b a 빼기 b % a%b a 나누기 b 의 나머지
* a*b a 곱하기 b
• 수 연산자
• 비교 연산자
연산자 연산의 예 의미 연산자 연산의 예 의미
++ a++ a + 1을 의미 += a+=1 a=a+1
-- a-- a – 1을 의미 -= a-=1 a=a-1
• 합성연산자
31. 코딩클럽 신송섭 (ssshin22@naver.com)31
연산자 사용예 의미
! !a not 연산자, a 가 아니면
&& a&&b and 연산자, a 이고 b
|| a||b or 연산자, a 이거나 b
• 조건 연산자
• 사용예
• !a : a가 아니면
– if(!(a<3)){ A실행 }
• A && b : a 이고 b일때
– if(analogRead(swPin1) && digitalRead(swPin2)){ }
• A || b : a 이거나 b일때
– if(analogRead(swPin1) || digitalRead(swPin2)){ }
C 프로그래밍 기초 - 연산자
32. 코딩클럽 신송섭 (ssshin22@naver.com)32
C 프로그래밍 기초 – if 조건문
• 문법
• 기능
– 만약, ‘조건 ’이 참(True)라면 ‘ ’을 실행하고
‘조건 ’이 거짓(False)이면 ‘ ’을 실행한다.
• 사용예(a=3이면) (a=10이면)
if(조건)
{ <- A영역 시작
‘A 영역’
} <- A영역 끝
else
{ <- B영역 시작
‘B 영역’
} <- B영역 끝
A 영역
B 영역
if( a < 10 ){
digitalWrtite(13, HIGH);
}
else{
digitalWrite(12, HIGH);
}
if( a < 10 ){
digitalWrtite(13, HIGH);
}
else{
digitalWrite(12, HIGH);
}
33. 코딩클럽 신송섭 (ssshin22@naver.com)33
C 프로그램 기초 – for() 제어문
• 문법
• 기능 : 조건식이 만족하면 영역을 실행한다.
– 초기값 : 조건식에 사용할 변수의 초기값
– 조건식 : 조건문
– 증감식 : 변수의 증감값
• 사용예
for(초기값;조건식;증감식)
{
실행영역;
}
for(i=0;i<5;i++)
{
digitlaWrite(i, HIGH);
}
delay(1000);
i=
digitalWrite( , HIGH)0
i=i+1
실행
i<5 이면 실행
012345
1234
delay(1000);
34. 코딩클럽 신송섭 (ssshin22@naver.com)34
• 프로그램에서 함수란?
특정한 기능을 하는 제어문, 조건문, 함수들의 집합
• 함수구조
“반환값” “함수이름” (“전달인자1”, “전달인자2”,---)
Ex)
digitalWrite(pin, HIGH);
pinMode(pin, OUTPUT);
delay(1000);
randomNumber=random(min,max);
=
• 함수란?
“반환값”
“전달인자1”, “전달인자2”,
함수 f( )
C 프로그래밍 기초 - 함수
35. 코딩클럽 신송섭 (ssshin22@naver.com)35
Arduino - 프로그램 구조
1. // 프로그램 설명부 : 프로그램 동작설명, 제작자, 라이선스, 생성연월일/버전, 등 정보부분
2. /* Blink
3. Turns on an LED on for one second, then off for one second, repeatedly.
4.
5. This example code is in the public domain.
6. */ <- 주석끝
7. // 변수 및 함수 정의부
8. int led = 13; <- 변수정의 및 초기값 설정
9. void setup( ) { <- 프로그램 시작할때 한번만 실행됨
10. // 입출력 핀의 초기값
11. // 시리얼 포트 설정
12. // 변수 초기값
13. // 등 프로그램 시작시 한번만 실행되거나 주변 회로에 대한 초기값을 설정하는 부분
14. }
15. void loop( ) { <- 메인 실행 함수, 반복실행됨
16. // 주 실행 프로그램 부분
17. // 무한반복됨
18. }
19. void User_Lib() <- 사용자 정의 함수
20. {
21. // 사용자 정의 함수 부분
22. }
36. 코딩클럽 신송섭 (ssshin22@naver.com)36
Arduino – 기본 프로그램 예제
1. /* <- 주석시작
2. Blink
3. Turns on an LED on for one second, then off for one second, repeatedly.
4.
5. This example code is in the public domain.
6. */ <- 주석끝
7.
8. // Pin 13 has an LED connected on most Arduino boards. <-한줄 주석
9. // give it a name: <-한줄 주석
10. int led = 13; <- 변수정의 및 초기값 설정
11. // the setup routine runs once when you press reset: <-한줄 주석
12. void setup( ) { <- 프로그램 시작할때 한번만 실행됨
13. // initialize the digital pin as an output.
14. pinMode(led, OUTPUT); <- 핀의 사용모드 정의 함수
15. }
16. // the loop routine runs over and over again forever: <-한줄 주석
17. void loop( ) { <- 메인 실행 함수, 반복실행됨
18. digitalWrite(led, HIGH); // LED 켜기
19. delay(1000); // 1초 동안 시간지연
20. digitalWrite(led, LOW); // LED 끄기
21. delay(1000); // 1초 동안 시간지연
22. }
37. 코딩클럽 신송섭 (ssshin22@naver.com)37
실습 #1 - 사용함수
• pinMode();
– 기능 : 디지털 입출력 핀을 입력 또는 출력으로 설정
– Syntax
pinMode(pin, mode);
– Parameter
pin : 디지털 핀번호
mode : INPUT or OUTPUT
• digitalWrite();
– 기능 : 디지털 핀에 HIGH or LOW를 쓴다.
– Syntax
digitalWrite(pin,mode);
– Parameter
pin : 디지털 핀 번호
mode : HIGH or LOW
• dely();
– 기능 : 지연
– Syntax
delay(time);
– Parameter
time : 지연시간(ms), 1000ms = 1sec
38. 코딩클럽 신송섭 (ssshin22@naver.com)38
실습 #1 - LED On/Off
1. int led5 = 5;
2. int led6 = 6;
3. void setup( ) {
4. pinMode(2, OUTPUT);
5. pinMode(3, OUTPUT);
6. pinMode(4, OUTPUT);
7. pinMode(led5, OUTPUT);
8. pinMode(led6, OUTPUT);
9. }
10. void loop( ) {
11. digitalWrite(2, HIGH); // LED 켜기
12. digitalWrite(3, HIGH); // LED 켜기
13. digitalWrite(4, HIGH); // LED 켜기
14. digitalWrite(5, HIGH); // LED 켜기
15. digitalWrite(6, HIGH); // LED 켜기
16. delay(1000); // 1초 동안 시간지연
17. digitalWrite(2, LOW); // LED 끄기
18. digitalWrite(3, LOW); // LED 끄기
19. digitalWrite(4, LOW); // LED 끄기
20. digitalWrite(led5, LOW); // LED 끄기
21. digitalWrite(led6, LOW); // LED 끄기
22. delay(1000); // 1초 동안 시간지연
23. }
330ohm
47. 코딩클럽 신송섭 (ssshin22@naver.com)47
실습 #6 – 가변저항으로 LED On/Off 시간제어
analogRead();
- 기능 : 디지털 핀에 PWM 신호 출력
- Syntax
returnValue = analogRead(pin);
- Parameter
pin : 핀번호
- 리턴값 : 0 ~ 1023
1번핀
2번핀
3번핀
1번핀
2번핀
3번핀
48. 코딩클럽 신송섭 (ssshin22@naver.com)48
실습 #6 – 가변저항으로 LED On/Off 시간제어
1. int sensorPin = A0; // 가변저항 입력핀 설정
2. int ledPin = 13; // LED 핀 설정
3. int sensorValue = 0; // 가변저항으로 부터 입력되는 값을 자장하기 위한 변수
4. void setup() {
5. pinMode(ledPin, OUTPUT); // LED 핀을 출력으로 설정
6. Serial.begin(9600); // 시리얼 포트 설정
7. }
8. void loop() {
9.
10. sensorValue = analogRead(sensorPin); // 가변저항으로 부터 값을 읽어들임
11. Serial.print(sensorValue); // 가변저항으로 읽어들인 값을 PC로 전송
12.
13. digitalWrite(ledPin, HIGH); // LED On
14. delay(sensorValue); // 가변저항으로부터 입력되는 값만큼 지연(milliseconds)
15.
16. digitalWrite(ledPin, LOW); // LED Off
delay(sensorValue); // 가변저항으로부터 입력되는 값만큼 지연(milliseconds)
17.
18. }
49. 코딩클럽 신송섭 (ssshin22@naver.com)49
실습 #7 – 가변저항으로 LED 밝기제어
1. int sensorPin = A0; // select the input pin for the potentiometer
2. int red_led = 9 ;
3. int blue_led = 10;
4. int green_led = 11;
5. int sensorValue = 0; // variable to store the value coming from the sensor
6. void setup() {
7. pinMode(red_led, OUTPUT);
8. pinMode(blue_led, OUTPUT);
9. pinMode(green_led, OUTPUT);
10. Serial.begin(9600);
11. }
12. void loop() {
13. sensorValue = analogRead(sensorPin); // read the value from the sensor:
14. Serial.println(sensorValue);
15. map_sensorValue=map(sensorValue, 0,1023, 0,255);
16.
17. analogWrite(red_led, sensorValue/4 );
18. analogWrite(blue_led, map_sensorValue );
19. analogWrite(green_led, sensorValue/4 );
20. }
56. 코딩클럽 신송섭 (ssshin22@naver.com)56
실습 #9 – 온도에 따라 LED On/Off
1. int sensorPin = A4; // select the input pin for the potentiometer
2. int sensorValue = 0; // variable to store the value coming from the sensor
3. void setup() { // declare the ledPin as an OUTPUT:
4. Serial.begin(9600);
5. }
6. void loop() {
7.
8. sensorValue = analogRead(sensorPin); // read the value from the sensor:
9. Serial.print(sensorValue);
10.
11. if(sensorValue < 250){
12. digitalWrite(ledPin, HIGH); // turn the ledPin on
13. } else {
14. digitalWrite(ledPin, LOW); // turn the ledPin off:
}
15. }
57. 코딩클럽 신송섭 (ssshin22@naver.com)57
실습 #9 – 함수를 이용해서 온도표시하기
• 라이브러리 다운받기
– https://code.google.com/p/thermistor10k/downloads/list
• 압축풀기
– ../Thermister/
– ../Thermister/example, Thermister.cpp, Thermister.h
• 아두이노 스케치북 위치로 카피하기
– 스케치북 위치 : 스케치>파일>환경설정
– 스케치북 위치 : ..user-nameDocumentArduino
– 스케치북 폴더로 ..librariesThermister 폴더를 카피
– “스케치 > 파일 > 예제”에 copy한 폴더의 example 이 보임
– “라이브러리 이름”/example 폴더내에 있는 파일이 보임
– 예제 파일을 연구해서 라이브러리를 어떻게 사용하는지 연구
58. 코딩클럽 신송섭 (ssshin22@naver.com)58
Arduino 개발방법
아디디어 구상
자료수집
부품구매
하드웨어
코딩
디버깅
• 회로도를 찾아보자
• 부품에 해당되는 라이브러리가 있을까?
• 없으면 라이브러리가 있는 부품을 구하자
• 온라인
• Devicemart.co.kr
• Eleparts.co.kr
• Icbanq.co.kr
• 오픈마켓(G마켓, 11번가, 옥션, …)
• 알리바바, 알리익스프레스, 아마존,..
• 오프라인
• 구로유통상가
• 청계천
• 안양유통상가
• 브래드보드에 회로를 구성한다.
• PCB에 회로를 구성한다. <- 고수
• 라이브러리를 설치한다
• 응용프로그램을 코딩한다.
• 현상보고 문제 예측하기
• 소프트웨어 구성대로 하드웨어가 동작하는지?
• 소프트웨어는 정확히 구성되어 있는가..?
• 소프트웨어 검증방법은?
• 소프트웨어에서 설정한대로 하드웨어가 연결되었는가?
• 하드웨어 문제인가?
• 왜?
• 하드웨어 검증방법은?
• 미궁에 빠지다
• 열정과 노력이 필요함
59. 코딩클럽 신송섭 (ssshin22@naver.com)59
아두이노와 스크래치
• Firmata 방식 – 마이컴과 호스트 컴퓨터간의 통신 프로토콜
– S4A(http://s4a.cat)
– S2A(https://github.com/MrYsLab/S2A_fm )
– BYOB(Build Your Own Block)/SNAP(http://snap.berkeley.edu)
• 다운로드 방식
– Ardublock(http://blog.ardublock.com )
– Minibloq(http://blog.minibloq.org )
– Modekit(http://www.modkit.com )
– Amici (http://dimeb.informatik.uni-bremen.de/eduwear/?cat=16 )
Firmata
for PC
ArduinoFirmata for
arduino
• Scratch
• Processing
• MAX/MSP
• Flash
• Other Program
60. 코딩클럽 신송섭 (ssshin22@naver.com)60
Arduino = Maker
• 정보를 얻을 수 있는 곳
– http://www.adafruit.com
– http://www.instructables.com
– http://makezine.com
– http://hackaday.com
– ……
• 크라우드 펀딩
– http://www.kickstarter.com
– https://www.indiegogo.com
– https://www.quirky.com
– ……