2025년 8월 19일 화요일

AGV(Automated Guided Vehicle)의 전진 및 후진 제어

 RootingforU님, 안녕하세요! AGV(Automated Guided Vehicle)의 전진 및 후진 제어를 위해 아두이노 우노 코딩에 대해 궁금해하고 계시는군요. 음... 아주 흥미로운 프로젝트가 될 것 같습니다. 제가 도와드리겠습니다.

AGV의 전진과 후진 제어는 일반적으로 DC 모터와 모터 드라이버를 사용하여 구현됩니다. 여기서는 L298N 모터 드라이버를 사용하는 것을 기준으로 설명과 코드를 제공해 드릴게요.

### **AGV 전진/후진 제어를 위한 아두이노 코딩 가이드**

**1. 필요한 부품:**

*   아두이노 우노 (Arduino Uno) 보드

*   DC 모터 2개 (AGV 구동용)

*   L298N 모터 드라이버 모듈 (2개의 DC 모터 제어 가능)

*   점퍼선 (회로 연결용)

*   별도의 전원 (모터 드라이버 및 모터 구동용, 보통 6V~12V)


**2. 연결 방법 (L298N 모터 드라이버 기준):**

L298N 모터 드라이버는 모터를 회전시키고 방향을 제어하는 데 사용됩니다.

*   **아두이노 ↔ L298N 연결:**

    *   `ENA` 핀 (또는 `ENB` 핀): 모터의 속도 제어 (PWM 핀, 아두이노의 디지털 9번, 10번 또는 11번 핀 등)

    *   `IN1`, `IN2` 핀: 모터 1의 방향 제어 (아두이노의 디지털 2, 3번 핀 등)

    *   `IN3`, `IN4` 핀: 모터 2의 방향 제어 (아두이노의 디지털 4, 5번 핀 등)

    *   `GND`: 아두이노의 `GND` 핀과 L298N의 `GND` 핀 연결


*   **L298N ↔ DC 모터 연결:**

    *   `OUT1`, `OUT2`: 모터 1 연결

    *   `OUT3`, `OUT4`: 모터 2 연결


*   **L298N 전원:**

    *   `+12V` (또는 `+5V`~`+35V`): 외부 전원 (모터 전압에 맞게)

    *   `GND`: 외부 전원의 `GND`


**3. 아두이노 스케치 (코딩 예제):**


아래 코드는 두 개의 DC 모터를 동시에 제어하여 AGV가 전진, 후진, 정지할 수 있도록 하는 기본적인 예제입니다.

```cpp

// L298N 모터 드라이버 핀 설정

// 모터 1 (왼쪽 바퀴라고 가정)

const int motor1Pin1 = 2;  // IN1

const int motor1Pin2 = 3;  // IN2

const int enable1Pin = 9;  // ENA (PWM 핀으로 속도 제어 가능)


// 모터 2 (오른쪽 바퀴라고 가정)

const int motor2Pin1 = 4;  // IN3

const int motor2Pin2 = 5;  // IN4

const int enable2Pin = 10; // ENB (PWM 핀으로 속도 제어 가능)


void setup() {

  // 모터 제어 핀들을 출력으로 설정

  pinMode(motor1Pin1, OUTPUT);

  pinMode(motor1Pin2, OUTPUT);

  pinMode(enable1Pin, OUTPUT);


  pinMode(motor2Pin1, OUTPUT);

  pinMode(motor2Pin2, OUTPUT);

  pinMode(enable2Pin, OUTPUT);


  // 시리얼 통신 시작 (디버깅용)

  Serial.begin(9600);

  Serial.println("AGV 제어 시작!");


  // 초기 상태: 모터 정지

  stopMotors();

}


void loop() {

  // 예시: 전진 -> 정지 -> 후진 -> 정지 반복


  Serial.println("전진!");

  moveForward();

  delay(3000); // 3초간 전진


  Serial.println("정지!");

  stopMotors();

  delay(2000); // 2초간 정지


  Serial.println("후진!");

  moveBackward();

  delay(3000); // 3초간 후진


  Serial.println("정지!");

  stopMotors();

  delay(2000); // 2초간 정지


  // AGV가 좌회전, 우회전 등 다른 동작을 추가할 수 있습니다.

  // 예를 들어:

  // Serial.println("좌회전!");

  // turnLeft();

  // delay(2000);

  // stopMotors();

  // delay(1000);


  // Serial.println("우회전!");

  // turnRight();

  // delay(2000);

  // stopMotors();

  // delay(1000);

}


// === 모터 제어 함수들 ===


// AGV 전진

void moveForward() {

  // 모터 1 전진

  digitalWrite(motor1Pin1, HIGH);

  digitalWrite(motor1Pin2, LOW);

  analogWrite(enable1Pin, 200); // 속도 (0~255, 필요에 따라 조절)


  // 모터 2 전진

  digitalWrite(motor2Pin1, HIGH);

  digitalWrite(motor2Pin2, LOW);

  analogWrite(enable2Pin, 200); // 속도 (0~255, 필요에 따라 조절)

}


// AGV 후진

void moveBackward() {

  // 모터 1 후진

  digitalWrite(motor1Pin1, LOW);

  digitalWrite(motor1Pin2, HIGH);

  analogWrite(enable1Pin, 200);


  // 모터 2 후진

  digitalWrite(motor2Pin1, LOW);

  digitalWrite(motor2Pin2, HIGH);

  analogWrite(enable2Pin, 200);

}


// AGV 정지

void stopMotors() {

  digitalWrite(motor1Pin1, LOW);

  digitalWrite(motor1Pin2, LOW);

  digitalWrite(enable1Pin, LOW); // ENA 핀을 LOW로 설정하여 모터 정지 (PWM 0과 동일)


  digitalWrite(motor2Pin1, LOW);

  digitalWrite(motor2Pin2, LOW);

  digitalWrite(enable2Pin, LOW); // ENB 핀을 LOW로 설정하여 모터 정지

}


// AGV 좌회전 (예시) - 왼쪽 모터 후진, 오른쪽 모터 전진

void turnLeft() {

  // 모터 1 (왼쪽) 후진

  digitalWrite(motor1Pin1, LOW);

  digitalWrite(motor1Pin2, HIGH);

  analogWrite(enable1Pin, 150); // 속도 조절


  // 모터 2 (오른쪽) 전진

  digitalWrite(motor2Pin1, HIGH);

  digitalWrite(motor2Pin2, LOW);

  analogWrite(enable2Pin, 150); // 속도 조절

}


// AGV 우회전 (예시) - 왼쪽 모터 전진, 오른쪽 모터 후진

void turnRight() {

  // 모터 1 (왼쪽) 전진

  digitalWrite(motor1Pin1, HIGH);

  digitalWrite(motor1Pin2, LOW);

  analogWrite(enable1Pin, 150); // 속도 조절


  // 모터 2 (오른쪽) 후진

  digitalWrite(motor2Pin1, LOW);

  digitalWrite(motor2Pin2, HIGH);

  analogWrite(enable2Pin, 150); // 속도 조절

}

```


**4. 코드 설명:**


*   `const int motorXPinY`: 아두이노의 어떤 디지털 핀을 모터 드라이버의 제어 핀(IN1, IN2 등)에 연결할지 정의합니다.

*   `const int enableXPin`: 모터 드라이버의 `ENA` 또는 `ENB` 핀에 연결될 아두이노의 PWM(물결표시 `~`가 있는 디지털 핀, 예: 3, 5, 6, 9, 10, 11번) 핀을 정의합니다. 이 핀을 통해 모터의 속도를 제어할 수 있습니다.

*   `setup()` 함수:

    *   `pinMode(핀번호, OUTPUT);`: 모든 제어 핀을 출력 모드로 설정합니다.

    *   `Serial.begin(9600);`: 시리얼 모니터를 통해 디버깅 메시지를 볼 수 있도록 설정합니다.

    *   `stopMotors();`: 코드가 시작될 때 모터가 움직이지 않도록 초기 정지 상태로 만듭니다.

*   `loop()` 함수:

    *   `moveForward()`, `moveBackward()`, `stopMotors()` 함수를 호출하여 AGV의 동작을 순차적으로 제어합니다.

    *   `delay(밀리초);`: 지정된 시간(밀리초) 동안 현재 동작을 유지합니다.

*   `moveForward()`, `moveBackward()`, `stopMotors()` 함수:

    *   `digitalWrite(핀번호, HIGH/LOW);`: 모터의 방향을 결정합니다. L298N 드라이버의 경우 `IN1`과 `IN2` (또는 `IN3`과 `IN4`)의 조합으로 모터의 회전 방향이 바뀝니다 (HIGH/LOW 또는 LOW/HIGH).

    *   `analogWrite(enable핀, 속도);`: `enable` 핀에 0부터 255까지의 값을 써서 모터의 속도를 제어합니다. 0은 정지, 255는 최대 속도입니다. `digitalWrite(enable핀, HIGH)`는 `analogWrite(enable핀, 255)`와 같은 효과를 냅니다.

    *   `stopMotors()` 함수에서는 `enable` 핀을 `LOW`로 설정하여 모터의 동력을 완전히 차단하고 정지시킵니다.

*   `turnLeft()`, `turnRight()` 함수: AGV의 방향 전환을 위한 기본적인 함수 예제입니다. 좌회전은 보통 한쪽 모터는 전진, 다른 쪽 모터는 후진 또는 한쪽 모터는 정지, 다른 쪽 모터는 전진으로 구현됩니다.


---


**추가 팁:**


1.  **전원 공급:** L298N 모터 드라이버와 DC 모터에는 아두이노의 5V 전원만으로는 부족할 수 있습니다. 별도의 고용량 전원 공급 장치(예: 6V~12V 배터리 팩)를 사용하는 것이 중요합니다.

2.  **모터 테스트:** 코드를 업로드하기 전에 모터와 드라이버의 연결이 정확한지 여러 번 확인해 주세요. 작은 DC 모터라도 갑자기 회전하면 다칠 수 있습니다.

3.  **속도 조절:** `analogWrite` 함수의 속도 값(0~255)을 변경하면서 AGV의 속도를 조절해 보세요.

4.  **AGV 구조:** 실제 AGV를 만들 때는 모터가 바퀴를 잘 구동할 수 있도록 기계적인 구조와 기어비 등도 고려해야 합니다.

5.  **피드백 제어:** 더욱 정밀한 제어를 위해서는 엔코더를 사용하여 바퀴의 회전수를 측정하고 PID 제어 등을 적용할 수 있습니다. 이는 더 고급 기술이지만, 시작은 이렇게 기본적인 제어부터 해보는 것이 좋답니다.


이 코드를 바탕으로 RootingforU님의 AGV 프로젝트가 성공적으로 진행되기를 응원합니다! 꼼꼼히 확인하시면서 즐겁게 작업해 보세요. 궁금한 점이 있으시면 언제든 다시 물어봐 주시고요. ^^

댓글 없음:

자동차 전면 유리 제상(Defrost/De-icing) 성능”**을 ANSYS Fluent로 해석 ///

도움말  좋은 화면 캡처예요 👍 이 이미지는 ANSYS Fluent → Setup 단계의 General 화면 이고, **“해석의 뼈대(종류·시간·좌표계)를 결정하는 곳”**입니다. 아래에서 화면에 보이는 기능을 영역별로 정확히 설명할게요. 🔧 ...