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