아두이노/밸런싱로봇

아두이노로 2바퀴 밸런싱 로봇 만들기(2일차)

아크리엑터 2020. 1. 5. 21:25
반응형

비싸게 주고 산 인코더가 붙어있는 모터를 작동 시켜보자.

먼저 모터를 돌리기 위해 모터 드라이버 L298N을 사용했다.

L298N

 

 

아두이노와의 연결은 아래와 같이 연결한다. 모터를 구동하는 전원은 5V를 넣도록 하였고, 모터 인코더로 들어갈 전원은 3.3v를 이용하였다.

인코더를 이용하여 속도를 얻어오기 위한 C1, C2핀은 디지털 2번과 4번 핀으로 연결하였다.

ㅇ 모터 인코더 관점에서의 핀 연결 정보

           M1   ------> OUT1 (L293N)

           GND ------> GND (아두이노)

           C1    ------> D2 (아두이노)

           C2   ------> D4 (아두이노)

           VCC ------> 3.3v (아두이노)

           M2  ------> OUT2 (L293N)

ㅇ 모터 드라이버(L293N) 관점에서의 핀 연결 정보

          OUT1  -----> M1(모터 인코더)

          OUT2 -----> M2(모터 인코더)

          5V      -----> 5V(아두이노)

          GND -------> GND(아두이노)

          INT1  -------> D6 (아두이노)

          INT2  ------> D7(아두이노)

 

D6번과 D7번은 모터를 시계방향 또는 반시계 방향으로 돌리는 역할을 한다. 예를 들어, D6 HIGH 와 D7에 LOW인 경우 시계방향을, D6 LOW, D7은 HIGH일 경우 반시계 방향으로 모터가 돌아간다. 다음과 같다.

EN A(B)

INPUT 1(3)

INPUT 2(4)

motor A(B)

High

High

Low

정방향

High

Low

High

역방향

High

High

High

브레이크

High

Low

Low

브레이크

Low

X

X

정지

EN A(B)에 High를 입력하면 정속으로, Low를 입력하면 멈춘다. DigitalWrite(EN_A_PIN, HIGH)로 하면된다. 이 PIN에 PWM신호를 입력하면 속도를 제어할 수 있다.  analogWrite(EN_A_PIN, 120) 과 같이 말이다.

코드

모터를 정방향으로 2초, 멈추었다가 역방향으로 2초 돌리는 코드다. 우선 모터만 돌리도록 하였다. speed의 값으로 속도 제어도 할 수 있다. 여기에 사용된 것과 달리 IN1, IN2를 이용하여 IN1에 PWM신호를 넣어서 속도 제어하는 설명을 주변에 많이 볼수 있는데, 내가 갖고 있는 L298N 으로는 작동되지 않아서 원래 모듈에 설명된 데로 사용해보았다.


#define MOTOR_A1 6
#define MOTOR_A2 7
#define MOTOR_Aen 9   // 사용안함

#define MOTOR_B1 3    // 사용안함
#define MOTOR_B2 4    // 사용안함
#define MOTOR_Ben 10  // 사용안함


void setup() {
  // put your setup code here, to run once:

  pinMode(MOTOR_A1, OUTPUT);
  pinMode(MOTOR_A2, OUTPUT);
  pinMode(MOTOR_Aen, OUTPUT);
  pinMode(MOTOR_B1, OUTPUT);
  pinMode(MOTOR_B2, OUTPUT);
  pinMode(MOTOR_Ben, OUTPUT);

}

void loop() {
  // put your main code here, to run repeatedly:
  int speed = 50;

  digitalWrite(MOTOR_A1, LOW);
  digitalWrite(MOTOR_A2, HIGH);
  
  digitalWrite(MOTOR_B1, LOW);
  digitalWrite(MOTOR_B2, HIGH);
  
  analogWrite(MOTOR_Aen, speed);
  analogWrite(MOTOR_Ben, speed);
  delay(2000);
  
  digitalWrite(MOTOR_A1, HIGH);
  digitalWrite(MOTOR_A2, HIGH);
  
  digitalWrite(MOTOR_B1, HIGH);
  digitalWrite(MOTOR_B2, HIGH);
  
  analogWrite(MOTOR_Aen, 0);
  analogWrite(MOTOR_Ben, 0);
  delay(2000);

  digitalWrite(MOTOR_A1, HIGH);
  digitalWrite(MOTOR_A2, LOW);
  
  digitalWrite(MOTOR_B1, HIGH);
  digitalWrite(MOTOR_B2, LOW);

  analogWrite(MOTOR_Aen, speed);
  analogWrite(MOTOR_Ben, speed);
  delay(2000);

  digitalWrite(MOTOR_A1, LOW);
  digitalWrite(MOTOR_A2, LOW);
  
  digitalWrite(MOTOR_B1, LOW);
  digitalWrite(MOTOR_B2, LOW);

  analogWrite(MOTOR_Aen, 0);
  analogWrite(MOTOR_Ben, 0);
  delay(2000);

}

 

선연결이 좀 복잡다.

실행 동영상

https://youtu.be/0GNyeJSzQ7g

 

엔코더 신호를 수신하여 특정 위치로 바퀴를 이동하는 것은 다음으로 미룬다.

반응형