LA 2 M2 UP UC
Percobaan 2
- Rangkai semua komponen dengan output buzzer dan LED RGB
Buatlah program dengan konfigurasi pin GP26 STM32 ,lalu upload program STM32
- Jalankan program dan cobakan sesuai kondisi
- amati perubahan yang terdeteksi saat tanah basah/kering
.
2. Hardware dan Diagram Blok[Kembali]
- prinsip kerja
Rangkaian dan program ini dirancang untuk mengontrol pergerakan motor stepper secara otomatis berdasarkan tingkat kelembapan tanah dengan memanfaatkan mikrokontroler STM32 sebagai unit pengendali utama. Sensor soil moisture berfungsi sebagai pendeteksi kelembapan, di mana data analognya dikirimkan ke pin ADC1 STM32 untuk diubah menjadi nilai digital. Nilai digital inilah yang kemudian digunakan sebagai acuan dalam menentukan mode pergerakan motor stepper, yang terdiri dari tiga kondisi: berputar searah jarum jam (Clockwise/CW), berputar berlawanan arah jarum jam (Counter-Clockwise/CCW), atau bergerak bolak-balik (oscillate) sesuai kondisi tanah yang terdeteksi.
Pada kondisi pertama ketika nilai ADC berada di bawah 1365, motor akan bergerak secara searah jarum jam (CW) sebagai indikasi kelembapan rendah, ditandai dengan menyala-nya LED merah. Kondisi kedua terjadi pada rentang nilai ADC antara 1365 hingga 2730, di mana motor akan berputar berlawanan arah jarum jam (CCW) dan LED hijau akan menyala sebagai indikator kelembapan sedang. Sementara itu, apabila nilai ADC melebihi 2730, sistem akan mengaktifkan mode bolak-balik (oscillate) untuk motor, serta menyalakan LED biru sebagai tanda bahwa kelembapan tanah berada pada tingkat tinggi.
Pergerakan motor stepper dikendalikan melalui empat pin GPIOB (IN1–IN4) dengan penerapan urutan bit yang diambil dari array STEP_SEQ_CW untuk putaran searah jarum jam dan STEP_SEQ_CCW untuk putaran berlawanan arah jarum jam. Fungsi RunStepper berperan dalam mengatur langkah pergerakan motor dengan memberikan jeda (delay) tertentu guna menyesuaikan kecepatan putaran sesuai kebutuhan. Seluruh proses ini berlangsung secara otomatis dan kontinu, sehingga sistem mampu merespons perubahan kelembapan tanah secara real-time tanpa memerlukan intervensi manual pengguna.
Dengan demikian, sistem ini tidak hanya menawarkan kontrol motor yang adaptif terhadap kondisi lingkungan, tetapi juga mendemonstrasikan penerapan konversi sinyal analog ke digital untuk mengatur perangkat aktuator dalam aplikasi otomasi berbasis mikrokontroler
4. Flowchart dan Listing Program[Kembali]
- Listing Program
Listing Program :
#include "stm32f1xx_hal.h"
// === Konfigurasi Pin ===
#define STEPPER_PORT GPIOB
#define IN1_PIN GPIO_PIN_8
#define IN2_PIN GPIO_PIN_9
#define IN3_PIN GPIO_PIN_10
#define IN4_PIN GPIO_PIN_11
#define LED_PORT GPIOB
#define LED_RED_PIN GPIO_PIN_12
#define LED_GREEN_PIN GPIO_PIN_13
#define LED_BLUE_PIN GPIO_PIN_14
// === Urutan Langkah Stepper ===
const uint16_t STEP_SEQ_CW[4] = {0x0100, 0x0200, 0x0400, 0x0800}; // Clockwise
const uint16_t STEP_SEQ_CCW[4] = {0x0800, 0x0400, 0x0200, 0x0100}; // Counter-clockwise
// === Global Variabel ===
ADC_HandleTypeDef hadc1;
uint8_t current_mode = 0; // 0=CW, 1=CCW, 2=Oscillate
uint8_t direction = 0; // Untuk mode oscillate
// === Fungsi Prototipe ===
void SystemClock_Config(void);
void MX_GPIO_Init(void);
void MX_ADC1_Init(void);
void RunStepper(const uint16_t *sequence, uint8_t speed);
void Error_Handler(void);
int main(void) {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_ADC1_Init();
while (1) {
// Baca sensor kelembaban
HAL_ADC_Start(&hadc1);
if (HAL_ADC_PollForConversion(&hadc1, 10) == HAL_OK) {
uint16_t adc_val = HAL_ADC_GetValue(&hadc1);
// Tentukan mode berdasarkan nilai ADC
if (adc_val < 1365) { // CW
current_mode = 0;
HAL_GPIO_WritePin(LED_PORT, LED_RED_PIN, GPIO_PIN_SET);
HAL_GPIO_WritePin(LED_PORT, LED_GREEN_PIN | LED_BLUE_PIN, GPIO_PIN_RESET);
}
else if (adc_val < 2730) { // CCW
current_mode = 1;
HAL_GPIO_WritePin(LED_PORT, LED_GREEN_PIN, GPIO_PIN_SET);
HAL_GPIO_WritePin(LED_PORT, LED_RED_PIN | LED_BLUE_PIN, GPIO_PIN_RESET);
}
else { // Oscillate
current_mode = 2;
HAL_GPIO_WritePin(LED_PORT, LED_BLUE_PIN, GPIO_PIN_SET);
HAL_GPIO_WritePin(LED_PORT, LED_RED_PIN | LED_GREEN_PIN, GPIO_PIN_RESET);
}
}
// Eksekusi mode gerakan motor
switch (current_mode) {
case 0: // CW
RunStepper(STEP_SEQ_CW, 10);
break;
case 1: // CCW
RunStepper(STEP_SEQ_CCW, 10);
break;
case 2: // Oscillate
if (direction == 0) {
RunStepper(STEP_SEQ_CW, 5);
if ((STEPPER_PORT->ODR & 0xFF00) == STEP_SEQ_CW[3])
direction = 1;
} else {
RunStepper(STEP_SEQ_CCW, 5);
if ((STEPPER_PORT->ODR & 0xFF00) == STEP_SEQ_CCW[3])
direction = 0;
}
break;
}
}
}
// === Fungsi Menggerakkan Motor Stepper ===
void RunStepper(const uint16_t *sequence, uint8_t speed) {
static uint8_t step = 0;
STEPPER_PORT->ODR = (STEPPER_PORT->ODR & 0x00FF) | sequence[step];
step = (step + 1) % 4;
HAL_Delay(speed);
}
// === Konfigurasi Clock STM32 ===
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_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) {
Error_Handler();
}
}
// === Inisialisasi GPIO untuk LED dan Motor ===
void MX_GPIO_Init(void) {
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOB_CLK_ENABLE();
// LED Output
GPIO_InitStruct.Pin = LED_RED_PIN | LED_GREEN_PIN | LED_BLUE_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_PULLDOWN;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(LED_PORT, &GPIO_InitStruct);
// Stepper Motor Output
GPIO_InitStruct.Pin = IN1_PIN | IN2_PIN | IN3_PIN | IN4_PIN;
HAL_GPIO_Init(STEPPER_PORT, &GPIO_InitStruct);
}
// === Inisialisasi ADC1 untuk Sensor ===
void MX_ADC1_Init(void) {
ADC_ChannelConfTypeDef sConfig = {0};
hadc1.Instance = ADC1;
hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
hadc1.Init.ContinuousConvMode = DISABLE;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 1;
if (HAL_ADC_Init(&hadc1) != HAL_OK) {
Error_Handler();
}
sConfig.Channel = ADC_CHANNEL_0;
sConfig.Rank = ADC_REGULAR_RANK_1;
sConfig.SamplingTime = ADC_SAMPLETIME_71CYCLES_5;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) {
Error_Handler();
}
}
// === Penanganan Error ===
void Error_Handler(void) {
while (1) {
// Loop terus jika error
}
}
Video Simulasi download
datasheet STM32 download
datasheet sensor soil moisture download
datasheet LED RGB download
Komentar
Posting Komentar