**Autonomous driving tech./Learning

[2024자율로봇대회] 120도 회전

2wnswoo 2024. 11. 11. 02:12

제공해주신 코드는 4개의 DC 모터를 개별적으로 제어하기 위한 좋은 예시입니다. 하지만, 질문자님께서 처음에 원하셨던 "원형 경기장에서 로봇이 흰색 경계선을 감지하고 60도로 회전하는 코드" 에는 아직 적용되지 않았습니다.

따라서, 4개의 모터를 사용하는 로봇이 흰색 경계선을 감지하고 회전하는 코드를 작성해 드리겠습니다.

참고: 아래 코드는 L298N과 같은 H-브리지 모터 드라이버를 사용하고, 적외선 센서로 흰색 경계선을 감지한다고 가정합니다. 핀 번호는 앞서 예시에서 사용한 것과 동일하게 설정했습니다.

C++
#define IR_SENSOR_PIN A0 // 적외선 센서 핀 번호
#define LEFT_MOTOR_PIN1 3  // 왼쪽 모터 핀 1
#define LEFT_MOTOR_PIN2 4  // 왼쪽 모터 핀 2
#define RIGHT_MOTOR_PIN1 5 // 오른쪽 모터 핀 1
#define RIGHT_MOTOR_PIN2 6 // 오른쪽 모터 핀 2
#define LEFT_MOTOR_SPEED_PIN 11 // 왼쪽 모터 속도 제어 핀 (PWM)
#define RIGHT_MOTOR_SPEED_PIN 12 // 오른쪽 모터 속도 제어 핀 (PWM)

const int motorSpeed = 200; // 모터 속도
const int turnDelay = 100; // 60도 회전에 필요한 지연 시간 (실제 로봇에 맞게 조정)
const int threshold = 500; // 흰색 선 감지 기준값 (실제 환경에 맞게 조정)

void setup() {
  pinMode(IR_SENSOR_PIN, INPUT);
  // 모터 드라이버 핀 설정
  pinMode(LEFT_MOTOR_PIN1, OUTPUT);
  pinMode(LEFT_MOTOR_PIN2, OUTPUT);
  pinMode(RIGHT_MOTOR_PIN1, OUTPUT);
  pinMode(RIGHT_MOTOR_PIN2, OUTPUT);
  pinMode(LEFT_MOTOR   
 
_SPEED_PIN, OUTPUT);
  pinMode(RIGHT_MOTOR_SPEED_PIN, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  int sensorValue = analogRead(IR_SENSOR_PIN);

  if (sensorValue > threshold) { // 흰색 선 감지
    turnRight(); // 오른쪽으로 60도 회전
  } else {
    moveForward(); // 직진
  }
}

void moveForward() {
  // 왼쪽 모터 전진
  digitalWrite(LEFT_MOTOR_PIN1, HIGH);
  digitalWrite(LEFT_MOTOR_PIN2, LOW);
  analogWrite(LEFT_MOTOR_SPEED_PIN, motorSpeed);

  // 오른쪽 모터 전진
  digitalWrite(RIGHT_MOTOR_PIN1, HIGH);
  digitalWrite(RIGHT_MOTOR_PIN2, LOW);
  analogWrite(RIGHT_MOTOR_SPEED_PIN, motorSpeed);
}

void turnRight() {
  // 왼쪽 모터 전진
  digitalWrite(LEFT_MOTOR_PIN1, HIGH);
  digitalWrite(LEFT_MOTOR_PIN2, LOW);
  analogWrite(LEFT_MOTOR_SPEED_PIN, motorSpeed);

  // 오른쪽 모터 후진
  digitalWrite(RIGHT_MOTOR_PIN1, LOW);
  digitalWrite(RIGHT_MOTOR_PIN2, HIGH);
  analogWrite(RIGHT_MOTOR_SPEED_PIN, motorSpeed);

  delay(turnDelay); // 60도 회전에 필요한 시간만큼 대기 (실제 로봇에 맞게 조정)
  stopMotors();
}

void stopMotors() {
  // 모든 모터 정지
  digitalWrite(LEFT_MOTOR_PIN1, LOW);
  digitalWrite(LEFT_MOTOR_PIN2, LOW);
  digitalWrite(RIGHT_MOTOR_PIN1, LOW);
  digitalWrite(RIGHT_MOTOR_PIN2, LOW   
 
);
}
코드를 사용할 때는 주의가 필요합니다.
 

코드 설명:

  • 좌우측 모터를 각각 제어하기 위해 LEFT_MOTOR_PIN1, LEFT_MOTOR_PIN2, RIGHT_MOTOR_PIN1, RIGHT_MOTOR_PIN2 핀을 사용합니다.
  • moveForward() 함수는 두 모터를 모두 전진시킵니다.
  • turnRight() 함수는 왼쪽 모터는 전진, 오른쪽 모터는 후진시켜 로봇을 오른쪽으로 회전시킵니다.
  • turnDelay 값을 조절하여 회전 각도를 조정할 수 있습니다. (실제 로봇에 맞게 조정해야 합니다.)

주의 사항:

  • 모터 드라이버와 모터의 연결은 위에서 설명한 핀 번호에 맞게 연결해야 합니다.
  • threshold 값은 실제 흰색 선과 검은색 바닥의 센서 값을 측정하여 적절히 조절해야 합니다.
  • turnDelay 값은 로봇의 회전 속도와 원하는 회전 각도에 맞게 조절해야 합니다.

이 코드가 4개의 모터를 사용하는 로봇을 제어하는 데 도움이 되기를 바랍니다. 궁금한 점이 있으시면 언제든지 질문해주세요! 😊

 

--

C++
#define IR_SENSOR_PIN A0 // 적외선 센서 핀 번호
#define LEFT_MOTOR_PIN1 3  // 왼쪽 모터 핀 1
#define LEFT_MOTOR_PIN2 4  // 왼쪽 모터 핀 2
#define RIGHT_MOTOR_PIN1 5 // 오른쪽 모터 핀 1
#define RIGHT_MOTOR_PIN2 6 // 오른쪽 모터 핀 2
#define LEFT_MOTOR_SPEED_PIN 11 // 왼쪽 모터 속도 제어 핀 (PWM)
#define RIGHT_MOTOR_SPEED_PIN 12 // 오른쪽 모터 속도 제어 핀 (PWM)

const int motorSpeed = 200; // 모터 속도
const int turnDelay = 100; // 120도 회전에 필요한 지연 시간 (실제 로봇에 맞게 조정)
const int threshold = 500; // 흰색 선 감지 기준값 (실제 환경에 맞게 조정)

void setup() {
  pinMode(IR_SENSOR_PIN, INPUT);
  // 모터 드라이버 핀 설정
  pinMode(LEFT_MOTOR_PIN1, OUTPUT);
  pinMode(LEFT_MOTOR_PIN2, OUTPUT);
  pinMode(RIGHT_MOTOR_PIN1, OUTPUT);
  pinMode(RIGHT_MOTOR_PIN2, OUTPUT);
  pinMode(LEFT_MOTOR   
 
_SPEED_PIN, OUTPUT);
  pinMode(RIGHT_MOTOR_SPEED_PIN, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  int sensorValue = analogRead(IR_SENSOR_PIN);

  if (sensorValue > threshold) { // 흰색 선 감지
    turnLeft(); // 왼쪽으로 120도 회전
  } else {
    moveForward(); // 직진
  }
}

void moveForward() {
  // 왼쪽 모터 전진
  digitalWrite(LEFT_MOTOR_PIN1, HIGH);
  digitalWrite(LEFT_MOTOR_PIN2, LOW);
  analogWrite(LEFT_MOTOR_SPEED_PIN, motorSpeed);

  // 오른쪽 모터 전진
  digitalWrite(RIGHT_MOTOR_PIN1, HIGH);
  digitalWrite(RIGHT_MOTOR_PIN2, LOW);
  analogWrite(RIGHT_MOTOR_SPEED_PIN, motorSpeed);
}

void turnLeft() {
  // 왼쪽 모터 후진
  digitalWrite(LEFT_MOTOR_PIN1, LOW);
  digitalWrite(LEFT_MOTOR_PIN2, HIGH);
  analogWrite(LEFT_MOTOR_SPEED_PIN, motorSpeed);

  // 오른쪽 모터 전진
  digitalWrite(RIGHT_MOTOR_PIN1, HIGH);
  digitalWrite(RIGHT_MOTOR_PIN2, LOW);
  analogWrite(RIGHT_MOTOR_SPEED_PIN, motorSpeed);

  delay(turnDelay); // 120도 회전에 필요한 시간만큼 대기 (실제 로봇에 맞게 조정)
  stopMotors();
}

void stopMotors() {
  // 모든 모터 정지
  digitalWrite(LEFT_MOTOR_PIN1, LOW);
  digitalWrite(LEFT_MOTOR_PIN2, LOW);
  digitalWrite(RIGHT_MOTOR_PIN1, LOW);
  digitalWrite(RIGHT_MOTOR_PIN2, LOW   
 
);
}
코드를 사용할 때는 주의가 필요합니다.
 

코드 설명:

  • turnLeft() 함수를 사용하여 로봇을 왼쪽으로 120도 회전시킵니다.
  • turnDelay 값을 조절하여 회전 각도를 조정할 수 있습니다. (실제 로봇에 맞게 조정해야 합니다.)

주의 사항:

  • 모터 드라이버와 모터의 연결은 위에서 설명한 핀 번호에 맞게 연결해야 합니다.
  • threshold 값은 실제 흰색 선과 검은색 바닥의 센서 값을 측정하여 적절히 조절해야 합니다.
  • turnDelay 값은 로봇의 회전 속도와 원하는 회전 각도에 맞게 조절해야 합니다.

이 코드가 4개의 모터를 사용하는 로봇을 제어하는 데 도움이 되기를 바랍니다. 궁금한 점이 있으시면 언제든지 질문해주세요! 😊