SlideShare une entreprise Scribd logo
1  sur  157
Télécharger pour lire hors ligne
2015-2 공학설계입문
한동대학교 전산전자공학부
한상준
Day 1
Arduino Overview
Day 1
Arduino Overview
IoT의 시작
IoT 사례
Arduino란 무엇인가
Arduino의 종류
Arduino의 개발환경
Uno 소프트웨어 구조
Uno 하드웨어 구조
Arduino 부속품과 센서
Arduino 구입하기, 사업자지출증빙
2015년도 신기술 하이프 사이클(Hype Cycle for Emerging Technologies, 2015. 7)(가트너)
IoT의 시작
IoT(Internet of Things, 사물인터넷)
“지능화된 사물들이 연결되어 형성되는 네트워크상에서 사람과 사물
(물리 또는 가상), 사물과 사물 간에 상호 소통하고 상황인식 기반의
지식이 결합되어 지능적인 서비스를 제공하는 글로벌 인프라”
12년 ITU-T Y.2060(Y.IoT-overview) 표준문서
IoT의 시작
IoT
사람
사물
사물
가상
환경
네트워크
운영체제
인공지능
클라우드
빅데이터
임베디드
모바일
보안
웹
전자심화
…
CES 2016 – LG Smart Home
https://www.youtube.com/watch?v=pXOAao7f6SA
Arduino란?
아트멜(Atmel)사의 마이크로컨트롤러 기반으로
만들어진 소형 보드와 프로그램을 개발할 수 있는
소프트웨어 개발 환경까지 함께 이르는 말
Arduino란?
2005년 이탈리아 밀라노 옆에 위치한 이브레아에서
예술가, 디자이너 및 학생들이 쉽게 사용할 수 있는
저렴한 컨트롤 장치를 만들 수 있도록 하기 위해 시작됨
Arduino란?
저렴한 가격
다양한 운영체제 지원
쉽고 간단한 프로그래밍 환경
USB 지원
오픈 소스 소프트에어
오픈 소스 하드웨어
Arduino의 종류
Arduino Uno R3
USB 컨넥터
외부전원
리셋버튼
아날로그 핀
디지털 핀
ISP 연결컨넥터
USB 시리얼 변환 컨트롤러
ATmega32816MHz 클록
https://www.arduino.cc/
Arduino 개발환경
Arduino 개발환경
Sketch -> .ino
C++ -> .cpp
소프트웨어 구조
setup
loop
USB 연결
리셋을 누르면
반복
Arduino 부속품
저항
보드
전선
다이오드
브레드보드
가변저항
누름 스위치트랜지스터
Arduino 외부장치
온도센서
광센서
사운드센서
압력센서
초음파 거리 센서
블루트스 모듈
모터쉴드
Arduino 구입하기
http://www.alibaba.com
https://www.eleparts.co.kr
http://www.devicemart.co.kr
미리 공부하기
https://opentutorials.org/module/682
전기, 브레드 보드, Arduino 기본
http://kocoafab.cc/
Arduino 응용
Day 2
Digital/Analog 입출력
Day 2
Digital/Analog 입출력
LED On/Off 무작정 따라하기
Digital 입출력
Analog 입출력
과제1 : PWM 연습
전기의 기본/저항
제 2과제 준비
과제2 : Analog 입출력 연습
전기의 기본
전류는 (+)극에서 (-)극으로 흐른다
전류, 전압, 저항, 옴의 법칙(V=IR)
Short Cicuit을 조심해야 한다(저항을 연결해야 한다)
다이오드(LED)는 전류가 한 방향으로만 흐른다
아두이노에서 사용하는 전류는 DC 전류이다
저항
저항의 첫 번째 띠와 두 번째 띠는 저항 값을, 세 번째는 제곱승을, 네 번째는 오차 범위를 나타낸다.
Ex) 10k옴 => 갈색(1), 검정색(0), 주황색(10^3), 금색(+-5%)
무작정 따라하기1
무작정 따라하기1
무작정 따라하기2
무작정 따라하기2
int ledPin = 13;
void setup()
{
pinMode(ledPin, OUTPUT);
}
void loop()
{
digitalWrite(ledPin, HIGH);
delay(1000);
digitalWrite(ledPin, LOW);
delay(1000);
}
13번 Digital Pin을 출력모드로 설정한다.
13번 Pin을 5V으로 출력(1)
13번 Pin을 0V으로 출력(0)
1초 delay
Analog VS Digital
Analog Signal
연속적으로 변하는 물리량
5V, Vcc, 1
0V, GND, 0
Digital Signal
이산적으로 수치가 변함
digitalWrite(ledPin, HIGH);
digitalWrite(ledPin, LOW);
Digital 입출력
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, HIGH);
Digital 출력
pinMode(ledPin, INPUT);
int value = digitalRead(ledPin);
Digital 입력
Digital 입력 연습
int ledPin = 13;
void setup()
{
Serial.begin(9600);
pinMode(ledPin, INPUT);
}
void loop()
{
int value = digitalRead(ledPin);
Serial.println(value);
}
PC와 연결
시리얼 모니터 출력
Digital 입력 연습
Digital 입력 - 풀업저항
Switch on => VCC
Switch off => floating
Digital 입력 - 풀업저항
Switch on => 0V
Switch off => VCC
Digital 입력 - 내부풀업저항
Switch on => 0V
Switch off => VCC
내부 20kΩ 풀업 저항 사용
Digital 입력 - 내부풀업저항
pinMode(ledPin, INPUT);
digitalWrite(ledPin, HIGH);
pinMode(ledPin, INPUT_PULLUP);or
내부풀업저항 연습 1
int ledPin = 2;
void setup() {
Serial.begin(9600);
pinMode(ledPin, INPUT);
digitalWrite(ledPin, HIGH);
}
void loop() {
int value = digitalRead(ledPin);
Serial.println(value);
}
내부풀업저항 연습 1
int ledPin = 2;
void setup() {
Serial.begin(9600);
pinMode(ledPin, INPUT_PULLUP);
}
void loop() {
int value = digitalRead(ledPin);
Serial.println(value);
}
내부풀업저항 연습 1
스위치로 연결된 풀업저항 값을 2번 핀으로 읽어
13번 핀에 연결된 LED On/Off
내부풀업저항 연습 2
내부풀업저항 연습 2
내부풀업저항 연습 2
int buttonIn = 2;
int buttonState = 0;
int ledPin = 13;
void setup() {
pinMode(buttonIn, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);
}
void loop() {
buttonState = digitalRead(buttonIn);
digitalWrite(ledPin, buttonState);
}
내부풀업저항 연습 2
13번 핀은 풀업 저항으로 사용하지 않는 것을 권장!
Digital 입력 - 풀다운저항
Switch on => VCC
Switch off => 0V
Digital 출력 - PWM 출력
~11, ~10, ~9, ~6, ~5, ~3
PWM(Pulse Width Modulation)은 디지털 신호를 출력하면서도
아날로그 신호와 같은 효과를 낼 수 있으며 analogWrite 함수를
사용하여 0부터 255까지 출력할 수 있다.
Digital 출력 - PWM 출력
analogWrite(ledPin, 0~255);
Digital 출력 - PWM 출력
서서히 밝아지는 LED 구현
PWM 출력 연습
PWM 출력 연습
int ledPin = 11;
void setup() {
pinMode(ledPin, OUTPUT);
}
void loop() {
for(int i=0;i<256;i++)
{
analogWrite(ledPin, i);
delay(50);
}
}
PWM 출력 연습
Analog 입력
static const uint_t A0 = 14;
static const uint_t A1 = 15;
static const uint_t A2 = 16;
static const uint_t A3 = 17;
static const uint_t A4 = 18;
static const uint_t A5 = 19;
pinMode(A0, OUTPUT);
digitalWrite(A0, HIGH);
Digital 입출력으로도 사용가능하다.
pinMode(A0, INPUT);
int value = analogRead(A0);
Analog 입력(0~1023)
Analog 입력
Analog 입력 연습
if(readCurrent != readPrevious)
{
readPrevious = readCurrent;
echoStr = "Current analog input : " + String(readCurrent);
Serial.println(echoStr);
}
Analog 입력 연습
int readPrevious = 0;
int readCurrent = 0;
void setup() {
Serial.begin(9600);
pinMode(A0, INPUT);
}
void loop() {
String echoStr;
readCurrent = analogRead(A0);
if(readCurrent != readPrevious)
{
readPrevious = readCurrent;
echoStr = "Current analog input : " + String(readCurrent);
Serial.println(echoStr);
}
}
Analog 입력 연습
Day 3
Library 사용하기
Day 3
Library 사용하기
아두이노 함수
Serial Class
다른 Library
String Class
C/C++ 기본
제 2과제 준비
과제3 : Serial 통신을 이용한 문자 처리
데이터형 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
C/C++ Syntax
C 기반 String 다루기
char str1[8] = {‘a’, ‘r’, ‘d’, ‘I’, ‘n’, ‘o’};
char str2[8] = “arduino”;
char * str = “arduino”;
str1 = str2; (str1, 2가 배열일 경우 X)
str1 = “arduino”; (str1이 배열일 경우 X)
strcat(str1, str2);
strcpy(str1, str2);
strcmp(str1, str2);
strlen(str1);
아두이노 함수
#include <Arduino.h>
디지털 입출력 함수
아날로그 입출력 함수
고급 입출력 함수
시간 함수
수학 함수
삼각 함수
난수 생성 함수
비트 조작 함수
인터럽트 함수
아두이노 함수 고급 입출력 함수
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)
아두이노 함수 고급 입출력 함수
아두이노 함수 고급 입출력 함수
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);
}
아두이노 함수 시간 함수
unsigned long millis(void)
프로그램이 시작된 이후의 밀리초(millisecond) 단위 경과 시간
//1초마다 프로그램이 실행된 시간을 출력
unsigned long time;
void loop()
{
Serial.print(“Time: “);
time = millis();
Serial.println(time);
delay(1000);
}
아두이노 함수 수학 함수
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를 반환
아두이노 함수 난수 생성 함수
long randNumber;
void setup()
{
Serial.begin(9600);
randomSeed(analogRead(A0)); //시작
}
void loop()
{
randNumber = random(300); //0~299
randNumber = random(10, 20); //10~19
}
아두이노 함수 인터럽트 함수
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로 변할 때 인터럽트 발생
아두이노 함수 인터럽트 함수
아두이노 함수 인터럽트 함수
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로 선언
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();
Serial Class
Serial_(Class)
long baud;
begin(baud);
println(value);
available();
read();
Serial_ Serial; //Object
Serial.begin(9600);
Serial.println(value);
Serial.available();
Serial.read();
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
Serial Class
한 주기에 직렬로 한 Byte씩 보내는 방식. Arduino에서는 USB 형태의 Serial 통신을
제공하고 PC에서는 가상 Serial 포트를 통해 통신을 이용할 수 있다. 이 때, Arduino의
0번 1번 핀은 Serial 통신으로 사용할 수 없다.
PC ArduinoUSB USB
가상 Serial 포트
Serial Class
char incomingChar;
void setup()
{
Serial.begin(9600);
}
void loop()
{
if(Serial.available() > 0)
{
incomingChar = Serial.read();
Serial.print(“I receive: “);
Serial.println(incomingChar);
delay(1000);
}
}
Serial Class
00
11
01
10
1초
void begin(unsigned long baud) //Serial.begin(9600);
baud: 속도(baud rate(보율))
1초에 4번 변했다 => 4baud
bits per second(bps) => 8bps
Serial Class
int peek(void)//Serial.peek();
시리얼 통신 첫 번째 바이트 데이터를 반환한다. 단, 데이터를 수신 버퍼에서 제거하지
않으므로 여러 번 peek 함수를 호출하면 버퍼 내 첫 번째에 위치한 동일한 문자가
계속적으로 반복된다. 수신 버퍼가 비어있을 경우 -1 return
PC ArduinoUSB USB
가상 Serial 포트
64bit
buffer
송신
buffer
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)를 발견하면 종료하는 부가 기능을
가지고 있다.
Serial Class
int parseInt(void)//Serial.parseInt();
시리얼 통신 수신 버퍼에서 첫 번째 유효한 정수를 반환한다. 현재 수신 버퍼가
비어있거나 정수가 발견되지 않으면 0을 반환한다.
int parseFloat(void)//Serial.parseFloat();
시리얼 통신 수신 버퍼에서 첫 번째 유효한 실수를 반환한다. 현재 수신 버퍼가
비어있거나 실수가 발견되지 않으면 0을 반환한다.
void flush(void)
시리얼 통신 송신 버퍼에 있는 데이터가 전송 완료할 때까지 대기한다.
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); //소수점 둘째 자리
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);
String stringOne = “Hello String”:
Serial.println(stringOne.length()); //12
stringOne.toLowerCase();
Serial.println(stringOne); //”hello string”
stringOne.toUpperCase();
Serial.println(stringOne); //”HELLO STRING”
for(int i=0;i<stringOne.length();i++)
Serial.println(stringOne[i]);
String Class
void loop()
{
String str1 = “0123”;
String str2 = “123a”;
String str3 = “abc”;
Serial.println(str1.toInt()); //123
Serial.println(str2.toInt()); //123
Serial.println(str3.toInt()); //0
}
String Class
“On”이 전송될 경우 => 9번 Pin의 LED on
“OFF”가 전송될 경우 => 9번 Pin의 LED off
Serial & String Class 연습
int ledPin = 9;
String inputString;
void setup() {
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
}
void loop() {
if(Serial.available() > 0)
{
char inChar = Serial.read();
inputString += inChar;
inputString.toLowerCase();
if(inputString == "on")
{
digitalWrite(ledPin, HIGH);
Serial.println("LED On!!");
inputString = "";
}
else
if(inputString == "off")
{
digitalWrite(ledPin, LOW);
Serial.println("LED Off!!");
inputString = "";
}
}
}
다른 라이브러리
스케치 -> Include Library
기본 라이브러리
다른 라이브러리
EPROM(Erasable PROM, 삭제 가능한 롬)은 필요할 때
기억된 내용을 지우고 다른 내용을 기록할 수 있는 롬이다.
EEPROM(Electrically Erasable Programmable ROM)은
높은 전압으로 데이터를 지울 수 있다.
EEPROM
다른 라이브러리
하드디스크처럼 전원이 끊어져도 데이터를 저장할 수 있는 공간이다.
기본적으로 ROM이기 때문에 쓰고 지우는 횟수가 정해져 있지만 충분히 사용할 수 있다.
1KB 정도를 저장할 수 있기 때문에 512개의 주소를 가질 수 있다.
EEPROM
다른 라이브러리
#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
다른 라이브러리확장 라이브러리
C:UsersSangJunDocuments(내 문서)Arduinolibraries
Day 4
외부장치 사용하기 1
Day 4
외부장치 사용하기 1
센서 사용하기 2 (초음파 거리 센서)
데이터 저장하기
모터 제어하기
센서 사용하기 1 (광, 압력, 온도 센서)
광 센서(Photo Resistor)
포토레지스터는 빛의 양에 따라 저항 값이 변하는 특성을 가지고 있다.
포토레지스터는 CdS(황화카드뮴)에 금속 다리를 결합하여 만들어진다.
광량이 높으면 광 센서의 저항이 낮아져 낮은 전압이 인가되고
광량이 낮으면 저항이 높아져 높은 전압이 인가된다.
광량을 정밀하게 측정하고자 하는 경우에는 포토다이오드나 포토 트랜지스터를 사용해야 한다.
광 센서(Photo Resistor)
void setup() {
Serial.begin(9600);
}
void loop() {
int val = analogRead(A0);
Serial.println(val);
delay(500);
}
광 센서(Photo Resistor)
압력 센서
압력 센서는 누르는 힘에 의해 저항 값이 변하는 센서로
누르는 힘이 커질수록 저항 값이 줄어드는 특성을 갖는다.
압력 센서
void setup() {
Serial.begin(9600);
}
void loop() {
int val = analogRead(A0);
Serial.println(val);
delay(500);
}
압력 센서
온도 센서
온도 센서는 온도에 따라 출력되는 전압이 변하는 특성을 가지는 센서로
온도가 높을 수록 높은 전압을 출력으로 낸다.
TMP36 온도 센서
2.7V ~ 5.5V 입력
Analog 전압 출력 GND
1C 증가 -> 출력 전압 10mV 증가
0.5v -> 섭씨 0도
온도 센서
void setup() {
Serial.begin(9600);
}
void loop() {
int reading = analogRead(A0);
float voltage = reading * 5.0 / 1024.0;
float tempC = (voltage - 0.5) * 100;
Serial.print(voltage);
Serial.println("V");
Serial.print(tempC);
Serial.println("C");
delay(500);
}
온도 센서
초음파 거리 센서
초음파 거리 센서는 초음파를 이용하여 거리를 측정하는 센서로
초음파는 지향성과 직진성이 높으며 공기 중에서는 340m/s의 일정한 속도로 진행한다.
(+)와 (-) 전압을 압전 소자에 번갈아 가할 때, 압전 소자의 변형에 의해 진동이 발생하고
초음파가 발생하는 역압전 현상과 초음파가 반사되어 돌아오는 파동에 의해 압전 소자가
진동하고 전압이 발생하는 정압전현상을 이용한다. 이를 통해 반사되어 돌아오는 시간을
측정하여 거리를 계산할 수 있다.
SRF05
초음파 거리 센서
초음파 거리 센서
SRF05의 트리거(Trigger) 핀으로 최소 10us의 펄스를 발생시키면 에코(echo) 핀으로 거리에 비
례하는 펄스가 반사되어 돌아온다. pulseIn 함수는 특정 핀으로 입력되는 펄스의 길이를 측정하는
함수로 마이크로초(us) 단위의 시간을 반환하므로 이를 통해 거리를 계산할 수 있다. 에코 핀으로
들어오는 펄스의 길이를 58로 나누면 cm 단위의 거리를 얻을 수 있다. 트리거 핀의 트리거 간격은
최소 50ms가 되어야 한다.
초음파 거리 센서
int distance;
int triggerPin = 12;
int echoPin = 11;
void setup()
{
Serial.begin(9600);
pinMode(triggerPin, OUTPUT);
pinMode(echoPin, INPUT);
}
void loop()
{
digitalWrite(triggerPin, HIGH);
delayMicroseconds(10);
digitalWrite(triggerPin, LOW);
distance = pulseIn(echoPin, HIGH) / 58;
Serial.println(“Distance(cm) = “ + String(distance));
delay(1000);
}
초음파 거리 센서
데이터 txt로 저장하기
1. 시리얼 모니터 내용 무식하게 복사
데이터 txt로 저장하기
2. 윈도우 cmd 시리얼 Listening 명령어
3. XShell과 같은 유틸리티 사용
데이터 엑셀로 저장하기
https://www.parallax.com/downloads/plx-daq
http://kocoafab.cc/tutorial/view/472
모터
DC 모터(Direct Current motor): 축이 연속적으로 회전하는 형태의 모터로 전원이 끊어지는
경우에만 정지한다. 정지 시에는 관성 때문에 정확한 정지 위치를 지정하기 어렵다.
스텝터 모터(Steppter motor): 전원이 공급되면 축은 일정 각도를 회전하고 멈춘다.
따라서 축을 연속적으로 회전시키기 위해서는 모터로 펄스열이 전달되어야 한다.
서보 모터(Servo motor): DC 모터의 한 종류로 DC 모터에 귀환 회로를 추가하여 정확한 위치
제어가 가능하도록 구성된 모터이다. 가격 면에서는 비싸지만 귀환 제어를 통해 정밀 제어가
가능하고 오동작을 수정할 수 있으며, 속도 면에서도 스테핑 모터에 비해 빠른 장점이 있다.
DC 모터
DC 모터(Direct Current motor)
DC 모터는 두 개의 연결선을 가지며, Vcc와 GND만을 연결하면 연결 방향에 따라 정회전 또는 역회전
하는 모터이다. 아두이노의 출력 핀에서 공급할 수 있는 최대 전류는 40mA이고 이는 소형 DC 모터의
구동 전류에도 미치지 못하는 경우가 많으므로 정상적으로 동작시킬 수 없다. 따라서 전용 외부 전원
과 전원 제어용 트랜지스터를 사용한다. 트랜지스터는 일종의 스위치 역할을 하여 아두이노 핀의 적
은 전류로 모터 구동에 필요한 많은 전류를 제어할 수 있도록 해준다. 실험에 사용할 NPN 타입의
P2N2222 트랜지스터로 베이스에 연결된 아두이노 핀의 출력이 1인 경우 콜렉터(collector)에서 에
미터(emitter)로 전류가 흐르게 되며, 아두이노 핀의 출력이 0인 경우 콜렉터에서 에미터로 전류가
흐르지 않는다,
트랜지스터는 서로 다른 종류의 반도체를 접합하여 만든 소자이며, 접합된 반도체의 종류에
따라 NPN 형과 PNP형으로 나뉜다. 두 유형의 트랜지스터는 극성이 반대인 점을 제외하면
동작 원리는 동일하다.
트랜지스터는 베이스(base), 에미터(emitter), 콜렉터(collector)로 구성되며, 베이스로 입
력되는 전류의 작은 변화로 콜렉터와 에미터 사이에 흐르는 전류에 큰 변화를 줄 수 있으므로
증폭이나 스위칭을 위한 소자로 사용된다.
NPN형 P2N2222
DC 모터
http://recipes.egloos.com/4971003
전류 200mA로 소형 DC모터 제어는 가능하다. 하지만 많은 전류를 필요로 하는 모터의 경우 외
부 전원이 필요하며, P2N2222 트랜지스터의 경우 최대 600mA 전류를 제어할 수 있지만, 그 이
상의 전류 제어가 필요한 경우 그에 맞는 트랜지스터를 사용해야 한다.
DC 모터
http://www.electricrcaircraftguy.com/2014/02/arduino-power-current-and-voltage.html
다이오드는 한 방향으로만 전류가 흐르도록 하는 반도체 부품을 말한다. 다이오드 중 양극
(anode)에서 음극(cathode)으로만 전류가 흐르는 특징을 이용한 다이오드를 정류 다이오드
(rectifier diode)라고 하며, 일반적으로 말하는 다이오드는 정류 다이오드를 가리킨다. 이때
전류가 흐르도록 다이오드가 연결된 것을 순방향 연결(forward bias)이라 하고, 전류가 흐르지
않도록 연결된 것을 역방향 연결(reverse bias)라고 한다.
DC 모터
정류 다이오드는 교류 전원을 직류 전원으로 변환하거나 역방향의 전류로부터 회로를 보호하는
목적으로 많이 사용된다. 정류 다이오드를 사용할 때는 다이오드에 허용되는 순방향 최대 전류
및 전압과 역방향 최대 전압을 고려해야 하고 다이오드에서 전압 감소가 발생한다는 점에도 주의
해야 한다.
1N4001
DC 모터
DC 모터
DC 모터
int motorPin = 3;
void setup() {
Serial.begin(9600);
pinMode(motorPin, OUTPUT);
}
void loop() {
if(Serial.available() > 0) {
int speed = Serial.parseInt();
if(speed >= 0 && speed <= 255) {
Serial.println("Current Speed: " + String(speed));
analogWrite(motorPin, speed);
}
}
}
DC 모터
스텝터 모터
스텝터모터는 펄스신호에 의해 작동되는 모터로서 1펄스마다 수도~수십도의 각도만 회전하는 모터이다.
각종 전자기기나 자동차 등의 정밀 제어가 필요한 부분에 두루 쓰이는 모터이다.
모터 드라이버
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);
}
스텝터 모터
모터 쉴드
앞에서는 적은 전류만을 필요로 하는 소형 모터를 사용하였기 때문에 USB로 공급되는 전원만으로도
모터의 구동이 가능하였지만, 특히 DC 모터의 경우 고전압, 고전류를 요구하는 경우가 많아 별도의
전원 공급 회로가 필요하다. 또한 모터 회전 방향 제어를 위한 별도의 칩을 사용하는 것이 일반적이다.
아두이노 모터 쉴드 L298칩
모터 쉴드를 사용하면 두 채널을 통해 두 개의 DC 모터 방향과 속도를 개별적으로 제어할 수 있다.
모터 쉴드
모터 구동을 위한 외부 전원
12V 에서 채널당 최대 2A
모터 쉴드 1. 아두이노의 2.1 파이 DC잭으로부터 전원공급을 받는다.(USB X)
2. DC 전원과 외부 전원 둘다 사용한다.
3. 9V 이상 모터 사용시 Vin 핀을 절단하고 보드와 쉴드를 분리
모터 쉴드
int DIRECTION_PIN = 12;
int VELOCITY_PIN = 3;
int BRAKE_PIN = 9;
//채널 A에 대해서
void setup() {
pinMode(DIRECTION_PIN, OUTPUT);
pinMode(BRAKE_PIN, OUTPUT);
}
void loop() {
digitalWrite(BRAKE_PIN, LOW); //브레이크 해제
digitalWrite(DIRECTION_PIN, HIGH); //정방향 회전
analogWrite(VELOCITY_PIN, 255); //최고 속도
delay(3000);
analogWrite(VELOCITY_PIN, 0); //정지
delay(1000);
digitalWrite(DIRECTION_PIN, LOW); //역방향 회전
analogWrite(VELOCITY_PIN, HIGH); //최고 속도
}
모터 쉴드
Day 5
외부장치 사용하기 2
Day 5 외부장치 사용하기 2
App Inventor 2
Wifi 통신
납땜하기
블루투스 통신
기타 외부 장치
블루투스 통신
블루투스(Bluetooth)는 1994년 에릭슨(Ericsson)이 개발한 개인 근거리 무선 통신
(Persoanl Area Network, PAN)을 위한 표준으로 RS-232를 대체하기 위한 저가격,
저전력의 무선 기술로 개발되었다. 기본적으로 10m 이내에서의 통신을 목표로 하며
이 범위는 100m까지 확장 가능하다. 블루투스는 2.4GHz 대역인 ISM(Industrial,
Scientific, Medical) 대역을 사용하고 있다.
HC-06 슬레이브 모듈
SPP(Serial Port Profile)
HC-06 블루투스 모듈은 VCC, GND, RX, TX의 네 핀을 연결하여 사용한다.
블루투스는 무선 연결이고 시리얼 통신과는 그 방식이 다르지만, 블루투스 모듈에서 무선 통신을
담당하므로 사용자는 유선 시리얼 통신과 동일한 방법으로 사용 할 수 있다. 이를 SPP라고 한다.
블루투스 통신
0번과 1번 핀은 하드웨어 시리얼 연결을 위해 사용되는 핀으로 컴퓨터와 USB 연결을
통해 시리얼 통신을 수행한다. 따라서 블루투스 모듈을 0번과 1번 이외의 핀에 연결하고
소프트웨어 시리얼을 사용하여 통신을 수행한다.
블루투스 통신
#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 연결
블루투스 모듈 설정
//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 모듈에 다음의 명령어를 통하여 설정을 변경할 수 있다
블루투스 통신
SmartPhone – Arduino 연결
“Bluetooth spp tools pro”
Bluetooth 통신을 테스트 할 수 있는 App
블루투스 통신
HC-06
Bluetooth Master - Slave 연결
Arduino 1 Arduino 2
Master Slave
두 대의 Arduino를 연결하기 위해서는 하나가 Master 모듈이어야 한다(일대일 통신만 가능)
블루투스 통신
MIT App Inventor2를 활용하여 Bluetooth 통신을 통해
LED를 On/Off하는 App을 제작해보자
블루투스 통신 App Inventor
Designer
블루투스 통신 App Inventor
Blocks
블루투스 통신 App Inventor
void loop() {
if(BTSerial.available())
{
char inChar = BTSerial.read();
inputString += inChar;
if(inputString == "on")
{
digitalWrite(ledPin, HIGH);
Serial.println("LED ON!");
inputString = "";
}
if(inputString == "off")
{
digitalWrite(ledPin, LOW);
Serial.println("LED OFF!");
inputString = "";
}
}
}
#include <SoftwareSerial.h>
SoftwareSerial BTSerial(3, 2);
int ledPin = 8;
String inputString;
void setup() {
Serial.begin(9600);
BTSerial.begin(9600);
pinMode(ledPin, OUTPUT);
}
블루투스 통신 App Inventor
블루투스 통신 App Inventor
https://www.youtube.com/watch?v=xjtxrxVauZg
Wifi 통신
Arduino PC
Wifi
센서
Client Server
request
response
Wifi 통신
Arduino PC
Wifi
센서
Server Client
request
response
Wifi 통신
http://kocoafab.cc/make/view/359
http://openweathermap.org/
날씨 데이터 가져오기
기타 외부장치 릴레이 모듈 int relay = 9;
void setup()
{
pinMode(relay, OUTPUT);
digitalWrite(relay, LOW);
}
void loop()
{
digitalWrite(relay, HIGH);
delay(5000);
digitalWrite(relay, LOW);
delay(5000);
}
가전 제품의 전원을 컨트롤 하기 위해 사용
기타 외부장치 우적 센서
비, 물, 습도 등을 감지하는 센서, 수분량에 따른 저항의 변화
판이 건조하면 Digital -> HIGH
판에 물이 묻으면 Digital -> LOW
우적 정도를 Analog로 측정 가능
가변 저항으로 threshold 값 조정
기타 외부장치 토양 수분 센서
판이 건조하면 Digital -> HIGH
판에 물이 묻으면 Digital -> LOW
우적 정도를 Analog로 측정 가능
가변 저항으로 threshold 값 조정
토양 내 수분함량 측정, 수분량에 따른 저항의 변화

Contenu connexe

Tendances

행동 기반 게임오브젝트
행동 기반 게임오브젝트행동 기반 게임오브젝트
행동 기반 게임오브젝트
kgun86
 
NDC 2014, 피할 수 없는 문자열의 세계
NDC 2014, 피할 수 없는 문자열의 세계NDC 2014, 피할 수 없는 문자열의 세계
NDC 2014, 피할 수 없는 문자열의 세계
tcaesvk
 

Tendances (20)

Arcus
ArcusArcus
Arcus
 
실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략
 
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
[KGC 2012]Boost.asio를 이용한 네트웍 프로그래밍
 
스마일게이트 서버개발캠프 - 5vengers
스마일게이트 서버개발캠프 - 5vengers 스마일게이트 서버개발캠프 - 5vengers
스마일게이트 서버개발캠프 - 5vengers
 
행동 기반 게임오브젝트
행동 기반 게임오브젝트행동 기반 게임오브젝트
행동 기반 게임오브젝트
 
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
NDC 2017 하재승 NEXON ZERO (넥슨 제로) 점검없이 실시간으로 코드 수정 및 게임 정보 수집하기
 
[NDC 2009] 행동 트리로 구현하는 인공지능
[NDC 2009] 행동 트리로 구현하는 인공지능[NDC 2009] 행동 트리로 구현하는 인공지능
[NDC 2009] 행동 트리로 구현하는 인공지능
 
Windows IOCP vs Linux EPOLL Performance Comparison
Windows IOCP vs Linux EPOLL Performance ComparisonWindows IOCP vs Linux EPOLL Performance Comparison
Windows IOCP vs Linux EPOLL Performance Comparison
 
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
제프리 리처의 Windows via C/C++ : 8장 유저 모드에서의 스레드 동기화
 
Scaling CPU Experiences: An Introduction to the Entity Component System
Scaling CPU Experiences: An Introduction to the Entity Component SystemScaling CPU Experiences: An Introduction to the Entity Component System
Scaling CPU Experiences: An Introduction to the Entity Component System
 
191221 unreal engine 4 editor 확장하기
191221 unreal engine 4 editor 확장하기191221 unreal engine 4 editor 확장하기
191221 unreal engine 4 editor 확장하기
 
게임서버프로그래밍 #4 - 멀티스레드 프로그래밍
게임서버프로그래밍 #4 - 멀티스레드 프로그래밍게임서버프로그래밍 #4 - 멀티스레드 프로그래밍
게임서버프로그래밍 #4 - 멀티스레드 프로그래밍
 
[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C# 혼합 멀티플랫폼 게임 아키텍처 설계
[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C#  혼합 멀티플랫폼 게임 아키텍처 설계[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C#  혼합 멀티플랫폼 게임 아키텍처 설계
[KGC2014] 두 마리 토끼를 잡기 위한 C++ - C# 혼합 멀티플랫폼 게임 아키텍처 설계
 
[NDC 2016] 유니티, iOS에서 LINQ 사용하기
[NDC 2016] 유니티, iOS에서 LINQ 사용하기[NDC 2016] 유니티, iOS에서 LINQ 사용하기
[NDC 2016] 유니티, iOS에서 LINQ 사용하기
 
190119 unreal engine c++ 입문 및 팁
190119 unreal engine c++ 입문 및 팁190119 unreal engine c++ 입문 및 팁
190119 unreal engine c++ 입문 및 팁
 
Introduction to Unity3D and Building your First Game
Introduction to Unity3D and Building your First GameIntroduction to Unity3D and Building your First Game
Introduction to Unity3D and Building your First Game
 
Kotlin Coroutines in Practice @ KotlinConf 2018
Kotlin Coroutines in Practice @ KotlinConf 2018Kotlin Coroutines in Practice @ KotlinConf 2018
Kotlin Coroutines in Practice @ KotlinConf 2018
 
Level design for games
Level design for gamesLevel design for games
Level design for games
 
Asynchronous JS in Odoo
Asynchronous JS in OdooAsynchronous JS in Odoo
Asynchronous JS in Odoo
 
NDC 2014, 피할 수 없는 문자열의 세계
NDC 2014, 피할 수 없는 문자열의 세계NDC 2014, 피할 수 없는 문자열의 세계
NDC 2014, 피할 수 없는 문자열의 세계
 

Similaire à 아두이노 2015-2 한동대학교 공학설계입문

원준갓의 IoT 수업
원준갓의 IoT 수업원준갓의 IoT 수업
원준갓의 IoT 수업
Won Jun Song
 
NDC 2011, 네트워크 비동기 통신, 합의점의 길목에서
NDC 2011, 네트워크 비동기 통신, 합의점의 길목에서NDC 2011, 네트워크 비동기 통신, 합의점의 길목에서
NDC 2011, 네트워크 비동기 통신, 합의점의 길목에서
tcaesvk
 

Similaire à 아두이노 2015-2 한동대학교 공학설계입문 (20)

원준갓의 IoT 수업
원준갓의 IoT 수업원준갓의 IoT 수업
원준갓의 IoT 수업
 
창조경제 IoT 해커톤 교육 2일차 교육 자료
창조경제 IoT 해커톤 교육 2일차 교육 자료창조경제 IoT 해커톤 교육 2일차 교육 자료
창조경제 IoT 해커톤 교육 2일차 교육 자료
 
Arduino Basic Programming
Arduino Basic ProgrammingArduino Basic Programming
Arduino Basic Programming
 
#아두이노 초급연수
#아두이노 초급연수#아두이노 초급연수
#아두이노 초급연수
 
IoT 해커톤 교육 3일차
IoT 해커톤 교육 3일차IoT 해커톤 교육 3일차
IoT 해커톤 교육 3일차
 
[엄마정치 메이커팀] 두번째 모임_2018_01_27
[엄마정치 메이커팀] 두번째 모임_2018_01_27[엄마정치 메이커팀] 두번째 모임_2018_01_27
[엄마정치 메이커팀] 두번째 모임_2018_01_27
 
메이커 페어 서울 2018 - 측우자격루(개발자용)
메이커 페어 서울 2018 - 측우자격루(개발자용)메이커 페어 서울 2018 - 측우자격루(개발자용)
메이커 페어 서울 2018 - 측우자격루(개발자용)
 
Aperture : 3&4. 조도센서를 이용한 led 밝기 제어하기
Aperture : 3&4. 조도센서를 이용한 led 밝기 제어하기Aperture : 3&4. 조도센서를 이용한 led 밝기 제어하기
Aperture : 3&4. 조도센서를 이용한 led 밝기 제어하기
 
Test-SDIC2018-1(Answer)
Test-SDIC2018-1(Answer)Test-SDIC2018-1(Answer)
Test-SDIC2018-1(Answer)
 
TestBCD2018-2(answer)
TestBCD2018-2(answer)TestBCD2018-2(answer)
TestBCD2018-2(answer)
 
Test-SDIC2018-2(answer)
Test-SDIC2018-2(answer)Test-SDIC2018-2(answer)
Test-SDIC2018-2(answer)
 
라즈베리파이 Circulus API 가이드
라즈베리파이 Circulus API 가이드라즈베리파이 Circulus API 가이드
라즈베리파이 Circulus API 가이드
 
Meteor IoT
Meteor IoTMeteor IoT
Meteor IoT
 
창조경제 IoT 해커톤 교육 4일차
창조경제 IoT 해커톤 교육 4일차창조경제 IoT 해커톤 교육 4일차
창조경제 IoT 해커톤 교육 4일차
 
Start io t_with_raspberrypi
Start io t_with_raspberrypiStart io t_with_raspberrypi
Start io t_with_raspberrypi
 
NDC 2011, 네트워크 비동기 통신, 합의점의 길목에서
NDC 2011, 네트워크 비동기 통신, 합의점의 길목에서NDC 2011, 네트워크 비동기 통신, 합의점의 길목에서
NDC 2011, 네트워크 비동기 통신, 합의점의 길목에서
 
라즈베리파이 IoT 시작하기
라즈베리파이 IoT 시작하기라즈베리파이 IoT 시작하기
라즈베리파이 IoT 시작하기
 
NodeJs로 디바이스 통신하기
NodeJs로 디바이스 통신하기NodeJs로 디바이스 통신하기
NodeJs로 디바이스 통신하기
 
강의자료 2
강의자료 2강의자료 2
강의자료 2
 
[2] 아두이노 활용 실습
[2] 아두이노 활용 실습[2] 아두이노 활용 실습
[2] 아두이노 활용 실습
 

아두이노 2015-2 한동대학교 공학설계입문

  • 3. Day 1 Arduino Overview IoT의 시작 IoT 사례 Arduino란 무엇인가 Arduino의 종류 Arduino의 개발환경 Uno 소프트웨어 구조 Uno 하드웨어 구조 Arduino 부속품과 센서 Arduino 구입하기, 사업자지출증빙
  • 4. 2015년도 신기술 하이프 사이클(Hype Cycle for Emerging Technologies, 2015. 7)(가트너)
  • 5.
  • 6. IoT의 시작 IoT(Internet of Things, 사물인터넷) “지능화된 사물들이 연결되어 형성되는 네트워크상에서 사람과 사물 (물리 또는 가상), 사물과 사물 간에 상호 소통하고 상황인식 기반의 지식이 결합되어 지능적인 서비스를 제공하는 글로벌 인프라” 12년 ITU-T Y.2060(Y.IoT-overview) 표준문서
  • 8. CES 2016 – LG Smart Home https://www.youtube.com/watch?v=pXOAao7f6SA
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18. Arduino란? 아트멜(Atmel)사의 마이크로컨트롤러 기반으로 만들어진 소형 보드와 프로그램을 개발할 수 있는 소프트웨어 개발 환경까지 함께 이르는 말
  • 19. Arduino란? 2005년 이탈리아 밀라노 옆에 위치한 이브레아에서 예술가, 디자이너 및 학생들이 쉽게 사용할 수 있는 저렴한 컨트롤 장치를 만들 수 있도록 하기 위해 시작됨
  • 20. Arduino란? 저렴한 가격 다양한 운영체제 지원 쉽고 간단한 프로그래밍 환경 USB 지원 오픈 소스 소프트에어 오픈 소스 하드웨어
  • 22.
  • 24. USB 컨넥터 외부전원 리셋버튼 아날로그 핀 디지털 핀 ISP 연결컨넥터 USB 시리얼 변환 컨트롤러 ATmega32816MHz 클록
  • 25.
  • 27. Arduino 개발환경 Sketch -> .ino C++ -> .cpp
  • 32. 미리 공부하기 https://opentutorials.org/module/682 전기, 브레드 보드, Arduino 기본 http://kocoafab.cc/ Arduino 응용
  • 34. Day 2 Digital/Analog 입출력 LED On/Off 무작정 따라하기 Digital 입출력 Analog 입출력 과제1 : PWM 연습 전기의 기본/저항 제 2과제 준비 과제2 : Analog 입출력 연습
  • 35. 전기의 기본 전류는 (+)극에서 (-)극으로 흐른다 전류, 전압, 저항, 옴의 법칙(V=IR) Short Cicuit을 조심해야 한다(저항을 연결해야 한다) 다이오드(LED)는 전류가 한 방향으로만 흐른다 아두이노에서 사용하는 전류는 DC 전류이다
  • 36. 저항 저항의 첫 번째 띠와 두 번째 띠는 저항 값을, 세 번째는 제곱승을, 네 번째는 오차 범위를 나타낸다. Ex) 10k옴 => 갈색(1), 검정색(0), 주황색(10^3), 금색(+-5%)
  • 40. 무작정 따라하기2 int ledPin = 13; void setup() { pinMode(ledPin, OUTPUT); } void loop() { digitalWrite(ledPin, HIGH); delay(1000); digitalWrite(ledPin, LOW); delay(1000); } 13번 Digital Pin을 출력모드로 설정한다. 13번 Pin을 5V으로 출력(1) 13번 Pin을 0V으로 출력(0) 1초 delay
  • 41. Analog VS Digital Analog Signal 연속적으로 변하는 물리량 5V, Vcc, 1 0V, GND, 0 Digital Signal 이산적으로 수치가 변함 digitalWrite(ledPin, HIGH); digitalWrite(ledPin, LOW);
  • 42. Digital 입출력 pinMode(ledPin, OUTPUT); digitalWrite(ledPin, HIGH); Digital 출력 pinMode(ledPin, INPUT); int value = digitalRead(ledPin); Digital 입력
  • 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
  • 50. int ledPin = 2; void setup() { Serial.begin(9600); pinMode(ledPin, INPUT); digitalWrite(ledPin, HIGH); } void loop() { int value = digitalRead(ledPin); Serial.println(value); } 내부풀업저항 연습 1
  • 51. int ledPin = 2; void setup() { Serial.begin(9600); pinMode(ledPin, INPUT_PULLUP); } void loop() { int value = digitalRead(ledPin); Serial.println(value); } 내부풀업저항 연습 1
  • 52. 스위치로 연결된 풀업저항 값을 2번 핀으로 읽어 13번 핀에 연결된 LED On/Off 내부풀업저항 연습 2
  • 55. int buttonIn = 2; int buttonState = 0; int ledPin = 13; void setup() { pinMode(buttonIn, INPUT_PULLUP); pinMode(ledPin, OUTPUT); } void loop() { buttonState = digitalRead(buttonIn); digitalWrite(ledPin, buttonState); } 내부풀업저항 연습 2
  • 56. 13번 핀은 풀업 저항으로 사용하지 않는 것을 권장!
  • 57. Digital 입력 - 풀다운저항 Switch on => VCC Switch off => 0V
  • 58. Digital 출력 - PWM 출력 ~11, ~10, ~9, ~6, ~5, ~3
  • 59. PWM(Pulse Width Modulation)은 디지털 신호를 출력하면서도 아날로그 신호와 같은 효과를 낼 수 있으며 analogWrite 함수를 사용하여 0부터 255까지 출력할 수 있다. Digital 출력 - PWM 출력
  • 61. 서서히 밝아지는 LED 구현 PWM 출력 연습
  • 63. int ledPin = 11; void setup() { pinMode(ledPin, OUTPUT); } void loop() { for(int i=0;i<256;i++) { analogWrite(ledPin, i); delay(50); } } PWM 출력 연습
  • 64. Analog 입력 static const uint_t A0 = 14; static const uint_t A1 = 15; static const uint_t A2 = 16; static const uint_t A3 = 17; static const uint_t A4 = 18; static const uint_t A5 = 19; pinMode(A0, OUTPUT); digitalWrite(A0, HIGH); Digital 입출력으로도 사용가능하다. pinMode(A0, INPUT); int value = analogRead(A0); Analog 입력(0~1023)
  • 67. if(readCurrent != readPrevious) { readPrevious = readCurrent; echoStr = "Current analog input : " + String(readCurrent); Serial.println(echoStr); } Analog 입력 연습
  • 68. int readPrevious = 0; int readCurrent = 0; void setup() { Serial.begin(9600); pinMode(A0, INPUT); } void loop() { String echoStr; readCurrent = analogRead(A0); if(readCurrent != readPrevious) { readPrevious = readCurrent; echoStr = "Current analog input : " + String(readCurrent); Serial.println(echoStr); } } Analog 입력 연습
  • 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
  • 72. C/C++ Syntax C 기반 String 다루기 char str1[8] = {‘a’, ‘r’, ‘d’, ‘I’, ‘n’, ‘o’}; char str2[8] = “arduino”; char * str = “arduino”; str1 = str2; (str1, 2가 배열일 경우 X) str1 = “arduino”; (str1이 배열일 경우 X) strcat(str1, str2); strcpy(str1, str2); strcmp(str1, str2); strlen(str1);
  • 73. 아두이노 함수 #include <Arduino.h> 디지털 입출력 함수 아날로그 입출력 함수 고급 입출력 함수 시간 함수 수학 함수 삼각 함수 난수 생성 함수 비트 조작 함수 인터럽트 함수
  • 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)
  • 75. 아두이노 함수 고급 입출력 함수
  • 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();
  • 84. Serial Class Serial_(Class) long baud; begin(baud); println(value); available(); read(); Serial_ Serial; //Object Serial.begin(9600); Serial.println(value); Serial.available(); Serial.read();
  • 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 포트
  • 87. Serial Class char incomingChar; void setup() { Serial.begin(9600); } void loop() { if(Serial.available() > 0) { incomingChar = Serial.read(); Serial.print(“I receive: “); Serial.println(incomingChar); delay(1000); } }
  • 88. Serial Class 00 11 01 10 1초 void begin(unsigned long baud) //Serial.begin(9600); baud: 속도(baud rate(보율)) 1초에 4번 변했다 => 4baud bits per second(bps) => 8bps
  • 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);
  • 94. String stringOne = “Hello String”: Serial.println(stringOne.length()); //12 stringOne.toLowerCase(); Serial.println(stringOne); //”hello string” stringOne.toUpperCase(); Serial.println(stringOne); //”HELLO STRING” for(int i=0;i<stringOne.length();i++) Serial.println(stringOne[i]); String Class
  • 95. void loop() { String str1 = “0123”; String str2 = “123a”; String str3 = “abc”; Serial.println(str1.toInt()); //123 Serial.println(str2.toInt()); //123 Serial.println(str3.toInt()); //0 } String Class
  • 96. “On”이 전송될 경우 => 9번 Pin의 LED on “OFF”가 전송될 경우 => 9번 Pin의 LED off Serial & String Class 연습
  • 97. int ledPin = 9; String inputString; void setup() { Serial.begin(9600); pinMode(ledPin, OUTPUT); } void loop() { if(Serial.available() > 0) { char inChar = Serial.read(); inputString += inChar; inputString.toLowerCase(); if(inputString == "on") { digitalWrite(ledPin, HIGH); Serial.println("LED On!!"); inputString = ""; } else if(inputString == "off") { digitalWrite(ledPin, LOW); Serial.println("LED Off!!"); inputString = ""; } } }
  • 98. 다른 라이브러리 스케치 -> Include Library 기본 라이브러리
  • 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(황화카드뮴)에 금속 다리를 결합하여 만들어진다. 광량이 높으면 광 센서의 저항이 낮아져 낮은 전압이 인가되고 광량이 낮으면 저항이 높아져 높은 전압이 인가된다. 광량을 정밀하게 측정하고자 하는 경우에는 포토다이오드나 포토 트랜지스터를 사용해야 한다.
  • 107. void setup() { Serial.begin(9600); } void loop() { int val = analogRead(A0); Serial.println(val); delay(500); } 광 센서(Photo Resistor)
  • 108. 압력 센서 압력 센서는 누르는 힘에 의해 저항 값이 변하는 센서로 누르는 힘이 커질수록 저항 값이 줄어드는 특성을 갖는다.
  • 110. void setup() { Serial.begin(9600); } void loop() { int val = analogRead(A0); Serial.println(val); delay(500); } 압력 센서
  • 111. 온도 센서 온도 센서는 온도에 따라 출력되는 전압이 변하는 특성을 가지는 센서로 온도가 높을 수록 높은 전압을 출력으로 낸다. TMP36 온도 센서 2.7V ~ 5.5V 입력 Analog 전압 출력 GND 1C 증가 -> 출력 전압 10mV 증가 0.5v -> 섭씨 0도
  • 113. void setup() { Serial.begin(9600); } void loop() { int reading = analogRead(A0); float voltage = reading * 5.0 / 1024.0; float tempC = (voltage - 0.5) * 100; Serial.print(voltage); Serial.println("V"); Serial.print(tempC); Serial.println("C"); delay(500); } 온도 센서
  • 114. 초음파 거리 센서 초음파 거리 센서는 초음파를 이용하여 거리를 측정하는 센서로 초음파는 지향성과 직진성이 높으며 공기 중에서는 340m/s의 일정한 속도로 진행한다.
  • 115. (+)와 (-) 전압을 압전 소자에 번갈아 가할 때, 압전 소자의 변형에 의해 진동이 발생하고 초음파가 발생하는 역압전 현상과 초음파가 반사되어 돌아오는 파동에 의해 압전 소자가 진동하고 전압이 발생하는 정압전현상을 이용한다. 이를 통해 반사되어 돌아오는 시간을 측정하여 거리를 계산할 수 있다. SRF05 초음파 거리 센서
  • 117. SRF05의 트리거(Trigger) 핀으로 최소 10us의 펄스를 발생시키면 에코(echo) 핀으로 거리에 비 례하는 펄스가 반사되어 돌아온다. pulseIn 함수는 특정 핀으로 입력되는 펄스의 길이를 측정하는 함수로 마이크로초(us) 단위의 시간을 반환하므로 이를 통해 거리를 계산할 수 있다. 에코 핀으로 들어오는 펄스의 길이를 58로 나누면 cm 단위의 거리를 얻을 수 있다. 트리거 핀의 트리거 간격은 최소 50ms가 되어야 한다. 초음파 거리 센서
  • 118. int distance; int triggerPin = 12; int echoPin = 11; void setup() { Serial.begin(9600); pinMode(triggerPin, OUTPUT); pinMode(echoPin, INPUT); } void loop() { digitalWrite(triggerPin, HIGH); delayMicroseconds(10); digitalWrite(triggerPin, LOW); distance = pulseIn(echoPin, HIGH) / 58; Serial.println(“Distance(cm) = “ + String(distance)); delay(1000); } 초음파 거리 센서
  • 119. 데이터 txt로 저장하기 1. 시리얼 모니터 내용 무식하게 복사
  • 120. 데이터 txt로 저장하기 2. 윈도우 cmd 시리얼 Listening 명령어 3. XShell과 같은 유틸리티 사용
  • 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 모터
  • 130. int motorPin = 3; void setup() { Serial.begin(9600); pinMode(motorPin, OUTPUT); } void loop() { if(Serial.available() > 0) { int speed = Serial.parseInt(); if(speed >= 0 && speed <= 255) { Serial.println("Current Speed: " + String(speed)); analogWrite(motorPin, speed); } } } 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 핀을 절단하고 보드와 쉴드를 분리
  • 137. int DIRECTION_PIN = 12; int VELOCITY_PIN = 3; int BRAKE_PIN = 9; //채널 A에 대해서 void setup() { pinMode(DIRECTION_PIN, OUTPUT); pinMode(BRAKE_PIN, OUTPUT); } void loop() { digitalWrite(BRAKE_PIN, LOW); //브레이크 해제 digitalWrite(DIRECTION_PIN, HIGH); //정방향 회전 analogWrite(VELOCITY_PIN, 255); //최고 속도 delay(3000); analogWrite(VELOCITY_PIN, 0); //정지 delay(1000); digitalWrite(DIRECTION_PIN, LOW); //역방향 회전 analogWrite(VELOCITY_PIN, HIGH); //최고 속도 } 모터 쉴드
  • 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
  • 150. void loop() { if(BTSerial.available()) { char inChar = BTSerial.read(); inputString += inChar; if(inputString == "on") { digitalWrite(ledPin, HIGH); Serial.println("LED ON!"); inputString = ""; } if(inputString == "off") { digitalWrite(ledPin, LOW); Serial.println("LED OFF!"); inputString = ""; } } } #include <SoftwareSerial.h> SoftwareSerial BTSerial(3, 2); int ledPin = 8; String inputString; void setup() { Serial.begin(9600); BTSerial.begin(9600); pinMode(ledPin, OUTPUT); } 블루투스 통신 App Inventor
  • 151. 블루투스 통신 App Inventor https://www.youtube.com/watch?v=xjtxrxVauZg
  • 152. Wifi 통신 Arduino PC Wifi 센서 Client Server request response
  • 153. Wifi 통신 Arduino PC Wifi 센서 Server Client request response
  • 155. 기타 외부장치 릴레이 모듈 int relay = 9; void setup() { pinMode(relay, OUTPUT); digitalWrite(relay, LOW); } void loop() { digitalWrite(relay, HIGH); delay(5000); digitalWrite(relay, LOW); delay(5000); } 가전 제품의 전원을 컨트롤 하기 위해 사용
  • 156. 기타 외부장치 우적 센서 비, 물, 습도 등을 감지하는 센서, 수분량에 따른 저항의 변화 판이 건조하면 Digital -> HIGH 판에 물이 묻으면 Digital -> LOW 우적 정도를 Analog로 측정 가능 가변 저항으로 threshold 값 조정
  • 157. 기타 외부장치 토양 수분 센서 판이 건조하면 Digital -> HIGH 판에 물이 묻으면 Digital -> LOW 우적 정도를 Analog로 측정 가능 가변 저항으로 threshold 값 조정 토양 내 수분함량 측정, 수분량에 따른 저항의 변화