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.
// 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:
Fungsi
stopMotor()
:Saya menambahkan fungsi kecil
void stopMotor()
. Fungsi ini berisi kode untuk mengatur semua pinIN
pada L298N keLOW
, yang secara efektif mematikan daya ke koil motor dan membuatnya berhenti. Ini membuat kode lebih rapi dan mudah dibaca.
Prioritas Kondisi Keamanan:
Pada bagian awal
loop()
, saya menambahkan kondisiif (buttonCWState == HIGH && buttonCCWState == HIGH)
.Kondisi ini adalah yang pertama kali diperiksa. Jika kedua tombol ditekan (
HIGH
), makastopMotor()
akan dipanggil, dan program akan langsung masuk keelse if
atauelse
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 iterasiloop()
, menjamin bahwa motor tidak akan mencoba bergerak ke dua arah sekaligus.
Cara Menggunakan:
Pastikan Semua Pengkabelan Benar: Hubungkan semua komponen (motor, driver L298N, power supply, potensiometer, dan kedua tombol dengan resistor pull-down) seperti yang dijelaskan sebelumnya.
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.
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
Posting Komentar