?>

Hard Copy World

HCW

Q&A

Home > Forum >

Q&A

질문드립니다 ㅡㅜ

페이지 정보

작성자 이진규 메일보내기 이름으로 검색 작성일14-11-17 11:01 조회1,767회 댓글1건

본문

#include <Servo.h> // Include servo library
Servo servoLeft; // Declare left and right servos
Servo servoRight;
int Pin3 = 8;
int Pin4 = 9;
int Pin10 = A0;
int Pin11 = A1;
int Digi3 = 0;
int Digi4 = 0;
int Digi10 = 0;
int Digi11 = 0;
long result = 0;
int sensorPin = A3;  
int sensorValue = 0; 
int ledPin = 1;

const int trigger = 10;
const int echo = 11;


void setup()
{

pinMode(trigger, OUTPUT);
  pinMode(echo, INPUT);
  Serial.begin(9600);
pinMode(ledPin, OUTPUT);
servoLeft.attach(13);
servoRight.attach(12);
}


void loop()
{

long duration_1, inches, cm;

  digitalWrite(trigger, LOW);
  delayMicroseconds(2);       //트리거의 동작 off
  digitalWrite(trigger, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigger, LOW); //트리거 10usec 동안의 high펄스 출력

  duration_1 = pulseIn(echo, HIGH); //에코단자에서 수신한 펄스 저장

  inches = microsecondsToInches(duration_1);
 cm = microsecondsToCentimeters(duration_1);
Serial.print(inches);
  Serial.print("in, ");
  Serial.print(cm);
  Serial.print("cm");
  Serial.println();  //초음파로 측정한 거리 값을 시리얼 통신으로 출력
 
  delay(50);

if (RCtime(Pin11) > 8)
{ Digi3 = 1; }
if (RCtime(Pin11) <= 8)
{ Digi3 = 0; }
if (RCtime(Pin11) > 8)
{ Digi10 = 1; }
if (RCtime(Pin11) <= 8)
{ Digi10 = 0; }


if (RCtime(Pin3) > 70)
{ Digi3 = 1; }
if (RCtime(Pin3) <= 70)
{ Digi3 = 0; }
if (RCtime(Pin4) > 70)
{ Digi4 = 1; }
if (RCtime(Pin4) <= 70)
{ Digi4 = 0; }
if (RCtime(Pin10) > 70)
{ Digi10 = 1; }
if (RCtime(Pin10) <= 70)
{ Digi10 = 0; }
if (RCtime(Pin11) > 70)
{ Digi11 = 1; }
if (RCtime(Pin11) <= 70)
{ Digi11 = 0; }
if ((Digi3==1) && (Digi4==0) && (Digi10==0) && (Digi11==0))
{ maneuver(200,-200,5); }

else if ((Digi3==1) && (Digi4==1) && (Digi10==0) && (Digi11==0))
{ maneuver(200,-50,5); }
else if ((Digi3==1) && (Digi4==1) && (Digi10==1) && (Digi11==0))
{ maneuver(200,-50,5); }
else if ((Digi3==0) && (Digi4==1) && (Digi10==0) && (Digi11==0))
{ maneuver(200,100,5); }
else if ((Digi3==0) && (Digi4==1) && (Digi10==1) && (Digi11==0))
{ maneuver(200,200,5); }
else if ((Digi3==0) && (Digi4==0) && (Digi10==1) && (Digi11==0))
{ maneuver(100,200,5); }
else if ((Digi3==0) && (Digi4==1) && (Digi10==1) && (Digi11==1))
{ maneuver(-50,200,5); }
else if ((Digi3==0) && (Digi4==0) && (Digi10==1) && (Digi11==1))
{ maneuver(-50,200,5); }
else if ((Digi3==0) && (Digi4==0) && (Digi10==0) && (Digi11==1))
{ maneuver(-200,200,5); }
else if ((Digi3==1) && (Digi4==1) && (Digi10==1) && (Digi11==1))
{ maneuver(10,200,900); }
else if ((Digi3==1) && (Digi4==0) && (Digi10==1) && (Digi11==0))
{ maneuver(200,200,500); }
else if ((Digi3==0) && (Digi4==0) && (Digi10==0) && (Digi11==0))
{ maneuver(200,200,800);
  maneuver(50,200,800);
  maneuver(200,50,800);

 

}


else
{ maneuver(200,200,5); }
sensorValue = analogRead(sensorPin);             
   if(sensorValue<45)
   {
   digitalWrite(ledPin,HIGH);
}
else{
  digitalWrite(ledPin,LOW);
}
}
long microsecondsToInches(long microseconds){

return microseconds / 148; //148usec동안의 송수신의 거리량은 1inch
}

long microsecondsToCentimeters(long microseconds)
{return microseconds / 58;}  //58usec동안의 송수신의 거리량은 1cm


long RCtime(int sensPin){
long result = 0;
pinMode(sensPin, OUTPUT);
digitalWrite(sensPin, HIGH);
delay(1);
pinMode(sensPin, INPUT);
digitalWrite(sensPin, LOW);
while(digitalRead(sensPin)){
result++;
}
return result;
}
void maneuver(int speedLeft, int speedRight, int msTime)
{

servoLeft.writeMicroseconds(1500 + speedLeft); //왼쪽 서보 속도 설정
servoRight.writeMicroseconds(1500 - speedRight); //오른쪽 서보 속도 설정

delay(msTime); // Delay for msTime
}

라인찾기 소스만들어 본것입니다.

라인이 없을시에(빨간 소스)  저렇게 구동하고 싶은데 그냥 사용하니 맨 마지막 명령만 실행하더라구요 그래서 인터럽트를 이용해서 몇초 간격으로 각각의 명령을 수행하게 하고 싶은데 제 머리로 쥐어 짜내어도 안되어서요 ㅡㅜ

그리고 초음파 센서에서 받은 값(파랑 소스) 인데요 초음파로 정면 8cm가 잡히면 빙 돌게 설명한건데 잘안되더라구요 ㅠ 조언좀 부탁드릴께요 ㅡㅜ

댓글목록

하드카피님의 댓글

하드카피 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 작성일

직접 코드만 봐서는 디버깅이 어렵겠습니다;;;
일단 타이머와 인터럽트를 이용해서 실행하고 싶으시다면 좀 복잡하지만 아래 링크를 참고해주세요.
http://www.hardcopyworld.com/gnuboard5/bbs/board.php?bo_table=lecture_pract&wr_id=12

보다 단순하고 러프하게 경과된 시간만 계산해서 특정 루틴 실행하기를 원하신다면 SimpleTimer와 같은 SW 적 라이브러리를 사용하거나 직접 구현하시면 됩니다. (millis() 함수를 이용해서 경과된 시간을 측정하는 방식)
http://playground.arduino.cc/Code/SimpleTimer

초음파 센서는 일단 초음파 센서 예제를 따라해서 정상적으로 동작하는지 확인부터 해보는 것이 좋겠습니다. 소스코드 상으로는 이미 이 과정을 거치신것 같기는 한데;;;
http://www.hardcopyworld.com/gnuboard5/bbs/board.php?bo_table=tech_sensor&wr_id=1&page=2
참고로 Servo 라이브러리를 사용할 경우 PWM 9, 10번 핀의 PWM 동작이 제대로 되지 않을겁니다.