LA Percobaan 1

 

[KEMBALI KE MENU SEBELUMNYA]

1. Prosedur[Kembali]

  1. Untuk menjalankan dan memvalidasi simulasi rangkaian pada platform seperti Wokwi, prosedur berikut harus dilakukan secara berurutan:

    1. Persiapan Lingkungan Simulasi: Buka platform simulator sirkuit elektronik (misalnya Wokwi) dan buat proyek baru dengan memilih papan mikrokontroler STM32 (khususnya seri Nucleo C031C6 jika tersedia, atau seri STM32 yang kompatibel).

    2. Perakitan Perangkat Keras (Wiring): * Hubungkan komponen Push Button ke pin PA0 dan sumber tegangan/GND melalui resistor (konfigurasi pull-down eksternal atau sesuai gambar).

      • Hubungkan Slide Switch (sebagai simulator sensor IR) ke pin PA1.

      • Hubungkan anoda LED Hijau ke pin PB0 dan anoda LED Merah ke pin PB1 (keduanya dihubungkan ke GND melalui resistor pembatas arus).

      • Hubungkan terminal positif Buzzer ke pin PB2 dan terminal negatifnya ke GND.

    3. Kompilasi Kode Program: Salin seluruh kode C (berbasis STM32 HAL) yang telah disediakan ke dalam editor teks pada simulator.

    4. Eksekusi Simulasi: Tekan tombol "Play" atau "Start Simulation" untuk mengkompilasi kode dan menjalankan mikrokontroler secara virtual.

    5. Pengujian Interaktif: Aktifkan Push Button di pin PA0 untuk menyalakan sistem.

      • Ubah status Slide Switch di pin PA1 untuk menyimulasikan transisi antara kondisi "tidak mendeteksi objek" dan "mendeteksi objek", lalu amati respons keluaran pada LED dan Buzzer.

2. Hardware dan Diagram Blok[Kembali]

A. Hardware

Rangkaian ini terdiri dari beberapa komponen esensial yang saling terintegrasi:
  • Mikrokontroler STM32 Nucleo C031C6: Merupakan unit pemroses sentral (otak sistem) yang bertugas mengeksekusi instruksi program, membaca sinyal digital dari pin input, dan mengendalikan logika pada pin output berdasarkan algoritma yang ditanamkan.
  • Push Button (Saklar Utama): Komponen input elektromekanis yang berfungsi sebagai pengontrol daya sistem secara logis. Komponen ini memberikan sinyal pemicu (logika HIGH) ke mikrokontroler untuk mengizinkan sistem mulai membaca data sensor.
  • Slide Switch (Simulator Sensor Inframerah): Komponen input yang digunakan untuk menyimulasikan pembacaan sensor IR. Dalam realitasnya, sensor IR bertugas mendeteksi pantulan cahaya untuk mengetahui ada tidaknya objek, yang diterjemahkan menjadi sinyal digital (HIGH untuk tidak ada objek, LOW untuk ada objek).
  • LED (Light Emitting Diode) Merah dan Hijau: Aktuator visual yang merepresentasikan status operasional sistem. LED Hijau mengindikasikan bahwa jalur aman (tidak ada rintangan), sedangkan LED Merah mengindikasikan status peringatan (terdapat rintangan).
  • Buzzer Piezoelektrik: Aktuator audio yang berfungsi menghasilkan gelombang suara sebagai bentuk peringatan atau alarm kepada pengguna ketika sensor mendeteksi keberadaan suatu objek.
  • Resistor: Komponen pasif yang berfungsi membatasi arus listrik. Dalam rangkaian ini, resistor digunakan untuk melindungi LED dari kerusakan akibat arus berlebih dan menstabilkan sinyal input (konfigurasi pull-down/pull-up).

3. Rangkaian Simulasi [Kembali]



    Nilai ADC yang diperoleh kemudian dibandingkan dengan batas threshold yang telah ditentukan dalam program, yaitu BATAS_SEDANG (1500) dan BATAS_GELAP (2800). Jika nilai ADC lebih besar dari 2800, maka kondisi dianggap gelap dan servo akan bergerak ke posisi masuk (jemuran masuk ke dalam atap). Jika nilai ADC berada di antara 1500 hingga 2800, maka kondisi dianggap sedang dan servo berada pada posisi setengah terbuka. Sedangkan jika nilai ADC lebih kecil dari 1500, maka kondisi dianggap terang dan servo akan bergerak ke posisi keluar (jemuran berada di luar atap).
    Pergerakan servo dikendalikan menggunakan sinyal PWM dengan periode 20 ms (50 Hz). Lebar pulsa sebesar 1000 µs menghasilkan sudut 0° (posisi masuk), 1500 µs menghasilkan sudut 90° (posisi setengah terbuka), dan 2000 µs menghasilkan sudut 180° (posisi keluar). Dengan demikian, sistem dapat secara otomatis menyesuaikan posisi jemuran berdasarkan perubahan intensitas cahaya lingkungan.

4. Flowchart dan Listing Program[Kembali]

  • Flowchart


    Listing Program :

    #include "main.h"
    
    /* Private variables ---------------------------------------------------------*/
    ADC_HandleTypeDef hadc1;
    TIM_HandleTypeDef htim3;
    
    /* USER CODE BEGIN PV */
    #define LDR_THRESHOLD 2000
    
    uint8_t manual_mode = 0;
    uint8_t posisi_servo = 0;
    /* USER CODE END PV */
    
    /* Private function prototypes -----------------------------------------------*/
    void SystemClock_Config(void);
    static void MX_GPIO_Init(void);
    static void MX_ADC1_Init(void);
    static void MX_TIM3_Init(void);
    
    /* USER CODE BEGIN 0 */
    
    // ================= SERVO =================
    void set_servo(uint8_t state)
    {
      if (state == 0)
        __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 1000);
      else
        __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 2000);
    }
    
    // ================= ADC =================
    uint16_t read_LDR(void)
    {
      HAL_ADC_Start(&hadc1);
      HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
      return HAL_ADC_GetValue(&hadc1);
    }
    
    /* USER CODE END 0 */
    
    int main(void)
    {
      HAL_Init();
      SystemClock_Config();
    
      MX_GPIO_Init();
      MX_ADC1_Init();
      MX_TIM3_Init();
    
      HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
    
      while (1)
      {
        /* MODE OTOMATIS */
        if (!manual_mode)
        {
          uint16_t ldr = read_LDR();
    
          if (ldr < LDR_THRESHOLD)
            posisi_servo = 0; // gelap ? masuk
          else
            posisi_servo = 1; // terang ? keluar
    
          set_servo(posisi_servo);
        }
    
        HAL_Delay(100);
      }
    }
    
    /* ================= CALLBACK INTERRUPT ================= */
    void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
    {
      if (GPIO_Pin == GPIO_PIN_1)
      {
        HAL_Delay(50); // debounce
    
        manual_mode = !manual_mode;
        posisi_servo = !posisi_servo;
    
        set_servo(posisi_servo);
      }
    }
    
    /* ================= CLOCK ================= */
    void SystemClock_Config(void)
    {
      RCC_OscInitTypeDef RCC_OscInitStruct = {0};
      RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
    
      HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1_BOOST);
    
      RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
      RCC_OscInitStruct.HSIState = RCC_HSI_ON;
      RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
      RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
      RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
      RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV4;
      RCC_OscInitStruct.PLL.PLLN = 85;
      RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
      RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
      RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
    
      HAL_RCC_OscConfig(&RCC_OscInitStruct);
    
      RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK
                                  | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
      RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
      RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
      RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
      RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
    
      HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4);
    }
    
    /* ================= ADC ================= */
    static void MX_ADC1_Init(void)
    {
      ADC_ChannelConfTypeDef sConfig = {0};
    
      hadc1.Instance = ADC1;
      hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV4;
      hadc1.Init.Resolution = ADC_RESOLUTION_12B;
      hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
      hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
      hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
      hadc1.Init.ContinuousConvMode = DISABLE;
    
      HAL_ADC_Init(&hadc1);
    
      sConfig.Channel = ADC_CHANNEL_1;
      sConfig.Rank = ADC_REGULAR_RANK_1;
      sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5;
    
      HAL_ADC_ConfigChannel(&hadc1, &sConfig);
    }
    
    /* ================= PWM ================= */
    static void MX_TIM3_Init(void)
    {
      TIM_OC_InitTypeDef sConfigOC = {0};
    
      htim3.Instance = TIM3;
      htim3.Init.Prescaler = 169;
      htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
      htim3.Init.Period = 19999;
    
      HAL_TIM_PWM_Init(&htim3);
    
      sConfigOC.OCMode = TIM_OCMODE_PWM1;
      sConfigOC.Pulse = 1500;
      sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
    
      HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1);
    
      HAL_TIM_MspPostInit(&htim3);
    }
    
    /* ================= GPIO ================= */
    static void MX_GPIO_Init(void)
    {
      GPIO_InitTypeDef GPIO_InitStruct = {0};
    
      __HAL_RCC_GPIOA_CLK_ENABLE();
    
      GPIO_InitStruct.Pin = GPIO_PIN_1;
      GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
      GPIO_InitStruct.Pull = GPIO_PULLUP;
      HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    
      HAL_NVIC_SetPriority(EXTI1_IRQn, 0, 0);
      HAL_NVIC_EnableIRQ(EXTI1_IRQn);
    }
    
    /* ================= ERROR ================= */
    void Error_Handler(void)
    {
      __disable_irq();
      while (1) {}
    }

5. Soal Analisa[Kembali]

1. Analisa bagaimana perbedaan implementasi PWM antara STM32 serta dampaknya terhadap kontrol motor dan LED.

2. Analisa bagaimana cara pembacaan nilai sensor analog menggunakan ADC pada STM32 

3. Analisa bagaimana penggunaan interrupt eksternal dalam mendeteksi input dari sensor atau tombol pada STM32

4. Analisa bagaimana cara kerja fungsi HAL_GetTick() pada STM32

5. Analisa bagaimana perbedaan konfigurasi dan kontrol pin PWM serta pemanfaatan timer internal pada STM32 dalam menghasilkan sinyal PWM

6. Bagaimana mengatur pergerakan motor servo pada stm 32?.




6. Video Simulasi[Kembali]



7. Download File[Kembali]

Video Simulasi [Download] 

Komentar

Postingan populer dari blog ini

Laporan Akhir Dioda Zener

Laporan Akhir Reverse Bias Dioda

Laporan Akhir Forward Bias Dioda