Devlog
article thumbnail

목표: 주어진 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);

}

 

profile

Devlog

@덩이

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그