M3 Laporan Akhir 1

 

Modul 3 - Laporan Akhir 1




UART dan I2C


1. Prosedur 
[Kembali]
1. Rangkai rangkaian sesuai dengan kondisi percobaan.
2. Buat program untuk mikrokontroler STM32F103C8 di software STM32 CubeIDE.
3. Buat program untuk Raspberry pi pico di software ThonyIDE.
4. Jalankan simulasi rangkaian.
5. Selesai. 

2. Hardware dan Diagram Blok[Kembali]

Raspberry Pi Pico 


STM32F103C8 

Push Button



LCD
 
Resistor

3. Rangkaian Simulasi dan Prinsip Kerja[Kembali]


  • Prinsip Kerja

Sistem ini terdiri dari dua mikrokontroler, yaitu STM32F103C8T6 (Blue Pill) dan Raspberry Pi Pico, yang berkomunikasi melalui jalur UART. STM32 berfungsi sebagai pengirim data, sementara Raspberry Pi Pico bertugas sebagai penerima data dan pengendali tampilan LCD I2C. Pada sisi STM32, terdapat tiga tombol yang masing-masing terhubung ke pin PB12, PB13, dan PB14. Saat salah satu tombol ditekan, STM32 akan mendeteksi input tersebut dan mengirimkan data berupa teks “MERAH”, “HIJAU”, atau “BIRU” melalui UART. Data ini dikirim menggunakan fungsi HAL_UART_Transmit dengan kecepatan baud 9600.

Di sisi penerima, Raspberry Pi Pico menggunakan UART0 (pin GP0 dan GP1) untuk membaca data dari STM32. Setelah data diterima, data akan diproses dan ditampilkan ke LCD 16x2 yang terhubung melalui antarmuka I2C menggunakan modul pico_i2c_lcd. Jika data yang diterima adalah “MERAH”, “HIJAU”, atau “BIRU”, maka LCD akan menampilkan pesan sesuai warna tersebut, misalnya “Warna: Merah”. Jika data tidak dikenali atau terjadi error dalam decoding, maka LCD akan menampilkan pesan kesalahan. Dengan demikian, sistem ini membentuk komunikasi antar mikrokontroler secara serial untuk mentransfer status input tombol dari STM32 ke Raspberry Pi Pico, dan menampilkannya secara real-time di layar LCD.


4. Flowchart dan Listing Program[Kembali]
  • Flochart


  • 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]



Comments

Popular posts from this blog

Modul 1 General Input dan Output

Tugas Besar Garasi Otomatis

Communication