LA 2 M2 UP UC



Percobaan 2

modul 2


1. Prosedur[Kembali]

  • Rangkai semua komponen dengan output buzzer dan LED RGB
  • Buatlah program dengan konfigurasi pin GP26 STM32 ,lalu upload program STM32

  • Jalankan program dan cobakan sesuai kondisi
  • amati perubahan yang terdeteksi saat tanah basah/kering

.

2. Hardware dan Diagram Blok[Kembali]



  • prinsip kerja

Rangkaian dan program ini dirancang untuk mengontrol pergerakan motor stepper secara otomatis berdasarkan tingkat kelembapan tanah dengan memanfaatkan mikrokontroler STM32 sebagai unit pengendali utama. Sensor soil moisture berfungsi sebagai pendeteksi kelembapan, di mana data analognya dikirimkan ke pin ADC1 STM32 untuk diubah menjadi nilai digital. Nilai digital inilah yang kemudian digunakan sebagai acuan dalam menentukan mode pergerakan motor stepper, yang terdiri dari tiga kondisi: berputar searah jarum jam (Clockwise/CW), berputar berlawanan arah jarum jam (Counter-Clockwise/CCW), atau bergerak bolak-balik (oscillate) sesuai kondisi tanah yang terdeteksi.

Pada kondisi pertama ketika nilai ADC berada di bawah 1365, motor akan bergerak secara searah jarum jam (CW) sebagai indikasi kelembapan rendah, ditandai dengan menyala-nya LED merah. Kondisi kedua terjadi pada rentang nilai ADC antara 1365 hingga 2730, di mana motor akan berputar berlawanan arah jarum jam (CCW) dan LED hijau akan menyala sebagai indikator kelembapan sedang. Sementara itu, apabila nilai ADC melebihi 2730, sistem akan mengaktifkan mode bolak-balik (oscillate) untuk motor, serta menyalakan LED biru sebagai tanda bahwa kelembapan tanah berada pada tingkat tinggi.

Pergerakan motor stepper dikendalikan melalui empat pin GPIOB (IN1–IN4) dengan penerapan urutan bit yang diambil dari array STEP_SEQ_CW untuk putaran searah jarum jam dan STEP_SEQ_CCW untuk putaran berlawanan arah jarum jam. Fungsi RunStepper berperan dalam mengatur langkah pergerakan motor dengan memberikan jeda (delay) tertentu guna menyesuaikan kecepatan putaran sesuai kebutuhan. Seluruh proses ini berlangsung secara otomatis dan kontinu, sehingga sistem mampu merespons perubahan kelembapan tanah secara real-time tanpa memerlukan intervensi manual pengguna.

Dengan demikian, sistem ini tidak hanya menawarkan kontrol motor yang adaptif terhadap kondisi lingkungan, tetapi juga mendemonstrasikan penerapan konversi sinyal analog ke digital untuk mengatur perangkat aktuator dalam aplikasi otomasi berbasis mikrokontroler 

 

 


4. Flowchart dan Listing Program[Kembali]

    • Flowchart





    • Listing Program

    Listing Program :

    #include "stm32f1xx_hal.h"

    // === Konfigurasi Pin ===

    #define STEPPER_PORT GPIOB

    #define IN1_PIN GPIO_PIN_8

    #define IN2_PIN GPIO_PIN_9

    #define IN3_PIN GPIO_PIN_10

    #define IN4_PIN GPIO_PIN_11

    #define LED_PORT GPIOB

    #define LED_RED_PIN GPIO_PIN_12

    #define LED_GREEN_PIN GPIO_PIN_13

    #define LED_BLUE_PIN GPIO_PIN_14

    // === Urutan Langkah Stepper ===

    const uint16_t STEP_SEQ_CW[4] = {0x0100, 0x0200, 0x0400, 0x0800}; // Clockwise

    const uint16_t STEP_SEQ_CCW[4] = {0x0800, 0x0400, 0x0200, 0x0100}; // Counter-clockwise

    // === Global Variabel ===

    ADC_HandleTypeDef hadc1;

    uint8_t current_mode = 0; // 0=CW, 1=CCW, 2=Oscillate

    uint8_t direction = 0; // Untuk mode oscillate

    // === Fungsi Prototipe ===

    void SystemClock_Config(void);

    void MX_GPIO_Init(void);

    void MX_ADC1_Init(void);

    void RunStepper(const uint16_t *sequence, uint8_t speed);

    void Error_Handler(void);

    int main(void) {

    HAL_Init();

    SystemClock_Config();

    MX_GPIO_Init();

    MX_ADC1_Init();

    while (1) {

    // Baca sensor kelembaban

    HAL_ADC_Start(&hadc1);

    if (HAL_ADC_PollForConversion(&hadc1, 10) == HAL_OK) {

    uint16_t adc_val = HAL_ADC_GetValue(&hadc1);

    // Tentukan mode berdasarkan nilai ADC

    if (adc_val < 1365) { // CW

    current_mode = 0;

    HAL_GPIO_WritePin(LED_PORT, LED_RED_PIN, GPIO_PIN_SET);

    HAL_GPIO_WritePin(LED_PORT, LED_GREEN_PIN | LED_BLUE_PIN, GPIO_PIN_RESET);

    }

    else if (adc_val < 2730) { // CCW

    current_mode = 1;

    HAL_GPIO_WritePin(LED_PORT, LED_GREEN_PIN, GPIO_PIN_SET);

    HAL_GPIO_WritePin(LED_PORT, LED_RED_PIN | LED_BLUE_PIN, GPIO_PIN_RESET);

    }

    else { // Oscillate

    current_mode = 2;

    HAL_GPIO_WritePin(LED_PORT, LED_BLUE_PIN, GPIO_PIN_SET);

    HAL_GPIO_WritePin(LED_PORT, LED_RED_PIN | LED_GREEN_PIN, GPIO_PIN_RESET);

    }

    }

    // Eksekusi mode gerakan motor

    switch (current_mode) {

    case 0: // CW

    RunStepper(STEP_SEQ_CW, 10);

    break;

    case 1: // CCW

    RunStepper(STEP_SEQ_CCW, 10);

    break;

    case 2: // Oscillate

    if (direction == 0) {

    RunStepper(STEP_SEQ_CW, 5);

    if ((STEPPER_PORT->ODR & 0xFF00) == STEP_SEQ_CW[3])

    direction = 1;

    } else {

    RunStepper(STEP_SEQ_CCW, 5);

    if ((STEPPER_PORT->ODR & 0xFF00) == STEP_SEQ_CCW[3])

    direction = 0;

    }

    break;

    }

    }

    }

    // === Fungsi Menggerakkan Motor Stepper ===

    void RunStepper(const uint16_t *sequence, uint8_t speed) {

    static uint8_t step = 0;

    STEPPER_PORT->ODR = (STEPPER_PORT->ODR & 0x00FF) | sequence[step];

    step = (step + 1) % 4;

    HAL_Delay(speed);

    }

    // === Konfigurasi Clock STM32 ===

    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;

    RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;

    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {

    Error_Handler();

    }

    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK

    | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;

    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;

    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;

    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;

    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) {

    Error_Handler();

    }

    }

    // === Inisialisasi GPIO untuk LED dan Motor ===

    void MX_GPIO_Init(void) {

    GPIO_InitTypeDef GPIO_InitStruct = {0};

    __HAL_RCC_GPIOB_CLK_ENABLE();

    // LED Output

    GPIO_InitStruct.Pin = LED_RED_PIN | LED_GREEN_PIN | LED_BLUE_PIN;

    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

    GPIO_InitStruct.Pull = GPIO_PULLDOWN;

    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;

    HAL_GPIO_Init(LED_PORT, &GPIO_InitStruct);

    // Stepper Motor Output

    GPIO_InitStruct.Pin = IN1_PIN | IN2_PIN | IN3_PIN | IN4_PIN;

    HAL_GPIO_Init(STEPPER_PORT, &GPIO_InitStruct);

    }

    // === Inisialisasi ADC1 untuk Sensor ===

    void MX_ADC1_Init(void) {

    ADC_ChannelConfTypeDef sConfig = {0};

    hadc1.Instance = ADC1;

    hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;

    hadc1.Init.ContinuousConvMode = DISABLE;

    hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;

    hadc1.Init.NbrOfConversion = 1;

    if (HAL_ADC_Init(&hadc1) != HAL_OK) {

    Error_Handler();

    }

    sConfig.Channel = ADC_CHANNEL_0;

    sConfig.Rank = ADC_REGULAR_RANK_1;

    sConfig.SamplingTime = ADC_SAMPLETIME_71CYCLES_5;

    if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) {

    Error_Handler();

    }

    }

    // === Penanganan Error ===

    void Error_Handler(void) {

    while (1) {

    // Loop terus jika error

    }

    }

5. Analisa[Kembali]







6. Video Demo[Kembali]





7. Download File[Kembali]

Video Simulasi  download  

datasheet STM32  download

datasheet sensor soil moisture  download

datasheet LED RGB  download

 

 


Komentar

Postingan populer dari blog ini

MODUL 1

modul 2 sistem digital

Tugas Pendahuluan 1 Modul 1 (Percobaan 1 Kondisi 10)