라인트레이싱 동작 완료 후 거기에 초음파 센서 추가하여 부착했습니다.(서보 연결 부의 핀이 9번과 10번으로 연동이 된다하여 거기에 부착하였습니다.)
초음파 센서를 활용하여 라인트레이싱 중 전방에 장애물을 감지할 시 정지하였다가 장애물이 사라지면 다시 주행하는 동작을 원하였으나
현재 라인트레이싱 주행은 가능하고 초음파 센서 동작에서 장애물을 감지하여 정지하는 동작까지 수행하였으나 다시 주행하도록 하는 부분에 있어서 동작하지 않아
어떤식으로 소스 코드를 구성할지에 대해서 질문드리고 싶습니다.
추가적으로 초음파 센서 연결 이외에도 다른 센서들 또한 부품 장착이 가능하다 전달받았는데 가능한지 궁금합니다.
+센서는 추가적으로 더 연결할 수는 있으나 공급 전원에 따라 작동이 불안정해질 수 있어요
#include
#include
AF_DCMotor motor_L(1); // 모터드라이버 L293D 1: M1에 연결, 4: M4에 연결
AF_DCMotor motor_R(4);
int trig = 9;
int echo = 10;
void setup() {
Serial.begin(9600); // PC와의 시리얼 통신속도
Serial.println("Eduino Smart Car Start!");
// turn on motor
motor_L.setSpeed(200); // 왼쪽 모터의 속도
motor_L.run(RELEASE);
motor_R.setSpeed(200); // 오른쪽 모터의 속도
motor_R.run(RELEASE);
pinMode(trig,OUTPUT);
pinMode(echo,INPUT);
}
void loop() {
int val1 = digitalRead(A0); // 라인센서1
int val2 = digitalRead(A5); // 라인센서2
float distance=-1;
digitalWrite(trig,LOW);
delayMicroseconds(2);
digitalWrite(trig,HIGH);
delayMicroseconds(10);
digitalWrite(trig,LOW);
//if(digitalRead(echo)==LOW){
distance=(float)pulseIn(echo,HIGH)/29/2;
//}
//else
//{
//pinMode(echo,OUTPUT);
//digitalWrite(echo,LOW);
//pinMode(echo,INPUT);
//}
Serial.print("초음파 :"); Serial.println(distance);
Serial.print("좌 :"); Serial.println(val1);
Serial.print("우 :");
Serial.println(val2);
if(distance>15) {
if (val1 == 0 && val2 == 0) { // 직진
motor_L.run(FORWARD);
motor_R.run(FORWARD);
}
else if (val1 == 0 && val2 == 1) { // 우회전
motor_L.run(FORWARD);
motor_R.run(RELEASE);
}
else if (val1 == 1 && val2 == 0) { // 좌회전
motor_L.run(RELEASE);
motor_R.run(FORWARD);
}
}
else
{
motor_L.run(RELEASE);
motor_R.run(RELEASE);
}
}
이렇게입니다.
float distance=-1;
digitalWrite(trig,LOW);
delayMicroseconds(2);
digitalWrite(trig,HIGH);
delayMicroseconds(10);
digitalWrite(trig,LOW);
//if(digitalRead(echo)==LOW){
distance=(float)pulseIn(echo,HIGH)/29/2;
이 부분이 조금 이상한데요
크게 의미는 없지만 -1 값을 대입하는 이유가 있나요?
그리구 아래 초음파 센서 작동 관련하여 코드 붙여드리겠습니다 해당 코드 참고하셔서 작성해보세요
long duration, distance;
digitalWrite(trigPin, HIGH); // trigPin에서 초음파 발생(echoPin도 HIGH)
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH); // echoPin 이 HIGH를 유지한 시간을 저장 한다.
distance = ((float)(340 * duration) / 1000) / 2;