Upload
others
View
0
Download
0
Embed Size (px)
Citation preview
아두이노로 만드는 인형뽑기장치
목 차
Ⅰ. 아두이노 및 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
Ⅰ. 아두이노 및 C프로그래밍 기초
- 1 -
1. 아두이노(Arduino) 소개
▪ 이탈리아에서 디자인 수업의 목적으로 손쉽게 사용할 수 있도록 개발된 오픈소스형 소형컴퓨터 ▪ Atmel 社의 마이크로컨트롤러를 기반으로 구성
▪ 아두이노(Arduino) = 마이크로컨트롤러 보드 + 프로그램 개발환경 + 인터넷 공개포럼
▪ 공식 포럼 : http://www.arduino.cc
Ⅰ. 아두이노 및 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
Ⅰ. 아두이노 및 C프로그래밍 기초
- 3 -
2. 아두이노 개발환경 구축
▪ 통합개발환경(Integration Development Environment) 이란?마이크로컨트롤러 시스템 개발에 필요한 하드웨어 연결 및 설정, 프로그래밍 작성, 다운로드 및 디버깅등의 작업을 손쉽게 할 수 있도록, 관련 기능이 통합되어 있는 소프트웨어 개발 도구 또는 환경.
▪ 통합개발환경 소프트웨어 설치?- 공식포럼(http://www.arduino.cc) 에서 IDE 소프트웨어를 다운로드.
Ⅰ. 아두이노 및 C프로그래밍 기초
- 4 -
- 다운로드 받은 파일을 실행하고, 프로그램 설치를 진행.
Ⅰ. 아두이노 및 C프로그래밍 기초
- 5 -
▪ 보드 연결 및 설정
- 아두이노 메가보드를 PC에 연결
- 아두이노 IDE 실행
Ⅰ. 아두이노 및 C프로그래밍 기초
- 6 -
- 보드 종류 및 포트 설정
※ 아두이노 보드를 다른 PC에서 연결해제 한 뒤 다시 연결할 때 포트 번호나 보드정보가 바뀔 수 있으므로, 프로그램 컴파일이나 보드 업로딩이 안 뒬 경우, 반드시 확인해야함.
Ⅰ. 아두이노 및 C프로그래밍 기초
- 7 -
▪ 기본 프로그램 작성 및 컴파일, 업로드- 아두이노 IDE 실행 후, 아래 예제를 입력함.
// 아두이노 처음 시작하기 : 시리얼통신으로 메시지 받기
void setup()
{
Serial.begin(9600); // 아두이노와 통신시작
}
void loop()
{
Serial.println("Hello Everyone!!"); // 메시지 출력
delay(1000); // 1초 기다리기
}
- “컴파일” 버튼 클릭 ⇨ “업로드” 버튼 클릭
- “시리얼 모니터” 버튼 클릭 ⇨ 출력 결과 확인
Ⅰ. 아두이노 및 C프로그래밍 기초
- 8 -
3. C프로그래밍 기초
▪ C언어는?
1972년, 벨 연구소(Bell Lab.) 데니스 리치가 개발한 프로그래밍 언어로서, UNIX OS를 운용하기 위해 사용되었다가 점차적으로 널리 사용되어 현재까지 사용됨
▪ C언어의 특징
- 문법이 간결하고, 명백함 - 구조화가 잘 되어있어, 광범위한 확장성을 지님 - 하드웨어 밀착 제어가 가능하면서도, 사용자 편리성이 우수함
▪ C언어 학습의 필요성
현재 ICT 기술의 발전에 힘입어, 컴퓨터 프로그래밍 기술이 하드웨어에 성능에 대한 제약을 거의 받지 않게 되면서, 사용자 편리성이 우수한 고급형 프로그래밍 언어(Java, C#, Python, VB 등)의 사용이 증대되고 있다.
프로그래밍 언어는 적용되는 시스템 환경과 상황에 맞도록 선택되어야 하며, “특정 프로그래밍 언어가 가장 좋다.” 라는 기준은 없다.
현재 기계공학 분야에서 주로 다루는 하드웨어 및 장비시스템은 아직까지 주로 C프로그래밍을 기반으로 개발되어 진다.
C언어는 하드웨어 성능이 뛰어나지 않은 시스템으로부터 고성능 시스템에 이르기까지 적용될 수 있도록, 컴파일러 환경이 다양하게 구축되어 있으며, 시스템의 성능을 최대한 활용 할 수 있도록 직관적인 문법 구조로 이루어져 있다.
C프로그래밍은 타 프로그래밍언어가 갖는 기본 특성을 모두 담고있어, 프로그래밍 습득에 필요한 선수학습으로서 매우 가치가 있는 프로그래밍 언어이다.
▪ 프로그래밍 문법이란?
사람의 언어와 동일하게, 기본적인 표현방법과 규칙을 명시한 것. 컴퓨터는 문법이 약간이라도 틀리면, 동작이 아예 수행되지 않으므로, 기본적인 프로그래밍 문법을 이해하는 것이 가장 중요하다.
Ⅰ. 아두이노 및 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
※ 데이터형별 크기는 아두이노 기준임
▪ 연산자 : 데이터의 처리를 위해 사용되는 산술, 논리연산을 수행하는 기능을 가진 기호유 형 기 호
산술 연산자 + , - , * , / , %, ++, --
대입 연산자 =, +=, -=, *=, /= , %=
관계 연산자 > , >= , < , <= , ==, !=
논리 연산자 && , || , !
비트연산자 & , | , ^ , ~ , << , >>
Ⅰ. 아두이노 및 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) : 서로 다른 데이터형을 하나의 개념체로 묶어서 다루는 것
Ⅰ. 아두이노 및 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);
}
Ⅰ. 아두이노 및 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초 기다리기
}
Ⅰ. 아두이노 및 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);
}
}
Ⅰ. 아두이노 및 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
}
}
Ⅰ. 아두이노 및 C프로그래밍 기초
- 15 -
※ QUEST
1. 실습 #2의 회로를 이용해서, LED 동작을 여러 가지로 바꿔보시오.
2. 실습 #2의 회로를 이용해서, 스위치를 누를때마다 LED 점등위치가 바뀌도록
프로그램을 작성해보시오.
Ⅰ. 아두이노 및 C프로그래밍 기초
- 16 -
6. 실습 #3 – 디스플레이(7세그먼트)
▪ 7세그먼트(FND – Flexible Numerical Display) 란?
- LED를 점등을 이용해서 숫자(0 ~ F) 및 간단한 기호를 표현할 수 있는 디스플레이 장치- 공통단자의 극성에 따라서 캐소드(K)형 또는 에노드(A)형으로 구분됨.
Ⅰ. 아두이노 및 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;
☞ 다음장에 계속...
Ⅰ. 아두이노 및 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세그먼트를 연결해서, 다양한 숫자값을 표현하시
오.
Ⅰ. 아두이노 및 C프로그래밍 기초
- 19 -
7. 실습 #4 – 아날로그 입력(조이스틱 모듈)
▪ 아두이노 보드 아날로그 입력단자 및 사양
▪ 아두이노 보드 아날로그 출력단자 및 사양
▪ PWM(Pulse Width Modulation, 펄스폭 변조) 이란? - 빠르게 ON/OFF 되는 신호의 ON시간의 비율(Duty Ratio)를 조정하여, 아날로그 출력과 유사한 출력효과를 만드는 것.
Ⅰ. 아두이노 및 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초
}
- 프로그램 업로드 ⇨ 시리얼 모니터 실행 ⇨ 조이스틱 모듈 조작, 값 변화 확인
Ⅰ. 아두이노 및 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);
}
Ⅰ. 아두이노 및 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);}
Ⅰ. 아두이노 및 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());
}
Ⅰ. 아두이노 및 C프로그래밍 기초
- 24 -
- 블루투스 이름, PIN 설정
⇩
⇩
Ⅰ. 아두이노 및 C프로그래밍 기초
- 25 -
⇩
⇩
Ⅰ. 아두이노 및 C프로그래밍 기초
- 26 -
⇩
⇩
Ⅰ. 아두이노 및 C프로그래밍 기초
- 27 -
⇩
Ⅰ. 아두이노 및 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);
}
}
- 원격 조정테스트(채팅앱 이용)
Ⅰ. 아두이노 및 C프로그래밍 기초
- 29 -
- 원격 조정테스트(컨트롤러앱 이용)
⇩
Ⅰ. 아두이노 및 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);
}
Ⅰ. 아두이노 및 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);
}
☞ 다음장에 계속...
Ⅰ. 아두이노 및 C프로그래밍 기초
- 32 -
void loop()
{
// 시리얼 통신으로 전송된 데이터가 있으면 데이터 표시함.
if (Serial.available())
{
delay(100);
lcd.clear();
while (Serial.available() > 0)
{
lcd.write(Serial.read());
}
}
}
- 시리얼 모니터 입력창에 메시지 입력후 LCD에 표시되는지 확인
Hello World!
- LCD 글자 명암 조정(글자가 안보이거나, 화면이 검게 나오는 경우)
Ⅱ. 직교로봇 시스템 구현
- 33 -
1. 기구부
▪ 기구부 구성
Ⅱ. 직교로봇 시스템 구현
- 34 -
▪ 프레임 조립
수직 프레임(4)
수평 프레임(9)
1. 수평프레임 양 끝에 프레임 체결너트를 그림과 같이 조립한다. (느슨하게)
2. 수평프레임과 수직프레임을 그림과 같이 조립한 뒤, 체결홀을 이용해서 볼트를 조여 준다.
Ⅱ. 직교로봇 시스템 구현
- 35 -
3. 프레임을 그림과 같이 “L” 자로 조립한 뒤, 프레임 홈에 하부 투명커버를 끼운다.
※ 하부 커버를 반드시 미리 끼워야 함.
4. 수평프레임을 하부커버 모서리에 위치 시킨후, 수직프레임을 수평프레임이 맞닿는 부분에 끼운다.
※ 순서대로 조립해야만 하부 커버 조립이 가능함.
※ 수평프레임에 사각너트를 미리 삽입한다.( 5번 참조)
Ⅱ. 직교로봇 시스템 구현
- 36 -
5. 나머지 프레임을 조립한다. 이 때, 수평 프레임 홈에는 사각너트를 반드시 삽입한다.
(상단 그림 개수 참조)
※ 사각너트는 프레임에 부품을 조립할 때 사용하므로 미리 삽입해두어야 한다.
Ⅱ. 직교로봇 시스템 구현
- 37 -
▪ 구동부 조립
1. 상단 수평 프레임에 그럼과 같이 측면 브라켓을 고정시킨다. ( M5–8 렌치볼트)
Ⅱ. 직교로봇 시스템 구현
- 38 -
리니어 부싱(장축)
2. 리니어 부싱(장축)을 측면 브라켓에 고정한다.
Ⅱ. 직교로봇 시스템 구현
- 39 -
상단 브라켓(좌/우) 리니어 부싱(단축)
3. 리니어 부싱(장축) 좌/우측어 상단 브라켓에 고정한다.
4. 리니어 부싱(단축)을 상단 브라켓에 고정한다.
Ⅱ. 직교로봇 시스템 구현
- 40 -
5. 중앙 브라켓을 부싱(단축)상단에 고정한다.
※ 방향 주의
6. 모터 브라켓을 중앙 브라켓 상단에 고정한다.
※ 모터브라켓 방향주의
7. 모터 브라켓을 우측 상단 브라켓에 고정한다.
※ 모터브라켓 방향주의
Ⅱ. 직교로봇 시스템 구현
- 41 -
8. 우측 상단프레임에 센서브라켓을 고정한다.
피니언 기어 (φ5)
좌측 측면 브라켓 좌측 상단 브라켓
9. 베어링 마운트에 피니언 기어(φ5)를 방향과 같이 조립한다.
※ 조립 방향 주의
※ 피니언 기어는 φ5 및 φ6 의 두 종류가 있으므로 혼동하지말것.
Ⅱ. 직교로봇 시스템 구현
- 42 -
10. 좌측 상단 브라켓 측면에 벨트고정 브라켓을 고정한다.
좌측 모터 브라켓 우측 상단 모터 브라켓 중앙 모터 도르레
11. 모터 브라켓에 모터를 고정하고, 피니언 기어(φ6) 또는 도르레를 고정 한다.
※ 모터 감속비 주의(주행축 1/60 , 도르레 1/90)
12. 리미트 센서를 고정한다.
Ⅱ. 직교로봇 시스템 구현
- 43 -
2. 전기/제어시스템
▪ 전기/제어시스템 구성
-구성 요소
MEGA2560 DC 모터(3개) SMPS (12V, 100W)
아날로그 조이스틱(1개) 마이크로 스위치(3개) 7세그먼트 (2개)
마이크로 스위치(4개) Tact스위치 (2개)브레드보드,
점퍼선, 저항 등
Ⅱ. 직교로봇 시스템 구현
- 44 -
▪ DC모터 결선
▪ 서보모터 결선
Ⅱ. 직교로봇 시스템 구현
- 45 -
▪ 디지털 입력 버튼 결선
-리미트 센서
-시작, 동작 버튼
Ⅱ. 직교로봇 시스템 구현
- 46 -
▪ 아날로그(조이스틱) 입력 버튼 결선
▪ 디스플레이 결선
-표시할 숫자의 자릿수만큼 7세그먼트를 배치하고, 해당 디지털핀에 순서대로 결선함.
Ⅱ. 직교로봇 시스템 구현
- 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 )
{
// 집게 - 원위치
}
}
Ⅱ. 직교로봇 시스템 구현
- 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;
Ⅱ. 직교로봇 시스템 구현
- 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);
Ⅱ. 직교로봇 시스템 구현
- 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; }
Ⅱ. 직교로봇 시스템 구현
- 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); }
Ⅱ. 직교로봇 시스템 구현
- 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);
Ⅱ. 직교로봇 시스템 구현
- 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);
Ⅱ. 직교로봇 시스템 구현
- 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
Ⅱ. 직교로봇 시스템 구현
- 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); }
Ⅱ. 직교로봇 시스템 구현
- 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]); }}