Program Arduino untuk Stepper Motor dengan Keamanan Tombol Ganda (L298N) update versi 4

 Menghentikan motor saat kedua tombol ditekan bersamaan akan mencegah perilaku yang tidak terduga dan bisa menjadi bahaya.

Kita akan memodifikasi logika di dalam loop() untuk menambahkan kondisi ini.


Program Arduino untuk Stepper Motor dengan Keamanan Tombol Ganda (L298N)

Program ini akan memastikan motor berhenti jika kedua tombol (CW dan CCW) ditekan secara bersamaan.

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
};

// Fungsi untuk menghentikan motor (mematikan semua koil)
void stopMotor() {
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, LOW);
}

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 Enhanced Safety 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
  int currentStepDelay = map(potValue, 0, 1023, 5000, 100);

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

  // --- Logika Keamanan: Kedua tombol ditekan, motor berhenti ---
  if (buttonCWState == HIGH && buttonCCWState == HIGH) {
    stopMotor(); // Panggil fungsi untuk menghentikan motor
    Serial.println("Both buttons pressed! Motor Stopped for safety.");
    delay(100); // Jeda singkat
  }
  // --- Jika hanya tombol CW yang ditekan ---
  else if (buttonCWState == HIGH) {
    Serial.print("Rotating Clockwise with Delay: ");
    Serial.print(currentStepDelay);
    Serial.println(" us");

    static int currentStepCW = 0;
    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++;
  }
  // --- Jika hanya tombol CCW yang ditekan ---
  else if (buttonCCWState == HIGH) {
    Serial.print("Rotating Counter-Clockwise with Delay: ");
    Serial.print(currentStepDelay);
    Serial.println(" us");

    static int currentStepCCW = 0;
    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++;
  }
  // --- Jika tidak ada tombol yang ditekan ---
  else {
    stopMotor(); // Panggil fungsi untuk menghentikan motor
    // Serial.println("Motor Stopped"); // Bisa diaktifkan untuk debugging
    delay(10); // Jeda singkat
  }
}

Penjelasan Perubahan:

  1. Fungsi stopMotor():

    • Saya menambahkan fungsi kecil void stopMotor(). Fungsi ini berisi kode untuk mengatur semua pin IN pada L298N ke LOW, yang secara efektif mematikan daya ke koil motor dan membuatnya berhenti. Ini membuat kode lebih rapi dan mudah dibaca.

  2. Prioritas Kondisi Keamanan:

    • Pada bagian awal loop(), saya menambahkan kondisi if (buttonCWState == HIGH && buttonCCWState == HIGH).

    • Kondisi ini adalah yang pertama kali diperiksa. Jika kedua tombol ditekan (HIGH), maka stopMotor() akan dipanggil, dan program akan langsung masuk ke else if atau else berikutnya (atau mengulang loop jika tidak ada perintah lain). Ini memastikan bahwa perintah berhenti memiliki prioritas tertinggi.

    • Dengan struktur if-else if-else ini, hanya satu blok kode yang akan dieksekusi per iterasi loop(), menjamin bahwa motor tidak akan mencoba bergerak ke dua arah sekaligus.

Cara Menggunakan:

  1. Pastikan Semua Pengkabelan Benar: Hubungkan semua komponen (motor, driver L298N, power supply, potensiometer, dan kedua tombol dengan resistor pull-down) seperti yang dijelaskan sebelumnya.

  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 berputar searah jarum jam.

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

    • Tekan dan tahan kedua tombol (CW dan CCW) secara bersamaan: motor akan segera berhenti.

    • Lepaskan kedua tombol: motor tetap berhenti.

Komentar