LAPORAN AKHIR

 




1. Prosedur
[Kembali]

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 dan Prinsip Kerja [Kembali]

Rangkaian



Prinsip kerja

Prinsip Kerja Rangkaian

Rangkaian ini bekerja berdasarkan prinsip protokol komunikasi serial antara dua mikrokontroler (STM32 dan Raspberry Pi Pico) dengan antarmuka visual melalui LCD

Pada percobaan ini, terjadi dua jenis komunikasi serial yang bekerja secara bersamaan namun dengan fungsi berbeda. Pertama, komunikasi UART antara STM32 dan Raspberry Pi Pico berfungsi untuk mentransmisikan data dari input tombol. Inputan tiga tombol (push button) yang terhubung ke pin PB12, PB13, dan PB14 dengan konfigurasi pull-up internal. sehingga logika aktif LOW (saat ditekan, pin terhubung ke GND), ketika salahs\ satu inputan ditekan maka mikrokontroler tersebut mengirimkan string teks seperti "MERAH", "HIJAU", atau "BIRU" melalui antarmuka UART dengan konfigurasi baud rate 9600 bps, 8 bit data, 1 stop bit, dan tanpa parity. Data ini dikirim secara asinkron melalui pin TX (PA9) STM32 yang terhubung ke pin RX (GPIO1) Pico, sementara ground kedua perangkat disatukan sebagai referensi tegangan.

Kedua, komunikasi I2C antara Raspberry Pi Pico dan LCD berperan untuk menampilkan informasi. Setelah Pico menerima data dari STM32 melalui UART, ia memproses data tersebut dan mengirimkannya ke LCD melalui antarmuka I2C dengan clock line (SCL) di GPIO5 dan data line (SDA) di GPIO4. Protokol I2C yang bekerja secara sinkron ini memungkinkan Pico mengontrol LCD dengan mengirimkan alamat slave (0x27) diikuti dengan perintah atau data teks yang akan ditampilkan. Library khusus mempermudah pengiriman perintah dasar seperti membersihkan layar (clear) atau menampilkan string (putstr). 

Kedua protokol komunikasi ini saling melengkapi dalam sistem tersebut. UART dipilih untuk komunikasi point-to-point antara dua mikrokontroler karena kesederhanaannya, sementara I2C digunakan untuk mengendalikan peripheral LCD karena kemampuannya mendukung multiple devices dengan hanya dua kabel. Seluruh proses ini menunjukkan bagaimana dua jenis komunikasi serial yang berbeda dapat diintegrasikan secara efektif dalam satu sistem embedded sederhana.


4. Flowchart dan Listing Program [Kembali]

Flowchart :

Listing Program :
  • 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)

 


5. Video Demo [Kembali]

6. Kondisi [Kembali]
 
7. Video Simulasi [Kembali]



8. Download File[Kembali]

File HTML [disini]

Video [disini]

Datasheet STM32F103C8T6 [disini]

Datasheet LCD I2C 16X2 [disini]


Komentar

Postingan populer dari blog ini

SISTEM DIGITAL

ELEKTRONIKA

MIKROPROSESOR DAN MIKROKONTROLER