TP P2K9
Langkah-langkah percobaan :
- Buka
web WOKWI.COM dan cari STM 32 NUCLEO C031C6
- Rangkai komponen sesuai dengan gambar
rangkaian di modul
- Klik
pada Library Manager untuk membuat file baru yang bernama main.h dan
main.c
- Masukan program yang telah di buat sesuai kondisi pada kedua file tersebut
- Simulasikan
2. Hardware dan Diagram Blok [Kembali]
a. Hardware
STM32 NUCLEO-G474RE adalah papan pengembangan (development board) berbasis mikrokontroler STM32 yang dirancang oleh STMicroelectronics untuk memudahkan proses pembelajaran, prototyping, dan pengembangan sistem embedded.
Secara spesifik, board ini menggunakan mikrokontroler STM32G474RE, yang termasuk dalam keluarga STM32 seri G4. Mikrokontroler ini berbasis inti ARM Cortex-M4 dengan kemampuan pemrosesan yang cukup tinggi serta dilengkapi dengan fitur DSP (Digital Signal Processing) dan FPU (Floating Point Unit), sehingga sangat cocok untuk aplikasi yang membutuhkan perhitungan matematis cepat seperti kontrol motor, sistem tenaga, dan pengolahan sinyal.
Push button
adalah komponen sakelar sederhana yang berfungsi untuk menghubungkan atau
memutuskan aliran arus listrik dalam suatu rangkaian dengan cara menekan
tombolnya. Pada penggunaan mikrokontroler, komponen ini berperan sebagai
perangkat input digital yang bekerja berdasarkan prinsip logika high atau low,
di mana status penekanannya dapat dibaca oleh pin GPIO atau digunakan untuk
memicu mekanisme interrupt eksternal. Agar pembacaan sinyal tetap stabil dan
terhindar dari kondisi floating, push button biasanya dikonfigurasi menggunakan
resistor pull-up atau pull-down yang memastikan level tegangan input tetap
berada pada kondisi logika yang jelas saat tombol tidak sedang ditekan.
4. LED
Motor servo
adalah perangkat aktuator yang dirancang dengan sistem umpan balik tertutup
(closed loop) untuk mengendalikan posisi sudut, kecepatan, dan akselerasi poros
secara presisi. Komponen ini bekerja berdasarkan sinyal kontrol PWM (Pulse
Width Modulation), di mana lebar pulsa yang diberikan ke pin kontrol akan
menentukan posisi derajat putaran porosnya, seperti pulsa 1 ms untuk posisi 0
derajat dan 2 ms untuk 180 derajat. Di dalam motor servo terdapat potensiometer
internal yang berfungsi mendeteksi posisi poros saat ini dan mengirimkan
informasi tersebut ke rangkaian kontrol untuk memastikan poros berhenti tepat
pada sudut yang diinginkan, sehingga sangat ideal digunakan pada sistem
robotika, kendali kemudi, maupun penggerak mekanik yang membutuhkan akurasi
tinggi.
b. Diagram Blok
3. Rangkaian Simulasi dan Prinsip Kerja [Kembali]
a. Flowchart
#include "main.h"
/* --- Handle Peripheral --- */
ADC_HandleTypeDef hadc1;
TIM_HandleTypeDef htim3;
/* --- Variabel Global --- */
uint8_t manual_mode = 0; // 0: Otomatis (LDR), 1: Manual (Tombol)
uint8_t posisi_servo = 0; // 0: Masuk (Teduh), 1: Keluar (Panas)
uint8_t last_button_state = 1;
/* --- Ambang Batas LDR --- */
#define LDR_THRESHOLD 2000
/* --- Prototipe Fungsi (Tanpa 'static' untuk menghindari Linker Error) --- */
void SystemClock_Config(void);
void MX_GPIO_Init(void);
void MX_ADC1_Init(void);
void MX_TIM3_Init(void);
void set_servo(uint8_t state);
uint16_t read_LDR(void);
void Error_Handler(void);
/**
* @brief Main program
*/
int main(void)
{
/* 1. Inisialisasi HAL */
HAL_Init();
/* 2. Konfigurasi Clock Sistem */
SystemClock_Config();
/* 3. Inisialisasi Semua Hardware */
MX_GPIO_Init();
MX_ADC1_Init();
MX_TIM3_Init();
/* 4. Jalankan PWM untuk Servo */
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
/* Loop Utama */
while (1)
{
// --- A. LOGIKA TOMBOL (PULL-UP: 0 = TEKAN) ---
uint8_t current_button = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1);
if (last_button_state == 1 && current_button == 0) // Deteksi Falling Edge
{
HAL_Delay(50); // Debounce
if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == 0)
{
manual_mode = !manual_mode; // Toggle antara Otomatis/Manual
if (manual_mode)
{
// Jika baru masuk mode manual, langsung switch posisi servo
posisi_servo = !posisi_servo;
set_servo(posisi_servo);
}
}
}
last_button_state = current_button;
// --- B. LOGIKA OTOMATIS (Hanya jika manual_mode == 0) ---
if (manual_mode == 0)
{
uint16_t ldr_val = read_LDR();
if (ldr_val < LDR_THRESHOLD)
{
// Kondisi: Mendung/Gelap -> Jemuran MASUK
posisi_servo = 0;
}
else
{
// Kondisi: Terang -> Jemuran KELUAR
posisi_servo = 1;
}
set_servo(posisi_servo);
}
HAL_Delay(100); // Delay stabilitas loop
}
}
/* ================= IMPLEMENTASI FUNGSI KONTROL ================= */
void set_servo(uint8_t state)
{
if (state == 0) // MASUK (0 Derajat)
{
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 1000);
}
else // KELUAR (180 Derajat)
{
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 2000);
}
}
uint16_t read_LDR(void)
{
uint16_t adc_val = 0;
HAL_ADC_Start(&hadc1);
if (HAL_ADC_PollForConversion(&hadc1, 10) == HAL_OK)
{
adc_val = HAL_ADC_GetValue(&hadc1);
}
HAL_ADC_Stop(&hadc1);
return adc_val;
}
/* ================= KONFIGURASI PERIPHERAL ================= */
void MX_ADC1_Init(void)
{
ADC_ChannelConfTypeDef sConfig = {0};
hadc1.Instance = ADC1;
hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;
hadc1.Init.Resolution = ADC_RESOLUTION_12B;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
if (HAL_ADC_Init(&hadc1) != HAL_OK) { Error_Handler(); }
sConfig.Channel = ADC_CHANNEL_0; // PA0
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); }
}
void MX_TIM3_Init(void)
{
TIM_OC_InitTypeDef sConfigOC = {0};
htim3.Instance = TIM3;
htim3.Init.Prescaler = 48 - 1; // Clock 48MHz -> 1MHz tick
htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
htim3.Init.Period = 20000 - 1; // 20ms period
htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
if (HAL_TIM_PWM_Init(&htim3) != HAL_OK) { Error_Handler(); }
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 1500;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1);
}
void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
/* PA0: ADC LDR */
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* PB1: Push Button (Input Pull-up) */
GPIO_InitStruct.Pin = GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
/* PA6: PWM Servo (AF1 untuk TIM3) */
GPIO_InitStruct.Pin = GPIO_PIN_6;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Alternate = GPIO_AF1_TIM3;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) { Error_Handler(); }
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) { Error_Handler(); }
}
void Error_Handler(void)
{
while(1);
}
}
5. Video Demo [Kembali]
6. Kondisi [Kembali]
8. Download File [Kembali]
- Download file lengkap (Rangkaian dan Program) (klik disini)
- Download video simulasi (klik disini)
- Download Datasheet Touch Sensor (klik disini)
- Download Datasheet Pir Sensor (klik disini)
- Download Datasheet Resistor (klik disini)
- Download Datasheet LED (klik disini)
- Download Datasheet Buzzer (klik disini)
Komentar
Posting Komentar