728x90
반응형

 

Specification L9110 L298N
Channel DC Motor 2 or StepMotor 1 DC Motor 2 or StepMotor 1
Input Voltage(Motor) DC 2.5 - 12V DC 5 - 35V
Continuous Current 0.8A(800mA) 2.0A(2000mA)
Peak Current 1.5A(1500mA) 2.5A(2500mA)
HIGH DC 2.5 - 12V DC 2.3 - 7V
LOW DC 0 - 0.7V DC -0.3 - 1.5V
Control PWM PWM

 

DC Motor
Specification mini low-current DC Motor
Input Voltage(Motor) 3 - 6V
Continuous Current 430mA
RPM 8800rpm
Torque 6.35g.cm

모터의 연속전류(Continuous Current) 또는 정격 전류(Rated Current)는 모터에 무한 시간 계속하여 흘릴 수 있는 전류를 의미한다.

모터의 최대전류(Peak Current)는 수 초간 짧은 시간 동안만 흘릴 수 있는 전류를 의미한다.

모터의 최대 전류는 연속 전류의 모터 종류에 따라 다르지만 보통 몇 배 정도 된다.

 

모터의 정격 전류와 최대 전류는 여러 요소에 의해 결정되지만

가장 중요한 요소는 전류에 의해 발새오디는 모터의 발열이다.

모털 코일에 전류가 흐르면 코일 저항 등에 의해 모터에서 열이 발생하고 열이 모터가 견딜 수 있는 온도를 넘어가면

코일의 단선 또는 절연 파괴 등이 발생한다.

 

그래서 동일한 모터라도 방열판이나 팬 등을 달아 방열 대책을 세우면 더 큰 전류를 흘릴 수 있다.

 

DC 모터 특성

1) 기동 토크가 크다

2) 인가 전압에 대하여 회전특성이 직선적으로 비례

3) 입력 전류에 대하여 출력 토크가 직선적으로 비례, 또한 출력 효율이 양호

4) 가격이 저렴

 

DC 모터의 결점 (세라믹 콘덴서 부착이유)

DC 모터의 가장 큰 결점

그 구조상 브러쉬(Brush)와 정류자(Commutator)에 의한 기계식 접점이 있다는 점이다.

이것에 의한 영향은 전류시의 전기 불꽃(Spark), 회전 소음, 수명이라는 형태로 나타난다.

그리고 마이크로 컴퓨터 제어를 하려는 경우는 'Noise'가 발생하게 된다.

따라서 이 노이즈 대첵이 유일한 과제가 될 수 있다.

이 노이즈 대책을 위해서 각 단자와 케이스 사이에  0.01μF∼0.1μF  정도의 세라믹 콘덴서를 직접 부착한다.

이것으로 정류자에서 발생하는 전기 불꽃을 흡수하여 노이즈를 억제할 수 있다.

DC 모터의 노이즈 대책에는 콘덴서를 케이스와 단자간에 직접 부착한다.

콘덴서의 리드는 가급적 짧게 한다.

 

 

 

>> 모터 용어 정리

 

모터를 선택할때 어떤 종류의 모터를 사용해야하는가도 중요하지만,
같은 종류의 모터 스펙을 비교하여 구매하는것도 중요함

작동 전압 (예: 3 ~ 6V)
모터가 작동하는 최적의 전압을 말함
더 작은 전압을 입력해도 굴러는 감(큰 전압은 모터가 망가질 수 있음)

적정 전압 (예: 6V)
모터의 성능을 최대한 활용하면서 모터에 부담을 주지 않는 전압.
또한 적정 전압을 기준으로 속도 및 힘 등을 표시함

전류 (예: 200mA)
모터가 사용하는 전류(에너지)를 말함.
즉, 모터를 사용하려면 모터의 전류보다 더 큰 전원을 입력해야함
(1A = 1000mA)

RPM (예: 300RPM)
Revolutions Per Minute의 약자이며, 분당 회전수를 의미함.
300RPM하면 1분에 300바퀴 돈다는 것

토크(예: 1kg/cm)
회전력(힘)을 말함.
1kg/cm 라 하면 모터의 축(돌아가는 부분)을 중심으로 1cm 떨어진 점에서
1kg의 힘을 버틸 수 있다는 의미.

 

 

모터의 전압 - 전류 - RPM - toque의 관계
모터의 전원(전류, 전압)이 강할 수록 출력(RPM, Torque)가 강해짐.
속도가 빠를수록 힘이 약하며, 반대로 힘이 강할수록 속도가 느려짐
(전원과 출력은 비례하나 속도와 토크는 반비례함)

무부하(No-Load)
모터에 아무런 힘이 가해지지 않은 상태를 말함.
무부하 상태의 전류, 무부하 상태의 RPM 등을 표시할 때 사용됨.

최적부하(Optimal-load)
모터가 가장 효율적으로 돌 수 있는 부하를 말함.
모터를 최대한 오래 사용하고 싶다면 최적 부하 상태에서 모털를 구동시켜야 함.

최대부하(Stall)
모터가 멈추는 지점. 그 정도의 힘을 받은 상태를 말함.
사용하는 전류가 확 높아지며, 그만큼 열이 나므로 주의해야함.

기어비(Ratio)
빠른 속도보다는 강한 힘을 요구할 때, 모터에 기어박스를 달게됨
감속기라고도 부르며, 이러한 기어가 부착된 모터를 기어드 모터라고 부름
기어비는 어느 정도 크기의 기어를 부착했느냐를 의미하며 기어비가 클수록 속도는 줄어들고 힘은 강해짐

DC모터 제어하기(속도 및 방향)

모터는 전원에 따라 AC모터와 DC모터로 분류되며, 방향과 속도를 제어하기 위해서는 보통
DC모터를 많이 사용함.
DC모터에서도 스텝모터, 서보모터, 일반DC모터, 엔코더장착모터 등으로 나뉘어지며,
각각의 모터들은 제어하는 방식이 모두 제각각임
이를 감안할 때 DC모터를 제어하는 방법은 크게 2가지로 나눌 수 있음.

바로 오픈루프(Open-Loop) 제어 방식과 클로즈루프(Close-Loop) 제어 방식임

오픈루프 제어는 일방적으로 모터에게 '모터야, 너 10바퀴만 돌아라' 또는 '모터야, 너 180도만 정방향으로 돌아라'와
같은 전기 신호를 보내는 방식을 말함(피드백이 없음)
이러한 방식은 모터가 최대 부하가 걸릴 경우 회전을 못하게 되는데, 명령을 내린 주체는 이를 알아 챌 수가 없기 때문에
오차가 생길 수 있다는 점이 있음.

 

Open-Loop

이와 반대로 클로즈 루프 제어는 결과를 측정하여 결과값을 기반으로 명령을 내리는 방식을 말함
즉, '10바퀴만 돌고 멈춰' 또는 '30도만 돌고 멈춰' 와 같은 방식임.
결과 값을 측정하기 위해서는 엔코더라는 적외선 센서가 부착된 엔코더 모터를 사용해야함

>> DC 모터 일반 작동 코드

int MOTOR = 10;

void setup()
{
  pinMode(MOTOR, OUTPUT);
}

void loop()
{
  analogWrite(MOTOR, 255);
  delay(1000);
  analogWrite(MOTOR, 0);
  delay(3000);
}

 

>> DC 모터 제어


DC 모터는 전류가 흐르는 방향으로 회전을 하기 때문에 포트의 출력을 제어하여
모터의 회전 방향을 결정할 수 있다.

이번에는 가변 저항을 연결하여 모터의 속도를 제어해도록 하자

** 모터를 다룰 떄는 주의할 것은 코일로 이루어진 모터에 전류를 흘릴 경우 반대방향으로
기전력(역기전력)이 발생하게 되는데 이를 방지하기 위해 모터와 병렬로
다이오드를 반드시 달아주어야 한다. 그래야 주변 회로(TR, FET 등)가 손상되지 않는다.

 

>> DC 모터 제어 회로도:

 

>> 부품 목록:

DC 모터, 100Ω (전류 제한용도), NPN형 TR, 정류용 다이오드(1N4001 ~ 4007,

100kΩ (10Ω ~ 500kΩ 등, 가지고 있는 가변 저항 사용)

 

>> 실습 절차:

1. 회로도를 참고하여 모터와 부품들을 연결

2. 저항은 전류제한(+, - 쇼트 방지용) 용도로 사용하기 위함 옴으로 100Ω 정도의 작은 저항을 사용하면 됨

따라서 만약 100Ω의 저항잉 없다면 50, 80, 120, 200Ω 등의 값이 작은 저항을 사용하면 문제가 없음

3. TR은 스위치 작용을 위해 연결한 것이므로 모델 종류에 상관 없으며 NPN 타입을 사용하면 된다.

단, TR의 극성에 주의한다. B(베이스단자), E(에이터 단자), C(콜렉터 단자)

4. 아래 프로그램 코드를 작성해서 실행해 본다.

 

int motorPin = 3; // Motor 연결핀 정의

void setup()
{
  pinMode(motorPin, OUPUT); // 모터 연결핀 출력 지정
}

void loop()
{
  int reading == analogRead(A3); // 아날로그 포트에서 최대 2^8(256) 값 읽어옴
  digitalWrite(motorPin, HIGH); // 읽어들인 데이터만큼 HIGH 유지
  delay(reading);
  digitalWrite(motorPin, LOW);  // (255-읽어온데이터) 만큼 LOW 유지
  delay(255-reading);
}

가변저항으로 인해 분배되어 들어오는 값

즉, 전압에 의한 레벨 값으로 2^8 비트 값(최대값이 256)을 읽어 들이는데 이 값을 가지고 PWM 신호 duty ratio를

조절하여 모터의 속도를 조절하는 방식이다.

PWM 신호와 같이 듀티비(HIGH와 LOW 신호 비율)로 모터의 회전 속도를 제어하는 것이다.

HIGH 신호가 LOW 신호보다 출력 시간을 길게하면 상대적으로 모터가 빨리 회전한다.

 


DC모터 시리얼 통신(창) 이용 제어

 

입력 값에 따라 속도 조절도 가능하다.

 

DC모터 제어 회로도

int motorPin = 3; // Motor 연결핀 정의

void setup()
{
  pinMode(motorPin, OUPUT); // 모터 연결핀 출력 지정
  Serial.begin(9600);
  Serial.println("Speed 0 to 255");
}

void loop()
{
  if(Serial.available())  // Serial data가 있으면 실행한다
  {
    int speed = Serial.parseInt(); // Serial 입력 데이터를 정수로 저장
    if(speed > 0 && speed <= 255)
    {
      analogWrite(motorPin, speed); // Serial 입력데이터만큼 출력
      Serial.println(speed);  // 현재 스피드를 출력
    }
  }
}

Serial.parseInt():
컴퓨터 시리얼 창을 통해 숫자 데이터를 전송하려 할 경우 정수 값이 아닌 ASCII 코드 값이 전송된다.
예를 들어 '123' 은 각각 아스키 코드 값인 '49', '50', '51' 이 전송이 된다.
따라서 정수 '123'의 값이 필요할 경우 프로그래밍으로 수치를 계산해야 하는 번거로움이 발생하는데
이를 편리하게 구현해 놓은 것이 parseInt() 함수 이다.


이번 시간 부터는 DC모터를 RC카 등에 응용할 수 있도록 본격적으로 제어해보는 실습을 가져보자

 

** 일반적으로 소형 DC모터라도 기어박스가 달린 모터를 제어할 때는 소모 전류를 체크해야한다.

아두이노 포트의 출력은 40mA로 매우 제한적이기 때문에 포트에서 직접 모터로 출력을 연결할 경우

아두이노 포트나 주변회로가 손상될 수 있으며 모터 또한 미약한 전류로는 돌릴 수 없게 된다.

 

이를 보완하기 위해 모터에 충분한 전류를 공급해 줄 수 있는 IC가 개발되어 있다.

이런 모터 드라이버용 IC(본 실험에서는 L293D) 를 이용해서 모터를 구동해보고자한다.

 

모터제어의 핵심은 정회전으로 돌릴 것인가? 역회전으로 돌릴 것인가?와 같은

"방향 제어" 와 "속도 제어" 인데, H - Bridge 라고 불리는 아래 그림과 같은 간단한 회로를 통해

방향 제어가 가능하며, 이런 H브릿지 회로가 두개(2채널) 들어가 있는 IC가 바로 L293D IC이며,

PWM 신호 입력을 통해 속도 제어까지 가능하다.

 

** H - Bridge 회로 (모터 구동 회로)

 

위 그림에서 스위치 1번과 4번을 닫을 때 (2, 3번은 오픈) 전류의 흐름으로 인해

한 방향으로 회전하기 시작하며, 방향을 반대방향으로 전환하려고 할 때는

2번과 3번 스위치를 닫으면(1, 4번은 오픈) 방향 전환이 이루어진다.

만약 그 이외의 경우에는 (1, 2번 닫고 3, 4번 오픈 / 1,2, 번 오픈 3, 4 닫기 / 모두 오픈)

모터가 회전하지 않는다 (정지)

회로 연결도가 알파벳 H를 닮았다 하여 'H-bridge'라고 하며,

아래 그림의 TR처럼 베이스 단자를 통해 스위치의 On/Off를 전자적으로 제어할 수 있다.

이러한 H브릿지 기능을 포함하고 속도제어까지 가능하도록 만들어진

IC가 바로 L293D(시리즈)IC이며, 이를 활용하여 DC모터를 제어해보도록 하자.

 

>> L293D 모터 제어 드라이버 IC:

H 브릿지 회로가 2개(2채널) 들어가 있으며, IC 이미지에서 처럼 좌우측으로 구분 되어 있다.

** 정방향 회전(정,역 방향은 연결에 따라 기준이 달라짐)

위 그림을 통해 왼쪽의 1번 채널을 살펴보자.

Input 1으로(2번 핀, 1A) HIGH 신호가 입력이 되면,VCC2(8번핀)으로 연결된 별도 공급의 전원이

3번핀(1Y)에서 나와서 DC motor를 거치고 6번핀(2Y)으로 빠져나가면서 모터를 (예를 들어)

정방향으로 회전 시킨다. 이때 Input 2 (7번핀, 2A)는 Low 신호 이어야 한다.

 

** 역방향 회전

Input 1 으로 (2번 핀, 1A)은 LOW 신호, Input 2(7번핀, 2A)는 HIGH 신호 입력이 되면

VCC2(8번핀)으로 연결된 별도 공급의 전원이 6번핀(2Y)에서 나와서 아까와는 반대 방향으로

DC motor를 거치고 3번핀(1Y)으로 빠져나가면서 모터를 역방향 회전 시킨다.

 

L293D IC는 이렇게 제어가능한 H-Bridge 채널이 구조상 좌측에 한개,

우측에 한개, 총 두개로 구성되어진 IC이다.

상세한 스펙과 설명을 아래에 다시 정리하였다.

 

L293D Motor Driver IC Specification

1. 제어 전원 : 5V(IC 자체를 동작 시키기 위한 전원)

2. 모터 전원 : 4.5V ~ 36V (모터에 공급되는 전원)

3. 채널당 600mA 출력 가능 (2개 채널, 총 1.2mA 출력 가능)

4. 클램프 다이오드 포함(역 전류 방지용)

5. 2채널이므로 DC모터 두개까지 제어 가능

 

>> 실습 회로 도면

>> 부품 목록 : L293D IC, DC 모터 , 10kΩ ~ 500kΩ 사이 아무거나

 

>> 실습절차:

1. 회로도를 참고하여 모터와 부품들을 연결

2. 회로 연결에서 VCC1(IC의 16번 핀)에 아두이노의 +5V 단자를 연결하고,

모터 구동을 위한 VCC2(IC의 8번 핀)에는 모터 구동하기에 무리가 없는

4.5~36V 사이의 별도 전원을 공급한다.

** 구동 토크가 크거나, 비교적 큰 모터를 연결하게 되면 L293D  IC에 발열이 심하게 나고

나가버릴 수 있으니 주의 할 것

 

3.회로의 모든 GND(그라운드, -단자)는 하나로 연결한다.

4. 속도 제어를 위해서는 PWM 신호 출력이 가능한 아두이노 포트를 사용해야 한다.

(디지털 포트 중 '~' 물결 무늬가 표시된 포트가 PWM 출력이 가능한 포트이다.)

따라서 IC의 1번핀 (Enable 단자)에는 반드시 아두이노의 PWM 포트를 연결하도록 한다.

5. 모터 연결선 +, - 두 가닥은 PWM 기능과는 무관 함으로 디지털 포트 중,

아무 포트에 연결하도록 한다.

 

int in1 = 7;
int in2 = 8;
int MotorA = 6;
int pwmA;

void setup()
{
  pinMode(in1, OUTPUT); //L293D의 1번 채널의 입력 1
  pinMode(in2, OUTPUT); //L293D의 1번 채널의 입력 2
  pinMode(MotorA, OUTPUT);
}

void loop()
{
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  // 정방향(in1 = HIGH, in2 = LOW)
  // 역방향(in1 = LOW, in2 = HIGH)
  // 모터선 연결에 따라 반대 방향이 될 수 있다

  pwmA = analogRead(A0) / 4; // 속도제어, 0 ~ 256 값을 넣기 위해 '/4'
  analogWrite(MotorA, pwmA);  // 모터를 회전시킴 & 속도를 결정
  delay(20);  // 출력값이 적용될 수 있는 시간을 줌  
}

지난 시간에 H-bridge IC(L293D)를 이용하여 모터를 회전시키고 속도 조절을 해보았다.

이번 시간에는 동일한 구성에 푸쉬버튼 스위치 하나만 추가하여 정회전으로 돌아가고 있는 모터를 역회전을 시켜보자

 

>> 부품 목록 : L293D IC, DC 모터, 푸쉬버튼, 저항, 10kΩ ~ 500kΩ 사이 아무거나

int in1 = 7;
int in2 = 8;
int MotorA = 6;
int pwmA;
int btn = 10; // 모터 방향 변경을 위한 버튼 변수 선언

void setup()
{
  pinMode(in1, OUTPUT); //L293D의 1번 채널의 입력 1
  pinMode(in2, OUTPUT); //L293D의 1번 채널의 입력 2
  pinMode(MotorA, OUTPUT);
  pinMode(btn, INPUT_PULLUP); // 아두이노 보드 내부 풀업저항 사용 코드
}

void loop()
{
  boolean btnHL = digitalRead(btn); // boolean은 0(LOW), 1(HIGH)논리값
  pwmA = analogRead(A0) / 4; // 속도제어, 0 ~ 256 값을 넣기 위해 '/4'
  MotorSet(pwmA, btnHL); // 모터의 속도와 방향을 설정하는 함수 실행
}

void MotorSet(int pwmA, boolean btnHL) // 속도값과 버튼상태 값 전달
{
  analogWrite(MotorA, pwmA); // 버튼이 그라운드와 연결되어 있어 눌러지면 LOW가 입력
  digitalWrite(in1, !btnHL); // 7번과 연결된 모터라인에 btnHL 반대값
  digitalWrite(in2, btnHL);  // 8번과 연결된 모터라인에 btnHL 논리값 출력
}

지난 시간에 DC모터를 버튼을 이용하여 정회전과 역회전을 시켜보았다.

이번 시간에는 모터 하나를 더 추가하여 동시에 두 개의 모터의 정, 역 제어를 해보도록 하자.

L283D의 나머지 채널 하나만 추가로 연결하면 되니 어렵지 않을 것이다.

 

>> 실습 목표:

두 개의 모터를 L283과 아두이노에 연결하고 같은 방향으로 전진을 시킨다.

푸쉬 버튼을 누르고 있는 순간만 두 개의 바퀴가 역회전이 되도록 프로그래밍 하라

(가변 저항을 통한 속도 제어도 가능하도록 하라)

 

>> 실습 회로도면 :

 

>> 실습 절차: 

1. 회로도를 참고하여 모터와 부품들을 연결

2. 회로 연결에서 VCC1(IC의 16번 핀)에 아두이노의 +5V 단자를 연결하고,

모터 구동을 위한 VCC2(IC의 8번 핀)에는 모터 구동하기에 무리가 없는

4.5~36V 사이의 별도 전원을 공급한다.

** 구동 토크가 크거나, 비교적 큰 모터를 연결하게 되면 L293D  IC에 발열이 심하게 나고

나가버릴 수 있으니 주의 할 것

 

3.회로의 모든 GND(그라운드, -단자)는 하나로 연결한다.

4. 속도 제어를 위해서는 PWM 신호 출력이 가능한 아두이노 포트를 사용해야 한다.

(디지털 포트 중 '~' 물결 무늬가 표시된 포트가 PWM 출력이 가능한 포트이다.)

따라서 IC의 1번핀 (Enable 단자)에는 반드시 아두이노의 PWM 포트를 연결하도록 한다.

5. 모터 연결선 +, - 두 가닥은 PWM 기능과는 무관 함으로 디지털 포트 중,

아무 포트에 연결하도록 한다.

 

6. 스위치 역할을 할 수 있는 푸쉬 버튼을 아두이노 남는 포트에 연결한다.

(만약 푸쉬 버튼이 없을 경우 점퍼선으로 대체 가능)

int in1 = 7;
int in2 = 8;
int in3 = 12;
int in4 = 13;

int MotorA = 6; // 좌측 모터
int MotorB = 11;// 우측 모터
int pwmA;
int btn = 10; // 모터 방향 변경을 위한 버튼 변수 선언

void setup()
{
  pinMode(in1, OUTPUT); //L293D의 1번 채널의 입력 1
  pinMode(in2, OUTPUT); //L293D의 1번 채널의 입력 2

  pinMode(in3, OUTPUT); //L293D의 2번 채널의 입력 1
  pinMode(in4, OUTPUT); //L293D의 2번 채널의 입력 2

  pinMode(MotorA, OUTPUT);
  pinMode(Motorㅠ, OUTPUT);

  pinMode(btn, INPUT_PULLUP); // 아두이노 보드 내부 풀업저항 사용 코드
}

void loop()
{
  boolean btnHL = digitalRead(btn); // boolean은 0(LOW), 1(HIGH)논리값
  pwmA = analogRead(A0) / 4; // 속도제어, 0 ~ 256 값을 넣기 위해 '/4'
  MotorSet(pwmA, btnHL); // 모터의 속도와 방향을 설정하는 함수 실행
}

void MotorSet(int pwmA, boolean btnHL) // 속도값과 버튼상태 값 전달
{
  analogWrite(MotorA, pwmA); // 버튼이 그라운드와 연결되어 있어 눌러지면 LOW가 입력
  digitalWrite(in1, !btnHL); // A 7번과 연결된 모터라인에 btnHL 반대값
  digitalWrite(in2, btnHL);  // A 8번과 연결된 모터라인에 btnHL 논리값 출력
  analogWrite(MotorB, pwm);
  digitalWrite(in3, !btnHL); // B 12번과 연결된 모터라인에 btnHL 반대값
  digitalWrite(in4, btnHL);  // B 13번과 연결된 모터라인에 btnHL 논리값 출력
}

지난 시간에 DC 모터를 버튼 하나를 이용하여 정회전과 역회전을 시켜 보았다.

이번에는 버튼 하나를 더 추가하여 버튼 A를 누르면 좌회전, 버튼 B를 누르면 우회전

버튼 A와 B를 동시에 누르면 역회전을 하는 회로를 실습해보도록 하자.

이 실습을 거치게 되면, RC카의 기본적인 구동 원리를 이해하게 된다.

 

>> 실습 목표:

처음에는 두 개의 모터를 정회전(전진) 시키고, 좌버튼(버튼A)를 누르고 있는 동안은 좌회전,

우버튼(버튼B)를 누르고 있는 동안은 후회전, 두개의 버튼 (A&B)를 동시에 누르면 역회전(후진)시켜서,

버튼 두개로 마치 RC자동차처럼 동작 시킬 수 있다.

#define btnFront 0 // '버튼정지' 변수를 '0'의 숫자값으로 정의
#define btnLeft 1
#define btnRight 2
#define btnBack 3

int in1 = 7;
int in2 = 8;
int in3 = 12;
int in4 = 13;

int btnL = 9; // 모터 방향 변경을 위한 버튼 변수 선언
int btnR = 10; // 모터 방향 변경을 위한 버튼 변수 선언

int Direction; // 모터 방향 변수

int MotorL = 6; // 좌측 모터
int MotorR = 11;// 우측 모터
int pwmA;

void setup()
{
  pinMode(in1, OUTPUT); //L293D의 1번 채널의 입력 1
  pinMode(in2, OUTPUT); //L293D의 1번 채널의 입력 2

  pinMode(in3, OUTPUT); //L293D의 2번 채널의 입력 1
  pinMode(in4, OUTPUT); //L293D의 2번 채널의 입력 2

  pinMode(MotorA, OUTPUT);
  pinMode(MotorB, OUTPUT);

  pinMode(btnL, INPUT_PULLUP); // 아두이노 보드 내부 풀업저항 사용 코드(좌)
  pinMode(btnR, INPUT_PULLUP); // 아두이노 보드 내부 풀업저항 사용 코드(우)
}

void loop()
{
  boolean btnHL = digitalRead(btnL); // boolean은 0(LOW), 1(HIGH)논리값(좌)
  boolean btnHL = digitalRead(btnR); // boolean은 0(LOW), 1(HIGH)논리값(우)
  pwmA = analogRead(A0) / 4; // 속도제어, 0 ~ 256 값을 넣기 위해 '/4'

  // 버튼 누름에 따른 비교문(if)과 Case 선택문 실행
  if (btnL_HL == HIGH && btnR_HL == HIGH)
  {
    Direction = 0;
  }
  else if (btnL_HL == LOW && btnR_HL == HIGH)
  {
    Direction = 1;
  }
  else if (btnL_HL == HIGH && btnR_HL == LOW)
  {
    Direction = 2;
  }
  else if (btnL_HL == LOW && btnR_HL == LOW)
  {
    Direction = 3;
  }

  switch(Direction)
  {
    case btnFront:  // 전진 [L, R 모터 정회전]
    {
      analogWrite(MotorL, pwm);
      digitalWrite(in1, HIGH);
      digitalWrite(in2, LOW);
      analogWrite(MotorR, pwm);
      digitalWrite(in3, HIGH);
      digitalWrite(in4, LOW);
      break;
    }

    case btnLeft:  // 좌회전 [L모터 정지, R 모터 전진]
    {
      analogWrite(MotorL, pwm);
      digitalWrite(in1, LOW);
      digitalWrite(in2, LOW);
      analogWrite(MotorR, pwm);
      digitalWrite(in3, HIGH);
      digitalWrite(in4, LOW);
      break;
    }

    case btnRight:  // 우회전 [L모터 전진, R 모터 정지]
    {
      analogWrite(MotorL, pwm);
      digitalWrite(in1, HIGH);
      digitalWrite(in2, LOW);
      analogWrite(MotorR, pwm);
      digitalWrite(in3, LOW);
      digitalWrite(in4, LOW);
      break;
    }

    case btnBack:  // 후진 [L, R 모터 역회전]
    {
      analogWrite(MotorL, pwm);
      digitalWrite(in1, LOW);
      digitalWrite(in2, HIGH);
      analogWrite(MotorR, pwm);
      digitalWrite(in3, LOW);
      digitalWrite(in4, HIGH);
      break;
    }
  }
}
728x90
반응형

'Firmware & Embedded > Components' 카테고리의 다른 글

Pull-up & Push-down  (0) 2022.11.21
BlueTooth Module(HC-05, 06)  (0) 2022.11.17
L9110S (Motor Driver Module)  (0) 2022.11.16
Joystick module  (0) 2022.11.08
Stepping Motor  (0) 2022.11.08

+ Recent posts