LA m



Percobaan 7
UART & I2C (STM – Pi Pico)


1. Prosedur[Kembali]

1. Rangkai semua komponen pada kedua development board yang terhubung ke mikrokontroler STM32F103C8 dan Raspberry Pi Pico.
2. Buat program untuk mikrokontroler STM32F103C8 di software STM32 CubeIDE dan program untuk mikrokontroler Raspberry Pi Pico di software Thonny.
3. Build program yang telah dibuat pada software STM32 CubeIDE, lalu inputkan program ke dalam mikrokontroler STM32F103C8 melalui stlink. Kemudian inputkan juga program dari software Thonny ke dalam mikrokontroler Raspberry Pi Pico melalui USB.
4. Setelah program diinputkan, uji rangkaian yang telah dirangkai sesuai dengan output yang ditentukan.
5. Selesai.

2. Hardware dan Diagram Blok[Kembali]

Hardware :

  • Raspberry pi pico
  • STM32F103C8



  • Push Button


  • Resistor




  • LCD




  • ST-LINK




  • Kabel USB 



  • Jumper Cable Wire


  • 2 Buah Development Board



Diagram Blok



3. Rangkaian Simulasi[Kembali]





  • Prinsip Kerja 
  Rangkaian ini terdiri dari dua mikrokontroler, yaitu STM32 sebagai pengirim data dan Raspberry Pi Pico sebagai penerima dan pengendali tampilan. Kedua mikrokontroler dihubungkan melalui komunikasi UART, di mana STM32 bertindak sebagai pengirim data (TX) dan Pico sebagai penerima data (RX). Raspberry Pi Pico juga terhubung dengan LCD berkomunikasi melalui protokol I2C, serta tiga buah push button berwarna merah, hijau, dan biru yang dipasang ke input digital.

Ketika rangkaian dinyalakan, Raspberry Pi Pico akan masuk ke mode standby, menunggu hingga menerima sinyal atau pesan dari STM32 melalui jalur UART. Selama menunggu, tidak ada output yang ditampilkan pada LCD. Setelah Pico menerima data awal tertentu dari STM32 (misalnya string "start" atau sinyal handshake), Pico akan mengirimkan sinyal balik UART READY, dan mulai menampilkan tulisan “UART READY” di LCD sebagai tanda bahwa sistem komunikasi telah aktif dan siap menerima input dari pengguna.

Selanjutnya, pengguna dapat berinteraksi dengan sistem melalui push button. Masing-masing push button (merah, hijau, biru) dihubungkan ke GPIO pada Pico dan ditarik dengan resistor pull-down atau pull-up untuk memastikan pembacaan digital stabil. Saat push button ditekan, Raspberry Pi Pico akan mendeteksi perubahan level logika pada pin input-nya, kemudian menjalankan logika yang sesuai.

Jika push button merah ditekan, Pico akan mengirimkan data ke LCD berupa string “MERAH”. Jika push button hijau ditekan, maka LCD akan menampilkan “HIJAU”, dan jika push button biru ditekan, LCD akan menampilkan “BIRU”. Semua tampilan karakter ini dikirimkan dari Pico ke LCD melalui protokol I2C dengan dua jalur utama: SDA (data) dan SCL (clock)



4. Flowchart dan Listing Program[Kembali]

  • Flowchart





  • Listing Program

  • STM32

#include "main.h" #include <string.h> UART_HandleTypeDef huart1; // Fungsi prototipe void SystemClock_Config(void); void MX_GPIO_Init(void); void MX_USART1_UART_Init(void); // Fungsi kirim UART void send_uart(char *text) { HAL_UART_Transmit(&huart1, (uint8_t *)text, strlen(text), HAL_MAX_DELAY); } int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USART1_UART_Init(); while (1) { if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_12) == GPIO_PIN_RESET) { send_uart("MERAH\r\n"); HAL_Delay(300); while (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_12) == GPIO_PIN_RESET); } else if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_13) == GPIO_PIN_RESET) { send_uart("HIJAU\r\n"); HAL_Delay(300); while (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_13) == GPIO_PIN_RESET); } else if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_14) == GPIO_PIN_RESET) { send_uart("BIRU\r\n"); HAL_Delay(300); while (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_14) == GPIO_PIN_RESET); } } } // Konfigurasi clock standar STM32F1 void SystemClock_Config(void) { RCC_OscInitTypeDef RCC_OscInitStruct = {0}; RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; __HAL_RCC_AFIO_CLK_ENABLE(); __HAL_RCC_PWR_CLK_ENABLE(); __HAL_AFIO_REMAP_SWJ_NOJTAG(); // Bebaskan PB3-PB4 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1; RCC_OscInitStruct.HSIState = RCC_HSI_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9; 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_DIV2; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2); } // Inisialisasi UART1 (TX: PA9, RX: PA10) void MX_USART1_UART_Init(void) { huart1.Instance = USART1; huart1.Init.BaudRate = 9600; huart1.Init.WordLength = UART_WORDLENGTH_8B; huart1.Init.StopBits = UART_STOPBITS_1; huart1.Init.Parity = UART_PARITY_NONE; huart1.Init.Mode = UART_MODE_TX_RX; huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; huart1.Init.OverSampling = UART_OVERSAMPLING_16; HAL_UART_Init(&huart1); } // Inisialisasi GPIO PB12, PB13, PB14 sebagai input pull-up void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOB_CLK_ENABLE();
// Konfigurasi input tombol dengan Pull-Up  GPIO_InitStruct.Pin = GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); }


  • Raspberry Pi Pico
from machine import I2C, Pin, UART import utime from pico_i2c_lcd import I2cLcd # Inisialisasi UART uart = UART(0, baudrate=9600, tx=Pin(0), rx=Pin(1)) # Inisialisasi LCD I2C i2c = I2C(0, scl=Pin(5), sda=Pin(4), freq=400000) I2C_ADDR = 0x27 # Ganti dengan alamat LCD Anda I2C_NUM_ROWS = 2 I2C_NUM_COLS = 16 lcd = I2cLcd(i2c, I2C_ADDR, I2C_NUM_ROWS, I2C_NUM_COLS) # Tunggu LCD siap utime.sleep_ms(100) lcd.clear() lcd.putstr("Menunggu input...") def process_uart_data(data): try: decoded = data.decode('utf-8').strip() lcd.clear() if decoded == "MERAH": lcd.putstr("Warna: Merah") elif decoded == "HIJAU": lcd.putstr("Warna: Hijau") elif decoded == "BIRU": lcd.putstr("Warna: Biru") else: lcd.putstr(f"Data: {decoded}") except Exception as e: lcd.clear() lcd.putstr(f"Error: {str(e)}") while True: if uart.any(): data = uart.readline() if data: process_uart_data(data) utime.sleep_ms(100) # Beri sedikit jeda



5. Video Demo[Kembali]







6. Analisa[Kembali]







7. Download File[Kembali]

HTML [Download]
Listing Program [Download]
Video Simulasi [Download]  
Datasheet STM32F103C8  [Download]
Datasheet Raspberry pi pico [Download]
Datasheet Push Button [Download]
Datasheet LCD [Download]












 

Komentar

Postingan populer dari blog ini

Modul 1 Input Output

Modul 3

Tugas Besar