Program Arduino untuk Stepper Motor dengan Kontrol Kecepatan Dinamis dan Arah (L298N) update versi 3

 Mari kita tambahkan fitur kontrol arah menggunakan dua tombol tekan (push button).

  • Satu tombol akan membuat motor berputar searah jarum jam.

  • Tombol lainnya akan membuat motor berputar berlawanan arah jarum jam.

  • Ketika tidak ada tombol yang ditekan, motor akan berhenti.

  • Kontrol kecepatan melalui potensiometer akan tetap berfungsi saat tombol ditekan.


Program Arduino untuk Stepper Motor dengan Kontrol Kecepatan Dinamis dan Arah (L298N)

Komponen Tambahan yang Dibutuhkan:

  • 2x Tombol Tekan (Push Button)

  • 2x Resistor Pull-down (sekitar 10k ohm)

Skema Pengkabelan Tambahan:

  1. Potensiometer:

    • Satu kaki luar potensiometer ke 5V Arduino.

    • Kaki tengah (wiper) potensiometer ke Analog Pin Arduino A0.

    • Kaki luar potensiometer yang lain ke GND Arduino.

  2. Tombol Tekan 1 (CW - Clockwise):

    • Satu kaki tombol ke 5V Arduino.

    • Kaki tombol yang lain ke Digital Pin Arduino 5.

    • Dari kaki tombol yang terhubung ke pin 5, pasang resistor 10k ohm ke GND (ini adalah konfigurasi pull-down).

  3. Tombol Tekan 2 (CCW - Counter-Clockwise):

    • Satu kaki tombol ke 5V Arduino.

    • Kaki tombol yang lain ke Digital Pin Arduino 6.

    • Dari kaki tombol yang terhubung ke pin 6, pasang resistor 10k ohm ke GND (ini adalah konfigurasi pull-down).

Skema Pengkabelan Lengkap (Ringkasan):

  • L298N ke Arduino:

    • IN1 -> D8

    • IN2 -> D9

    • IN3 -> D10

    • IN4 -> D11

    • VCC L298N -> 5V Arduino

    • GND L298N (kontrol) -> GND Arduino

    • +12V L298N -> Power Supply Eksternal (+)

    • GND L298N (daya motor) -> Power Supply Eksternal (-)

    • ENA L298N -> 5V Arduino

    • ENB L298N -> 5V Arduino

  • Stepper Motor ke L298N:

    • Koil A (2 kabel) -> OUT1 & OUT2

    • Koil B (2 kabel) -> OUT3 & OUT4

    • (Pastikan pasangan koil benar)

  • Potensiometer ke Arduino:

    • Kaki luar -> 5V

    • Kaki tengah -> A0

    • Kaki luar -> GND

  • Tombol CW ke Arduino:

    • Satu kaki -> 5V

    • Kaki lain -> D5

    • Resistor 10k dari D5 -> GND

  • Tombol CCW ke Arduino:

    • Satu kaki -> 5V

    • Kaki lain -> D6

    • Resistor 10k dari D6 -> GND


Arduino
// Mendefinisikan pin yang terhubung ke driver L298N
const int IN1 = 8;
const int IN2 = 9;
const int IN3 = 10;
const int IN4 = 11;

// Pin untuk potensiometer
const int potPin = A0; // Pin analog untuk membaca potensiometer

// Pin untuk tombol kontrol arah
const int buttonCWPin = 5;  // Tombol untuk putar searah jarum jam
const int buttonCCWPin = 6; // Tombol untuk putar berlawanan arah jarum jam

// Jumlah langkah per putaran penuh motor Anda.
// NEMA 17 umumnya 200 langkah per putaran (1.8 derajat per langkah).
const int stepsPerRevolution = 200;

// Urutan langkah untuk stepper motor bipolar (Full Step Drive)
// Ini adalah urutan aktivasi koil untuk membuat motor bergerak maju satu langkah
// {IN1, IN2, IN3, IN4}
int stepSequence[4][4] = {
  {1, 0, 1, 0}, // Step 1: Koil A aktif, Koil B aktif
  {0, 1, 1, 0}, // Step 2: Koil A terbalik, Koil B aktif
  {0, 1, 0, 1}, // Step 3: Koil A terbalik, Koil B terbalik
  {1, 0, 0, 1}  // Step 4: Koil A aktif, Koil B terbalik
};

void setup() {
  // Mengatur semua pin L298N sebagai OUTPUT
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);

  // Mengatur pin tombol sebagai INPUT
  pinMode(buttonCWPin, INPUT);
  pinMode(buttonCCWPin, INPUT);

  // Mulai komunikasi serial untuk debugging
  Serial.begin(9600);
  Serial.println("Stepper Motor with Dynamic Speed & Direction Control (L298N) Started");
}

void loop() {
  // Membaca nilai dari potensiometer (0-1023)
  int potValue = analogRead(potPin);

  // Mengubah nilai potensiometer (0-1023) menjadi rentang delay yang sesuai
  // map(value, fromLow, fromHigh, toLow, toHigh)
  // Rentang delay: 5000 mikrodetik (lambat) hingga 100 mikrodetik (cepat)
  int currentStepDelay = map(potValue, 0, 1023, 5000, 100);

  // Membaca status tombol
  int buttonCWState = digitalRead(buttonCWPin);
  int buttonCCWState = digitalRead(buttonCCWPin);

  // Jika tombol CW ditekan
  if (buttonCWState == HIGH) {
    Serial.print("Rotating Clockwise with Delay: ");
    Serial.print(currentStepDelay);
    Serial.println(" us");

    // Lakukan satu langkah searah jarum jam
    // Kita hanya melakukan satu langkah per iterasi loop() utama
    // agar program responsif terhadap perubahan tombol dan potensiometer
    static int currentStepCW = 0; // Menggunakan static agar nilai tetap antar panggilan loop
    int sequenceIndex = currentStepCW % 4;
    digitalWrite(IN1, stepSequence[sequenceIndex][0]);
    digitalWrite(IN2, stepSequence[sequenceIndex][1]);
    digitalWrite(IN3, stepSequence[sequenceIndex][2]);
    digitalWrite(IN4, stepSequence[sequenceIndex][3]);
    delayMicroseconds(currentStepDelay);
    currentStepCW++; // Lanjut ke langkah berikutnya
  }
  // Jika tombol CCW ditekan
  else if (buttonCCWState == HIGH) {
    Serial.print("Rotating Counter-Clockwise with Delay: ");
    Serial.print(currentStepDelay);
    Serial.println(" us");

    // Lakukan satu langkah berlawanan arah jarum jam
    static int currentStepCCW = 0; // Menggunakan static agar nilai tetap antar panggilan loop
    int sequenceIndex = (4 - 1 - (currentStepCCW % 4)) % 4;
    digitalWrite(IN1, stepSequence[sequenceIndex][0]);
    digitalWrite(IN2, stepSequence[sequenceIndex][1]);
    digitalWrite(IN3, stepSequence[sequenceIndex][2]);
    digitalWrite(IN4, stepSequence[sequenceIndex][3]);
    delayMicroseconds(currentStepDelay);
    currentStepCCW++; // Lanjut ke langkah berikutnya
  }
  // Jika tidak ada tombol yang ditekan, motor berhenti
  else {
    // Matikan semua pin IN untuk mematikan koil motor
    // Ini akan menghentikan motor dan mengurangi konsumsi daya saat diam
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, LOW);
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, LOW);
    // Serial.println("Motor Stopped"); // Bisa diaktifkan untuk debugging
    delay(10); // Jeda singkat agar tidak terlalu membebani CPU
  }
}

Penjelasan Perubahan:

  1. Pin Tombol:

    • const int buttonCWPin = 5; dan const int buttonCCWPin = 6;: Mendefinisikan pin digital untuk kedua tombol.

    • pinMode(buttonCWPin, INPUT); dan pinMode(buttonCCWPin, INPUT);: Mengatur pin tombol sebagai input.

  2. Logika Kontrol Arah di loop():

    • int buttonCWState = digitalRead(buttonCWPin); dan int buttonCCWState = digitalRead(buttonCCWPin);: Membaca status tombol. Karena kita menggunakan konfigurasi pull-down, tombol akan berstatus HIGH saat ditekan dan LOW saat dilepas.

    • if (buttonCWState == HIGH): Jika tombol CW ditekan, motor akan berputar searah jarum jam.

    • else if (buttonCCWState == HIGH): Jika tombol CCW ditekan, motor akan berputar berlawanan arah jarum jam.

    • else: Jika tidak ada tombol yang ditekan, semua pin IN pada L298N diatur ke LOW. Ini akan mematikan daya ke koil motor, sehingga motor berhenti dan tidak menahan posisi (jika Anda ingin motor menahan posisi saat diam, jangan matikan koil, tetapi itu akan mengkonsumsi daya).

    • static int currentStepCW = 0; dan static int currentStepCCW = 0;: Variabel static digunakan di sini. Ini penting karena kita hanya melakukan satu langkah motor per iterasi loop(). Variabel static akan mempertahankan nilainya antara panggilan fungsi loop(), sehingga motor dapat melanjutkan dari langkah terakhirnya dan tidak selalu memulai dari langkah pertama setiap kali loop() berjalan.

  3. Gerakan per Iterasi loop():

    • Berbeda dengan program sebelumnya yang melakukan seluruh putaran dalam satu for loop, sekarang kita hanya melakukan satu langkah motor per iterasi loop(). Ini membuat program lebih responsif terhadap input tombol dan potensiometer, karena Arduino dapat terus memeriksa status input.

Cara Menggunakan:

  1. Hubungkan Semua Komponen: Pastikan semua komponen (motor, driver, power supply, potensiometer, dan kedua tombol dengan resistor pull-down) terhubung dengan benar sesuai skema.

  2. Salin dan Unggah Kode:

    • Salin seluruh kode di atas dan tempelkan ke Arduino IDE.

    • Pilih Tools > Board dan Tools > Port yang benar.

    • Klik tombol Upload.

  3. Uji Coba:

    • Putar potensiometer untuk mengatur kecepatan.

    • Tekan dan tahan tombol CW, motor akan berputar searah jarum jam dengan kecepatan yang diatur potensiometer.

    • Tekan dan tahan tombol CCW, motor akan berputar berlawanan arah jarum jam.

    • Lepaskan kedua tombol, motor akan berhenti.

Komentar