1. 프로젝트 사용한 보드 종류
아두이노 uno
2. 사용한 개발 프로그램명
아두이노 IDE
3. 소스코드 (주석 필수)
#include <IRremote.h> // 적외선 리모컨 라이브러리
#include <Servo.h>
int motorPin1 = 7;
int motorPin2 = 6;
int motorPin3 = 5;
int motorPin4 = 4;
int LS = 11;
int CS = 9;
int RS = 8;
int trigPin = 2;
int echoPin = 3;
int controller = 10;
int servoPin = 12;
Servo servo;
int angle = 0;
IRrecv irrecv(controller);
decode_results results;
void forward(){
analogWrite(motorPin1, 128);
analogWrite(motorPin2, 0);
analogWrite(motorPin3, 128);
analogWrite(motorPin4, 0);
}
void back(){
analogWrite(motorPin1, 0);
analogWrite(motorPin2, 140);
analogWrite(motorPin3, 0);
analogWrite(motorPin4, 140);
}
void right1(){
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, HIGH);
}
void left1(){
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, HIGH);
digitalWrite(motorPin3, HIGH);
digitalWrite(motorPin4, LOW);
}
void right2(){
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, LOW);
}
void left2(){
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, HIGH);
digitalWrite(motorPin4, LOW);
}
void stop(){
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, LOW);
}
void setup() {
Serial.begin(9600);
pinMode(motorPin1, OUTPUT);
pinMode(motorPin2, OUTPUT);
pinMode(motorPin3, OUTPUT);
pinMode(motorPin4, OUTPUT);
pinMode(LS, INPUT);
pinMode(CS, INPUT);
pinMode(RS, INPUT);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
irrecv.enableIRIn();
pinMode(controller, INPUT);
servo.attach(servoPin);
}
void loop() {
digitalWrite(trigPin, LOW);
digitalWrite(echoPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
unsigned long duration = pulseIn(echoPin, HIGH);
float distance = duration /29.0/2.0;
Serial.print(distance);
Serial.println("cm");
if(irrecv.decode(&results)){
Serial.println(results.value, HEX);
Serial.println(results.value);
irrecv.resume();
}
if(distance < 20){
stop();
}
if(results.value == 0xFF38C7 && results.value == 16726215){
stop();
}
if(results.value == 0xFF18E7){ //0xFFA857
if(digitalRead(LS) && digitalRead(CS) && digitalRead(RS) && distance>20){
forward();
}
else if(!digitalRead(LS) && digitalRead(CS) && !digitalRead(RS) && distance>20){
forward();
}
else if(digitalRead(LS) && !digitalRead(CS) && !digitalRead(RS)&& distance >20){
left1();
delay(100);
left2();
}
else if(digitalRead(LS) && digitalRead(CS) && !digitalRead(RS) && distance>20){
left2();
}
else if(!digitalRead(LS) && !digitalRead(CS) && digitalRead(RS) && distance>20){
right1();
delay(100);
right2();
}
else if(!digitalRead(LS) && digitalRead(CS) && digitalRead(RS) && distance>20){
right2();
}
else if(!digitalRead(LS) && !digitalRead(CS) && !digitalRead(RS) && distance>20){
left1();
}
}
}
6. 문제점 및 에러 내용
제가 서보모터로 초음파센서를 움직이면서 초음파거리가 20이하가 되었을때 정지하도록 하고 적외선 리모컨을 사용하여 버튼을 눌렀을때 정지하거나 라인트레이싱을 시작하도록 만들었습니다. 일정거리가 되었을때 정지하는것과 적외선 센서를 사용해서 라인트레이싱 되는것까진 했는데 서브모터만 넣어서 작동시키면 거리측정을 시잘할때 한번만 측정하고 적외선센서가 인식이 되어버리는데 어떻게 해야되나요?
|