Mengontrol Servo Menggunakan ESP32 dengan Metode Bluetooth Control Tutorial ESP32

Konten [Tampil]


    ESP-32 DEV MODULE + Servo 180 MG995R
    Motor servo merupakan komponen elektronik yang sering digunakan dalam berbagai aplikasi robotika dan mekanika, seperti dalam robot arm, kontrol posisi, dan banyak lagi. Dalam proyek ini, kita akan menggunakan modul ESP32 untuk mengontrol motor servo melalui koneksi Bluetooth, memanfaatkan library ESP32Servo. Dengan pendekatan ini, pengguna dapat mengatur nilai posisi dan kecepatan servo dari jarak jauh.

    Alat dan Bahan

    1. ESP32 Dev Module: Modul mikrokontroler yang mendukung koneksi Wi-Fi dan Bluetooth.
    2. Motor Servo: Servo standar (misalnya SG90 atau MG995R).
    3. Breadboard dan Jumper Wire: Untuk merangkai komponen.
    4. Power Supply: Untuk memberikan daya ke servo. ( jika di perlukan )
    5. Smartphone: Sebagai pengendali Bluetooth.

    Instalasi Library

    Sebelum memulai, pastikan Anda telah menginstal library ESP32Servo. Di Arduino IDE, Anda bisa menginstalnya seperti berikut:

    1. Buka Arduino IDE, kemudian pilih `Sketch` > `Include Library` > `Manage Libraries`.
    2. Ketikkan "ESP32Servo" pada kolom pencarian dan instal library tersebut.

    Rangkaian

    Rangkaian sederhana yang akan kita buat sebagai berikut:

    1. Sambungkan kabel kontrol dari servo pada ESP32 (GPIO 13).
    2. Sambungkan pin VCC servo ke sumber VIN dan GND ke ground dari ESP32.(untuk penggunaan yang lama atau permanen wajib memakai power supply eksternal)

    Kode Program

    Berikut adalah contoh kode untuk mengontrol motor servo menggunakan ESP32 dan ESP32Servo library melalui Bluetooth:

    #include <ESP32Servo.h>
    #include <BluetoothSerial.h>

    BluetoothSerial SerialBT;
    Servo myServo;

    // Pin untuk servo
    const int servoPin = 13; // Ganti dengan pin yang kamu gunakan untuk servo

    int targetPosition = 0;  // Posisi tujuan servo
    int currentPosition = 0; // Posisi saat ini servo
    int speedDelay = 15;     // Delay dalam ms untuk kecepatan servo (kecepatan gerakan)
    unsigned long previousMillis = 0; // Waktu terakhir servo diperbarui
    bool updateServo = false; // Untuk menandai update servo

    void setup() {
      Serial.begin(115200);
      SerialBT.begin("ESP32_Servo"); // Nama perangkat Bluetooth
      Serial.println("Bluetooth device is ready to pair.");

      // Inisialisasi servo
      myServo.attach(servoPin);
      myServo.write(0); // Posisi awal servo
      delay(1000);
    }

    void loop() {
      // Jika ada data yang dikirim melalui Bluetooth
      if (SerialBT.available()) {
        char command = SerialBT.read(); // Membaca perintah dari Bluetooth

        // Memeriksa apakah perintah untuk mengatur kecepatan
        if (command == 's') {
          // Mengatur kecepatan. Harus diikuti dengan angka dari 1-9
          if (SerialBT.available()) {
            char speedChar = SerialBT.read();
            if (speedChar >= '1' && speedChar <= '9') {
              speedDelay = map(speedChar, '1', '9', 10, 100); // Memetakan kecepatan dari 10ms ke 100ms
              Serial.print("Setting speed delay to: ");
              Serial.println(speedDelay);
            } else {
              Serial.println("Invalid speed value.");
            }
          }
        }

        // Memeriksa perintah untuk mengatur posisi
        else if (command >= '0' && command <= '9') {
          targetPosition = map(command, '0', '9', 0, 180);
          Serial.print("Setting target position to: ");
          Serial.println(targetPosition);
          updateServo = true; // Menandakan bahwa servo perlu diperbarui
        }
        
        else {
          Serial.println("Unknown command.");
        }
      }

      // Update servo position non-blocking
      if (updateServo) {
        unsigned long currentMillis = millis();
        if (currentMillis - previousMillis >= speedDelay) {
          // Update posisi servo sedikit demi sedikit
          if (currentPosition < targetPosition) {
            currentPosition++; // Arahkan ke posisi yang lebih tinggi
          }
          else if (currentPosition > targetPosition) {
            currentPosition--; // Arahkan ke posisi yang lebih rendah
          }
          
          myServo.write(currentPosition); // Menggerakkan servo ke posisi saat ini
          previousMillis = currentMillis; // Update waktu terakhir diperbarui

          // Jika kita sudah mencapai tujuan, hentikan update
          if (currentPosition == targetPosition) {
            updateServo = false; // Stop updating
          }
        }
      }
    }

    Berikut adalah penjelasan  dari kode yang terlihat rumit di atas, fungsi utamnya mengontrol motor servo menggunakan ESP32 melalui koneksi Bluetooth dan memungkinkan penyesuaian posisi dan kecepatan servo dengan cara yang sederhana dan efektif.

    Penjelasan Kode

    1. Library dan Variabel Global

    #include <ESP32Servo.h>
    #include <BluetoothSerial.h>

    BluetoothSerial SerialBT;
    Servo myServo;

    // Pin untuk servo
    const int servoPin = 13; // Ganti dengan pin yang kamu gunakan untuk servo

    int targetPosition = 0;  // Posisi tujuan servo
    int currentPosition = 0; // Posisi saat ini servo
    int speedDelay = 15;     // Delay dalam ms untuk kecepatan servo (kecepatan gerakan)
    unsigned long previousMillis = 0; // Waktu terakhir servo diperbarui
    bool updateServo = false; // Untuk menandai update servo

    - ESP32Servo: Library ini digunakan untuk mengontrol motor servo dengan ESP32.
    - BluetoothSerial: Memungkinkan ESP32 untuk berkomunikasi menggunakan Bluetooth.
    - Variabel global: Digunakan untuk menyimpan status servo, posisi saat ini, dan pengaturan kecepatan.

     2. Setup

      void setup() {
      Serial.begin(115200);
      SerialBT.begin("ESP32_Servo"); // Nama perangkat Bluetooth
      Serial.println("Bluetooth device is ready to pair.");

      // Inisialisasi servo
      myServo.attach(servoPin);
      myServo.write(0); // Posisi awal servo
      delay(1000);
    }


    - Dalam fungsi `setup()`, kita mulai komunikasi serial untuk monitor dan Bluetooth. Nama perangkat Bluetooth ditetapkan menjadi "ESP32_Servo" untuk ditemukan oleh perangkat lain.
    - Servo diinisialisasi pada pin yang ditentukan dan langsung di-set ke posisi awal 0 derajat.

     3. Loop Utama

    void loop() {
      // Jika ada data yang dikirim melalui Bluetooth
      if (SerialBT.available()) {
        char command = SerialBT.read(); // Membaca perintah dari Bluetooth

        // Memeriksa apakah perintah untuk mengatur kecepatan
        if (command == 's') {
          // Mengatur kecepatan. Harus diikuti dengan angka dari 1-9
          if (SerialBT.available()) {
            char speedChar = SerialBT.read();
            if (speedChar >= '1' && speedChar <= '9') {
              speedDelay = map(speedChar, '1', '9', 10, 100); // Memetakan kecepatan dari 10ms ke 100ms
              Serial.print("Setting speed delay to: ");
              Serial.println(speedDelay);
            } else {
              Serial.println("Invalid speed value.");
            }
          }
        }


        // Memeriksa perintah untuk mengatur posisi
        else if (command >= '0' && command <= '9') {
          targetPosition = map(command, '0', '9', 0, 180);
          Serial.print("Setting target position to: ");
          Serial.println(targetPosition);
          updateServo = true; // Menandakan bahwa servo perlu diperbarui
        }
        
        else {
          Serial.println("Unknown command.");
        }
      }


    - Di dalam `loop()`, program memeriksa apakah ada data yang tersedia dari koneksi Bluetooth.
    - Jika perintah yang diterima adalah `'s'`, ini menunjukkan bahwa pengguna ingin mengatur kecepatan. Kecepatan diset dari `'1'` sampai `'9'`, yang kemudian dipetakan menjadi delay dari 10 ms sampai 100 ms.
    - Jika perintah berbentuk angka dari `'0'` hingga `'9'`, ini menunjukkan posisi yang diinginkan untuk servo. Posisi ini dipetakan antara 0 (0 derajat) hingga 180 (180 derajat).
    - Semua perintah dicetak ke serial monitor untuk pemantauan.

     4. Pembaruan Posisi Servo

      // Update servo position non-blocking
      if (updateServo) {
        unsigned long currentMillis = millis();
        if (currentMillis - previousMillis >= speedDelay) {
          // Update posisi servo sedikit demi sedikit
          if (currentPosition < targetPosition) {
            currentPosition++; // Arahkan ke posisi yang lebih tinggi
          }
          else if (currentPosition > targetPosition) {
            currentPosition--; // Arahkan ke posisi yang lebih rendah
          }
          
          myServo.write(currentPosition); // Menggerakkan servo ke posisi saat ini
          previousMillis = currentMillis; // Update waktu terakhir diperbarui

          // Jika kita sudah mencapai tujuan, hentikan update
          if (currentPosition == targetPosition) {
            updateServo = false; // Stop updating
          }
        }
      }
    }


    - Bagian ini melakukan pembaruan posisi servo secara non-blokir. Ini menggunakan fungsi `millis()` untuk menentukan waktu sejak program mulai berjalan dan membantu dalam mengatur kecepatan servo tanpa menghentikan eksekusi program.
    - Servo akan bergerak secara bertahap sesuai dengan kecepatan yang telah diatur hingga mencapai posisi target. Setelah mencapai posisi target, flag `updateServo` diatur menjadi `false`, yang menghentikan pembaruan. 

    Penggunaan

    Anda dapat mengontrol servo dengan menghubungkan smartphone ke perangkat Bluetooth dan menggunakan aplikasi terminal Bluetooth untuk mengirim perintah:

    Tampilan Terminal dari Android

    Tampilan Serial Monitor Ketika Menerima Perintah

    - Mengatur posisi: Kirim angka dari `0` hingga `9` untuk mengatur posisi servo dalam rentang 0° hingga 180°.
    - Mengatur kecepatan: Kirim huruf `s`, diikuti dengan angka dari `1` hingga `9` untuk mengatur kecepatan gerak servo. contoh s1 atau s9 (tanpa spasi) kemudian kirim angka 1-9 untuk menggerakkan servo

    Kode ini memberikan solusi efektif untuk mengontrol motor servo menggunakan ESP32 melalui koneksi Bluetooth. Dengan kemampuan untuk menyesuaikan posisi dan kecepatan servo secara real-time, Anda dapat mengembangkan proyek dengan fungsionalitas yang lebih kompleks, seperti mengontrol beberapa servo sekaligus atau menggunakan sensor untuk umpan balik kontrol. Anda bisa mengeksplorasi lebih lanjut dengan menambahkan fitur tambahan sesuai kebutuhan aplikasi Anda.

    Umbrella Electronica


     

     

     

     

    Next Post Previous Post
    2 Comments
    • rehandi
      rehandi 13 Oktober 2024 pukul 18.06

      tutorialnya berhasil tq boss

    • rienda
      rienda 26 Oktober 2024 pukul 12.06

      izin coba master

    Add Comment
    comment url