- Pahami terlebih dahulu kondisi yang akan digunakan
- Buka Wokwi
- Persiapkan alat dan bahan
- Buat rangkaian sesuai dengan kondisi dan modul
- Sesuaikan konfigurasi pin
- Buat kode program untuk mengoperasikan rangkaian tersebut sesuai dengan kondisi
- Jalankan simulasi rangkaian.
- Proses selesai
2. Hardware dan Diagram Blok[Kembali]
a. Hardware
1. STM32 NUCLEO-G474RE
1. STM32 NUCLEO-G474RE
STM32 NUCLEO-G474RE adalah development board (papan pengembangan) terjangkau dan fleksibel dari STMicroelectronics, yang didasarkan pada mikrokontroler STM32G474RE (Arm® Cortex®-M4 @170MHz, 512KB Flash). Papan ini mendukung konektivitas Arduino Uno V3 dan ST Morpho, serta dilengkapi debugger ST-LINK terintegrasi, menjadikannya ideal untuk pembuatan prototipe cepat.
Motor servo adalah perangkat aktuator putar atau linier yang dirancang untuk kontrol posisi, kecepatan, dan percepatan yang presisi menggunakan sistem feedback loop tertutup.
Pushbutton adalah komponen sakelar mekanis sederhana yang dioperasikan dengan cara ditekan untuk menghubungkan (on) atau memutuskan (off) aliran arus listrik dalam suatu rangkaian..
4. Buzzer
Buzzer adalah suatu komponen elektronika yang berfungsi untuk mengubah energi listrik menjadi energi suara (bunyi) melalui mekanisme getaran. Komponen ini termasuk dalam kategori output device karena digunakan untuk memberikan respon berupa suara terhadap suatu kondisi atau perintah dalam rangkaian elektronik.
5. Resistor
Resistor adalah komponen elektronik pasif yang berfungsi untuk membatasi arus listrik dalam suatu rangkaian. Resistor bekerja berdasarkan hukum Ohm, yang menyatakan bahwa tegangan (V) = arus (I) × resistansi (R). Resistor memiliki satuan Ohm (Ω) dan digunakan dalam berbagai aplikasi seperti pembagian tegangan, kontrol arus, dan proteksi rangkaian elektronik.
b. Diagram Blok
3. Rangkaian Simulasi dan Prinsip Kerja[Kembali]
4. Flowchart dan Listing Program[Kembali]
A. Flowchart
B. Listring Program
#include "main.h"
// ================= HANDLE =================
ADC_HandleTypeDef hadc1;
TIM_HandleTypeDef htim3;
// ================= VARIABLE =================
uint8_t manual_mode = 0;
uint8_t posisi_servo = 0;
uint8_t last_button = 1;
// ================= THRESHOLD =================
#define LDR_THRESHOLD 2000
// ================= CLOCK =================
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;
HAL_RCC_OscConfig(&RCC_OscInitStruct);
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0);
}
// ================= GPIO =================
void MX_GPIO_Init(void)
{
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct = {0};
// LDR (PA0)
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
// BUTTON (PB1 - active low)
GPIO_InitStruct.Pin = GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
// SERVO (PA6 - TIM3 CH1)
GPIO_InitStruct.Pin = GPIO_PIN_6;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Alternate = GPIO_AF1_TIM3;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
// ================= ADC =================
void MX_ADC1_Init(void)
{
__HAL_RCC_ADC_CLK_ENABLE();
hadc1.Instance = ADC1;
hadc1.Init.Resolution = ADC_RESOLUTION_12B;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
HAL_ADC_Init(&hadc1);
}
// ================= PWM SERVO =================
void MX_TIM3_Init(void)
{
__HAL_RCC_TIM3_CLK_ENABLE();
htim3.Instance = TIM3;
htim3.Init.Prescaler = 48 - 1; // 1 us tick (48 MHz)
htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
htim3.Init.Period = 20000 - 1; // 20 ms (50 Hz)
HAL_TIM_PWM_Init(&htim3);
TIM_OC_InitTypeDef sConfigOC = {0};
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 1500; // posisi tengah
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1);
}
// ================= SERVO CONTROL =================
void set_servo(uint8_t state)
{
if (state == 0)
{
// Masuk (gelap)
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 1000);
}
else
{
// Keluar (terang)
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 2000);
}
}
// ================= READ LDR =================
uint16_t read_LDR(void)
{
ADC_ChannelConfTypeDef sConfig = {0};
sConfig.Channel = ADC_CHANNEL_0;
sConfig.Rank = ADC_REGULAR_RANK_1;
HAL_ADC_ConfigChannel(&hadc1, &sConfig);
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY);
return HAL_ADC_GetValue(&hadc1);
}
// ================= MAIN =================
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_ADC1_Init();
MX_TIM3_Init();
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
while (1)
{
// ===== BUTTON TOGGLE MODE =====
uint8_t button = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1);
if (last_button == 1 && button == 0)
{
manual_mode = !manual_mode;
// Saat masuk manual, langsung toggle posisi
if (manual_mode)
{
posisi_servo = !posisi_servo;
set_servo(posisi_servo);
}
HAL_Delay(200);
}
last_button = button;
// ===== MODE OTOMATIS =====
if (!manual_mode)
{
uint16_t ldr = read_LDR();
if (ldr > LDR_THRESHOLD)
{
// Cahaya tinggi → keluar
posisi_servo = 1;
}
else
{
// Cahaya rendah → masuk
posisi_servo = 0;
}
set_servo(posisi_servo);
}
HAL_Delay(100);
}
}
Download Video Simulasi [Klik Disini]
Download Analisa [Klik Disini]
.png)
No comments:
Post a Comment