LAPORAN AKIR





Rangkaian Percobaan 7  
UART & I2C (STM – Pi Pico)


1. Prosedur[Kembali]



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]

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]












Tidak ada komentar:

Posting Komentar

     BAHAN PRESENTASI     MATA KULIAH ELEKTRONIKA 2022 Oleh Mutia Azzahra 2210953018 DOSEN PENGAMPU DR. DARWISON, M.T. Referensi  1. Darwiso...