58
아두이노로 만드는 인형뽑기장치

아두이노로 만드는 인형뽑기장치 · 6. 실습 #3 – 디스플레이(7세그먼트) 7세그먼트(FND – Flexible Numerical Display) 란? - LED를 점등을 이용해서

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 아두이노로 만드는 인형뽑기장치 · 6. 실습 #3 – 디스플레이(7세그먼트) 7세그먼트(FND – Flexible Numerical Display) 란? - LED를 점등을 이용해서

아두이노로 만드는 인형뽑기장치

Page 2: 아두이노로 만드는 인형뽑기장치 · 6. 실습 #3 – 디스플레이(7세그먼트) 7세그먼트(FND – Flexible Numerical Display) 란? - LED를 점등을 이용해서

목 차

Ⅰ. 아두이노 및 C프로그래밍기초 ------------------------------------------------------- 1

1. 아두이노 소개 ------------------------------------------------------------------------- 1

2. 아두이노 개발환경 구축 -------------------------------------------------------------- 3

3. C 프로그래밍 기초 -------------------------------------------------------------------- 8

4. 실습 #1 – 디지털 출력(LED제어) --------------------------------------------------- 12

5. 실습 #2 - 디지털 입력(스위치 입력) ----------------------------------------------- 14

6. 실습 #3 – 디스플레이(7세그먼트) --------------------------------------------------- 16

7. 실습 #4 – 아날로그 입력(조이스틱 모듈) ------------------------------------------ 19

8. 실습 #5 – 센서 ---------------------------------------------------------------------- 21

9. 실습 #6 – 통신/ 블루투스 ---------------------------------------------------------- 23

10. 실습 #7 – 모터 --------------------------------------------------------------------- 30

11. 실습 #8 – LCD 모듈 ------------------------------------------------------------- 31

Ⅱ. 직교로봇 시스템 구현 ------------------------------------------------------- 33

1. 기구부 ------------------------------------------------------------------------ 33

2. 전기/제어시스템 ------------------------------------------------------------- 43

3. 프로그램 설계 ------------------------------------------------------------------- 47

4. 실습 #1 – 아날로그 조그(JOG) 동작 ----------------------------------------------- 48

Page 3: 아두이노로 만드는 인형뽑기장치 · 6. 실습 #3 – 디스플레이(7세그먼트) 7세그먼트(FND – Flexible Numerical Display) 란? - LED를 점등을 이용해서

Ⅰ. 아두이노 및 C프로그래밍 기초

- 1 -

1. 아두이노(Arduino) 소개

▪ 이탈리아에서 디자인 수업의 목적으로 손쉽게 사용할 수 있도록 개발된 오픈소스형 소형컴퓨터 ▪ Atmel 社의 마이크로컨트롤러를 기반으로 구성

▪ 아두이노(Arduino) = 마이크로컨트롤러 보드 + 프로그램 개발환경 + 인터넷 공개포럼

▪ 공식 포럼 : http://www.arduino.cc

Page 4: 아두이노로 만드는 인형뽑기장치 · 6. 실습 #3 – 디스플레이(7세그먼트) 7세그먼트(FND – Flexible Numerical Display) 란? - LED를 점등을 이용해서

Ⅰ. 아두이노 및 C프로그래밍 기초

- 2 -

▪ 아두이노 Mega 2560 Overview

- Atmel社의 ATmega2560 마이크로컨트롤러 기반의 아두이노 보드

- 주요 사양

마이크로 컨트롤러 ATmega2560

동작전압 5V

입력전압(허용) 7 - 12V

입력전압(한계) 6 - 20V

디지털 I/O 핀 54개(15개는 PWM 출력기능)

아날로그 입력 핀 16개

핀당 DC 전류 20 mA

3.3V 핀 전류 50 mA

Flash Memory 256 KB (8KB는 부트로더)

SRAM 8 KB

EEPROM 4 KB

클럭속도 16 MHZ

크기 101.52(L) * 53.3(W)

무게 37g

Page 5: 아두이노로 만드는 인형뽑기장치 · 6. 실습 #3 – 디스플레이(7세그먼트) 7세그먼트(FND – Flexible Numerical Display) 란? - LED를 점등을 이용해서

Ⅰ. 아두이노 및 C프로그래밍 기초

- 3 -

2. 아두이노 개발환경 구축

▪ 통합개발환경(Integration Development Environment) 이란?마이크로컨트롤러 시스템 개발에 필요한 하드웨어 연결 및 설정, 프로그래밍 작성, 다운로드 및 디버깅등의 작업을 손쉽게 할 수 있도록, 관련 기능이 통합되어 있는 소프트웨어 개발 도구 또는 환경.

▪ 통합개발환경 소프트웨어 설치?- 공식포럼(http://www.arduino.cc) 에서 IDE 소프트웨어를 다운로드.

Page 6: 아두이노로 만드는 인형뽑기장치 · 6. 실습 #3 – 디스플레이(7세그먼트) 7세그먼트(FND – Flexible Numerical Display) 란? - LED를 점등을 이용해서

Ⅰ. 아두이노 및 C프로그래밍 기초

- 4 -

- 다운로드 받은 파일을 실행하고, 프로그램 설치를 진행.

Page 7: 아두이노로 만드는 인형뽑기장치 · 6. 실습 #3 – 디스플레이(7세그먼트) 7세그먼트(FND – Flexible Numerical Display) 란? - LED를 점등을 이용해서

Ⅰ. 아두이노 및 C프로그래밍 기초

- 5 -

▪ 보드 연결 및 설정

- 아두이노 메가보드를 PC에 연결

- 아두이노 IDE 실행

Page 8: 아두이노로 만드는 인형뽑기장치 · 6. 실습 #3 – 디스플레이(7세그먼트) 7세그먼트(FND – Flexible Numerical Display) 란? - LED를 점등을 이용해서

Ⅰ. 아두이노 및 C프로그래밍 기초

- 6 -

- 보드 종류 및 포트 설정

※ 아두이노 보드를 다른 PC에서 연결해제 한 뒤 다시 연결할 때 포트 번호나 보드정보가 바뀔 수 있으므로, 프로그램 컴파일이나 보드 업로딩이 안 뒬 경우, 반드시 확인해야함.

Page 9: 아두이노로 만드는 인형뽑기장치 · 6. 실습 #3 – 디스플레이(7세그먼트) 7세그먼트(FND – Flexible Numerical Display) 란? - LED를 점등을 이용해서

Ⅰ. 아두이노 및 C프로그래밍 기초

- 7 -

▪ 기본 프로그램 작성 및 컴파일, 업로드- 아두이노 IDE 실행 후, 아래 예제를 입력함.

// 아두이노 처음 시작하기 : 시리얼통신으로 메시지 받기

void setup()

{

Serial.begin(9600); // 아두이노와 통신시작

}

void loop()

{

Serial.println("Hello Everyone!!"); // 메시지 출력

delay(1000); // 1초 기다리기

}

- “컴파일” 버튼 클릭 ⇨ “업로드” 버튼 클릭

- “시리얼 모니터” 버튼 클릭 ⇨ 출력 결과 확인

Page 10: 아두이노로 만드는 인형뽑기장치 · 6. 실습 #3 – 디스플레이(7세그먼트) 7세그먼트(FND – Flexible Numerical Display) 란? - LED를 점등을 이용해서

Ⅰ. 아두이노 및 C프로그래밍 기초

- 8 -

3. C프로그래밍 기초

▪ C언어는?

1972년, 벨 연구소(Bell Lab.) 데니스 리치가 개발한 프로그래밍 언어로서, UNIX OS를 운용하기 위해 사용되었다가 점차적으로 널리 사용되어 현재까지 사용됨

▪ C언어의 특징

- 문법이 간결하고, 명백함 - 구조화가 잘 되어있어, 광범위한 확장성을 지님 - 하드웨어 밀착 제어가 가능하면서도, 사용자 편리성이 우수함

▪ C언어 학습의 필요성

현재 ICT 기술의 발전에 힘입어, 컴퓨터 프로그래밍 기술이 하드웨어에 성능에 대한 제약을 거의 받지 않게 되면서, 사용자 편리성이 우수한 고급형 프로그래밍 언어(Java, C#, Python, VB 등)의 사용이 증대되고 있다.

프로그래밍 언어는 적용되는 시스템 환경과 상황에 맞도록 선택되어야 하며, “특정 프로그래밍 언어가 가장 좋다.” 라는 기준은 없다.

현재 기계공학 분야에서 주로 다루는 하드웨어 및 장비시스템은 아직까지 주로 C프로그래밍을 기반으로 개발되어 진다.

C언어는 하드웨어 성능이 뛰어나지 않은 시스템으로부터 고성능 시스템에 이르기까지 적용될 수 있도록, 컴파일러 환경이 다양하게 구축되어 있으며, 시스템의 성능을 최대한 활용 할 수 있도록 직관적인 문법 구조로 이루어져 있다.

C프로그래밍은 타 프로그래밍언어가 갖는 기본 특성을 모두 담고있어, 프로그래밍 습득에 필요한 선수학습으로서 매우 가치가 있는 프로그래밍 언어이다.

▪ 프로그래밍 문법이란?

사람의 언어와 동일하게, 기본적인 표현방법과 규칙을 명시한 것. 컴퓨터는 문법이 약간이라도 틀리면, 동작이 아예 수행되지 않으므로, 기본적인 프로그래밍 문법을 이해하는 것이 가장 중요하다.

Page 11: 아두이노로 만드는 인형뽑기장치 · 6. 실습 #3 – 디스플레이(7세그먼트) 7세그먼트(FND – Flexible Numerical Display) 란? - LED를 점등을 이용해서

Ⅰ. 아두이노 및 C프로그래밍 기초

- 9 -

▪ 데이터 : 상수, 변수- 상수 : 프로그램이 실행되기 전에 미리 선언되어, 프로그램 실행중 값이 바뀌지 않는 데이터- 변수 : 프로그램이 실행되기전 데이터형을 미리 선언한후, 프로그램 실행중 필요에 따라 변할 수 있는 데이터(또는 메모리 공간)- 데이터형 : 변수 저장되는 데이터의 종류(정수, 실수, 문자 등)

유 형 크기 (바이트) 범 위

int 2 -32768 ~ 32767

unsigned int 2 0 ~ 65535

long 4 -2147483648 ~ -2147483647

unsigned long 4 4294967295

float 4 3.4028235E+38 ~ -3.4028235E+38

double 4 3.4028235E+38 ~ -3.4028235E+38

boolean 1 true(1) 또는 False(0)

char 1 -128 ~ 127

byte 1 0 ~ 255

※ 데이터형별 크기는 아두이노 기준임

▪ 연산자 : 데이터의 처리를 위해 사용되는 산술, 논리연산을 수행하는 기능을 가진 기호유 형 기 호

산술 연산자 + , - , * , / , %, ++, --

대입 연산자 =, +=, -=, *=, /= , %=

관계 연산자 > , >= , < , <= , ==, !=

논리 연산자 && , || , !

비트연산자 & , | , ^ , ~ , << , >>

Page 12: 아두이노로 만드는 인형뽑기장치 · 6. 실습 #3 – 디스플레이(7세그먼트) 7세그먼트(FND – Flexible Numerical Display) 란? - LED를 점등을 이용해서

Ⅰ. 아두이노 및 C프로그래밍 기초

- 10 -

▪ 제어문 : 프로그램의 실행흐름을 조건에 따라 여러 가지로 나누거나 바꾸는 기능유 형 형 식 사용예

if 문

if(조건식1)

{

수행문1;

}

else if(조건식2)

{

수행문2;

}

else

{

수행문3;

}

int x = 5;

if(x >10)

{

printf(“x는 10보다 크다”);

}

else if(x >= 5)

{

printf(“x는 5보다 크거나 같다”);

}

else

{

printf(“x는 5보다 작다”);

}

for 문

for(초기값 ; 조건식 ; 증감치)

{

반복수행문;

}

for(int n=1 ; n<=10 ; n++)

{

// 1부터 10숫자 출력

printf(“%d, n);

}

while 문

while(반복조건식)

{

수행문;

}

int n=1;

while(n <= 10)

{

// 1부터 10숫자 출력

printf(“%d, n);

n++;

}

기타

break, continue, return,

do ~ while

switch ~ case

goto

-

▪ 함수(Function) : 프로그램에서 반복 수행되는 부분(또는 기능)을 별도의 기능으로 묶어둔 것▪ 포인터(Pointer) : 데이터 또는 함수가 실행되는 메모리 주소값(Memory Address)▪ 배열(Array) : 동일한 형태의 변수 또는 데이터를 한꺼번에 지정한 것▪ 구조체(Structure) : 서로 다른 데이터형을 하나의 개념체로 묶어서 다루는 것

Page 13: 아두이노로 만드는 인형뽑기장치 · 6. 실습 #3 – 디스플레이(7세그먼트) 7세그먼트(FND – Flexible Numerical Display) 란? - LED를 점등을 이용해서

Ⅰ. 아두이노 및 C프로그래밍 기초

- 11 -

▪ C프로그래밍 기본예제- 홀/짝수 판별

// 변수에 저장된 숫자가 짝수인지 홀수인지 판단 (변수와 상수, if문)

int number = 1;

int result = 0;

void setup()

{

Serial.begin(9600); // 아두이노와 통신시작

}

void loop()

{

result = number % 2; // number를 2로 나눈 나머지를 result에 저장(0 또는 1)

if(result == 0)

{

Serial.println("EVEN"); // 나머지가 0이면 짝수

}

else

{

Serial.println("ODD"); // 나머지가 1이면 홀수

}

while(1);

}

- 숫자카운트

// 숫자카운트하기 (for문)

void setup()

{

Serial.begin(9600);

}

void loop()

{

for(int n=0 ; n<=10 ; n++)

{

Serial.print("Number : "); // 메시지 출력

Serial.println(n); // 숫자출력

delay(1000);

}

while(1);

}

Page 14: 아두이노로 만드는 인형뽑기장치 · 6. 실습 #3 – 디스플레이(7세그먼트) 7세그먼트(FND – Flexible Numerical Display) 란? - LED를 점등을 이용해서

Ⅰ. 아두이노 및 C프로그래밍 기초

- 12 -

4. 실습 #1 – 디지털 출력(LED제어)

▪ LED 1개 On/Off 제어

-LED 회로연결

-아두이노 프로그램 작성// LED Blink 기본 예제

void setup()

{

// 13번핀 출력 초기화

pinMode(13, OUTPUT);

}

void loop()

{

digitalWrite(13, HIGH); // LED 켜기

delay(1000); // 1초 기다리기

digitalWrite(13, LOW); // LED 끄기

delay(1000); // 1초 기다리기

}

Page 15: 아두이노로 만드는 인형뽑기장치 · 6. 실습 #3 – 디스플레이(7세그먼트) 7세그먼트(FND – Flexible Numerical Display) 란? - LED를 점등을 이용해서

Ⅰ. 아두이노 및 C프로그래밍 기초

- 13 -

▪ LED 8개 On/Off 제어

-LED 회로연결

-아두이노 프로그램 작성// LED 순차적으로 켜고 끄기

void setup()

{

// 출력핀 초기화

for(int pin=6 ; pin <= 13 ; pin++)

{

pinMode(pin, OUTPUT);

}

}

void loop()

{

for(int pin=6 ; pin <= 13 ; pin++)

{

digitalWrite(pin, HIGH);

delay(500);

digitalWrite(pin, LOW);

}

}

Page 16: 아두이노로 만드는 인형뽑기장치 · 6. 실습 #3 – 디스플레이(7세그먼트) 7세그먼트(FND – Flexible Numerical Display) 란? - LED를 점등을 이용해서

Ⅰ. 아두이노 및 C프로그래밍 기초

- 14 -

5. 실습 #2 – 디지털 입력(스위치 입력)

▪ 스위치 1개 연결

-스위치 회로연결(실습#1에 추가 연결)

-아두이노 프로그램 작성// 버튼 입력할때 LED 켜지기

int buttonPin = 5; // 입력핀 번호

int ledPin = 13; // 출력핀번호

int buttonState = 0; // 버튼상태 저장

void setup()

{

pinMode(ledPin, OUTPUT); // 출력핀

pinMode(buttonPin, INPUT); // 입력핀모드

}

void loop()

{

buttonState = digitalRead(buttonPin); // 버튼 입력

// 버튼상태 확인

if(buttonState == LOW)

{

digitalWrite(ledPin, HIGH); // LED ON

}

else

{

digitalWrite(ledPin, LOW); // LED OFF

}

}

Page 17: 아두이노로 만드는 인형뽑기장치 · 6. 실습 #3 – 디스플레이(7세그먼트) 7세그먼트(FND – Flexible Numerical Display) 란? - LED를 점등을 이용해서

Ⅰ. 아두이노 및 C프로그래밍 기초

- 15 -

※ QUEST

1. 실습 #2의 회로를 이용해서, LED 동작을 여러 가지로 바꿔보시오.

2. 실습 #2의 회로를 이용해서, 스위치를 누를때마다 LED 점등위치가 바뀌도록

프로그램을 작성해보시오.

Page 18: 아두이노로 만드는 인형뽑기장치 · 6. 실습 #3 – 디스플레이(7세그먼트) 7세그먼트(FND – Flexible Numerical Display) 란? - LED를 점등을 이용해서

Ⅰ. 아두이노 및 C프로그래밍 기초

- 16 -

6. 실습 #3 – 디스플레이(7세그먼트)

▪ 7세그먼트(FND – Flexible Numerical Display) 란?

- LED를 점등을 이용해서 숫자(0 ~ F) 및 간단한 기호를 표현할 수 있는 디스플레이 장치- 공통단자의 극성에 따라서 캐소드(K)형 또는 에노드(A)형으로 구분됨.

Page 19: 아두이노로 만드는 인형뽑기장치 · 6. 실습 #3 – 디스플레이(7세그먼트) 7세그먼트(FND – Flexible Numerical Display) 란? - LED를 점등을 이용해서

Ⅰ. 아두이노 및 C프로그래밍 기초

- 17 -

▪ 7세그먼트 1개 연결

-7세그먼트 회로연결

※ 7세그먼트의 a~h 단자를 디지털핀 6~13에 순서대로 연결

-아두이노 프로그램 작성// for문을 이용한 FND 출력예제

int ledPin[8] = {6, 7, 8, 9, 10, 11, 12, 13};

byte numTable[10] = { B00111111, // 0

B00000110, // 1

B01011011, // 2

B01001111, // 3

B01100110, // 4

B01101101, // 5

B01111101, // 6

B00000111, // 7

B01111111, // 8

B01100111 // 9

};

boolean segment = false;

☞ 다음장에 계속...

Page 20: 아두이노로 만드는 인형뽑기장치 · 6. 실습 #3 – 디스플레이(7세그먼트) 7세그먼트(FND – Flexible Numerical Display) 란? - LED를 점등을 이용해서

Ⅰ. 아두이노 및 C프로그래밍 기초

- 18 -

void setup()

{

for(int i=0 ; i < 8 ; i++)

{

pinMode(ledPin[i], OUTPUT);

}

}

void loop()

{

// 숫자증가 : 0 ~ 9

for(int Num=0 ; Num<=9 ; Num++)

{

// 해당숫자를 FND에 표시

for(int i=0 ; i<8 ; i++)

{

// 해당비트를 추출

segment = ( ( B00000001 << i ) & numTable[Num] ) >> i;

digitalWrite(ledPin[i], segment);

}

delay(1000);

}

}

※ QUEST

1. 실습 #3의 회로를 이용해서, 7세그먼트의 동작을 바꿔보시오.

2. 실습 #3을 기초로, 여러 개의 7세그먼트를 연결해서, 다양한 숫자값을 표현하시

오.

Page 21: 아두이노로 만드는 인형뽑기장치 · 6. 실습 #3 – 디스플레이(7세그먼트) 7세그먼트(FND – Flexible Numerical Display) 란? - LED를 점등을 이용해서

Ⅰ. 아두이노 및 C프로그래밍 기초

- 19 -

7. 실습 #4 – 아날로그 입력(조이스틱 모듈)

▪ 아두이노 보드 아날로그 입력단자 및 사양

▪ 아두이노 보드 아날로그 출력단자 및 사양

▪ PWM(Pulse Width Modulation, 펄스폭 변조) 이란? - 빠르게 ON/OFF 되는 신호의 ON시간의 비율(Duty Ratio)를 조정하여, 아날로그 출력과 유사한 출력효과를 만드는 것.

Page 22: 아두이노로 만드는 인형뽑기장치 · 6. 실습 #3 – 디스플레이(7세그먼트) 7세그먼트(FND – Flexible Numerical Display) 란? - LED를 점등을 이용해서

Ⅰ. 아두이노 및 C프로그래밍 기초

- 20 -

▪ 아날로그 조이스틱 입력

- 조이스틱 모듈 연결

- 아두이노 프로그램 작성

// 아날로그 입력값을 전압으로 표현하기

void setup()

{

Serial.begin(9600); // 시리얼모니터 초기화

}

void loop()

{

int sensorValue = analogRead(A0); // 아날로그 A0 입력받기

long voltage = map(sensorValue, 0, 1023, 0, 500);

Serial.print("Digital :");

Serial.print(sensorValue); // 디지털값 출력

Serial.print(" Voltage :");

Serial.println((float)voltage/100); // 전압값 출력

delay(500); // 시간딜레이 0.5초

}

- 프로그램 업로드 ⇨ 시리얼 모니터 실행 ⇨ 조이스틱 모듈 조작, 값 변화 확인

Page 23: 아두이노로 만드는 인형뽑기장치 · 6. 실습 #3 – 디스플레이(7세그먼트) 7세그먼트(FND – Flexible Numerical Display) 란? - LED를 점등을 이용해서

Ⅰ. 아두이노 및 C프로그래밍 기초

- 21 -

8. 실습 #5 – 센서

▪ 조도 센서

- 센서 결선

- 아두이노 프로그램 작성

// CDS 센서와 LED

int ledPin = 13;

int sensorPin = 0;

void setup()

{

pinMode(ledPin, OUTPUT);

}

void loop()

{

int sensor = analogRead(sensorPin);

digitalWrite(ledPin, HIGH);

delay(sensor);

digitalWrite(ledPin, LOW);

delay(sensor);

}

Page 24: 아두이노로 만드는 인형뽑기장치 · 6. 실습 #3 – 디스플레이(7세그먼트) 7세그먼트(FND – Flexible Numerical Display) 란? - LED를 점등을 이용해서

Ⅰ. 아두이노 및 C프로그래밍 기초

- 22 -

▪ 온습도센서 모듈 - 센서 결선

- 아두이노 프로그램 작성

#include <DHT.h>

DHT dht(2, DHT11); // 온습도 센서모듈 설정

void setup(){ Serial.begin(9600); Serial.println("DHT11 measure start"); dht.begin(); // 온습도 센서모듈 시작}

void loop(){ float humiValue = dht.readHumidity(); float tempValue = dht.readTemperature();

if( isnan(humiValue) || isnan(tempValue) ) { Serial.println("Failed"); return; }

Serial.print("Humidity:"); Serial.print(humiValue); Serial.println("%RH"); Serial.print("Temperature:"); Serial.print(tempValue); Serial.println("C"); Serial.println();

delay(2000);}

Page 25: 아두이노로 만드는 인형뽑기장치 · 6. 실습 #3 – 디스플레이(7세그먼트) 7세그먼트(FND – Flexible Numerical Display) 란? - LED를 점등을 이용해서

Ⅰ. 아두이노 및 C프로그래밍 기초

- 23 -

9. 실습 #6 – 통신 / 블루투스

▪ 블루투스 모듈(HC-06) 결선

▪ 블루투스 모듈(HC-06) 설정

- 아두이노 프로그램 작성#include <SoftwareSerial.h>

SoftwareSerial BT(12, 13);

void setup()

{

Serial.begin(9600);

BT.begin(9600);

}

void loop()

{

if (BT.available()) Serial.write(BT.read());

if (Serial.available()) BT.write(Serial.read());

}

Page 26: 아두이노로 만드는 인형뽑기장치 · 6. 실습 #3 – 디스플레이(7세그먼트) 7세그먼트(FND – Flexible Numerical Display) 란? - LED를 점등을 이용해서

Ⅰ. 아두이노 및 C프로그래밍 기초

- 24 -

- 블루투스 이름, PIN 설정

Page 27: 아두이노로 만드는 인형뽑기장치 · 6. 실습 #3 – 디스플레이(7세그먼트) 7세그먼트(FND – Flexible Numerical Display) 란? - LED를 점등을 이용해서

Ⅰ. 아두이노 및 C프로그래밍 기초

- 25 -

Page 28: 아두이노로 만드는 인형뽑기장치 · 6. 실습 #3 – 디스플레이(7세그먼트) 7세그먼트(FND – Flexible Numerical Display) 란? - LED를 점등을 이용해서

Ⅰ. 아두이노 및 C프로그래밍 기초

- 26 -

Page 29: 아두이노로 만드는 인형뽑기장치 · 6. 실습 #3 – 디스플레이(7세그먼트) 7세그먼트(FND – Flexible Numerical Display) 란? - LED를 점등을 이용해서

Ⅰ. 아두이노 및 C프로그래밍 기초

- 27 -

Page 30: 아두이노로 만드는 인형뽑기장치 · 6. 실습 #3 – 디스플레이(7세그먼트) 7세그먼트(FND – Flexible Numerical Display) 란? - LED를 점등을 이용해서

Ⅰ. 아두이노 및 C프로그래밍 기초

- 28 -

▪ 블루투스로 원격 LED 오/오프 제어- 아두이노 프로그램 작성

#include <SoftwareSerial.h>

int ledPin = 13;

SoftwareSerial BT(2, 3);

void setup()

{

BT.begin(9600);

pinMode(ledPin, OUTPUT);

}

void loop()

{

if(BT.available())

{

char a = (char)BT.read();

if(a == '1') digitalWrite(ledPin, HIGH);

else if(a == '0') digitalWrite(ledPin, LOW);

}

}

- 원격 조정테스트(채팅앱 이용)

Page 31: 아두이노로 만드는 인형뽑기장치 · 6. 실습 #3 – 디스플레이(7세그먼트) 7세그먼트(FND – Flexible Numerical Display) 란? - LED를 점등을 이용해서

Ⅰ. 아두이노 및 C프로그래밍 기초

- 29 -

- 원격 조정테스트(컨트롤러앱 이용)

Page 32: 아두이노로 만드는 인형뽑기장치 · 6. 실습 #3 – 디스플레이(7세그먼트) 7세그먼트(FND – Flexible Numerical Display) 란? - LED를 점등을 이용해서

Ⅰ. 아두이노 및 C프로그래밍 기초

- 30 -

10. 실습 #7 – 모터

▪ 서보 모터란? 모터와 모터의 위치측정센서, 주변제어부를 포함하여 모터의 위치, 속도를 제어할 수 있도록 구성된 제어시스템을 서보제어시스템 이라고 하며, 이때 사용되는 모터를 통상, 서보모터라고 칭한다.

▪ 서보 모터 구동

- 모터 결선(실습#4에 추가 연결)

- 아두이노 프로그램 작성#include <Servo.h>

Servo myservo;

void setup()

{

myservo.attach(12);

myservo.write(0);

delay(1000);

}

void loop()

{

int sensorValue = analogRead(A0);

int angle = map(sensorValue, 0, 1023, 0, 180);

myservo.write(angle);

delay(50);

}

Page 33: 아두이노로 만드는 인형뽑기장치 · 6. 실습 #3 – 디스플레이(7세그먼트) 7세그먼트(FND – Flexible Numerical Display) 란? - LED를 점등을 이용해서

Ⅰ. 아두이노 및 C프로그래밍 기초

- 31 -

11. 실습 #8 – LCD모듈

▪ LCD ( Liquid Crystal Display) - 디지털 기기의 기본적인 디스플레이 장치로 널리 사용됨 - 지정된 문자(숫자)만 표시할 수 있는 텍스트 LCD와 문자 및 그림 출력이 가능한 그래픽 LCD로 구분됨.

▪ LCD 구동

- LCD 결선 (I2C 통신 방식)

- 아두이노 프로그램 작성

#include <Wire.h> // I2C 통신용

#include <LiquidCrystal_I2C.h> // LCD제어용

LiquidCrystal_I2C lcd(0x3F, 16, 2); // LCD 초기세팅 (0x27)

void setup()

{

lcd.init(); // LCD 초기화

lcd.backlight(); // LCD 백라이트 ON

lcd.setCursor(0,0); // LCD 커서위치

Serial.begin(9600);

}

☞ 다음장에 계속...

Page 34: 아두이노로 만드는 인형뽑기장치 · 6. 실습 #3 – 디스플레이(7세그먼트) 7세그먼트(FND – Flexible Numerical Display) 란? - LED를 점등을 이용해서

Ⅰ. 아두이노 및 C프로그래밍 기초

- 32 -

void loop()

{

// 시리얼 통신으로 전송된 데이터가 있으면 데이터 표시함.

if (Serial.available())

{

delay(100);

lcd.clear();

while (Serial.available() > 0)

{

lcd.write(Serial.read());

}

}

}

- 시리얼 모니터 입력창에 메시지 입력후 LCD에 표시되는지 확인

Hello World!

- LCD 글자 명암 조정(글자가 안보이거나, 화면이 검게 나오는 경우)

Page 35: 아두이노로 만드는 인형뽑기장치 · 6. 실습 #3 – 디스플레이(7세그먼트) 7세그먼트(FND – Flexible Numerical Display) 란? - LED를 점등을 이용해서

Ⅱ. 직교로봇 시스템 구현

- 33 -

1. 기구부

▪ 기구부 구성

Page 36: 아두이노로 만드는 인형뽑기장치 · 6. 실습 #3 – 디스플레이(7세그먼트) 7세그먼트(FND – Flexible Numerical Display) 란? - LED를 점등을 이용해서

Ⅱ. 직교로봇 시스템 구현

- 34 -

▪ 프레임 조립

수직 프레임(4)

수평 프레임(9)

1. 수평프레임 양 끝에 프레임 체결너트를 그림과 같이 조립한다. (느슨하게)

2. 수평프레임과 수직프레임을 그림과 같이 조립한 뒤, 체결홀을 이용해서 볼트를 조여 준다.

Page 37: 아두이노로 만드는 인형뽑기장치 · 6. 실습 #3 – 디스플레이(7세그먼트) 7세그먼트(FND – Flexible Numerical Display) 란? - LED를 점등을 이용해서

Ⅱ. 직교로봇 시스템 구현

- 35 -

3. 프레임을 그림과 같이 “L” 자로 조립한 뒤, 프레임 홈에 하부 투명커버를 끼운다.

※ 하부 커버를 반드시 미리 끼워야 함.

4. 수평프레임을 하부커버 모서리에 위치 시킨후, 수직프레임을 수평프레임이 맞닿는 부분에 끼운다.

※ 순서대로 조립해야만 하부 커버 조립이 가능함.

※ 수평프레임에 사각너트를 미리 삽입한다.( 5번 참조)

Page 38: 아두이노로 만드는 인형뽑기장치 · 6. 실습 #3 – 디스플레이(7세그먼트) 7세그먼트(FND – Flexible Numerical Display) 란? - LED를 점등을 이용해서

Ⅱ. 직교로봇 시스템 구현

- 36 -

5. 나머지 프레임을 조립한다. 이 때, 수평 프레임 홈에는 사각너트를 반드시 삽입한다.

(상단 그림 개수 참조)

※ 사각너트는 프레임에 부품을 조립할 때 사용하므로 미리 삽입해두어야 한다.

Page 39: 아두이노로 만드는 인형뽑기장치 · 6. 실습 #3 – 디스플레이(7세그먼트) 7세그먼트(FND – Flexible Numerical Display) 란? - LED를 점등을 이용해서

Ⅱ. 직교로봇 시스템 구현

- 37 -

▪ 구동부 조립

1. 상단 수평 프레임에 그럼과 같이 측면 브라켓을 고정시킨다. ( M5–8 렌치볼트)

Page 40: 아두이노로 만드는 인형뽑기장치 · 6. 실습 #3 – 디스플레이(7세그먼트) 7세그먼트(FND – Flexible Numerical Display) 란? - LED를 점등을 이용해서

Ⅱ. 직교로봇 시스템 구현

- 38 -

리니어 부싱(장축)

2. 리니어 부싱(장축)을 측면 브라켓에 고정한다.

Page 41: 아두이노로 만드는 인형뽑기장치 · 6. 실습 #3 – 디스플레이(7세그먼트) 7세그먼트(FND – Flexible Numerical Display) 란? - LED를 점등을 이용해서

Ⅱ. 직교로봇 시스템 구현

- 39 -

상단 브라켓(좌/우) 리니어 부싱(단축)

3. 리니어 부싱(장축) 좌/우측어 상단 브라켓에 고정한다.

4. 리니어 부싱(단축)을 상단 브라켓에 고정한다.

Page 42: 아두이노로 만드는 인형뽑기장치 · 6. 실습 #3 – 디스플레이(7세그먼트) 7세그먼트(FND – Flexible Numerical Display) 란? - LED를 점등을 이용해서

Ⅱ. 직교로봇 시스템 구현

- 40 -

5. 중앙 브라켓을 부싱(단축)상단에 고정한다.

※ 방향 주의

6. 모터 브라켓을 중앙 브라켓 상단에 고정한다.

※ 모터브라켓 방향주의

7. 모터 브라켓을 우측 상단 브라켓에 고정한다.

※ 모터브라켓 방향주의

Page 43: 아두이노로 만드는 인형뽑기장치 · 6. 실습 #3 – 디스플레이(7세그먼트) 7세그먼트(FND – Flexible Numerical Display) 란? - LED를 점등을 이용해서

Ⅱ. 직교로봇 시스템 구현

- 41 -

8. 우측 상단프레임에 센서브라켓을 고정한다.

피니언 기어 (φ5)

좌측 측면 브라켓 좌측 상단 브라켓

9. 베어링 마운트에 피니언 기어(φ5)를 방향과 같이 조립한다.

※ 조립 방향 주의

※ 피니언 기어는 φ5 및 φ6 의 두 종류가 있으므로 혼동하지말것.

Page 44: 아두이노로 만드는 인형뽑기장치 · 6. 실습 #3 – 디스플레이(7세그먼트) 7세그먼트(FND – Flexible Numerical Display) 란? - LED를 점등을 이용해서

Ⅱ. 직교로봇 시스템 구현

- 42 -

10. 좌측 상단 브라켓 측면에 벨트고정 브라켓을 고정한다.

좌측 모터 브라켓 우측 상단 모터 브라켓 중앙 모터 도르레

11. 모터 브라켓에 모터를 고정하고, 피니언 기어(φ6) 또는 도르레를 고정 한다.

※ 모터 감속비 주의(주행축 1/60 , 도르레 1/90)

12. 리미트 센서를 고정한다.

Page 45: 아두이노로 만드는 인형뽑기장치 · 6. 실습 #3 – 디스플레이(7세그먼트) 7세그먼트(FND – Flexible Numerical Display) 란? - LED를 점등을 이용해서

Ⅱ. 직교로봇 시스템 구현

- 43 -

2. 전기/제어시스템

▪ 전기/제어시스템 구성

-구성 요소

MEGA2560 DC 모터(3개) SMPS (12V, 100W)

아날로그 조이스틱(1개) 마이크로 스위치(3개) 7세그먼트 (2개)

마이크로 스위치(4개) Tact스위치 (2개)브레드보드,

점퍼선, 저항 등

Page 46: 아두이노로 만드는 인형뽑기장치 · 6. 실습 #3 – 디스플레이(7세그먼트) 7세그먼트(FND – Flexible Numerical Display) 란? - LED를 점등을 이용해서

Ⅱ. 직교로봇 시스템 구현

- 44 -

▪ DC모터 결선

▪ 서보모터 결선

Page 47: 아두이노로 만드는 인형뽑기장치 · 6. 실습 #3 – 디스플레이(7세그먼트) 7세그먼트(FND – Flexible Numerical Display) 란? - LED를 점등을 이용해서

Ⅱ. 직교로봇 시스템 구현

- 45 -

▪ 디지털 입력 버튼 결선

-리미트 센서

-시작, 동작 버튼

Page 48: 아두이노로 만드는 인형뽑기장치 · 6. 실습 #3 – 디스플레이(7세그먼트) 7세그먼트(FND – Flexible Numerical Display) 란? - LED를 점등을 이용해서

Ⅱ. 직교로봇 시스템 구현

- 46 -

▪ 아날로그(조이스틱) 입력 버튼 결선

▪ 디스플레이 결선

-표시할 숫자의 자릿수만큼 7세그먼트를 배치하고, 해당 디지털핀에 순서대로 결선함.

Page 49: 아두이노로 만드는 인형뽑기장치 · 6. 실습 #3 – 디스플레이(7세그먼트) 7세그먼트(FND – Flexible Numerical Display) 란? - LED를 점등을 이용해서

Ⅱ. 직교로봇 시스템 구현

- 47 -

3. 프로그램 설계

-순서도

loop()

{

if ( step == 0 )

{

// 버튼, LED 초기화

}

else if ( step == 1 )

{

// 시작버튼 입력확인

}

else if ( step == 2 )

{

// 시간초과 확인

// 조그 동작

}

else if ( step == 3 )

{

// 집게 - 하강, GRAP ON, 상승

}

else if ( step == 4 )

{

// 집게 - 배출구로 이동

}

else if ( step == 5 )

{

// 집게 - GRAP OFF

}

else if ( step == 6 )

{

// 집게 - 원위치

}

}

Page 50: 아두이노로 만드는 인형뽑기장치 · 6. 실습 #3 – 디스플레이(7세그먼트) 7세그먼트(FND – Flexible Numerical Display) 란? - LED를 점등을 이용해서

Ⅱ. 직교로봇 시스템 구현

- 48 -

4. 실습 #1 – 전체 프로그램

#include <Servo.h>

#define TIME 30000 // msec

// 7세그먼트 출력핀 0 ~ 3자리int iPinFND[2][8] = { {30, 31, 32, 33, 34, 35, 36, 37}, {22, 23, 24, 25, 26, 27, 28, 29} };

// 7세그먼트 숫자값 : 0 ~ 9byte arNumTable[10][8] = { {1, 1, 1, 1, 1, 1, 0, 0}, // 0 {0, 1, 1, 0, 0, 0, 0, 0}, // 1 {1, 1, 0, 1, 1, 0, 1, 0}, // 2 {1, 1, 1, 1, 0, 0, 1, 0}, // 3 {0, 1, 1, 0, 0, 1, 1, 0}, // 4 {1, 0, 1, 1, 0, 1, 1, 0}, // 5 {1, 0, 1, 1, 1, 1, 1, 0}, // 6 {1, 1, 1, 0, 0, 0, 0, 0}, // 7 {1, 1, 1, 1, 1, 1, 1, 0}, // 8 {1, 1, 1, 1, 0, 1, 1, 0} }; // 9

int iPinMotor_X_CW = 2;int iPinMotor_X_CCW = 3;int iPinMotor_Y_CW = 4;int iPinMotor_Y_CCW = 5;int iPinMotor_Z_CW = 6;int iPinMotor_Z_CCW = 7;

int iPinLimit_X_Min = 8;int iPinLimit_X_Max = 9;int iPinLimit_Y_Min = 10;int iPinLimit_Y_Max = 11;

int iPinJog_X = A0;int iPinJog_Y = A1;

int iPinServo[3] = {38, 39, 40};

int iPinBtn_Start = 12;int iPinBtn_Crain = 13;

int iOldVal_X = 0;int iOldVal_Y = 0;

Page 51: 아두이노로 만드는 인형뽑기장치 · 6. 실습 #3 – 디스플레이(7세그먼트) 7세그먼트(FND – Flexible Numerical Display) 란? - LED를 점등을 이용해서

Ⅱ. 직교로봇 시스템 구현

- 49 -

int iStep = 0;

unsigned long ulPreTime = 0;unsigned long ulPreTime_Demo = 0;

Servo Gripper[3];

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

for (int i = 0 ; i < 2 ; i++) { for (int pin = 0 ; pin < 8 ; pin++) { pinMode(iPinFND[i][pin], OUTPUT); } }

for (int servo = 0 ; servo < 3; servo++) { Gripper[servo].attach(iPinServo[servo]); Gripper[servo].write(90); }

pinMode(iPinLimit_X_Min, INPUT_PULLUP); pinMode(iPinLimit_X_Max, INPUT_PULLUP); pinMode(iPinLimit_Y_Min, INPUT_PULLUP); pinMode(iPinLimit_Y_Max, INPUT_PULLUP);

pinMode(iPinBtn_Start, INPUT_PULLUP); pinMode(iPinBtn_Crain, INPUT_PULLUP);

delay(500);

}

int iStateDemo = 1;

void loop(){ // 리미트 센서 boolean bLimit_X_Min = (boolean)!digitalRead(iPinLimit_X_Min); boolean bLimit_X_Max = (boolean)!digitalRead(iPinLimit_X_Max); boolean bLimit_Y_Min = (boolean)!digitalRead(iPinLimit_Y_Min);

Page 52: 아두이노로 만드는 인형뽑기장치 · 6. 실습 #3 – 디스플레이(7세그먼트) 7세그먼트(FND – Flexible Numerical Display) 란? - LED를 점등을 이용해서

Ⅱ. 직교로봇 시스템 구현

- 50 -

boolean bLimit_Y_Max = (boolean)!digitalRead(iPinLimit_Y_Max);

// 조그, 버튼 입력 int iVal_X = analogRead(iPinJog_X); int iVal_Y = analogRead(iPinJog_Y);

unsigned long ulCurTime = millis();

if (iStep == 0) { Serial.println("INITIALIZE");

for (int i = 0 ; i < 2 ; i++) { for (int pin = 0 ; pin < 8 ; pin++) { digitalWrite(iPinFND[i][pin], LOW); } }

iStep = 1;

Serial.println("WAIT START");

} if (iStep == 1) { if (ulCurTime - ulPreTime_Demo >= 700) { iStateDemo = !iStateDemo; ulPreTime_Demo = ulCurTime;

digitalWrite(iPinFND[1][6], iStateDemo); digitalWrite(iPinFND[0][6], iStateDemo); }

if (digitalRead(iPinBtn_Start) == LOW) { delay(50);

Serial.println("GAME START");

iStep = 2; ulPreTime = ulCurTime; }

Page 53: 아두이노로 만드는 인형뽑기장치 · 6. 실습 #3 – 디스플레이(7세그먼트) 7세그먼트(FND – Flexible Numerical Display) 란? - LED를 점등을 이용해서

Ⅱ. 직교로봇 시스템 구현

- 51 -

if (iVal_Y > 700) // Y+ { analogWrite(iPinMotor_Z_CW, 0); analogWrite(iPinMotor_Z_CCW, 255); } else if (iVal_Y < 300) // Y- { analogWrite(iPinMotor_Z_CW, 255); analogWrite(iPinMotor_Z_CCW, 0); } else { analogWrite(iPinMotor_Z_CW, 0); analogWrite(iPinMotor_Z_CCW, 0); } } if (iStep == 2) { unsigned long ulElapsedTime = ulCurTime - ulPreTime;

double dTime = (double)(TIME - ulElapsedTime)/1000.; if(dTime > (int)dTime) DisplayNumber((int)dTime+1); else DisplayNumber((int)dTime); if (ulElapsedTime >= TIME) { Serial.println("TIME OVER"); iStep = 3; } else { // 조그 동작 if ( (abs(iOldVal_X - iVal_X) > 30) || (abs(iOldVal_Y - iVal_Y) > 30) ) { iOldVal_X = iVal_X; iOldVal_Y = iVal_Y;

Serial.print(iVal_X); Serial.print(", "); Serial.println(iVal_Y); }

Page 54: 아두이노로 만드는 인형뽑기장치 · 6. 실습 #3 – 디스플레이(7세그먼트) 7세그먼트(FND – Flexible Numerical Display) 란? - LED를 점등을 이용해서

Ⅱ. 직교로봇 시스템 구현

- 52 -

if (iVal_X < 300) // X+ { if (bLimit_X_Max == false) { analogWrite(iPinMotor_X_CW, 0); analogWrite(iPinMotor_X_CCW, 255); } else { Serial.println("Limit_X_Max"); analogWrite(iPinMotor_X_CW, 0); analogWrite(iPinMotor_X_CCW, 0); } } else if (iVal_X > 700) // X- { if (bLimit_X_Min == false) { analogWrite(iPinMotor_X_CW, 255); analogWrite(iPinMotor_X_CCW, 0); } else { Serial.println("Limit_X_Min"); analogWrite(iPinMotor_X_CW, 0); analogWrite(iPinMotor_X_CCW, 0); } } else { analogWrite(iPinMotor_X_CW, 0); analogWrite(iPinMotor_X_CCW, 0); }

if (iVal_Y > 700) // Y+ { if (bLimit_Y_Max == false) { analogWrite(iPinMotor_Y_CW, 0); analogWrite(iPinMotor_Y_CCW, 255); } else { Serial.println("Limit_Y_Max"); analogWrite(iPinMotor_Y_CW, 0);

Page 55: 아두이노로 만드는 인형뽑기장치 · 6. 실습 #3 – 디스플레이(7세그먼트) 7세그먼트(FND – Flexible Numerical Display) 란? - LED를 점등을 이용해서

Ⅱ. 직교로봇 시스템 구현

- 53 -

analogWrite(iPinMotor_Y_CCW, 0); } } else if (iVal_Y < 300) // Y- { if (bLimit_Y_Min == false) { analogWrite(iPinMotor_Y_CW, 255); analogWrite(iPinMotor_Y_CCW, 0); } else { Serial.println("Limit_Y_Min"); analogWrite(iPinMotor_Y_CW, 0); analogWrite(iPinMotor_Y_CCW, 0); } } else { analogWrite(iPinMotor_Y_CW, 0); analogWrite(iPinMotor_Y_CCW, 0); }

// 크레인 동작버튼 if (digitalRead(iPinBtn_Crain) == LOW) { delay(50);

// 모터 정지 analogWrite(iPinMotor_X_CW, 0); analogWrite(iPinMotor_X_CCW, 0); analogWrite(iPinMotor_Y_CW, 0); analogWrite(iPinMotor_Y_CCW, 0);

iStep = 3; } } } if (iStep == 3) { Serial.println("PICK UP");

// 1. 하강 analogWrite(iPinMotor_Z_CW, 0); analogWrite(iPinMotor_Z_CCW, 255);

Page 56: 아두이노로 만드는 인형뽑기장치 · 6. 실습 #3 – 디스플레이(7세그먼트) 7세그먼트(FND – Flexible Numerical Display) 란? - LED를 점등을 이용해서

Ⅱ. 직교로봇 시스템 구현

- 54 -

delay(3500);

// 2. 정지 & GRAP ON analogWrite(iPinMotor_Z_CW, 0); analogWrite(iPinMotor_Z_CCW, 0); for (int servo = 0 ; servo < 3; servo++) { Gripper[servo].attach(iPinServo[servo]); Gripper[servo].write(140); }

delay(1000);

// 3. 상승 analogWrite(iPinMotor_Z_CW, 255); analogWrite(iPinMotor_Z_CCW, 0); delay(3500);

// 4. 정지 analogWrite(iPinMotor_Z_CW, 0); analogWrite(iPinMotor_Z_CCW, 0);

iStep = 4; Serial.println("TAKE OUT"); } if (iStep == 4) { if (bLimit_X_Max == false) { analogWrite(iPinMotor_X_CW, 0); analogWrite(iPinMotor_X_CCW, 255); } else { analogWrite(iPinMotor_X_CW, 0); analogWrite(iPinMotor_X_CCW, 0); }

if (bLimit_Y_Max == false) { analogWrite(iPinMotor_Y_CW, 0); analogWrite(iPinMotor_Y_CCW, 255); } else

Page 57: 아두이노로 만드는 인형뽑기장치 · 6. 실습 #3 – 디스플레이(7세그먼트) 7세그먼트(FND – Flexible Numerical Display) 란? - LED를 점등을 이용해서

Ⅱ. 직교로봇 시스템 구현

- 55 -

{ analogWrite(iPinMotor_Y_CW, 0); analogWrite(iPinMotor_Y_CCW, 0); }

if (bLimit_X_Max == true && bLimit_Y_Max == true) { analogWrite(iPinMotor_X_CW, 0); analogWrite(iPinMotor_X_CCW, 0);

analogWrite(iPinMotor_Y_CW, 0); analogWrite(iPinMotor_Y_CCW, 0);

iStep = 5; } } if (iStep == 5) { Serial.println("GRAP OFF");

// GRAP OFF for (int servo = 0 ; servo < 3; servo++) { Gripper[servo].attach(iPinServo[servo]); Gripper[servo].write(90); }

delay(3000);

iStep = 6; Serial.println("RETURN HOME"); } if (iStep == 6) { if (bLimit_X_Min == false) { analogWrite(iPinMotor_X_CW, 255); analogWrite(iPinMotor_X_CCW, 0); } else { analogWrite(iPinMotor_X_CW, 0); analogWrite(iPinMotor_X_CCW, 0); }

Page 58: 아두이노로 만드는 인형뽑기장치 · 6. 실습 #3 – 디스플레이(7세그먼트) 7세그먼트(FND – Flexible Numerical Display) 란? - LED를 점등을 이용해서

Ⅱ. 직교로봇 시스템 구현

- 56 -

if (bLimit_Y_Min == false) { analogWrite(iPinMotor_Y_CW, 255); analogWrite(iPinMotor_Y_CCW, 0); } else { analogWrite(iPinMotor_Y_CW, 0); analogWrite(iPinMotor_Y_CCW, 0); }

if (bLimit_X_Min == true && bLimit_Y_Min == true) { Serial.println("GAME OVER");

analogWrite(iPinMotor_X_CW, 0); analogWrite(iPinMotor_X_CCW, 0);

analogWrite(iPinMotor_Y_CW, 0); analogWrite(iPinMotor_Y_CCW, 0);

iStep = 0; } }}

void DisplayNumber(int iNum){ // 10의 자리 표시 int iNum_10 = iNum / 10;

for (int pin = 0 ; pin < 8 ; pin++) { digitalWrite(iPinFND[1][pin], arNumTable[iNum_10][pin]); }

// 1의 자리 표시 int iNum_1 = iNum % 10;

for (int pin = 0 ; pin < 8 ; pin++) { digitalWrite(iPinFND[0][pin], arNumTable[iNum_1][pin]); }}