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
ADC_HandleTypeDef hadc1;
TIM_HandleTypeDef htim3;
uint8_t last_button = 1;
uint8_t manual_mode = 0;
uint8_t posisi_servo = 0;
// ================= 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();
GPIO_InitTypeDef GPIO_InitStruct = {0};
// LDR PA0
GPIO_InitStruct.Pin = LDR_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
HAL_GPIO_Init(LDR_PORT, &GPIO_InitStruct);
// SERVO PA6 = TIM3_CH1
GPIO_InitStruct.Pin = SERVO_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Alternate = GPIO_AF1_TIM3;
HAL_GPIO_Init(SERVO_PORT, &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 =================
void MX_TIM3_Init(void)
{
__HAL_RCC_TIM3_CLK_ENABLE();
htim3.Instance = TIM3;
// 48MHz / 48 = 1MHz
// 1 tick = 1us
htim3.Init.Prescaler = 48 - 1;
htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
htim3.Init.Period = 20000 - 1; // 20ms = 50Hz
htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
HAL_TIM_PWM_Init(&htim3);
TIM_OC_InitTypeDef sConfigOC = {0};
sConfigOC.OCMode = TIM_OCMODE_PWM1;
sConfigOC.Pulse = 1500;
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
// PA6 = TIM3_CH1
HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1);
}
// ================= SERVO =================
void set_servo(uint8_t state)
{
if(state == 0)
{
// posisi kiri
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 1000);
}
else
{
// posisi kanan
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, 2000);
}
}
// ================= ADC READ =================
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();
// start PWM PA6 TIM3_CH1
HAL_TIM_PWM_Start(&htim3, TIM_CHANNEL_1);
while (1)
{
// ===== BUTTON TOGGLE =====
uint8_t button = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1);
if (last_button == 1 && button == 0)
{
manual_mode = !manual_mode;
posisi_servo = !posisi_servo;
set_servo(posisi_servo);
HAL_Delay(0);
}
last_button = button;
// ===== MODE OTOMATIS =====
if (!manual_mode)
{
uint16_t ldr = read_LDR();
if (ldr < LDR_THRESHOLD)
{
posisi_servo = 0;; // mendung → masuk
}
else
{
posisi_servo = 1; // terang → keluar
}
set_servo(posisi_servo);
}
HAL_Delay(100);
}
}
2. main.h
#ifndef __MAIN_H
#define __MAIN_H
#include "stm32c0xx_hal.h"
// ================= HANDLE =================
extern ADC_HandleTypeDef hadc1;
extern TIM_HandleTypeDef htim3;
// ================= PIN =================
// LDR PA0
#define LDR_PIN GPIO_PIN_0
#define LDR_PORT GPIOA
// SERVO PA6 = TIM3_CH1
#define SERVO_PIN GPIO_PIN_6
#define SERVO_PORT GPIOA
// ================= THRESHOLD =================
#define LDR_THRESHOLD 1500
// ================= FUNCTION =================
void SystemClock_Config(void);
void MX_GPIO_Init(void);
void MX_ADC1_Init(void);
void MX_TIM3_Init(void);
uint16_t read_LDR(void);
void set_servo(uint8_t state);
#endif
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)






0 comments:
Posting Komentar