Senin, 18 Mei 2020

Laporan Akhir Modul 3

 




1. Prosedur
[Kembali]

- Rangkaian


    Rangkaian ini terdiri dari STM32 yang terhubung ke tiga push button, Raspberry Pi Pico, dan LCD 16x2 I2C. STM32 digunakan untuk membaca input dari tombol dan mengirimkan data melalui komunikasi UART ke Raspberry Pi Pico. Pico kemudian menampilkan data tersebut ke LCD menggunakan komunikasi I2C. Tegangan 3.3V dan GND dibagikan ke seluruh komponen agar sistem dapat berjalan. Saat tombol ditekan, STM32 mengirimkan teks seperti “MERAH”, “HIJAU”, atau “BIRU” ke Pico, lalu Pico menampilkannya di layar LCD.

2. Hardware dan Diagram Blok [Kembali]

STM32F103C8 sebagai mikrokontroler utama untuk mengontrol input dari sensor dan output ke LED.




- Raspberry Pi Pico untuk menerima data dari STM32 dan menampilkannya ke LCD




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

Rangkaian ini bekerja dengan cara membaca input dari tombol menggunakan STM32. Ketika salah satu tombol ditekan, STM32 akan mengirimkan data berupa teks melalui komunikasi UART ke Raspberry Pi Pico. Pico kemudian menerima data tersebut dan mengolahnya. Setelah itu, Pico akan menampilkan informasi yang diterima ke LCD 16x2 menggunakan komunikasi I2C. Semua komponen mendapatkan suplai daya dari jalur yang sama, dan komunikasi antar mikrokontroler dilakukan secara serial.


4. Flowchart dan Listing Program [Kembali]

Flowchart :





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. Kondisi [Kembali]




7. Video Simulasi [Kembali]




8. Download File[Kembali]

File HTML [disini]
Datasheet Raspberry Pi Pico [disini]
Listing Program [disini]
Video [disini]
Datasheet STM32F103C8 [disini]

Datasheet LCD I2C 16x2 [disini]

0 comments:

Posting Komentar