1. Prosedur [Kembali]

  • Pahami terlebih dahulu kondisi yang akan digunakan
  • Buka Wokwi
  • Persiapkan alat dan bahan
  • Buat rangkaian sesuai dengan kondisi dan modul 
  • Sesuaikan konfigurasi pin
  • Buat kode program untuk mengoperasikan rangkaian tersebut sesuai dengan kondisi 
  • Jalankan simulasi rangkaian.  
  • Proses selesai

2. Hardware dan Diagram Blok[Kembali]

a. Hardware
1. STM32 NUCLEO-G474RE
STM32 NUCLEO-G474RE adalah development board (papan pengembangan) terjangkau dan fleksibel dari STMicroelectronics, yang didasarkan pada mikrokontroler STM32G474RE (Arm® Cortex®-M4 @170MHz, 512KB Flash). Papan ini mendukung konektivitas Arduino Uno V3 dan ST Morpho, serta dilengkapi debugger ST-LINK terintegrasi, menjadikannya ideal untuk pembuatan prototipe cepat.

2. Motor Servo

Motor servo adalah perangkat aktuator putar atau linier yang dirancang untuk kontrol posisi, kecepatan, dan percepatan yang presisi menggunakan sistem feedback loop tertutup.

3. Pushbutton
Pushbutton adalah komponen sakelar mekanis sederhana yang dioperasikan dengan cara ditekan untuk menghubungkan (on) atau memutuskan (off) aliran arus listrik dalam suatu rangkaian..


4. Buzzer
Buzzer adalah suatu komponen elektronika yang berfungsi untuk mengubah energi listrik menjadi energi suara (bunyi) melalui mekanisme getaran. Komponen ini termasuk dalam kategori output device karena digunakan untuk memberikan respon berupa suara terhadap suatu kondisi atau perintah dalam rangkaian elektronik.

5. Resistor 

Resistor adalah komponen elektronik pasif yang berfungsi untuk membatasi arus listrik dalam suatu rangkaian. Resistor bekerja berdasarkan hukum Ohm, yang menyatakan bahwa tegangan (V) = arus (I) × resistansi (R). Resistor memiliki satuan Ohm (Ω) dan digunakan dalam berbagai aplikasi seperti pembagian tegangan, kontrol arus, dan proteksi rangkaian elektronik.

b. Diagram Blok



3. Rangkaian Simulasi dan Prinsip Kerja[Kembali]


Prinsip Kerja :

Prinsip kerja rangkaian ini dimulai saat sistem dinyalakan (mulai), kemudian mikrokontroler melakukan inisialisasi semua komponen, yaitu sensor LDR, push button (interrupt), dan motor servo. Setelah itu, sistem masuk ke proses pembacaan sensor LDR untuk mendeteksi intensitas cahaya di lingkungan.

Jika LDR mendeteksi kondisi gelap, maka mikrokontroler akan memberikan sinyal ke motor servo untuk bergerak ke posisi masuk (misalnya menutup pintu/penutup). Sebaliknya, jika LDR mendeteksi kondisi terang, maka servo akan bergerak ke posisi keluar (misalnya membuka pintu/penutup).

Selain itu, terdapat push button sebagai interrupt yang dapat mengubah kondisi servo kapan saja tanpa menunggu pembacaan LDR. Artinya, ketika tombol ditekan, sistem langsung merespons dengan menggerakkan servo (baik ke posisi masuk atau keluar sesuai logika yang diprogram), sehingga berfungsi sebagai kontrol manual.

Proses ini berlangsung terus-menerus selama sistem aktif, dengan mikrokontroler selalu membaca kondisi LDR dan memantau interrupt dari push button, hingga sistem dihentikan (selesai).


4. Flowchart dan Listing Program[Kembali]

A. Flowchart


B. Listring Program

#include "main.h"

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

// ================= VARIABLE =================
uint8_t manual_mode = 0;
uint8_t posisi_servo = 0;
uint8_t last_button = 1;

// ================= THRESHOLD =================
#define LDR_THRESHOLD 2000

// ================= 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 - active low)
    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;
    htim3.Init.Prescaler = 48 - 1;     // 1 us tick (48 MHz)
    htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
    htim3.Init.Period = 20000 - 1;     // 20 ms (50 Hz)
    HAL_TIM_PWM_Init(&htim3);

    TIM_OC_InitTypeDef sConfigOC = {0};
    sConfigOC.OCMode = TIM_OCMODE_PWM1;
    sConfigOC.Pulse = 1500; // posisi tengah
    sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;

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

// ================= SERVO CONTROL =================
void set_servo(uint8_t state)
{
    if (state == 0)
    {
        // Masuk (gelap)
        __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 1000);
    }
    else
    {
        // Keluar (terang)
        __HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 2000);
    }
}

// ================= READ LDR =================
uint16_t read_LDR(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);
}

// ================= 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);

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

        if (last_button == 1 && button == 0)
        {
            manual_mode = !manual_mode;

            // Saat masuk manual, langsung toggle posisi
            if (manual_mode)
            {
                posisi_servo = !posisi_servo;
                set_servo(posisi_servo);
            }

            HAL_Delay(200);
        }

        last_button = button;

        // ===== MODE OTOMATIS =====
        if (!manual_mode)
        {
            uint16_t ldr = read_LDR();

            if (ldr > LDR_THRESHOLD)
            {
                // Cahaya tinggi → keluar
                posisi_servo = 1;
            }
            else
            {
                // Cahaya rendah → masuk
                posisi_servo = 0;
            }

            set_servo(posisi_servo);
        }

        HAL_Delay(100);
    }
}


5. Video Demo[Kembali]


6. Analisa[Kembali]



7Download File[Kembali]

Download Rangkaian Simulasi [Klik Disini]
Download Video Simulasi [Klik Disini]
Download Analisa [Klik Disini]

No comments:

Post a Comment

  BAHAN PRESENTASI UNTUK MATA KULIAH  ELEKTRONIKA 2024 Nama : Muhammad Fadhlurrahman Yuzary NIM : 2310952015 Elektronika A Dosen Pengampu ; ...