Laporan Akhir 2

[menuju akhir]

1. Prosedur [kembali]

  1. Rangkai rangkaian di breadboard sesuai dengan percobaan ke-3 pada modul menggunakan sensor inframerah (IR) dan sensor sentuh sebagai input, serta LED RGB sebagai output.
  2. Sambungkan breadboard ke komputer yang terinstal software STM32CubeIDE menggunakan kabel USB.
  3. Buka STM32CubeIDE dan pastikan STM32 terdeteksi dengan baik oleh perangkat lunak.
  4. Buat dan buka program pada STM32CubeIDE yang telah dibuat untuk mengontrol LED RGB.
  5. Upload program ke STM32 dan jalankan program untuk mengontrol LED RGB.
  6. Uji sensor inframerah dan sensor sentuh untuk memastikan LED RGB menyala sesuai dengan kondisi yang ditentukan.
  7. Selesai.

2. Hardware dan Diagram Blok [kembali]

Hardware

a) Raspberry Pi Pico

b) STM32F103C8
c) LED RGB
d) Touch Sensor
f) Sensor Infrared
g) Breadboard
h) Resistor

Diagram Blok

3. Rangkaian Simulasi dan Prinsip Kerja [kembali]

Rangkaian Simulasi

  • Rangkaian sebelum disimulasikan

  • Rangkaian setelah disimulasikan

Prinsip Kerja

Prinsip Kerja Program:

  1. Inisialisasi Sistem:

o   HAL_Init();
Program dimulai dengan memanggil fungsi HAL_Init() yang melakukan inisialisasi HAL (Hardware Abstraction Layer) untuk mengonfigurasi seluruh perangkat keras mikrocontroller (STM32). Ini adalah langkah awal untuk menggunakan periferal dan sistem timer di STM32.

  1. Konfigurasi Clock Sistem:

o   SystemClock_Config();
Fungsi ini mengatur konfigurasi clock sistem. Pengaturan ini memastikan bahwa STM32 berfungsi dengan clock yang tepat dan semua periferal bekerja pada frekuensi yang sesuai. Biasanya ini digunakan untuk mengatur pengaturan osilator dan pembagi clock.

  1. Inisialisasi GPIO:

o   MX_GPIO_Init();
Fungsi ini digunakan untuk mengonfigurasi semua pin GPIO yang diperlukan oleh program, termasuk pin untuk LED dan sensor. Setelah fungsi ini dijalankan, semua pin yang diperlukan telah siap digunakan.

  1. Pembacaan Status Sensor:

o   uint8_t ir_status = HAL_GPIO_ReadPin(GPIOB, IR_Pin);
Fungsi ini membaca status sensor inframerah (IR) yang terhubung ke pin IR_Pin pada port GPIOB. Status ini bisa GPIO_PIN_SET (jika IR mendeteksi gerakan) atau GPIO_PIN_RESET (jika tidak ada gerakan).

o   uint8_t touch_status = HAL_GPIO_ReadPin(GPIOB, TOUCH_Pin);
Fungsi ini membaca status sensor sentuh (TOUCH) yang terhubung ke pin TOUCH_Pin pada port GPIOB. Status ini juga bisa GPIO_PIN_SET (jika ada sentuhan) atau GPIO_PIN_RESET (jika tidak ada sentuhan).

  1. Mengatur LED Biru Berdasarkan Status IR:

o   HAL_GPIO_WritePin(BLUE_GPIO_Port, BLUE_Pin, ir_status);
Berdasarkan status sensor IR, jika IR aktif (terdeteksi gerakan), maka LED Biru akan menyala (GPIO_PIN_SET), jika tidak ada gerakan, LED Biru dimatikan (GPIO_PIN_RESET).

  1. Mengatur LED Hijau Berdasarkan Status Sensor Sentuh:

o   HAL_GPIO_WritePin(GPIOA, GREEN_Pin, touch_status);
Berdasarkan status sensor sentuh, jika ada sentuhan, maka LED Hijau akan menyala (GPIO_PIN_SET), jika tidak ada sentuhan, LED Hijau akan dimatikan (GPIO_PIN_RESET).

  1. Mengatur LED Merah Berdasarkan Kedua Sensor:

o   if (ir_status == GPIO_PIN_RESET && touch_status == GPIO_PIN_RESET)
Bagian ini memeriksa apakah kedua sensor (IR dan TOUCH) tidak aktif, yang berarti tidak ada gerakan pada sensor IR dan tidak ada sentuhan pada sensor sentuh. Jika kondisi ini terpenuhi, LED Merah akan menyala (GPIO_PIN_SET).

o   HAL_GPIO_WritePin(GPIOA, RED_Pin, GPIO_PIN_SET);
Jika tidak ada gerakan dan tidak ada sentuhan, LED Merah akan menyala.

o   else { HAL_GPIO_WritePin(GPIOA, RED_Pin, GPIO_PIN_RESET); }
Jika salah satu sensor (IR atau TOUCH) aktif, LED Merah akan dimatikan (GPIO_PIN_RESET).

  1. Delay:

o   HAL_Delay(10);
Program memberikan delay kecil selama 10 milidetik untuk memastikan bahwa pembacaan sensor dan penyalakan LED stabil. Ini juga membantu mencegah pembacaan yang tidak stabil pada sensor dan penyalakan LED yang tidak diinginkan (misalnya, bouncing pada tombol atau sensor sentuh).

Prinsip kerja rangkaian ini didasarkan pada pemrosesan sinyal digital oleh mikrokontroler STM32 untuk mengontrol penyalaan LED RGB menggunakan sensor inframerah dan sensor sentuh sebagai input. Rangkaian ini bekerja dengan prinsip logika digital, di mana sensor inframerah bertindak sebagai detektor gerakan dan sensor sentuh bertindak sebagai detektor sentuhan. Masing-masing sensor memberikan sinyal yang akan dibaca oleh mikrokontroler. Jika sensor inframerah mendeteksi gerakan, mikrokontroler akan mengaktifkan LED Biru, sedangkan jika sensor sentuh mendeteksi sentuhan, LED Hijau akan menyala.

Jika kedua sensor tersebut tidak aktif (tidak ada gerakan pada sensor inframerah dan tidak ada sentuhan pada sensor sentuh), maka LED Merah akan menyala. Hal ini dilakukan dengan membaca status dari kedua sensor tersebut, dan berdasarkan status ini, mikrokontroler akan mengatur status pin GPIO yang terhubung ke masing-masing LED. Jika salah satu sensor aktif, mikrokontroler akan mematikan LED Merah, namun jika kedua sensor tidak aktif, LED Merah akan menyala.

Untuk memastikan pembacaan sensor yang stabil, program juga memberikan delay kecil untuk menghindari pembacaan yang tidak stabil akibat noise atau efek bouncing dari sensor sentuh. Dengan cara ini, sistem dapat mengontrol LED secara tepat berdasarkan kondisi yang terdeteksi oleh sensor tanpa adanya gangguan atau pembacaan yang salah.

4. Flowchart dan Listing Program [kembali]

Flowchart

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 ir_status = HAL_GPIO_ReadPin(GPIOB, IR_Pin); // Membaca IR sensor (PB10)
    uint8_t touch_status = HAL_GPIO_ReadPin(GPIOB, TOUCH_Pin); // Membaca Touch Sensor (PB6)

    // LED Biru menyala jika IR aktif
    HAL_GPIO_WritePin(BLUE_GPIO_Port, BLUE_Pin, ir_status);

    // LED Hijau menyala jika Touch aktif
    HAL_GPIO_WritePin(GPIOA, GREEN_Pin, touch_status);

    // LED Merah menyala jika tidak ada sensor yang aktif
    if (ir_status == GPIO_PIN_RESET && touch_status == GPIO_PIN_RESET) {
        HAL_GPIO_WritePin(GPIOA, RED_Pin, GPIO_PIN_SET); // Nyalakan LED RED
    } else {
        HAL_GPIO_WritePin(GPIOA, RED_Pin, GPIO_PIN_RESET); // Matikan LED RED
    }
        HAL_Delay(10); // Delay kecil untuk stabilisasi pembacaan sensor
    }

}

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();

 /*Configure GPIO pin Output Level */
 HAL_GPIO_WritePin(GPIOA, RED_Pin|GREEN_Pin, GPIO_PIN_RESET);

 /*Configure GPIO pin Output Level */
 HAL_GPIO_WritePin(BLUE_GPIO_Port, BLUE_Pin, GPIO_PIN_RESET);

 /*Configure GPIO pins : RED_Pin GREEN_Pin */
 GPIO_InitStruct.Pin = RED_Pin|GREEN_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);

 /*Configure GPIO pin : BLUE_Pin */
 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);

 /*Configure GPIO pins : IR_Pin TOUCH_Pin */
 GPIO_InitStruct.Pin = IR_Pin|TOUCH_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 /* USE_FULL_ASSERT */

5. Video Demo [kembali]

6. Kondisi [kembali]

    Percobaan 2

Buatlah rangkaian seperti percobaan 2 dengan kondisi ketika sensor Infrared (IR) mendeteksi gerakan (IR aktif) dan sensor touch tidak mendeteksi sentuhan (TOUCH tidak aktif), maka LED RGB akan menampilkan warna Merah (LED Merah menyala) sesuai dengan logika yang diterapkan pada program.
  • Sensor Infrared (IR): Ketika sensor mendeteksi gerakan, statusnya akan aktif (logika HIGH), dan LED Biru akan menyala.
  • Sensor Touch: Jika tidak ada sentuhan, status sensor adalah tidak aktif (logika LOW), yang menyebabkan LED Hijau mati.
  • LED Merah: LED Merah akan menyala ketika kedua sensor (IR dan TOUCH) tidak aktif atau tidak mendeteksi gerakan dan sentuhan.
7. Analisa [kembali]

1. Analisa bagaimana pengaruh penggunaan/pemilihan GPIO pada STM32 dan Raspberry Pi Pico.

Jawab :

Pemilihan GPIO pada STM32 dan Raspberry Pi Pico memiliki pengaruh besar terhadap fleksibilitas dan performa sistem. STM32 memiliki GPIO yang lebih kompleks dengan fitur seperti alternate function, pull-up/pull-down resistors, dan interrupt eksternal (EXTI) yang memungkinkan penggunaan lebih luas dalam aplikasi industri dan real-time. Sementara itu, Raspberry Pi Pico memiliki GPIO yang lebih sederhana dan lebih mudah dikonfigurasi, terutama dengan MicroPython. Meskipun Raspberry Pi Pico mendukung PWM, I2C, SPI, dan UART, fleksibilitas pengaturannya masih kalah dibandingkan dengan STM32 yang memiliki lebih banyak mode operasi untuk setiap pin.

2. Analisa bagaimana STM32 dan Raspberry Pi Pico menerima inputan dan menghasilkan output

Jawab :

STM32 menerima input dengan membaca status pin melalui fungsi HAL_GPIO_ReadPin() dalam HAL Library atau dengan mengakses register secara langsung. Output dihasilkan dengan mengubah status pin menggunakan HAL_GPIO_WritePin(), yang memungkinkan pengendalian perangkat eksternal seperti LED atau relay. Sementara itu, Raspberry Pi Pico menggunakan pustaka machine dalam MicroPython untuk membaca input dengan pin.value() dan mengatur output dengan pin.value(1) atau pin.value(0). Kedua mikrokontroler ini dapat bekerja dalam mode polling atau interrupt, tetapi STM32 lebih unggul dalam manajemen interrupt karena memiliki fitur EXTI yang memungkinkan pemrosesan input lebih cepat tanpa polling terus-menerus.

3. Analisa bagaimana program deklarasi pin I/O pada STM32 dan Raspberry Pi Pico

Jawab :

Deklarasi pin pada STM32 memerlukan konfigurasi yang lebih kompleks dibandingkan Raspberry Pi Pico. Pada STM32, pin I/O harus diinisialisasi menggunakan GPIO_InitTypeDef, di mana pengguna harus menentukan mode, kecepatan, dan pull-up/pull-down. Konfigurasi ini umumnya dilakukan dengan HAL_GPIO_Init(). Sebaliknya, Raspberry Pi Pico memiliki deklarasi yang lebih sederhana, cukup dengan Pin(nomor_pin, mode), di mana mode bisa berupa Pin.IN atau Pin.OUT. Hal ini membuat Raspberry Pi Pico lebih mudah digunakan, terutama bagi pemula yang tidak ingin terlalu banyak berurusan dengan konfigurasi hardware.

4. Analisa bagaimana program dalam analisa metode pendeteksian input pada STM32 dan Raspberry Pi Pico

Jawab :

STM32 dan Raspberry Pi Pico memiliki dua metode utama untuk mendeteksi input, yaitu polling dan interrupt. Pada STM32, polling dilakukan dengan HAL_GPIO_ReadPin(), sedangkan interrupt menggunakan EXTI (External Interrupt) yang memungkinkan sistem merespons input secara langsung tanpa harus terus-menerus memeriksa status pin. Raspberry Pi Pico juga mendukung polling dengan pin.value(), tetapi untuk interrupt, digunakan pin.irq(handler=callback, trigger=Pin.IRQ_FALLING), yang memungkinkan eksekusi fungsi tertentu saat terjadi perubahan sinyal pada pin input. Namun, pengelolaan interrupt pada STM32 lebih fleksibel dan memungkinkan prioritas yang lebih kompleks dibandingkan dengan Raspberry Pi Pico.

5. Analisa Fungsi HAL_Delay(100) pada STM32 dan utime.sleep_ms(1) pada Raspberry Pi Pico

Jawab :

Fungsi HAL_Delay(100) pada STM32 bekerja berdasarkan SysTick Timer, sehingga tetap berjalan dengan presisi tinggi tanpa memblokir sepenuhnya eksekusi sistem jika digunakan dalam aplikasi multitasking. Sebaliknya, utime.sleep_ms(1) pada Raspberry Pi Pico menggunakan metode blocking delay, yang dapat menghambat eksekusi kode lainnya selama waktu delay berlangsung. Oleh karena itu, dalam aplikasi real-time yang memerlukan efisiensi tinggi, STM32 memiliki keunggulan dalam mengelola delay tanpa mengganggu proses lain, sedangkan Raspberry Pi Pico lebih cocok untuk tugas yang lebih sederhana dan tidak memerlukan multitasking yang kompleks.

8. Download File [kembali]

Rangkaian [klik disini]
Video Simulasi [klik disini]
Listing Program [klik disini]
Datasheet Raspberry STM32F103C8 [klik disini]
Datasheet Sensor Infrared [klik disini]
Datasheet Sensor Touch[klik disini]
Datasheet LED [klik disini]

Komentar

Postingan populer dari blog ini

Modul 1 General Input dan Output

Modul 1 Gerbang Logika Dasar & Monostable Multivibrator