Percobaan 7
1. Rangkai semua komponen pada kedua development board yang terhubung ke mikrokontroler STM32F103C8 dan Raspberry Pi Pico.
2. Buat program untuk mikrokontroler STM32F103C8 di software STM32 CubeIDE dan program untuk mikrokontroler Raspberry Pi Pico di software Thonny.
3. Build program yang telah dibuat pada software STM32 CubeIDE, lalu inputkan program ke dalam mikrokontroler STM32F103C8 melalui stlink. Kemudian inputkan juga program dari software Thonny ke dalam mikrokontroler Raspberry Pi Pico melalui USB.
4. Setelah program diinputkan, uji rangkaian yang telah dirangkai sesuai dengan output yang ditentukan.
3. Build program yang telah dibuat pada software STM32 CubeIDE, lalu inputkan program ke dalam mikrokontroler STM32F103C8 melalui stlink. Kemudian inputkan juga program dari software Thonny ke dalam mikrokontroler Raspberry Pi Pico melalui USB.
4. Setelah program diinputkan, uji rangkaian yang telah dirangkai sesuai dengan output yang ditentukan.
5. Selesai.
2. Alat dan Bahan [Kembali]
Hardware :
- Raspberry pi pico
- STM32F103C8
- Push Button
- Resistor
3. Rangkaian Simulasi [Kembali]
4. Prinsip Kerja Rangkaian & Listing Code [Kembali]
- Prinsip Kerja
Prinsip kerja dari rangkaian dan program adalah komunikasi antar mikrokontroler (STM32 dan Raspberry Pi Pico) menggunakan protokol UART, dan menampilkan data pada LCD I2C. Raspberry Pi Pico berperan sebagai master pengendali tampilan, sedangkan STM32 bertindak sebagai pengirim data input dari push button. Komunikasi antara STM32 dan Raspberry Pi Pico menggunakan protokol UART, sedangkan komunikasi antara Raspberry Pi Pico dengan LCD menggunakan protokol I2C.
Pada rangkaian, tiga push button terhubung ke pin input STM32 (PB12, PB13, dan PB14) dengan konfigurasi pull-up, sehingga ketika tombol ditekan, pin akan membaca logika rendah (LOW). Program pada STM32 akan membaca kondisi pin tersebut secara terus menerus dalam loop. Ketika tombol ditekan, STM32 mengirimkan data berupa string teks seperti "MERAH", "HIJAU", atau "BIRU" melalui UART. Raspberry Pi Pico menerima data ini melalui pin UART (RX), kemudian memproses string yang diterima dan mencocokkannya dengan kondisi yang telah ditentukan. Jika cocok, maka Raspberry Pi Pico menampilkan warna yang sesuai pada LCD 16x2 menggunakan protokol I2C. LCD menggunakan alamat 0x27. Pi Pico menggunakan library
pico_i2c_lcd
untuk menampilkan pesan teks. Data diproses menggunakan fungsi process_uart_data
. Pesan seperti "MERAH"
akan diterjemahkan dan ditampilkan di LCD sebagai "Warna: Merah"
. Dengan demikian, sistem ini menunjukkan proses input dari push button yang dikirimkan melalui UART ke Raspberry Pi Pico, dan hasilnya ditampilkan dalam bentuk teks di LCD.Listing Code:
- 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 Rangkaian [Kembali]
7. Link Download [Kembali]
Video Simulasi klik disini
Tidak ada komentar:
Posting Komentar