a) Prosedur[Kembali]

  1. Menyusun rangkaian sesuai pada percobaan 2 modul di breadboard.
  2. Buka software STM32CubeIDE.
  3. Listing program pada software STM32CubeIDE, sesuaikan konfigurasi pin di program dengan pin yang digunakan pada STM32F103C8 di breadboard.
  4. Generate code pada software untuk mendapatkan file program C, lalu masukkan algoritma rangkaian ke dalam file.
  5. Konversikan file ke dalam ekstensi .hex.
  6. Masukkan file dengan ekstensi .hex ke dalam STM32F103C8 di rangkaian.
  7. Simulasikan/jalankan rangkaian pada breadboard.
  8. Cek apakah setiap komponen rangkaian pada breadboard berfungsi dan berjalan sesuai algoritma program.
  9. Jika terdapat kendala atau masalah pada rangkaian maka lakukan problem solving terlebih dahulu hingga rangkaian berjalan sebagaimana mestinya.
  10. Selesai.

b) Hardware dan Diagram Blok[Kembali]

  • STM32.
  • Motor Stepper.
  • LED RGB.
  • Soil Moisture Sensor.

c) Rangkaian Simulasi dan Prinsip Kerja[Kembali]



  • Rangkaian Simulasi

Gambar 1. Rangkaian Percobaan 1. 

  • Prinsip Kerja

Prinsip kerja rangkaian ini adalah untuk mengontrol motor stepper menggunakan STM32. Pengaturan arah putaran motor dilakukan dengan membaca nilai dari hasil pembacaan soil moisture sensor. Selain itu, rangkaian ini juga dilengkapi dengan tiga buah LED RGB yang berfungsi sebagai indikator visual untuk menunjukkan mode operasi motor yang sedang aktif.

Pada awal eksekusi, sistem akan menginisialisasi konfigurasi yang dibutuhkan, seperti pengaturan clock, GPIO Input Output, dan termasuk konfigurasi input GPIO ADC. Empat pin pada port GPIOB digunakan sebagai output untuk menggerakkan motor stepper, sedangkan tiga pin lainnya digunakan untuk menyalakan LED RGB.

Selanjutnya, program masuk ke algoritma utama, di mana sistem secara terus-menerus membaca nilai analog dari sensor melalui pin ADC. Nilai analog ini terlebih dahulu dikonversi ke nilai digital oleh ADC. Nilai digital yang diperoleh ini digunakan sebagai dasar untuk menentukan mode kerja motor dan juga menghidupkan LED RGB sebagai lampu indikator:

  1. Mode Searah Jarum Jam 
    Jika nilai digital < 1365, motor akan berputar ke kanan. Dalam mode ini, LED merah akan menyala dan LED biru hijau mati.

  2. Mode Berlawanan Arah Jarum Jam 
    Jika nilai digital berada pada rentang 1365-2730, motor akan berputar ke kiri. LED hijau akan menyala sebagai penanda, dan LED merah biru mati.

  3. Mode Osilasi (Maju-Mundur)
    Jika nilai digital >2730, motor akan bergerak maju dan mundur secara bergantian. LED biru akan menyala untuk menunjukkan bahwa mode osilasi sedang aktif, dan LED merah hijau mati.

Pergerakan motor diatur menggunakan fungsi RunStepper(), yang akan menyalakan pin GPIO sesuai urutan yang ditentukan dalam array. Fungsi ini juga mengatur jeda waktu antar langkah motor agar kecepatannya sesuai.

Khusus untuk mode osilasi, program akan memeriksa apakah motor telah mencapai langkah terakhir dalam satu arah. Jika iya, maka arah putaran akan dibalik. Dengan logika ini, motor dapat bergerak bolak-balik secara otomatis tanpa perlu intervensi tambahan.


d) Flowchart dan Listing Program[Kembali]


  • Flowchart
Gambar 2. Flowchart.

  • Listing Program 

#include "stm32f1xx_hal.h"

 

// Konfigurasi Hardware

#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_RED_PIN                  GPIO_PIN_12 #define LED_GREEN_PIN GPIO_PIN_13 #define LED_BLUE_PIN GPIO_PIN_14 #define LED_PORT                     GPIOB

 

// Mode 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

 

ADC_HandleTypeDef hadc1;

uint8_t current_mode = 0; // 0=CW, 1=CCW, 2=Oscillate

uint8_t direction = 0;    // Untuk mode oscillate

 

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 potensiometer untuk pilih mode

HAL_ADC_Start(&hadc1);

if (HAL_ADC_PollForConversion(&hadc1, 10) == HAL_OK) {

uint16_t adc_val = HAL_ADC_GetValue(&hadc1);

 

// Tentukan mode

if (adc_val < 1365) { // Mode 1: 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) { // Mode 2: 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 { // Mode 3: 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 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 == (STEPPER_PORT->ODR & 0x00FF) | STEP_SEQ_CW[3])

direction = 1;

} else {

RunStepper(STEP_SEQ_CCW, 5);

if(STEPPER_PORT->ODR == (STEPPER_PORT->ODR & 0x00FF) | STEP_SEQ_CCW[3])

direction = 0;

}

break;

}

}

}

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);

}

 

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();

}

}

 

void MX_GPIO_Init(void) {

GPIO_InitTypeDef GPIO_InitStruct = {0};

 

  HAL_RCC_GPIOB_CLK_ENABLE();

 

// Konfigurasi LED

GPIO_InitStruct.Pin = LED_RED_PIN | LED_GREEN_PIN | LED_BLUE_PIN; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

GPIO_InitStruct.Pull = GPIO_PULLDOWN; // Tambahkan pull-down GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; // High speed untuk stabil HAL_GPIO_Init(LED_PORT, &GPIO_InitStruct);

 

// Konfigurasi Stepper

GPIO_InitStruct.Pin = IN1_PIN | IN2_PIN | IN3_PIN | IN4_PIN;

HAL_GPIO_Init(STEPPER_PORT, &GPIO_InitStruct);

}

 

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();

}

}

void Error_Handler(void) {

while(1) {}

}


e) Video Demo[Kembali]


Video 1. Video Percobaan 1.


f) Analisa[Kembali]



Gambar 3. Analisa.


g) Download File[Kembali]

Download video percobaan [klik]