Mengatur kecepatan motor DC 5V menggunakan PWM

Untuk menggerakkan motor DC diperlukan driver, driver motor adalah rangkaian elektronika yang mampu menghasilkan arus yang besar untuk belitan motor. driver yang umum digunakan adalah formasi jembatan (full bridge) seperti chip L293, L298.

Salah satu rangkaian favorit (sederhana) untuk menggerakkan motor
dc adalah rangkaian push pull atau rangkaian totem pole.

skema rangkaian totem pole (rangkaian tarik-ulur) menggunakan transistor:

kombinasi transistor yang bisa digunakan adalah NPN BD139 dan PNP BD140 yang mampu melewatkan arus hingga 1A. Rangkaian ini memiliki kekurangan yaitu tegangan keluaran sama dengan tegangan masukan (input) dikurangi tegangan Vbe sekitar 0.6v.

Agar rangkaian pushpull/totempole bisa menghasilkan tegangan output lebih besar misalnya 12 volt, bisa melengkapinya dengan opamp.

Skema rangkaian pushpull dengan opamp:

Jika dikombinasikan dengan PWM dari arduino, maka rangkaian ini berfungsi sebagai Pengatur kecepatan motor dc yang memiliki fungsi kecepatan, selain itu juga fungsi maju dan mundur.

Untuk mengatur kecepatan motor dc menggunakan arduino, rangkaian disusun menjadi dua sisi (untuk polaritas positif dan negatif) dan dua input pwm.

Skema pengontrol kecepatan motor dc dengan arduino:

berikut contoh sketch atau program yang bisa diaplikasikan.

#define pinMotorA 9
#define pinMotorB 10

bool motorMaju = false;
bool motorHidup = false;
char chrKecepatan[5];
byte Kecepatan;

void setup() {
  Serial.begin(9600);
  Serial.println("Mengatur kecepatan motor DC 5V menggunakan PWM dilengkapi aksi maju-mundur");
  Serial.println("dengan rangkaian sederhana menggunakan Arduino dan 4 transistor");
  Serial.println("entri [M] untuk maju");
  Serial.println("entri [m] untuk mundur");
  Serial.println("entri [Kxxx] untuk set kecepatan, xxx = 0 s/d 255");
  Serial.println("entri [+] untuk menambah kecepatan 10 angka");
  Serial.println("entri [-] untuk kurangi kecepatan 10 angka");
  Serial.println("entri [B] untuk berhenti");
  Serial.println("https://www.semesin.com/project");

  pinMode(pinMotorA, OUTPUT);
  pinMode(pinMotorB, OUTPUT);
}

void loop() {
  if(Serial.available())
  {
    char c = Serial.read();
    if(c == 'M')
    {
      motorMaju = true;
      Serial.println("Motor maju");
      motorHidup = true;
    }
    else if(c == 'm')
    {
      motorMaju = false;
      Serial.println("Motor mundur");
      motorHidup = true;
    }
    else if(toupper(c) == 'K')
    {
      delay(10);
      Serial.readBytesUntil('\n', chrKecepatan, sizeof(chrKecepatan));
      Kecepatan = String(chrKecepatan).toInt();
      Serial.print("Set kecepatan = ");
      Serial.println(Kecepatan);
    }
    else if(c == '+')
    {
      if(Kecepatan <= 245)
      {
        Kecepatan += 10;
      }
      Serial.print("Set kecepatan = ");
      Serial.println(Kecepatan);
    }
    else if(c == '-')
    {
      if(Kecepatan >= 10)
      {
        Kecepatan -= 10;
      }
      Serial.print("Set kecepatan = ");
      Serial.println(Kecepatan);
    }
    else if(toupper(c) == 'B')
    {
      digitalWrite(pinMotorA, LOW);
      digitalWrite(pinMotorB, LOW);
      motorHidup = false;
      Serial.println("Motor berhenti");
    }
  }
  if(motorHidup)
  {
    if(motorMaju)
    {
      digitalWrite(pinMotorB, LOW);
      analogWrite(pinMotorA, Kecepatan);
    }
    else
    {
      digitalWrite(pinMotorA, LOW);
      analogWrite(pinMotorB, Kecepatan);
    }
  }

}

jika terjadi kedala Arduino me-reset ketika running, bisa diakibatkan Arduino kekurangan catu daya (power supply).