Jumat, 28 Maret 2025

Laporan Akhir Modul 1 Percobaan 2 Praktikum Mikroprosesor dan Mikrokontrole






1. Prosedur [kembali]

    Langkah-langkah percobaan :

a. Tentukan percobaan dan kondisi yang akan dilakukan (Kondisi 6)

b. Siapakan alat dan bahan yang akan digunakan

c. Rangkai Rangkaian pada Board sesuai gambar percobaan kondisi 6 dengan komponen 1 input push button, 1 sensor infrared STM32F103C8, 3 Resistor 220 Ohm, 1 Output LED-RGB dam 1 Buzzer  hubungkan menggunakan jumper. 

d. Buatlah program  pada software STM32Cube IDE dengan konfigurasi Pin Input dan Output berdasarkan pada Pin GPIO STM32 yang telah dirangkai sebelumnya.

e. Kemudian, buatlah program untuk menghasilkan Output LED-RGB dan Buzzer sesuai kondisi yang telah ditentukan.

f.  Hubungkan Laptop dengan STM32F103C8 dengan STlink 

g. Run Program, dan lihat output yang dihasilkan ketika push button ditekan



2. Hardware dan Diagram Blok [kembali]
        A. Hardware
            1. STM32F103C8



            2. Push Button



            3. LED-RGB


            4. Jumper

            5. Resistor



            6. Laptop


        B. Software
            1. STM32Cube IDE


       C. Blok Diagram


3. Rangkaian Simulasi dan Prinsip Kerja [kembali]
           A. Rangkaian Simulasi


            B. Rangkaian Percobaan



            C. Prinsip Kerja

    
        Rangkaian ini terdiri dari beberapa komponen, yakni mikrokontroler STM32F103C8, sensor infrared, buzzer, led-rgb, jumper, push button dan resistor 220 ohm. Pada rangkaian, yang menjadi inputan berupa sensor infrared dan push button sementara buzzer dan led-rgb menjadi outputnya. Pada rangkaian sensor infrared yang memiliki 3 kaki yang perlu terhubung dengan dengan sumber daya (3,3V), ground dan output data berupa apakah terdeteksi objek (logika 1)  atau tidak. Lalu inputan kedua berupa push button yang ketika ditekan memberi logika 1. Lalu dari inputan yang terhubung oleh jumper dihubungkan dengan mikrokontroler dengan memperhatikan port berapa saja yang terhubung agar dapat di deklarasikan oleh program nantinya. Sesuai kondisi yang diinginkan, output yang diharapkan yakni: 

- Jika Infrared aktif (mendeteksi objek), maka led akan berwarna hijau diiringi dengan buzzer berbunyi.
- Jika Button ditekan (logika 1), maka led akan berwarna merah diiringi dengan bunyi buzzer. 
- Jika kedua inpuitan dalam kondisi aktif, maka led-rgb akan berwarna jingga/kuning dengan iringan bunyi buzzer. 


          Rangkaian dihubungkan pada board, setelah itu lanjut ke Program. Dimana program ini dibuat pada software STM32Cube IDE. Program ini menggunakan bahasa Python sebagai berikut:

  1. Inisialisasi Sistem:

    • HAL_Init(); → Inisialisasi hardware abstraction layer.

    • SystemClock_Config(); → Konfigurasi clock sistem menggunakan HSI (High-Speed Internal).

    • MX_GPIO_Init(); → Inisialisasi GPIO.

  2. Loop utama (while (1)):

    • Membaca status tombol dan sensor IR:

      uint8_t button_status = HAL_GPIO_ReadPin(GPIOB, BUTTON_Pin);
      uint8_t ir_status = HAL_GPIO_ReadPin(GPIOB, IR_Pin);
      
    • Reset output GPIO (LED & Buzzer):

      HAL_GPIO_WritePin(GPIOA, GREEN_Pin | RED_Pin | BUZZER_Pin, GPIO_PIN_RESET);
      
    • Jika tombol ditekan (BUTTON_Pin bernilai GPIO_PIN_SET):

      if (button_status == GPIO_PIN_SET)
      {
          HAL_GPIO_WritePin(GPIOA, RED_Pin, GPIO_PIN_SET);
          HAL_GPIO_WritePin(GPIOA, BUZZER_Pin, GPIO_PIN_SET);
      }
      

      → LED merah menyala dan buzzer berbunyi.

    • Jika sensor IR mendeteksi sesuatu (IR_Pin bernilai GPIO_PIN_SET):

      if (ir_status == GPIO_PIN_SET)
      {
          HAL_GPIO_WritePin(GPIOA, GREEN_Pin, GPIO_PIN_SET);
          HAL_GPIO_WritePin(GPIOA, BUZZER_Pin, GPIO_PIN_SET);
      }
      

      → LED hijau menyala dan buzzer berbunyi.

    • Delay 100ms untuk debounce tombol/sensor.

  3. Konfigurasi Clock (SystemClock_Config()):

    • Menggunakan HSI (High-Speed Internal) 16MHz sebagai sumber clock.

    • Tidak menggunakan PLL.

    • Mengatur pembagian clock untuk AHB, APB1, dan APB2.

  4. Inisialisasi GPIO (MX_GPIO_Init()):

    • Output:

      • RED_Pin, GREEN_Pin, BUZZER_Pin, BLUE_Pin sebagai push-pull output.

    • Input:

      • BUTTON_Pin dan IR_Pin sebagai input tanpa pull-up/pull-down.

  5. Error Handler (Error_Handler()):

    • Menonaktifkan interrupt dan masuk ke loop infinite jika terjadi error.


Peningkatan & Perbaikan yang Bisa Dilakukan

  1. Tambahkan debounce untuk tombol

    • Saat ini, tombol bisa mendeteksi banyak input akibat bouncing. Bisa ditambahkan debounce software.

    if (button_status == GPIO_PIN_SET)
    {
        HAL_Delay(50); // Delay debounce
        if (HAL_GPIO_ReadPin(GPIOB, BUTTON_Pin) == GPIO_PIN_SET)
        {
            HAL_GPIO_WritePin(GPIOA, RED_Pin, GPIO_PIN_SET);
            HAL_GPIO_WritePin(GPIOA, BUZZER_Pin, GPIO_PIN_SET);
        }
    }
    
  2. Gunakan else if untuk menghindari kondisi tumpang tindih

    • Jika tombol dan IR aktif bersamaan, LED hijau & merah bisa berkedip tidak stabil. Bisa diubah menjadi:

    if (button_status == GPIO_PIN_SET)
    {
        HAL_GPIO_WritePin(GPIOA, RED_Pin, GPIO_PIN_SET);
        HAL_GPIO_WritePin(GPIOA, BUZZER_Pin, GPIO_PIN_SET);
    }
    else if (ir_status == GPIO_PIN_SET)
    {
        HAL_GPIO_WritePin(GPIOA, GREEN_Pin, GPIO_PIN_SET);
        HAL_GPIO_WritePin(GPIOA, BUZZER_Pin, GPIO_PIN_SET);
    }
    
  3. Matikan buzzer jika tidak ada input

    else
    {
        HAL_GPIO_WritePin(GPIOA, BUZZER_Pin, GPIO_PIN_RESET);
    }

Setelah program selesai dibuat, hubungkan Laptop dengan STM32F103C8, Lanjut ke simulasi, dimana:

- STM32F103C8 terhubung dengan 1 LED-RGB, Buzzer, push button dan sensor infrared.
- Saat sebuah tombol ditekan, LED yang sesuai menyala.
- Saat tombol dilepas, LED akan mati kembali.
- Output pada terminal menunjukkan tombol mana yang ditekan.

4. Flowchart dan Listing Program [kembali]
        A. Flowchart








        B. Listing Program  

#include "main.h" void SystemClock_Config(void); static void MX_GPIO_Init(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); while (1) {
uint8_t button_status = HAL_GPIO_ReadPin(GPIOB, BUTTON_Pin);
uint8_t ir_status = HAL_GPIO_ReadPin(GPIOB, IR_Pin);
HAL_GPIO_WritePin(GPIOA, GREEN_Pin | RED_Pin | BUZZER_Pin,
GPIO_PIN_RESET);
if (button_status == GPIO_PIN_SET)
{
HAL_GPIO_WritePin(GPIOA, RED_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, BUZZER_Pin, GPIO_PIN_SET);
}
if (ir_status == GPIO_PIN_SET)
{
HAL_GPIO_WritePin(GPIOA, GREEN_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOA, BUZZER_Pin, GPIO_PIN_SET);
}
HAL_Delay(100);
}
}
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;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
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();
}
}
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOD_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
HAL_GPIO_WritePin(GPIOA, RED_Pin|GREEN_Pin|BUZZER_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(BLUE_GPIO_Port, BLUE_Pin, GPIO_PIN_RESET);
GPIO_InitStruct.Pin = RED_Pin|GREEN_Pin|BUZZER_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = BLUE_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(BLUE_GPIO_Port, &GPIO_InitStruct);
GPIO_InitStruct.Pin = BUTTON_Pin|IR_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
void Error_Handler(void)
{
__disable_irq();
while (1)
{
 
}
#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t *file, uint32_t line)
{
}
#endif       

    

5. Analisa [kembali]
       



6. Video Demo [kembali]



7. Download file [kembali]

Tidak ada komentar:

Posting Komentar

Laporan Akhir Modul 1 Percobaan 2 Praktikum Mikroprosesor dan Mikrokontrole

[KEMBALI KE MENU SEBELUMNYA] DAFTAR ISI 1. Prosedur 2. Hardware dan Diagram Blok 3. Rangkaian Simulasi dan Prinsip Kerja 4. F...