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 :
3. Rangkaian Simulasi[Kembali]
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]
#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); }
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]
Komentar
Posting Komentar