Rangkaian Percobaan 7
UART & I2C (STM – Pi Pico)
2. Hardware dan Diagram Blok[Kembali]
Raspberry PI Pico sebagai mikrokontroler utama yang mengendalikan semua komponen input dan output.STM32F103C8T6 sebagai mikrokontroler utama untuk mengontrol input dari sensor dan output ke LED.Resistor pembatas arus sebagai resistor pull-down untuk button
Push Button digunakan sebagai input manual
LCD 16x2 I2C sebagai tampilan output
3. Rangkaian Simulasi[Kembali]
Rangkayan
Prinsip Kerja
Rangkaian ini mengimplementasikan komunikasi serial antara dua mikrokontroler, yaitu STM32 dan Raspberry Pi Pico, yang dilengkapi dengan antarmuka visual berupa LCD.
Dalam percobaan ini, terdapat dua jenis komunikasi serial yang digunakan secara bersamaan dengan peran berbeda. Komunikasi pertama adalah UART yang menghubungkan STM32 dengan Raspberry Pi Pico. Fungsi utama dari koneksi ini adalah untuk mengirimkan data dari input tombol. Tiga buah tombol (push button) terhubung ke pin PB12, PB13, dan PB14 pada STM32, dengan konfigurasi pull-up internal sehingga tombol aktif dalam kondisi LOW (saat ditekan, pin terhubung ke GND). Ketika salah satu tombol ditekan, STM32 mengirimkan string teks seperti “MERAH”, “HIJAU”, atau “BIRU” melalui UART. Konfigurasi komunikasi ini adalah baud rate 9600 bps, 8 data bit, 1 stop bit, dan tanpa parity. Data dikirim secara asinkron dari pin TX (PA9) STM32 ke pin RX (GPIO1) pada Pico, dan kedua perangkat dihubungkan ke ground yang sama sebagai referensi tegangan.
Komunikasi kedua adalah I2C yang menghubungkan Raspberry Pi Pico dengan LCD. Setelah menerima data melalui UART, Pico memproses dan menampilkannya di LCD menggunakan komunikasi I2C. Jalur clock (SCL) dihubungkan ke GPIO5 dan jalur data (SDA) ke GPIO4. Dengan menggunakan alamat slave 0x27, Pico dapat mengirim perintah atau data ke LCD secara sinkron. Penggunaan pustaka (library) khusus memudahkan dalam mengirimkan perintah dasar seperti menghapus tampilan atau mencetak teks ke layar.
Kedua jenis komunikasi ini saling mendukung dalam sistem tersebut. UART dipilih karena kesederhanaannya untuk komunikasi langsung antar mikrokontroler, sementara I2C digunakan untuk mengontrol perangkat eksternal seperti LCD dengan efisien, hanya menggunakan dua jalur komunikasi. Integrasi kedua protokol ini memperlihatkan bagaimana sistem embedded dapat menggabungkan berbagai jenis komunikasi serial secara efektif dalam satu aplikasi yang sederhana.
4. Flowchart dan Listing Program[Kembali]
- STM32F103C8T6
#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 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 I2C 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...")
# Fungsi untuk memproses data dari UART 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("Error:") lcd.putstr(str(e)[:16]) # Potong agar sesuai 16 karakter
# Loop utama while True: if uart.any(): data = uart.readline() if data: process_uart_data(data) utime.sleep_ms(100)
|
Tidak ada komentar:
Posting Komentar