6. IoT의 시작
IoT(Internet of Things, 사물인터넷)
“지능화된 사물들이 연결되어 형성되는 네트워크상에서 사람과 사물
(물리 또는 가상), 사물과 사물 간에 상호 소통하고 상황인식 기반의
지식이 결합되어 지능적인 서비스를 제공하는 글로벌 인프라”
12년 ITU-T Y.2060(Y.IoT-overview) 표준문서
41. Analog VS Digital
Analog Signal
연속적으로 변하는 물리량
5V, Vcc, 1
0V, GND, 0
Digital Signal
이산적으로 수치가 변함
digitalWrite(ledPin, HIGH);
digitalWrite(ledPin, LOW);
44. int ledPin = 13;
void setup()
{
Serial.begin(9600);
pinMode(ledPin, INPUT);
}
void loop()
{
int value = digitalRead(ledPin);
Serial.println(value);
}
PC와 연결
시리얼 모니터 출력
Digital 입력 연습
45. Digital 입력 - 풀업저항
Switch on => VCC
Switch off => floating
46. Digital 입력 - 풀업저항
Switch on => 0V
Switch off => VCC
47. Digital 입력 - 내부풀업저항
Switch on => 0V
Switch off => VCC
48. 내부 20kΩ 풀업 저항 사용
Digital 입력 - 내부풀업저항
pinMode(ledPin, INPUT);
digitalWrite(ledPin, HIGH);
pinMode(ledPin, INPUT_PULLUP);or
70. Day 3
Library 사용하기
아두이노 함수
Serial Class
다른 Library
String Class
C/C++ 기본
제 2과제 준비
과제3 : Serial 통신을 이용한 문자 처리
71. 데이터형 Byte 설명
boolean 1 논리형
char 1 문자형
byte 1 부호 없는 정수형
int 2 정수형
word 2 부호 없는 정수형
long 4 정수형
short 2 정수형
float 4 실수형
double 4 실수형
데이터형 ATmega 기반
Unlike other platforms,
where you can get more precision
by using a double (e.g. up to 15 digits),
On the Arduino, double is the same size as float.
C/C++ Syntax
74. 아두이노 함수 고급 입출력 함수
void tone(unit8_t pin, unsigned int frequency, unsigned long duration = 0)
pin: 핀 번호
frequency: 출력 주파수
duration: 출력 지속 시간, 밀리 초 단위
50% 듀티 사이클과 지정된 주파수를 가지는 구형파(square ware)를 출력
단음 재생 지속시간 설정 가능, 설정되지 않으면 notone 함수가 호출될 때까지 출력
특정 시간에는 하나의 핀에서 하나의 톤만을 재생 가능
동일한 핀에서 tone 함수를 다시 호출하면 새롭게 지정된 주파수의 톤이 재생
피에조 부저나 스피커를 연결하여 사용
tone 함수를 사용할 경우 3번과 11번에서 PWM을 출력할 수 없음
void notone(unit8_t pin)
76. 아두이노 함수 고급 입출력 함수
int speakerPin = 12;
int numTones = 10;
int tones[] = {261, 277, 294, 311, 330, 349, 370, 392, 415, 440};
// mid C C# D D# E F F# G G# A
void loop()
{
for (int i = 0; i < numTones; i++)
{
tone(speakerPin, tones[i]);
delay(500);
}
noTone(speakerPin);
}
77. 아두이노 함수 시간 함수
unsigned long millis(void)
프로그램이 시작된 이후의 밀리초(millisecond) 단위 경과 시간
//1초마다 프로그램이 실행된 시간을 출력
unsigned long time;
void loop()
{
Serial.print(“Time: “);
time = millis();
Serial.println(time);
delay(1000);
}
78. 아두이노 함수 수학 함수
min(x, y) //#define min(x, y) ((x) < (y) ? (a) : (b))
max(x, y) //#define max(x, y) ((x) > (y) ? (a) : (b))
abs(x) //절대값
double pow(double base, double exponent) //거듭제곱
double sqrt(double x) //x의 제곱근
double sin(double rad)
double cos(double rad)
double tan(double rad)
map(value, 200, 800, 0, 100) // 200~800 값을 0~100 값으로 mapping
constrain(x, a, b) //x가 a ,b 범위 내의 값이면 x, a보다 작은 경우 a를,
b보다 큰 경우 b를 반환
79. 아두이노 함수 난수 생성 함수
long randNumber;
void setup()
{
Serial.begin(9600);
randomSeed(analogRead(A0)); //시작
}
void loop()
{
randNumber = random(300); //0~299
randNumber = random(10, 20); //10~19
}
81. void attachInterrupt(uint8_t interrupt, void (*function)(void), int mode)
interrupt: 인터럽트 번호
function: interrupt service routine
mode: 인터럽트가 발생하는 지점
Arduino Uno
인터럽트 0 => 2번 핀, 인터럽트 1 => 3번 핀
Mode 상수
LOW => 입력 값이 LOW일 때 인터럽트 발생
CHANGE => 입력 값의 상태가 변할 때 인터럽트 발생
RISING => LOW에서 인터럽트 발생
FALLING => HIGH에서 LOW로 변할 때 인터럽트 발생
아두이노 함수 인터럽트 함수
82. 아두이노 함수 인터럽트 함수
int pin = 13;
volatile int state = LOW;
void setup()
{
pinMode(pin, OUTPUT);
attachInterrupt(0, blink, CHANGE);
}
void loop()
{
digitalWrite(pin, state);
}
void blink()
{
state = !state;
}
ISR 함수 내에서 delay 함수는 무시
ISR 함수 내에서 millis 함수 시간 증가 X
동기화를 위해 전역 변수 volatile로 선언
83. C++ Class
자동차(Class)
int speed;
int oil;
accel();
turnRight();
turnLeft();
stop();
자동차 a; //Object
a.speed = 150;
a.oil = 15;
a.accel();
a.turnRight();
a.turnLeft();
a.stop();
85. Serial Class
Serial 통신은 USART(Universal Synchronous Asynchronous Receiver Transmitter)
또는 UART로 알려진 방식으로 RS-232C 프로토콜에 정의된 내용 중에서 데이터 송수신
을 위한 세 개의 핀, RXD(receive data), TXD(transmit data), GND 핀만을 사용하여
통신을 수행한다.
PC Arduino
RXD
TXD
GND
RXD
TXD
0번 핀
1번 핀
GND
86. Serial Class
한 주기에 직렬로 한 Byte씩 보내는 방식. Arduino에서는 USB 형태의 Serial 통신을
제공하고 PC에서는 가상 Serial 포트를 통해 통신을 이용할 수 있다. 이 때, Arduino의
0번 1번 핀은 Serial 통신으로 사용할 수 없다.
PC ArduinoUSB USB
가상 Serial 포트
89. Serial Class
int peek(void)//Serial.peek();
시리얼 통신 첫 번째 바이트 데이터를 반환한다. 단, 데이터를 수신 버퍼에서 제거하지
않으므로 여러 번 peek 함수를 호출하면 버퍼 내 첫 번째에 위치한 동일한 문자가
계속적으로 반복된다. 수신 버퍼가 비어있을 경우 -1 return
PC ArduinoUSB USB
가상 Serial 포트
64bit
buffer
송신
buffer
90. Serial Class
int read(void)//Serial.read();
시리얼 통신 첫 번째 바이트 데이터를 반환한다. peek()와는 달리 수신 버퍼에서
반환한 문자를 제거한다. 수신 버퍼가 비어있을 경우 -1 return
size_t readBytes(char * buffer, size_t length)
buffer: 입력 문자를 저장한 버퍼
length: 입력 받을 최대 문자 수
반환 값: 입력 받은 문자 수
length에 지정한 byte 수의 문자를 읽었거나 시간 초과가 발생하면 종료하며
입력 받은 문자의 수를 반환한다.
size_t readBytesUntil(char terminator, char * buffer, size_t length)
readBytes와 같으나 종료 문자(terminator)를 발견하면 종료하는 부가 기능을
가지고 있다.
91. Serial Class
int parseInt(void)//Serial.parseInt();
시리얼 통신 수신 버퍼에서 첫 번째 유효한 정수를 반환한다. 현재 수신 버퍼가
비어있거나 정수가 발견되지 않으면 0을 반환한다.
int parseFloat(void)//Serial.parseFloat();
시리얼 통신 수신 버퍼에서 첫 번째 유효한 실수를 반환한다. 현재 수신 버퍼가
비어있거나 실수가 발견되지 않으면 0을 반환한다.
void flush(void)
시리얼 통신 송신 버퍼에 있는 데이터가 전송 완료할 때까지 대기한다.
92. Serial Class
Serial.print(78, BIN); //2진수
Serial.print(78, OCT); //8진수
Serial.print(78, DEC); //12진수
Serial.print(78, HEX); //16진수
Serial.print(1.23456, 0); //소수점 없음
Serial.print(1.23456, 2); //소수점 둘째 자리
93. String Class
String stringOne = “Hello String”:
stringOne = String(‘a’); //”a”
String stringTwo = String(“This is a string!”);
String stringThr = String(13); //”13”
String stringFour = stringTwo + stringThr; //”This is a stirng!13”
stringTwo += stringOne //This is a string!a
If(stringTwo != stringOne)
Serial.println(stringTwo);
else
Serial.println(stringOne);
99. 다른 라이브러리
EPROM(Erasable PROM, 삭제 가능한 롬)은 필요할 때
기억된 내용을 지우고 다른 내용을 기록할 수 있는 롬이다.
EEPROM(Electrically Erasable Programmable ROM)은
높은 전압으로 데이터를 지울 수 있다.
EEPROM
100. 다른 라이브러리
하드디스크처럼 전원이 끊어져도 데이터를 저장할 수 있는 공간이다.
기본적으로 ROM이기 때문에 쓰고 지우는 횟수가 정해져 있지만 충분히 사용할 수 있다.
1KB 정도를 저장할 수 있기 때문에 512개의 주소를 가질 수 있다.
EEPROM
101. 다른 라이브러리
#include <EEPROM.h>
int address = 10;
int value = 100;
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.println("EEPROM Write : " + String(value));
EEPROM.write(address, value); //EEPROM에 쓰기
Serial.print("EEPROM Read : ");
int inMemory = EEPROM.read(address);
Serial.println(inMemory);
while(true);
}
주소
512개가 안 넘도록 체크해주는 것이 좋다.
0~255(1Byte)
EEPROM
104. Day 4
외부장치 사용하기 1
센서 사용하기 2 (초음파 거리 센서)
데이터 저장하기
모터 제어하기
센서 사용하기 1 (광, 압력, 온도 센서)
105. 광 센서(Photo Resistor)
포토레지스터는 빛의 양에 따라 저항 값이 변하는 특성을 가지고 있다.
포토레지스터는 CdS(황화카드뮴)에 금속 다리를 결합하여 만들어진다.
광량이 높으면 광 센서의 저항이 낮아져 낮은 전압이 인가되고
광량이 낮으면 저항이 높아져 높은 전압이 인가된다.
광량을 정밀하게 측정하고자 하는 경우에는 포토다이오드나 포토 트랜지스터를 사용해야 한다.
111. 온도 센서
온도 센서는 온도에 따라 출력되는 전압이 변하는 특성을 가지는 센서로
온도가 높을 수록 높은 전압을 출력으로 낸다.
TMP36 온도 센서
2.7V ~ 5.5V 입력
Analog 전압 출력 GND
1C 증가 -> 출력 전압 10mV 증가
0.5v -> 섭씨 0도
114. 초음파 거리 센서
초음파 거리 센서는 초음파를 이용하여 거리를 측정하는 센서로
초음파는 지향성과 직진성이 높으며 공기 중에서는 340m/s의 일정한 속도로 진행한다.
115. (+)와 (-) 전압을 압전 소자에 번갈아 가할 때, 압전 소자의 변형에 의해 진동이 발생하고
초음파가 발생하는 역압전 현상과 초음파가 반사되어 돌아오는 파동에 의해 압전 소자가
진동하고 전압이 발생하는 정압전현상을 이용한다. 이를 통해 반사되어 돌아오는 시간을
측정하여 거리를 계산할 수 있다.
SRF05
초음파 거리 센서
117. SRF05의 트리거(Trigger) 핀으로 최소 10us의 펄스를 발생시키면 에코(echo) 핀으로 거리에 비
례하는 펄스가 반사되어 돌아온다. pulseIn 함수는 특정 핀으로 입력되는 펄스의 길이를 측정하는
함수로 마이크로초(us) 단위의 시간을 반환하므로 이를 통해 거리를 계산할 수 있다. 에코 핀으로
들어오는 펄스의 길이를 58로 나누면 cm 단위의 거리를 얻을 수 있다. 트리거 핀의 트리거 간격은
최소 50ms가 되어야 한다.
초음파 거리 센서
122. 모터
DC 모터(Direct Current motor): 축이 연속적으로 회전하는 형태의 모터로 전원이 끊어지는
경우에만 정지한다. 정지 시에는 관성 때문에 정확한 정지 위치를 지정하기 어렵다.
스텝터 모터(Steppter motor): 전원이 공급되면 축은 일정 각도를 회전하고 멈춘다.
따라서 축을 연속적으로 회전시키기 위해서는 모터로 펄스열이 전달되어야 한다.
서보 모터(Servo motor): DC 모터의 한 종류로 DC 모터에 귀환 회로를 추가하여 정확한 위치
제어가 가능하도록 구성된 모터이다. 가격 면에서는 비싸지만 귀환 제어를 통해 정밀 제어가
가능하고 오동작을 수정할 수 있으며, 속도 면에서도 스테핑 모터에 비해 빠른 장점이 있다.
123. DC 모터
DC 모터(Direct Current motor)
DC 모터는 두 개의 연결선을 가지며, Vcc와 GND만을 연결하면 연결 방향에 따라 정회전 또는 역회전
하는 모터이다. 아두이노의 출력 핀에서 공급할 수 있는 최대 전류는 40mA이고 이는 소형 DC 모터의
구동 전류에도 미치지 못하는 경우가 많으므로 정상적으로 동작시킬 수 없다. 따라서 전용 외부 전원
과 전원 제어용 트랜지스터를 사용한다. 트랜지스터는 일종의 스위치 역할을 하여 아두이노 핀의 적
은 전류로 모터 구동에 필요한 많은 전류를 제어할 수 있도록 해준다. 실험에 사용할 NPN 타입의
P2N2222 트랜지스터로 베이스에 연결된 아두이노 핀의 출력이 1인 경우 콜렉터(collector)에서 에
미터(emitter)로 전류가 흐르게 되며, 아두이노 핀의 출력이 0인 경우 콜렉터에서 에미터로 전류가
흐르지 않는다,
124. 트랜지스터는 서로 다른 종류의 반도체를 접합하여 만든 소자이며, 접합된 반도체의 종류에
따라 NPN 형과 PNP형으로 나뉜다. 두 유형의 트랜지스터는 극성이 반대인 점을 제외하면
동작 원리는 동일하다.
트랜지스터는 베이스(base), 에미터(emitter), 콜렉터(collector)로 구성되며, 베이스로 입
력되는 전류의 작은 변화로 콜렉터와 에미터 사이에 흐르는 전류에 큰 변화를 줄 수 있으므로
증폭이나 스위칭을 위한 소자로 사용된다.
NPN형 P2N2222
DC 모터
http://recipes.egloos.com/4971003
125. 전류 200mA로 소형 DC모터 제어는 가능하다. 하지만 많은 전류를 필요로 하는 모터의 경우 외
부 전원이 필요하며, P2N2222 트랜지스터의 경우 최대 600mA 전류를 제어할 수 있지만, 그 이
상의 전류 제어가 필요한 경우 그에 맞는 트랜지스터를 사용해야 한다.
DC 모터
http://www.electricrcaircraftguy.com/2014/02/arduino-power-current-and-voltage.html
126. 다이오드는 한 방향으로만 전류가 흐르도록 하는 반도체 부품을 말한다. 다이오드 중 양극
(anode)에서 음극(cathode)으로만 전류가 흐르는 특징을 이용한 다이오드를 정류 다이오드
(rectifier diode)라고 하며, 일반적으로 말하는 다이오드는 정류 다이오드를 가리킨다. 이때
전류가 흐르도록 다이오드가 연결된 것을 순방향 연결(forward bias)이라 하고, 전류가 흐르지
않도록 연결된 것을 역방향 연결(reverse bias)라고 한다.
DC 모터
127. 정류 다이오드는 교류 전원을 직류 전원으로 변환하거나 역방향의 전류로부터 회로를 보호하는
목적으로 많이 사용된다. 정류 다이오드를 사용할 때는 다이오드에 허용되는 순방향 최대 전류
및 전압과 역방향 최대 전압을 고려해야 하고 다이오드에서 전압 감소가 발생한다는 점에도 주의
해야 한다.
1N4001
DC 모터
131. 스텝터 모터
스텝터모터는 펄스신호에 의해 작동되는 모터로서 1펄스마다 수도~수십도의 각도만 회전하는 모터이다.
각종 전자기기나 자동차 등의 정밀 제어가 필요한 부분에 두루 쓰이는 모터이다.
모터 드라이버
132. void loop() {
// 시계 반대 방향으로 한바퀴 회전
Serial.println("counterclockwise");
myStepper.step(stepsPerRevolution);
delay(1000);
// 시계 방향으로 한바퀴 회전
Serial.println("clockwise");
myStepper.step(-stepsPerRevolution);
delay(1000);
}
#include <Stepper.h>
// 회전각도 설정 2048 => 한바퀴(360도)
const int stepsPerRevolution = 2048; //360도
// 모터 드라이브에 연결된 핀 IN4, IN2, IN3, IN1
Stepper myStepper(stepsPerRevolution,11,9,10,8);
void setup() {
myStepper.setSpeed(14); //모터 회전속도 설정
Serial.begin(9600);
}
스텝터 모터
133. 모터 쉴드
앞에서는 적은 전류만을 필요로 하는 소형 모터를 사용하였기 때문에 USB로 공급되는 전원만으로도
모터의 구동이 가능하였지만, 특히 DC 모터의 경우 고전압, 고전류를 요구하는 경우가 많아 별도의
전원 공급 회로가 필요하다. 또한 모터 회전 방향 제어를 위한 별도의 칩을 사용하는 것이 일반적이다.
134. 아두이노 모터 쉴드 L298칩
모터 쉴드를 사용하면 두 채널을 통해 두 개의 DC 모터 방향과 속도를 개별적으로 제어할 수 있다.
모터 쉴드
135. 모터 구동을 위한 외부 전원
12V 에서 채널당 최대 2A
모터 쉴드 1. 아두이노의 2.1 파이 DC잭으로부터 전원공급을 받는다.(USB X)
2. DC 전원과 외부 전원 둘다 사용한다.
3. 9V 이상 모터 사용시 Vin 핀을 절단하고 보드와 쉴드를 분리
139. Day 5 외부장치 사용하기 2
App Inventor 2
Wifi 통신
납땜하기
블루투스 통신
기타 외부 장치
140. 블루투스 통신
블루투스(Bluetooth)는 1994년 에릭슨(Ericsson)이 개발한 개인 근거리 무선 통신
(Persoanl Area Network, PAN)을 위한 표준으로 RS-232를 대체하기 위한 저가격,
저전력의 무선 기술로 개발되었다. 기본적으로 10m 이내에서의 통신을 목표로 하며
이 범위는 100m까지 확장 가능하다. 블루투스는 2.4GHz 대역인 ISM(Industrial,
Scientific, Medical) 대역을 사용하고 있다.
141. HC-06 슬레이브 모듈
SPP(Serial Port Profile)
HC-06 블루투스 모듈은 VCC, GND, RX, TX의 네 핀을 연결하여 사용한다.
블루투스는 무선 연결이고 시리얼 통신과는 그 방식이 다르지만, 블루투스 모듈에서 무선 통신을
담당하므로 사용자는 유선 시리얼 통신과 동일한 방법으로 사용 할 수 있다. 이를 SPP라고 한다.
블루투스 통신
142. 0번과 1번 핀은 하드웨어 시리얼 연결을 위해 사용되는 핀으로 컴퓨터와 USB 연결을
통해 시리얼 통신을 수행한다. 따라서 블루투스 모듈을 0번과 1번 이외의 핀에 연결하고
소프트웨어 시리얼을 사용하여 통신을 수행한다.
블루투스 통신
143. #include <SoftwareSerial.h>
SoftwareSerial BTSerial(3, 2); //(RX, TX)
void setup()
{
Serial.begin(9600);
BTSerial.begin(9600);
}
void loop()
{
//device -> Bluetooth -> Arduino -> PC
if(BTSerial.available())
Serial.write(BTSerial.read());
//PC -> Arduino -> Bluetooth -> device
if(Serial.available())
BTSerial.write(Serial.read());
}
블루투스 통신 PC & Arduino 연결
144. 블루투스 모듈 설정
//default name: linvor
//default password: 1234
//default speed: 9600
//default setting: 8 data bit, 1 stop bit, no parity bit
AT -> “OK” 출력
AT+NAMEcapblue -> 블루투스 모듈 이름을 “capblue”로 설정
AT+PIN1111 -> 모듈 비밀번호를 1111로 설정
AT+BAUD04 -> 속도 변경(4는 9600)
Bluetooth 모듈에 다음의 명령어를 통하여 설정을 변경할 수 있다
블루투스 통신
145. SmartPhone – Arduino 연결
“Bluetooth spp tools pro”
Bluetooth 통신을 테스트 할 수 있는 App
블루투스 통신
146. HC-06
Bluetooth Master - Slave 연결
Arduino 1 Arduino 2
Master Slave
두 대의 Arduino를 연결하기 위해서는 하나가 Master 모듈이어야 한다(일대일 통신만 가능)
블루투스 통신
147. MIT App Inventor2를 활용하여 Bluetooth 통신을 통해
LED를 On/Off하는 App을 제작해보자
블루투스 통신 App Inventor