[menuju akhir]
PERCOBAAN 7
UART & I2C (STM – Pi Pico)
1. Prosedur[kembali]
Rangkaian
- Siapkan breadboard dan hubungkan push button ke pin PB12, PB13, dan PB14 pada STM32, masing-masing dengan konfigurasi input pull-up (bisa menggunakan resistor eksternal 10kΩ ke VCC jika diperlukan).
- Hubungkan PA9 (TX) STM32 ke GP1 (RX) Raspberry Pi Pico menggunakan jumper male to male.
- Satukan ground (GND) dari STM32 dan Raspberry Pi Pico.
- Hubungkan LCD I2C ke Raspberry Pi Pico pada pin GP4 (SDA) dan GP5 (SCL) sesuai alamat I2C (biasanya 0x27), dan pastikan diberi catu daya 3.3V atau 5V sesuai spesifikasi LCD.
- Pastikan semua koneksi kuat dan tidak terbalik.
Pengujian program
- Upload program ke STM32 menggunakan STM32CubeIDE atau STM32CubeMX untuk mendeteksi tombol dan mengirim data melalui UART.
- Upload program MicroPython ke Raspberry Pi Pico menggunakan Thonny IDE untuk membaca data UART dan menampilkan hasil ke LCD.
- Setelah kedua program berjalan, tekan salah satu tombol (PB12, PB13, atau PB14).
- Jika tombol PB12 ditekan, LCD harus menampilkan “Warna: Merah”.
- Jika tombol PB13 ditekan, LCD harus menampilkan “Warna: Hijau”.
- Jika tombol PB14 ditekan, LCD harus menampilkan “Warna: Biru”.
- Ulangi penekanan tombol lain untuk menguji konsistensi sistem.
2. Hardware dan Diagram Blok[kembali]
STM32 adalah keluarga mikrokontroler berbasis arsitektur ARM Cortex yang dikembangkan oleh STMicroelectronics. Mikrokontroler ini memiliki performa tinggi, konsumsi daya rendah, serta fitur periferal yang lengkap, seperti ADC (Analog to Digital Converter), komunikasi serial (UART, SPI, I2C), dan GPIO yang dapat dikonfigurasi sesuai kebutuhan. STM32 sering digunakan dalam sistem tertanam (embedded systems) untuk berbagai aplikasi, termasuk otomasi, robotika, dan perangkat IoT.
- Raspberry Pi Pico
Raspberry Pi Pico adalah mikrokontroler berbasis RP2040, yaitu chip buatan Raspberry Pi yang memiliki dual-core ARM Cortex-M0+ dengan kecepatan hingga 133 MHz. Mikrokontroler ini digunakan untuk berbagai proyek embedded system, seperti robotika, otomasi, dan pemrosesan sinyal, karena memiliki GPIO (General Purpose Input Output) yang fleksibel serta mendukung pemrograman dengan MicroPython dan C/C++.
- Breadboard
Breadboard adalah sebuah papan yang digunakan untuk merancang dan menguji rangkaian elektronik secara sementara tanpa perlu menyolder komponen. Breadboard memungkinkan perakitan rangkaian secara cepat dan mudah, sehingga sangat berguna dalam prototyping dan eksperimen elektronik.
- Jumper male to male
Kabel jumper Male to Male adalah kabel yang memiliki konektor jantan (male) di kedua ujungnya. Kabel ini biasanya digunakan untuk menghubungkan pin pada board elektronik, seperti Raspberry Pi, Arduino, atau breadboard, dengan komponen lainnya. Kabel jumper male to male sering digunakan dalam rangkaian prototyping atau percobaan karena fleksibilitas dan kemudahannya untuk digunakan.
- Push Button
Push button adalah saklar atau tombol yang digunakan untuk menghubungkan atau memutuskan sirkuit listrik. Tombol ini biasanya bersifat sementara (momentary), yang berarti ketika tombol ditekan, arus listrik akan mengalir, dan ketika tombol dilepaskan, arus listrik akan terputus. Fungsi utama push button adalah untuk memberikan input atau perintah ke sistem. Dalam rangkaian ini, push button dapat digunakan untuk mengaktifkan atau mengubah status sistem, seperti memulai pembacaan sensor kelembaban tanah atau mengubah mode kerja rangkaian.
Resistor adalah komponen elektronik yang digunakan untuk membatasi atau mengatur aliran arus listrik dalam suatu rangkaian. Resistor bekerja dengan cara menambah hambatan pada rangkaian, yang bergantung pada nilai resistansi yang diberikan (dalam ohm). Resistor berfungsi untuk mengatur arus listrik yang mengalir pada komponen lain, seperti LED RGB atau sensor. Dalam rangkaian ini, resistor digunakan untuk melindungi LED RGB dari aliran arus yang berlebihan, serta untuk menyesuaikan sinyal yang diterima oleh sensor kelembaban tanah.
3. Rangkaian Simulasi dan Prinsip Kerja[kembali]

Rangkaian ini bekerja dengan prinsip komunikasi serial UART antara mikrokontroler STM32 dan Raspberry Pi Pico. Pada sisi STM32, tiga tombol ditekan sebagai input digital yang terhubung ke pin PB12, PB13, dan PB14. Ketika salah satu tombol ditekan, STM32 akan membaca kondisi tombol sebagai logika rendah (karena konfigurasi pull-up internal), kemudian mengirimkan sebuah string teks melalui UART (misalnya "MERAH", "HIJAU", atau "BIRU") melalui pin PA9 (TX). Komunikasi serial ini menggunakan konfigurasi standar: baudrate 9600, 8-bit data, tanpa parity, dan 1 stop bit. Proses ini terjadi secara berulang di dalam loop utama, dengan penundaan singkat setelah pengiriman untuk menghindari pembacaan berulang ketika tombol masih ditekan.
Sementara itu, Raspberry Pi Pico bertindak sebagai penerima data UART. Pico menerima data dari pin RX (GP1) dan menggunakan modul UART0 untuk membaca data yang masuk dari STM32. Data yang diterima kemudian diproses dan ditampilkan pada LCD I2C yang terhubung ke pin GP4 (SDA) dan GP5 (SCL). Pico akan menampilkan informasi warna sesuai string yang diterima, misalnya "Warna: Merah" jika data yang diterima adalah "MERAH". Jika data yang diterima tidak sesuai dengan ketiga pilihan, maka string tersebut tetap akan ditampilkan di LCD. Proses ini memungkinkan sistem mendeteksi input fisik dari tombol pada STM32 dan menampilkannya secara real-time pada LCD melalui Raspberry Pi Pico, membentuk sistem komunikasi dua perangkat yang responsif dan sederhana.
4. Flowchart dan Listing Program [kembali]

>
stm 32#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_
>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. Analisa [kembali]
6. Video Simulasi [kembali]
7. Download file [kembali]
[menuju awal]
Tidak ada komentar:
Posting Komentar