아두이노 프로그래밍 Lecture #01 2018. 9. 20.
목 차 IoT 장치 개요 Arudino 실습환경 구축 Arduino 실습 디지털 출력(DO) 디지털 입력(DI) 아날로그 출력(AO) 아날로그 입력(AI) 시리얼 통신(Serial Comm.)
1. IoT 장치 개요(1) IoT 시스템 아키텍처 구성
1. IoT 장치 개요(2) IoT 장치 예:
1. IoT 장치 개요(3) IoT 장치의 주요 기능 데이터 수집 – 환경요인 센싱 및 데이터 생성 데이터 소비 – 환경요인에 대한 액추에이팅(제어) 데이터 통신 – 원격 호스트로 데이터 전송 또는 제어 명령 수신
1. IoT 장치 개요(4) IoT 장치 – 기본 구조 (1) Sensors Controller Comm. (MCU) I/F 디지털 전기신호 비트 스트림 Controller (MCU) Comm. I/F Actuators 아날로그 전기신호 별도의 ADC/DAC 장치가 필요
1. IoT 장치 개요(5) IoT 장치 – 기본 구조 (2) Controller 장치는 주로 MCU(Micro-Controller Unit) 기반으로 구현 Controller 장치는 Sensors/Actuators 장치와 전기 신호를 이용하여 인 터페이스한다. 전기 신호 – 디지털 신호 / 아날로그 신호 Controller는 디지털 신호와 아날로그 신호 입출력을 지원하여야 한다. 아날로그 신호 입출력을 위해 별도의 ADC/DAC 장치가 필요 Controller 장치는 시리얼 통신 방식으로 외부와 데이터 통신 비동기 시리얼 통신 – UART 동기 시리얼 통신 – I2C, SPI Controller 장치는 크기가 작아야 한다. Controller 장치는 저전력으로 동작하여야 한다.
1. IoT 장치 개요(6) IoT 장치 프로그래밍 간단한(경량) 알고리즘을 기반으로 프로그래밍하여야 한다. 주로 외부 장치와의 인터페이스 기능을 구현한다. 다음의 인터페이스 기능을 활용하여야 한다. 디지털 신호 출력 디지털 신호 입력 아날로그 신호 출력 아날로그 신호 입력 시리얼 데이터 통신(UART/I2C/SPI) 필요에 따란 인터럽트(Interrupt) 기반의 비동기 동작을 구현한다.
2. Arduino 실습환경 구축(1) Arduino 란? 오픈소스 하드웨어 프로토타입핑(prototyping) 플랫폼 3 가지 의미를 내포 A programming environment A community & philosophy A physical piece of hardware
2. Arduino 실습환경 구축(2) 아두이노 플랫폼 기본 구성
2. Arduino 실습환경 구축(3) AVR Atmega 8-bit microcontroller chip 사용 chip was designed to be used with C language Arduino Mega-ADK
2. Arduino 실습환경 구축(4) Arduino Diecimila Board • 16 kBytes of Flash program memory • 1 kByte of RAM • 16 MHz (Apple II: 1 MHz) • Inputs and Outputs • 13 digital input/output pins • 5 analog input pins • 6 analog output(PWM) pins • Completely stand-alone: doesn’t need a computer once programmed
2. Arduino 실습환경 구축(5) Arduino Mega-ADK Board • 256 KB of Flash program memory • 4 KB of EEPROM • 8 kB of RAM • 16 MHz (Apple II: 1 MHz) • Inputs and Outputs: - 40 digital input/output pins - 16 analog input pins - 14 analog output(PWM) pins • 4’s UART(serial) port • USB Host channel USB Host Channel ATmega2560
2. Arduino 실습환경 구축(6) 아두이노 하드웨어 변형 Lilypad Arduino Breadboard Arduino Arduino Mini Arduino Nano Arduino Bluetooth Arduino Ethernet Arduino Notebook Arduino DIY
2. Arduino 실습환경 구축(7) Arduino IDE 프로젝트 생성 및 프로 그램 소스 편집 프로그램 컴파일 프로그램 다운로드(ISP) 콘솔 모니터 Function Buttons Program Coding Area System Message Area
2. Arduino 실습환경 구축(8) Arduino IDE 설치 아두이노 웹사이트(www.arduino.cc)에서 설치 패키지 다운로드 설치 패키지의 압축을 풀어 적절한 위치에 설치 환경변수 설정 및 실행 : 환경설정 파일 /root/.bashrc #> pwd /root/다운로드 #> mv arduino-1.0-linux.tgz /opt #> cd /opt #> tar xvfz arduino-1.0-linux.tgz #> gedit ~/.bashrc : PATH=/opt/arduin-1.0:$PATH #> source ~/.bashrc #> arduino
lsusb 명령어를 이용하여 연결 여부 확인 가능 2. Arduino 실습환경 구축(9) Host PC와 아두이노 보드 연결 lsusb 명령어를 이용하여 연결 여부 확인 가능
2. Arduino 실습환경 구축(10) 아두이노 프로그램 개발 사이클 Make as many changes as you want Not like most web programming: edit ➝ run Edit ➝ compile ➝ upload ➝ run
2. Arduino 실습환경 구축(11) 아두이노 프로그램 작성 및 실행 Write your sketch Sketch : Arduino 보드에서 실행되는 프로그램 Press Compile button(to check for errors) Press Upload button to program Arduino board with your sketch
2. Arduino 실습환경 구축(12) 예제 프로그램을 이용한 테스트 LED Blink Example Step #1 : Arduino Board 연결 Step #2 : Arduino 프로그램 실행 Step #3 : Arduino 프로그램에서의 타겟 설정 사용하는 arduino 보드 타입과 연결 포트 설정
2. Arduino 실습환경 구축(13) 예제 프로그램을 이용한 테스트 Step #4 : LED Blink 예제 스케치 로딩 메뉴: File Examples 1.Basics Blick Step #5 : Compile 버튼으로 스케치 컴파일링 Step #6 : Unoload 버튼으로 스케치 업로드 Step #7 : 실행 결과 확인 보드 내의 led 13이 깜박이지를 확인
3. Arduino 실습 Arduino API Arduino 실습 issues https://www.arduino.cc/reference/en/ Arduino 실습 issues 시간 지연 디지털 출력 디지털 입력 아날로그 출력 아날로그 입력 인터럽트 시리얼 통신: I2C, SPI, UART
3. Arduino 실습 – 디지털 출력(1) 디지털 출력(1) – LED on/off 회로 구성 회로도: 연결도: 구성 회로: pin d8
3. Arduino 실습 – 디지털 출력(2) 디지털 출력(1) – LED on/off 회로 구성 온보드(on-board) 되어 있어 별도의 결선 없음 MEGA ADK 내장 LED는 Digital Pin 13번과 회로적으로 연결
3. Arduino 실습 – 디지털 출력(3) 디지털 출력(1) – LED on/off 스케치 프로그램 pinMode() – digital pin의 입출력 모드 설정 digitalWrite() – 디지털 신호 출력 #define LED_PIN 13 void setup() { pinMode(LED_PIN, OUTPUT); } void loop() { digitalWrite(LED_PIN, HIGH); // digitalWrite(LED_PIN, HIGH);
3. Arduino 실습 – 디지털 출력(4) 디지털 출력(2) – LED Blinking 점멸 간격을 1000ms(1sec)로 설정 시간지연 API 사용 delay()/delayMicroseconds() 회로 구성 앞 예제와 동일
3. Arduino 실습 – 디지털 출력(5) 디지털 출력(2) – LED Blinking 스케치 프로그램 #define LED_PIN 13 #define BLINK_INTERVAL 1000 // 1000 msec = 1sec void setup() { pinMode(LED_PIN, OUTPUT); } void loop() { digitalWrite(LED_PIN, HIGH); delay(BLINK_INTERVAL); digitalWrite(LED_PIN, LOW);
3. Arduino 실습 – 디지털 출력(6) 디지털 출력(3) – 외부 LED 모듈 제어 외부 LED 모듈의 다수 LED를 제어 여러 개의 LED들을 250ms 간격을 점멸 LED 모듈
3. Arduino 실습 – 디지털 출력(7) 디지털 출력(3) – 외부 LED 모듈 제어 LED 모듈 회로도
3. Arduino 실습 – 디지털 출력(8) 회로 구성 MEGA ADK 모듈과 LED 모듈 결선 결선 방법 MEGA ADK 모듈의 2 핀을 LED 모듈의 S1 핀에 연결 MEGA ADK 모듈의 3 핀을 LED 모듈의 S2 핀에 연결 MEGA ADK 모듈의 4 핀을 LED 모듈의 S3 핀에 연결 MEGA ADK 모듈의 5 핀을 LED 모듈의 S4 핀에 연결 MEGA ADK 모듈의 6 핀을 LED 모듈의 S5 핀에 연결 MEGA ADK 모듈의 7 핀을 LED 모듈의 S6 핀에 연결 MEGA ADK 모듈의 8 핀을 LED 모듈의 S7 핀에 연결 MEGA ADK 모듈의 9 핀을 LED 모듈의 S8 핀에 연결
3. Arduino 실습 – 디지털 출력(9) 디지털 출력(3) – 외부 LED 모듈 제어 스케치 프로그램 #define BLINK_INTERVAL 250 enum LEDPINS { LED1=2, LED2, LED3, LED4, LED5, LED6, LED7, LED8 }; void setup() { for (int i=LED1; i<=LED8; i++){ pinMode(i, OUTPUT); } void loop() { for (int i=LD1; i<=LED8; i++) { digitalWrite(i, HIGH); delay(BLINK_INTERVAL); digitalWrite(i, LOW); }
3. Arduino 실습 – 디지털 입력(1) 디지털 입력(1) – Push Button & LED on-off 스위치 (Switch) 연결을 만들거나 끊는데 사용하는 전자 부품 다양한 형태의 스위치를 사용 가능 간이 형태의 스위치를 만들어 사용 가능 Push Button Switch
3. Arduino 실습 – 디지털 입력(2) 디지털 입력(1) – Push Button & LED on-off 스위치 연결 회로 Pull-up resistor Digital IO 2 Arduino Vcc R Digital IO 2 Arduino GND R Pull-down resistor 스위치 on: High 스위치 on: Low 스위치 off: ? Low 스위치 off: ? High
3. Arduino 실습 – 디지털 입력(3) 디지털 입력(1) – Push Button & LED on-off 스위치 연결 회로 디지털 입력핀은 아무런 회로연결을 갖지 않는 경우 디지털 입력은 0V와 5V 사이를 움직이며(floating) 일정한 값을 갖지 못함 Pull-up Register / Pull-down Register 입력 핀을 5V 또는 0V 연결할 때 적용 Pull input up to 5V Pull input down to ground(0V) 스위치 연결 방식 스위치 동작 Press HIGH Not Press LOW
3. Arduino 실습 – 디지털 입력(4) 디지털 입력(1) – Push Button & LED on-off 사용 모듈 MEGA ADK 모듈 LED 모듈 Button 모듈
Pull-up resistor 버튼을 누르면 LOW 입력 3. Arduino 실습 – 디지털 입력(5) 디지털 입력(1) – Push Button & LED on-off Button 모듈 회로도 Pull-up resistor 버튼을 누르면 LOW 입력
3. Arduino 실습 – 디지털 입력(6) 디지털 입력(1) – Push Button & LED on-off 회로 구성 MEGA ADK 모듈의 2 핀을 LED 모듈의 S1 핀에 연결 MEGA ADK 모듈의 8 핀을 Button 모듈의 S1 핀에 연결
digitalWrite(ledBin, digitalRead(btnPin)); 3. Arduino 실습 – 디지털 입력(7) 디지털 입력(1) – Push Button & LED on-off 스케치 프로그램 digitalRead() – 디지털 신호 입력 int btnPin = 8; int ledPin = 2; void setup() { pinMode(ledPin, OUTPUT); pinMode(btnPin, INPUT); digitalWrite(ledPin, LOW); } void loop() { if (digitalRead(btnPin) == HIGH) { digitalWrite(ledPin, HIGH); else { delay(250); digitalWrite(ledBin, digitalRead(btnPin));
3. Arduino 실습 – 디지털 입력(8) 디지털 입력(2) – Push Button & LED Toggling 동작: 스위치 입력에 따라 LED on/off 동작을 toggling 스위치 입력의 에지 검출 필요 스위치 입력 신호: 에지 검출 (이전 입력 != 현재 입력) && (현재 입력 == HIGH) 상승 에지 (이전 입력 != 현재 입력) && (현재 입력 == LOW) 하강 에지 HIGH LOW Rising Edge Falling Edge
3. Arduino 실습 – 디지털 입력(9) 디지털 입력(2) – Push Button & LED Toggling 회로 구성 이전 실습 회로 사용
3. Arduino 실습 – 디지털 입력(10) 디지털 입력(2) – Push Button & LED Toggling 스케치 프로그램 int btnPin = 22; int ledPin = 9; int ledState = LOW; #define NO_EDGE 0 #define RISING_EDGE 1 #define FALLING_EDGE 2 int checkBtnEdge() { static int prevState = LOW; int currState = digitalRead(ledPin); int edge = NO_EDGE; if (prevState != currState){ if (currState == HIGH)) edge = RISING_EDGE; else edge = FALLING_EDGE; prevState = currState; } return edge; void setup() { pinMode(ledPin, OUTPUT); pinMode(btnPin, INPUT); digitalWrite(ledPin, ledState); } void loop() { if (checkBtnEdge() == RISING_EDGE) { ledState = !ledState; delay(250);
3. Arduino 실습 – 디지털 입력(11) 디지털 입력(2) – Push Button & LED Toggling 스위치 입력 에지 검출 issue: Button Bounce 현상 버튼을 누르거나 땔 때에 일시적으로 전압이 불안해지는 현상 Button Debounce Button bounce를 제거하는 동작 H/W 해결책 – capacity 활용 S/W 해결책 – 버튼 입력 상태가 바뀔 때에 약간의 지연을 허용
3. Arduino 실습 – 디지털 입력(12) 디지털 입력(2) – Push Button & LED Toggling 스케치 프로그램 int btnPin = 22; int ledPin = 9; int ledState = LOW; #define NO_EDGE 0 #define RISING_EDGE 1 #define FALLING_EDGE 2 #define BOUNCE_DELAY 50 // msec int checkBtnEdge() { static int prevState = LOW; int edge = NO_EDGE; long startDelay = 0; int currState = digitalRead(ledPin); if (prevState != currState){ if (startDelay == 0) { startDelay = millis(); } else if (millis() – startDelay > BOUNCE_DELAY) { edge = currState==HIGH ? RISING_EDGE : FALLING_EDGE; prevState = currState; startDelay = 0; } else { return edge; void setup() { pinMode(ledPin, OUTPUT); pinMode(btnPin, INPUT); digitalWrite(ledPin, ledState);
3. Arduino 실습 – 디지털 입력(13) 디지털 입력(2) – Push Button & LED Toggling 스케치 프로그램 void loop() { if (checkBtnEdge() == FALLING_EDGE) { ledState = !ledState; } digitalWrite(ledPin, ledState); delay(250);