Tugas Pendahuluan 2


1. Prosedur [Kembali]

  • Siapkan perangkat komputer atau laptop yang terhubung ke internet, kemudian buka browser dan masuk ke website Wokwi.
  • Login ke akun Wokwi jika diperlukan, lalu pilih menu New Project untuk membuat proyek simulasi baru.
  • Pilih board STM32 Nucleo C031C6 sebagai mikrokontroler utama yang akan digunakan pada simulasi.
  • Setelah workspace terbuka, tambahkan komponen yang diperlukan dengan memilih menu Add Part. Komponen yang digunakan yaitu LDR sensor module, push button, dan servo motor.
  • Letakkan komponen pada area kerja Wokwi agar susunan rangkaian rapi dan mudah dibaca.
  • Hubungkan pin VCC pada sensor LDR ke pin 5V atau 3.3V pada board STM32 sesuai kebutuhan sensor.
  • Hubungkan pin GND sensor LDR ke pin GND pada board STM32.
  • Hubungkan pin output sensor LDR (AO/DO) ke salah satu pin input mikrokontroler, misalnya PA0 jika menggunakan pembacaan analog.
  • Pasang push button pada area kerja, kemudian hubungkan salah satu kaki tombol ke pin input digital STM32, misalnya PA1.
  • Hubungkan kaki tombol lainnya ke GND, lalu pada program aktifkan internal pull-up agar tombol dapat terbaca dengan baik saat ditekan.
  • Tambahkan servo motor ke area kerja. Hubungkan kabel VCC servo ke pin 5V, kabel GND servo ke ground, dan kabel signal servo ke pin PWM STM32, misalnya PA8 atau pin timer lainnya.
  • Setelah semua sambungan selesai, buka file program main.c pada editor Wokwi.
  • Tulis program menggunakan bahasa C. Program harus berisi pembacaan sensor LDR, pembacaan tombol, serta pengaturan sudut servo menggunakan sinyal PWM.
  • Buat logika program:
    • Jika cahaya terang, servo bergerak ke sudut 0°.
    • Jika cahaya gelap, servo bergerak ke sudut 90° atau 180°.
    • Jika tombol ditekan, servo berpindah posisi secara manual.
  • Simpan program setelah selesai ditulis.
  • Klik tombol Start Simulation atau ikon Run pada Wokwi untuk menjalankan simulasi rangkaian.
  • Ubah nilai cahaya pada sensor LDR dengan menggeser slider intensitas cahaya yang tersedia pada komponen sensor.
  • Amati pergerakan servo ketika kondisi cahaya berubah. Servo akan bergerak sesuai logika program yang dibuat.
  • Tekan push button pada simulasi untuk menguji kontrol manual servo. Jika program benar, servo akan berubah posisi saat tombol ditekan.
  • 2. Hardware dan Diagram Blok[Kembali]

    Instrumentasi / Alat

      1. Breadboard— Papan prototyping untuk merangkai komponen tanpa solder.
    1. Adaptor — Sumber daya eksternal untuk rangkaian.

    Komponen / Bahan

    1. STM32 NUCLEO-G474RE — Development board berbasis ARM Cortex-M4F dengan 51 GPIO pin dan clock speed hingga 170 MHz, dilengkapi ST-LINK onboard.

      Spesifikasi:

      • Microcontroller : STM32G474RE (ARM Cortex-M4F)
      • Operating Voltage : 3.3V
      • Input Voltage (recommended) : 5V via USB atau 7–12V via VIN
      • Input Voltage (limit) : 4.5V – 15V
      • Digital I/O Pins : ±51 GPIO
      • PWM Digital I/O Pins : Hingga 24 channel (termasuk HRTIM)
      • Analog Input Pins : Hingga 24 channel ADC (12-bit / 16-bit dengan oversampling)
      • DC Current per I/O Pin : Maks. 20 mA (disarankan ≤ 8 mA)
      • DC Current for 3.3V Pin : Hingga ±500 mA
      • Flash Memory : 512 KB
      • SRAM : 128 KB (termasuk CCM RAM)
      • Clock Speed : Hingga 170 MHz
      • Onboard Debugger : ST-LINK V3
      • Komunikasi : USART, SPI, I²C, USB, CAN FD
    2. Sensor LDR



      Spesifikasi Sensor Cahaya LDR

       

      1. Supply : 3.3 V – 5 V (arduino available)

      2. Output Type: Digital Output (0 and 1) 

      3. Inverse output

      4. Include IC LM393 voltage comparator

      5. Sensitivitasnya dapat diatur 

      6. Dimensi PCB size: 3.2 cm x 1.4 cm

    3. Motor Servo



    4. Push Button


      Spesifikasi Teknis Push Button Switch

      Karakteristik Listrik

      • Rating Tegangan (Voltage): Menunjukkan batas maksimum tegangan yang bisa ditangani, misalnya 12V DC atau 250V AC.

      • Rating Arus (Current): Menunjukkan seberapa besar arus yang bisa dialirkan tanpa merusak kontak, biasanya berkisar antara 1A hingga 5A.

      • Tipe Kontak: Bisa NO (Normally Open), NC (Normally Closed), atau kombinasi keduanya (SPDT / Single Pole Double Throw).


    Diagram Blok


    3. Rangkaian Simulasi dan Prinsip Kerja[Kembali]



    Prinsip kerja:

    Prinsip kerja rangkaian pada gambar tersebut adalah sistem kendali servo berbasis mikrokontroler STM32 Nucleo C031C6 yang menggunakan sensor cahaya (LDR module) dan push button sebagai input. Mikrokontroler berfungsi sebagai pusat pengolah data yang membaca kondisi sensor dan tombol, kemudian mengatur posisi motor servo sesuai program.

    Saat rangkaian diberi catu daya VCC, board STM32 Nucleo akan aktif dan menyalurkan tegangan ke sensor LDR serta motor servo. Sensor LDR digunakan untuk mendeteksi intensitas cahaya di lingkungan sekitar. Nilai cahaya yang diterima sensor akan diubah menjadi sinyal analog/digital, lalu dikirim ke salah satu pin input STM32 untuk dibaca.

    Data dari sensor kemudian diproses oleh STM32. Jika cahaya berada di bawah batas tertentu (gelap), servo dapat diputar ke sudut tertentu, misalnya 0°. Jika cahaya terang, servo diputar ke sudut lain, misalnya 90° atau 180°, sesuai logika program yang dibuat. Dengan demikian servo bergerak otomatis berdasarkan kondisi cahaya.

    Selain sensor, terdapat push button yang berfungsi sebagai input manual. Saat tombol ditekan, STM32 mendeteksi perubahan logika pada pin input, kemudian menjalankan perintah tertentu, misalnya mengubah posisi servo secara manual, mengganti mode otomatis ke manual, atau memindahkan sudut servo ke posisi berikutnya.

    Motor servo dikendalikan melalui sinyal PWM (Pulse Width Modulation) dari salah satu pin output STM32. Lebar pulsa PWM menentukan sudut putar servo. Semakin besar duty cycle dalam rentang tertentu, maka sudut servo akan berubah sesuai karakteristik servo.

    4. Flowchart dan Listing Program[Kembali]


    Listing Program:
    #include "main.h"

    /* ================= HANDLE ================= */
    ADC_HandleTypeDef hadc1;
    TIM_HandleTypeDef htim3;

    /* ================= VARIABLE ================= */
    uint8_t posisi_servo = 0;     // 0 / 90 / 180
    uint8_t last_button = 1;

    /* ================= THRESHOLD LUX ================= */
    /*
    <1000   = 0 derajat
    1000-3000 = 90 derajat
    >3000   = 180 derajat
    */
    #define LUX_LOW   1000
    #define LUX_HIGH  3000

    /* ================= CLOCK ================= */
    void SystemClock_Config(void)
    {
      RCC_OscInitTypeDef RCC_OscInitStruct = {0};
      RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

      RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
      RCC_OscInitStruct.HSIState = RCC_HSI_ON;
      HAL_RCC_OscConfig(&RCC_OscInitStruct);

      RCC_ClkInitStruct.ClockType =
          RCC_CLOCKTYPE_HCLK |
          RCC_CLOCKTYPE_SYSCLK;

      RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
      RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;

      HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0);
    }

    /* ================= GPIO ================= */
    void MX_GPIO_Init(void)
    {
      __HAL_RCC_GPIOA_CLK_ENABLE();
      __HAL_RCC_GPIOB_CLK_ENABLE();

      GPIO_InitTypeDef GPIO_InitStruct = {0};

      /* LDR PA0 */
      GPIO_InitStruct.Pin = GPIO_PIN_0;
      GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
      HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

      /* BUTTON PB1 */
      GPIO_InitStruct.Pin = GPIO_PIN_1;
      GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
      GPIO_InitStruct.Pull = GPIO_PULLUP;
      HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

      /* SERVO PA6 TIM3_CH1 */
      GPIO_InitStruct.Pin = GPIO_PIN_6;
      GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
      GPIO_InitStruct.Pull = GPIO_NOPULL;
      GPIO_InitStruct.Alternate = GPIO_AF1_TIM3;
      HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    }

    /* ================= ADC ================= */
    void MX_ADC1_Init(void)
    {
      __HAL_RCC_ADC_CLK_ENABLE();

      hadc1.Instance = ADC1;
      hadc1.Init.Resolution = ADC_RESOLUTION_12B;
      hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
      hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;

      HAL_ADC_Init(&hadc1);
    }

    /* ================= PWM SERVO ================= */
    void MX_TIM3_Init(void)
    {
      __HAL_RCC_TIM3_CLK_ENABLE();

      htim3.Instance = TIM3;

      /* 1 us tick jika clock 48MHz */
      htim3.Init.Prescaler = 48 - 1;
      htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
      htim3.Init.Period = 20000 - 1;   // 20 ms

      HAL_TIM_PWM_Init(&htim3);

      TIM_OC_InitTypeDef sConfigOC = {0};

      sConfigOC.OCMode = TIM_OCMODE_PWM1;
      sConfigOC.Pulse = 1500;
      sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;

      HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1);
    }

    /* ================= SERVO CONTROL ================= */
    void set_servo(uint8_t angle)
    {
      if(angle == 0)
      {
        __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 500);
      }
      else if(angle == 90)
      {
        __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 1500);
      }
      else if(angle == 180)
      {
        __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 2500);
      }
    }

    /* ================= ADC READ ================= */
    uint16_t read_adc(void)
    {
      ADC_ChannelConfTypeDef sConfig = {0};

      sConfig.Channel = ADC_CHANNEL_0;
      sConfig.Rank = ADC_REGULAR_RANK_1;

      HAL_ADC_ConfigChannel(&hadc1, &sConfig);

      HAL_ADC_Start(&hadc1);
      HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);

      return HAL_ADC_GetValue(&hadc1);
    }

    /* ================= ADC TO LUX ================= */
    /* estimasi untuk Wokwi */
    uint16_t read_lux(void)
    {
      uint16_t adc = read_adc();
      return (adc * 10000) / 4095;
    }

    /* ================= MAIN ================= */
    int main(void)
    {
      HAL_Init();

      SystemClock_Config();
      MX_GPIO_Init();
      MX_ADC1_Init();
      MX_TIM3_Init();

      HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);

      set_servo(0);

      while (1)
      {
        /* ================= BUTTON ================= */
        uint8_t button = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1);

        if(last_button == 1 && button == 0)
        {
          /* tekan tombol = pindah sudut */
          if(posisi_servo == 0)
            posisi_servo = 90;
          else if(posisi_servo == 90)
            posisi_servo = 180;
          else
            posisi_servo = 0;

          set_servo(posisi_servo);

          HAL_Delay(250); // debounce
        }

        last_button = button;

        /* ================= AUTO BY LUX ================= */
        uint16_t lux = read_lux();

        if(lux < LUX_LOW)
        {
          posisi_servo = 0;
        }
        else if(lux <= LUX_HIGH)
        {
          posisi_servo = 90;
        }
        else
        {
          posisi_servo = 180;
        }

        set_servo(posisi_servo);

        HAL_Delay(100);
      }
    }

    5. Video Demo[Kembali]


    6. Kondisi[Kembali]

    Percobaan 2 Kondisi 8

    Buatlah rangkaian dengan kondisi ketika sensor cahaya (LDR) mendeteksi lingkungan terang, maka jemuran berada di luar atap. Jika cahaya sedang, jemuran berada pada posisi setengah terbuka, dan jika gelap, jemuran berada di dalam atap.

    7. Video Simulasi[Kembali]


    8. Download File[Kembali]

    Tidak ada komentar:

    Posting Komentar

        BAHAN PRESENTASI UNTUK MATAKULIAH ELEKTRONIKA 2024 Oleh : MUHAMMAD IKHSAN DEPUTRA NIM. 2310952003   Dosen Pengampu : Dr. Darwison, S. T....