목표: 주어진 3가지 조건을 만족하면서 아두이노 오토봇을 이용하여 제시된 맵을 통과하기
#include <IRremote.h>
#include <Servo.h>
IRrecv irrecv(2);
decode_results results;
int MOTORL_PIN = 5;
int MOTORR_PIN = 9;
Servo IServo;
Servo RServo;
int TRIG_PIN = 3;
int ECHO_PIN = 4;
long duration, cm, in;
int QTI1_PIN = 11;
int QTI2_PIN = 12;
int qtis;
int k = 1;
void setup() {
Serial.begin(9600);
Serial.println("Enabling IRin");
irrecv.enableIRIn();
Serial.println("Enabled IRin");
IServo.attach(MOTORL_PIN);
RServo.attach(MOTORR_PIN);
pinMode(QTI1_PIN,INPUT);
pinMode(QTI2_PIN,INPUT);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
}
void loop() {
/* QTI센서 부분 */
if(k<0) {
qtis = digitalRead(QTI1_PIN)*2 + digitalRead(QTI2_PIN);
switch(qtis) {
case 0: Serial.println("00"); slowgo(); break;
case 1: Serial.println("01"); turnright2(); break;
case 2: Serial.println("10"); turnleft2(); break;
case 3: Serial.println("11"); stop(); break;
}
}
/* 리모컨 조작 */
if (irrecv.decode(&results)) {
Serial.println(results.value, NEC);
switch(results.value) {
case 0xFF18E7:
Serial.println("2");
goForward();
break;
case 0xFF10EF:
Serial.println("4");
turnleft();
break;
case 0xFF38C7:
Serial.println("5");
stop();
break;
case 0xFF5AA5:
Serial.println("6");
turnright();
break;
case 0xFF4AB5:
Serial.println("8");
back8();
break;
case 0xFF6897:
Serial.println("0");
leftturn();
break;
case 0xFF9867:
Serial.println("-");
k=k*(-1);
break;
case 0xFFB04f:
Serial.println("OK");
rightturn();
break;
case 0xFFA857:
Serial.println(">ll");
program();
break;
default:
break;
}
irrecv.resume(); // Receive the next value
}
delay(100);
}
void goForward() {
IServo.writeMicroseconds(1560);
RServo.writeMicroseconds(1430);
}
void slowgo() {
IServo.writeMicroseconds(1535);
RServo.writeMicroseconds(1455);
delay(250);
}
void turnright() {
IServo.writeMicroseconds(1560);
RServo.writeMicroseconds(1550);
}
void turnleft() {
IServo.writeMicroseconds(1440);
RServo.writeMicroseconds(1430);
}
void stop() {
IServo.writeMicroseconds(1500);
RServo.writeMicroseconds(1490);
}
void back8() {
IServo.writeMicroseconds(1400);
RServo.writeMicroseconds(1590);
delay(400);
IServo.writeMicroseconds(1500);
RServo.writeMicroseconds(1490);
}
void turnright2() {
IServo.writeMicroseconds(1530);
RServo.writeMicroseconds(1520);
delay(50);
}
void turnleft2() {
IServo.writeMicroseconds(1480);
RServo.writeMicroseconds(1470);
delay(50);
}
void rightturn() {
IServo.writeMicroseconds(1580);
RServo.writeMicroseconds(1570);
delay(640);
IServo.writeMicroseconds(1500);
RServo.writeMicroseconds(1490);
}
void leftturn() {
IServo.writeMicroseconds(1440);
RServo.writeMicroseconds(1430);
delay(850);
IServo.writeMicroseconds(1500);
RServo.writeMicroseconds(1490);
}
/* 초음파센서 함수 */
void program() {
int i = 0;
while(i<3) {
int distance;
int sonarPwm;
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
sonarPwm = pulseIn(ECHO_PIN, 1, 18500L);
distance = sonarPwm / 60;
Serial.println(distance);
delay(200);
/* 구간별 회전방향 설정 */
switch(i) {
case 0:
if (distance > 0 && distance < 10) {
rightturn();
i++;
}
else {
slowgo();
}
break;
case 1:
if (distance > 0 && distance < 10) {
leftturn();
distance = 20;
i++;
}
else {
slowgo();
}
case 2:
if (distance > 0 && distance < 10) {
leftturn();
i++;
}
else {
slowgo();
}
}
}
slowgo();
delay(100);
}
'학교' 카테고리의 다른 글
[2019-2] 디지털신호처리 첩 신호 만들기 과제 (0) | 2022.01.06 |
---|---|
[2019-1] 임베디드시스템 프로젝트 (0) | 2021.08.26 |
[2019-1] 컴퓨터그래픽스1 프로젝트 (0) | 2021.08.12 |
[2019-1] 자바프로그래밍 과제 (0) | 2021.08.12 |
[2019-1] 디지털영상처리1 8장 과제 (0) | 2021.08.12 |