본문 바로가기
IoT 디바이스 활용/Arduino

Arduino - DC 모터 (motor.h, car.h)

by cooluk 2020. 10. 16.

DC 모터

DC 모터

image-20201006161217413


L298N

  • 모터 드라이버 모듈

    image-20201006161251029


속도 설정

image-20201006161314137

  • ENA, ENB
    • 점퍼스위치가 있는 경우 정속도(속도 조절 불가)
    • 점퍼스위치를 제거하고 PWM 핀에 연결하면 속도 조절 가능

모터 방향 설정

image-20201006161355526


image-20201006161417188


CAR-EX/app.ino

// 우측 바퀴
int IN1 = 8;
int IN2 = 7;
int EN1 = 9;

// 좌측 바퀴
int IN3 = 5;
int IN4 = 4;
int EN2 = 3;  // PWM 제어

void setup()
{
    pinMode(IN1, OUTPUT);
    pinMode(IN2, OUTPUT);
    pinMode(EN1, OUTPUT);
    pinMode(IN3, OUTPUT);
    pinMode(IN4, OUTPUT);
    pinMode(EN2, OUTPUT);
}

void loop()
{
    // 전진
    digitalWrite(IN1, HIGH);
    digitalWrite(IN2, LOW);
    analogWrite(EN1, 200);
    digitalWrite(IN3, HIGH);
    digitalWrite(IN4, LOW);
    analogWrite(EN2, 200);
    delay(1000);

    // 정지
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, LOW);
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, LOW);
    delay(2000);
}

Motor 클래스화

motor.h

#pragma once

#include <Arduino.h>

class Motor {
protected:
    int in1;    // 전진
    int in2;    // 후진
    int en;     // 속도, PWM

public:
    Motor(int in1, int in2, int en);

    void forward(int speed=200);    // 전진
    void backward(int speed=200);   // 후진
    void stop();                    // 정지
    void setSpeed(int speed);
};

motor.cpp

#include "motor.h"

Motor::Motor(int in1, int in2, int en) : in1(in1), in2(in2), en(en) {
    pinMode(in1, OUTPUT);
    pinMode(in2, OUTPUT);
    pinMode(en, OUTPUT);
}

void Motor::forward(int speed) {    // 전진
    digitalWrite(in1, HIGH);
    digitalWrite(in2, LOW);
    analogWrite(en, speed);
}

void Motor::backward(int speed) {   // 후진
    digitalWrite(in1, LOW);
    digitalWrite(in2, HIGH);
    analogWrite(en, speed);
}

void Motor::stop() {                    // 정지
    digitalWrite(in1, LOW);
    digitalWrite(in2, LOW);
    analogWrite(en, 0);
}

void Motor::setSpeed(int speed) {
    analogWrite(en, speed);
}

app.ino

#include "motor.h"

Motor right(8, 7, 9);
Motor left(5, 4, 3);

void setup() {

}

void loop()
{
    // 전진
    left.forward();
    right.forward();
    delay(1000);

    // 정지
    left.stop();
    right.stop();
    delay(2000);

    // 후진
    left.backward();
    right.backward();
    delay(1000);

    // 정지
    left.stop();
    right.stop();
    delay(2000);
}

Car 클래스화

car.h

#pragma once

#include <Arduino.h>
#include "motor.h"

class Car {
protected:
    Motor right;
    Motor left;

public:
    Car(int in1, int in2, int en1, int in3, int in4, int en2);

    void forward(int speed=200);    // 전진
    void backward(int speed=200);   // 후진
    void turnLeft(int speed=200);   // 좌회전 r: forward, l: backward
    void turnRight(int speed=200);  // 우회전 r: backward, l: forward
    void setSpeed(int rightSpeed, int leftSpeed);
    void stop();
};

car.cpp

# include "car.h"

Car::Car(int in1, int in2, int en1, int in3, int in4, int en2):
    right(in1, in2, en1), left(in3, in4, en2) {
}

void Car::forward(int speed) {
    right.forward(speed);
    left.forward(speed);
}

void Car::backward(int speed) {
    right.backward(speed);
    left.backward(speed);
}

void Car::turnLeft(int speed) {
    right.forward(speed);
    left.backward(speed);
}

void Car::turnRight(int speed) {
    right.backward(speed);
    left.forward(speed);
}

void Car::setSpeed(int rightSpeed, int leftSpeed) {
    right.setSpeed(rightSpeed);
    left.setSpeed(leftSpeed);
}

void Car::stop() {
    right.stop();
    left.stop();
}

app.ino

#include <car.h>

Car car(8, 7, 9, 5, 4 ,3);

void setup() {

}

void loop()
{
    // 전진
    car.forward();
    delay(2000);

    // 정지
    car.stop();
    delay(2000);

    // 후진
    car.backward();
    delay(1000);

    // 정지
    car.stop();
    delay(2000);

    car.turnLeft();
    delay(500);

    car.stop();
    delay(1000);

    car.turnRight();
    delay(500);

    car.stop();
    delay(1000);
}

댓글