본문 바로가기

메이커 프로젝트/아두이노 +

아두이노 DC 모터 제어하기

[오늘의 타겟] DC 모터 / 모터 드라이버 

 

- DC 모터

 

- 2개에 선에 전압을 입력하면 모터가 돌아간다.

 

 

- 전압의 방향을 반대로 입력하면 모터도 반대로 돌아간다.

 

- 참고자료

https://m.blog.naver.com/kids_power/221572444008

 

[아두이노/DC모터] DC 모터와 모터 드라이버 사용법

안녕하세요! 휴몬랩 입니다. 오늘은 DC 모터와 모터 드라이버 사용법에 대해 알아볼까 합니다. 준비물 아...

blog.naver.com

 

 

 

- 모터 드라이브 : L298N

   ->모터 가동에 필요한 충분한 전류, 전압을 제공.

 

참고자료. 모터드라이브를 사용하는 이유.

https://blog.naver.com/PostView.nhn?blogId=ycpiglet&logNo=222050336319&categoryNo=29&parentCategoryNo=0 

 

모터 드라이버의 사용 이유 (DC모터, 아두이노)

DC 모터 모터란 전기 에너지를 기계 에너지로 변환해주는 장치이다. 굉장히 많은 영역에서 모터를 사용하...

blog.naver.com

 

 

*** 오늘 실습 재료
DC 모터 2개
바퀴 2개
모터드라이버(빨간색)
아두이노
아두이노 선
아두이노 케이블

 

 

 

[실습 1] 모터 1개 전진-후진 기본코드

 

- 사전작업 : 5v 인에이블 점퍼제거

 

 

 - 모터드라이브 기본 회로 구성

 

- 바퀴 결합

 

 

- 아두이노 모터 드라이버 구동회로

// 3번과 4번 핀은 모터 제어에 관한 핀
int IN1Pin = 3;
int IN2Pin = 4;

// 5번핀은 모터의 힘을 설정해주는 핀
int ENPin = 5;

void setup() {
  pinMode(IN1Pin, OUTPUT);
  pinMode(IN2Pin, OUTPUT); // 3, 4번 제어핀들은 핀모드를 출력은로 설정
  analogWrite(ENPin, 255); //5번 핀에 255의 최대 힘을 설정한다. 
}

void loop() {    
  //Go : 핀 3, 핀 4 에 신호를 다르게 하면 전진
  digitalWrite(IN1Pin, HIGH); 
  digitalWrite(IN2Pin, LOW);
  delay(5000);//5sec 

  //Back : 핀 3, 핀 4 에 신호를 다르게 하면 후진
  digitalWrite(IN1Pin, LOW);
  digitalWrite(IN2Pin, HIGH);  
  delay(5000);//5sec
  
  //Brake (Stop) 핀 3, 4에 똑같이 High를 주거나 Low을 주면 은 멈춘다.
  digitalWrite(IN1Pin, HIGH);
  digitalWrite(IN2Pin, HIGH);
  delay(5000);//1sec
}

 

 

 

 

 

 

 

[실습 2] 모터 1개 전진-후진울 시리얼모니터로 제어

- 실습1 회로를 그대로 씁니다.

 

- 시리얼 모니터란? 

  -> 컴퓨터로 아두이노를 제어하기 위한 통신 포트

 

 

 - 시리얼 통신으로 모터 제어 코드

int IN1Pin = 3;
int IN2Pin = 4;
int ENPin = 5;


void setup() {
  pinMode(IN1Pin, OUTPUT);
  pinMode(IN2Pin, OUTPUT);
  analogWrite(ENPin, 255); //Max Speed
  Serial.begin(9600);
  Serial.println("start !! ");
}

void loop() {
  if(Serial.available())  //시리얼모니터에서 데이터가 들어오면
  {
    char in_data;         // 입력된 데이터 저장을 위한 변수
    in_data = Serial.read();  //입력된 데이터 in_data에 저장
     Serial.print("data : ");
     Serial.println(in_data);
     
    if(in_data == '1')    //입력된 데이터가 '1'이라면
    {
     digitalWrite(IN1Pin, HIGH); 
     digitalWrite(IN2Pin, LOW);
    }
    else if(in_data == '2') //입력된 데이터가 '2'이라면
    {
    //뒤로 회전 (어떤 방향으로 꽂았느냐에 따라서 방향 반대)
      digitalWrite(IN1Pin, LOW);
      digitalWrite(IN2Pin, HIGH);  
    }
    else if(in_data == '3') //입력된 데이터가 '3'이라면
    {
       //회전 정지
      digitalWrite(IN1Pin, HIGH);
      digitalWrite(IN2Pin, HIGH);
    }
  }
}

자료 출처 : https://codingrun.com/111

 

아래 사진과 같이 잘 작동 하나요?

 

 

 

 

 

[실습 3] 모터 2개를 제어 해 보자.

 

모터 2개 제어 회로 주요 이슈

- 모터가 2개부터는 외부 전원에서 전원을 모터드라이브에 추가로 공급해 주어야 한다.

- 이때 포인트는 외부 전압원  GND 와 아두이노 GND를 연결하여 전기적으로 평형을 맞추어야 한다.

- 위 회로에서는  아두이노  V_in  에 외부 전원 VCC 를 공급해 줌으로 아두이노에게도 전원을 공급한다.

 

실습 회로와 프로그래밍 코드는 아래 url을 타고 들어가서 진행하세요~!

 

https://steemit.com/arduino/@jhis21c/dc-dc

 

DC 모터 드라이버를 이용해서 DC모터 제어하기 — Steemit

이번 튜토리얼 에서는 DC 모터 드라이버를 이용해서 2개의 DC모터를 제어 하는 방법을 배워 보도록 하겠습니다. DC 모터는 DC(직류)전원으로 작동하는 모터를 말하며 모형 자동차, 무선조정용 장난

steemit.com

 

 

 

[도전 과제] 

모터 2개 회로를 시리얼 모니터로 제어 해보세요.

W 누르면 바퀴 전진

S 누르면 바퀴 후진

A 누르면 좌회전

D 누르면 우회전

X 누르면 버튼은 바퀴 모두 정지

 

- 회로는 [실습 3] 회로 그대로 쓰시면 됩니다.

- 프로그래밍 코드는 [실습 2] 회로를 수정해서 쓰면 됩니다.

 

int IN1Pin = 8;
int IN2Pin = 7;
int IN3Pin = 2;
int IN4Pin = 4;
int ENAPin = 6;
int ENBPin = 3;
void setup() {
  Serial.begin(9600);
  pinMode(IN1Pin, OUTPUT);
  pinMode(IN2Pin, OUTPUT);
  pinMode(IN3Pin, OUTPUT);
  pinMode(IN4Pin, OUTPUT);
  analogWrite(ENAPin, 255);
  analogWrite(ENBPin, 255);
}
void loop()
{
   if(Serial.available())  //시리얼모니터에서 데이터가 들어오면
  {
    char in_data;         // 입력된 데이터 저장을 위한 변수
    in_data = Serial.read();  //입력된 데이터 in_data에 저장
     Serial.print("data : ");
     Serial.println(in_data);
     if(in_data == 's')
     {
     digitalWrite(IN1Pin, HIGH);
     digitalWrite(IN2Pin, LOW);
     digitalWrite(IN3Pin, HIGH);
     digitalWrite(IN4Pin, LOW);
     delay(1000);
     }
     else if(in_data == 'w')
     {
     digitalWrite(IN1Pin, LOW);
     digitalWrite(IN2Pin, HIGH);
     digitalWrite(IN3Pin, LOW);
     digitalWrite(IN4Pin, HIGH);
     delay(1000);
     }
     else if(in_data == 'd')
     {
     digitalWrite(IN1Pin, HIGH);
     digitalWrite(IN2Pin, LOW);
     digitalWrite(IN3Pin, LOW);
     digitalWrite(IN4Pin, HIGH);
     }
     else if(in_data == 'a')
     {
     digitalWrite(IN1Pin, LOW);
     digitalWrite(IN2Pin, HIGH);
     digitalWrite(IN3Pin, HIGH);
     digitalWrite(IN4Pin, LOW);
     }
     else if(in_data == 'x')
     {
     digitalWrite(IN1Pin, HIGH);
     digitalWrite(IN2Pin, HIGH);
     digitalWrite(IN3Pin, HIGH);
     digitalWrite(IN4Pin, HIGH);
     }
  }
}

- 도전과제 완료 후 원킹쌤에게 검사 받고 보고서 작성하면 됩니다.

 

 

 

 

 

 

끝.