Program Arduino untuk Stepper Motor dengan LCD 16x2 I2C

 Menambahkan LCD 16x2 dengan antarmuka I2C akan membuat sistem kontrol stepper motor Anda jauh lebih informatif. Kita bisa menampilkan kecepatan motor dan arah putarannya langsung di LCD.


Program Arduino untuk Stepper Motor dengan LCD 16x2 I2C

Program ini akan menampilkan status motor (berhenti, CW, CCW) dan kecepatan (nilai delay) di LCD, selain kontrol via potensiometer dan tombol.

Komponen Tambahan yang Dibutuhkan:

  • LCD 16x2 dengan Modul I2C

  • Library LiquidCrystal_I2C (Anda perlu menginstalnya di Arduino IDE)

Skema Pengkabelan Tambahan:

  • LCD 16x2 I2C ke Arduino:

    • SDA LCD ke pin A4 Arduino

    • SCL LCD ke pin A5 Arduino

    • VCC LCD ke 5V Arduino

    • GND LCD ke GND Arduino

Pastikan semua pengkabelan untuk L298N, stepper motor, potensiometer, dan tombol tetap sama seperti sebelumnya.


Arduino
// --- Library yang Dibutuhkan ---
#include <Wire.h> // Diperlukan untuk komunikasi I2C
#include <LiquidCrystal_I2C.h> // Library untuk LCD I2C

// --- Konfigurasi Pin ---
const int IN1 = 8;
const int IN2 = 9;
const int IN3 = 10;
const int IN4 = 11;

const int potPin = A0; // Pin analog untuk membaca potensiometer
const int buttonCWPin = 5;  // Tombol untuk putar searah jarum jam
const int buttonCCWPin = 6; // Tombol untuk putar berlawanan arah jarum jam

// --- Konfigurasi Motor Stepper ---
const int stepsPerRevolution = 200; // Langkah per putaran NEMA 17

// Urutan langkah untuk stepper motor bipolar (Full Step Drive)
int stepSequence[4][4] = {
  {1, 0, 1, 0},
  {0, 1, 1, 0},
  {0, 1, 0, 1},
  {1, 0, 0, 1}
};

// --- Konfigurasi LCD ---
// Inisialisasi objek LCD dengan alamat I2C, jumlah kolom, dan jumlah baris
// Alamat I2C umum: 0x27 atau 0x3F. Jika tidak yakin, gunakan I2C Scanner.
LiquidCrystal_I2C lcd(0x27, 16, 2);

// --- Variabel Global untuk Tampilan ---
String motorStatus = "Stopped";
int lastStepDelay = 0; // Untuk memantau perubahan kecepatan

// --- Fungsi Pengendalian Motor ---

// Fungsi untuk menghentikan motor (mematikan semua koil)
void stopMotor() {
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, LOW);
  if (motorStatus != "Stopped") { // Hanya update LCD jika status berubah
    motorStatus = "Stopped";
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Motor: Stopped");
  }
}

// Fungsi untuk melakukan satu langkah motor CW
void stepCW(int delayUs) {
  static int currentStep = 0;
  int sequenceIndex = currentStep % 4;
  digitalWrite(IN1, stepSequence[sequenceIndex][0]);
  digitalWrite(IN2, stepSequence[sequenceIndex][1]);
  digitalWrite(IN3, stepSequence[sequenceIndex][2]);
  digitalWrite(IN4, stepSequence[sequenceIndex][3]);
  delayMicroseconds(delayUs);
  currentStep++;
  if (motorStatus != "CW") { // Hanya update LCD jika status berubah
    motorStatus = "CW";
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Motor: CW");
  }
}

// Fungsi untuk melakukan satu langkah motor CCW
void stepCCW(int delayUs) {
  static int currentStep = 0;
  int sequenceIndex = (4 - 1 - (currentStep % 4)) % 4;
  digitalWrite(IN1, stepSequence[sequenceIndex][0]);
  digitalWrite(IN2, stepSequence[sequenceIndex][1]);
  digitalWrite(IN3, stepSequence[sequenceIndex][2]);
  digitalWrite(IN4, stepSequence[sequenceIndex][3]);
  delayMicroseconds(delayUs);
  currentStep++;
  if (motorStatus != "CCW") { // Hanya update LCD jika status berubah
    motorStatus = "CCW";
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Motor: CCW");
  }
}

void setup() {
  // --- Inisialisasi Pin ---
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);
  pinMode(buttonCWPin, INPUT);
  pinMode(buttonCCWPin, INPUT);

  // --- Inisialisasi Serial (Debugging) ---
  Serial.begin(9600);
  Serial.println("Stepper Motor Control with LCD (L298N) Started");

  // --- Inisialisasi LCD ---
  lcd.init();      // Inisialisasi LCD
  lcd.backlight(); // Hidupkan backlight LCD
  lcd.setCursor(0, 0);
  lcd.print("Motor: Stopped");
  lcd.setCursor(0, 1);
  lcd.print("Speed: ");
}

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

  // Mengubah nilai potensiometer menjadi rentang delay (100 us - 5000 us)
  int currentStepDelay = map(potValue, 0, 1023, 5000, 100);

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

  // --- Logika Kontrol Motor ---
  if (buttonCWState == HIGH && buttonCCWState == HIGH) {
    stopMotor(); // Prioritas keamanan: kedua tombol ditekan
  } else if (buttonCWState == HIGH) {
    stepCW(currentStepDelay); // Putar CW
  } else if (buttonCCWState == HIGH) {
    stepCCW(currentStepDelay); // Putar CCW
  } else {
    stopMotor(); // Tidak ada tombol ditekan
  }

  // --- Pembaruan Tampilan LCD ---
  // Hanya perbarui LCD baris kedua jika kecepatan berubah
  if (currentStepDelay != lastStepDelay) {
    lcd.setCursor(7, 1); // Posisi kursor di baris 2, kolom 8 ("Speed: XXXX us")
    lcd.print("        "); // Hapus nilai sebelumnya
    lcd.setCursor(7, 1);
    lcd.print(currentStepDelay);
    lcd.print(" us");
    lastStepDelay = currentStepDelay; // Simpan nilai delay terakhir
  }
}

Penjelasan Perubahan dan Fitur Baru:

  1. Sertakan Library LCD:

    • #include <Wire.h>: Library standar Arduino untuk komunikasi I2C.

    • #include <LiquidCrystal_I2C.h>: Library spesifik untuk LCD I2C. Anda harus menginstalnya dari Arduino IDE melalui Sketch > Include Library > Manage Libraries... dan cari "LiquidCrystal I2C" (biasanya oleh Frank de Brabander atau serupa).

  2. Inisialisasi LCD:

    • LiquidCrystal_I2C lcd(0x27, 16, 2);: Baris ini membuat objek LCD.

      • 0x27: Ini adalah alamat I2C modul LCD Anda. Alamat umum lainnya adalah 0x3F. Jika LCD Anda tidak berfungsi, Anda mungkin perlu menjalankan program "I2C Scanner" (banyak contoh tersedia online) untuk menemukan alamat yang benar.

      • 16, 2: Menunjukkan bahwa ini adalah LCD 16 kolom dan 2 baris.

  3. Variabel Status:

    • String motorStatus = "Stopped";: Variabel ini akan menyimpan status motor saat ini ("Stopped", "CW", "CCW") untuk ditampilkan di LCD.

    • int lastStepDelay = 0;: Digunakan untuk menyimpan nilai stepDelay sebelumnya. Ini agar LCD hanya diperbarui ketika ada perubahan kecepatan, menghindari flicker yang tidak perlu.

  4. Inisialisasi LCD di setup():

    • lcd.init();: Menginisialisasi modul LCD.

    • lcd.backlight();: Menghidupkan backlight LCD.

    • lcd.setCursor(0, 0); lcd.print("Motor: Stopped");: Menampilkan status awal motor di baris pertama.

    • lcd.setCursor(0, 1); lcd.print("Speed: ");: Menampilkan label "Speed:" di baris kedua.

  5. Pembaruan Tampilan LCD di loop():

    • Status Motor: Di dalam fungsi stopMotor(), stepCW(), dan stepCCW(), saya menambahkan logika untuk memperbarui motorStatus dan menampilkan di baris pertama LCD hanya jika statusnya berubah. Ini mengurangi penulisan ke LCD yang tidak perlu.

    • Kecepatan Motor:

      • if (currentStepDelay != lastStepDelay): Kondisi ini memastikan bahwa nilai kecepatan di baris kedua LCD hanya diperbarui jika potensiometer diputar dan mengubah kecepatan.

      • lcd.print(" ");: Sebelum menulis nilai baru, kita mencetak spasi untuk menghapus angka sebelumnya (terutama jika angka baru lebih pendek dari yang lama).

      • lcd.print(currentStepDelay); lcd.print(" us");: Menampilkan nilai currentStepDelay dan unit "us".

Cara Menggunakan:

  1. Instal Library LiquidCrystal_I2C:

    • Buka Arduino IDE.

    • Pergi ke Sketch > Include Library > Manage Libraries...

    • Cari "LiquidCrystal I2C" (penulis biasanya Frank de Brabander).

    • Klik "Install".

  2. Periksa Alamat I2C LCD: Jika LCD tidak menyala atau tidak menampilkan teks, alamat I2C 0x27 mungkin salah. Anda dapat menemukan alamat yang benar dengan mengunggah sketsa I2CScanner (cari di internet atau di contoh library Wire) ke Arduino Anda dan melihat hasilnya di Serial Monitor. Kemudian, ubah 0x27 menjadi alamat yang ditemukan.

  3. Hubungkan Semua Komponen: Pastikan semua pengkabelan untuk motor, driver, potensiometer, tombol, dan LCD sudah benar.

  4. 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.

Setelah diunggah, LCD akan menampilkan "Motor: Stopped" dan "Speed: [nilai delay awal]". Ketika Anda menekan tombol, status motor akan berubah dan nilai kecepatan akan diperbarui secara dinamis saat Anda memutar potensiometer.

Komentar