Tugas Pendahuluan II - Percobaan 8 Kondisi 4

 [KEMBALI KE MENU SEBELUMNYA]




MODUL II
PERCOBAAN 8 KONDISI 4

1. Prosedur
 [Kembali]

- Rangkai semua komponen sesuai kondisi yang dipilih
- Rangkai rangkaian sesuai percobaan 8 di modul 2
- Buat program pada STMCubeIDE dan jadikan library untuk komponen di protheus
- Jalankan program pada simulasi dan cobakan sesuai dengan modul dan kondisi

2. Hardware dan Diagram Blok [Kembali]

1. STM32F103C8





    2. ULN2003A




    3. Motor DC



    4. Motor DC Stepper



    5. Touch Sensor


   
     Diagram Blok




3. Rangkaian Simulasi dan Prinsip Kerja [Kembali]
    Gambar Rangkaian Sebelum Disimulasikan





                                  
    Gambar Rangkaian Setelah Disimulasikan
 




                                        
PRINSIP KERJA
    
    Mengatur dua jenis motor—motor stepper dan motor DC—dengan bantuan sensor sentuh dan potensiometer, menggunakan mikrokontroler STM32F1 dan library HAL. Sistem bekerja secara otomatis dengan membaca status dari sensor sentuh yang terhubung ke pin PB0. Jika sensor sentuh aktif (ditekan), maka motor DC akan menyala dengan mengaktifkan pin PB7, sementara motor stepper akan dimatikan dengan menyetel semua output stepper ke kondisi LOW. Namun, jika sensor sentuh tidak aktif, motor DC dimatikan dan sistem mulai membaca nilai analog dari potensiometer menggunakan ADC internal (channel 0).

Nilai dari potensiometer ini digunakan untuk menentukan perilaku motor stepper yang dikendalikan melalui empat pin output (PB8–PB11). Jika nilai ADC lebih dari 2048, motor stepper akan berputar ke arah berlawanan jarum jam (CCW) menggunakan urutan langkah STEP_SEQ_CCW. Jika nilainya di bawah atau sama dengan 2048, motor stepper akan bekerja dalam mode osilasi, yaitu bergerak bolak-balik antara arah searah jarum jam (CW) dan berlawanan jarum jam (CCW), dengan arah dikontrol oleh variabel oscillate_dir yang selalu berganti nilainya setiap siklus. Fungsi RunStepper mengatur logika pengaktifan masing-masing pin motor stepper berdasarkan urutan bit array dan memberikan delay antar langkah agar motor dapat bergerak secara bertahap. Fungsi-fungsi pendukung seperti MX_GPIO_Init, MX_ADC1_Init, dan SystemClock_Config digunakan untuk menginisialisasi semua perangkat keras yang diperlukan sebelum masuk ke loop utama.


4. FlowChart dan Listing Program [Kembali]

a. 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 TOUCH_SENSOR_PORT GPIOB #define TOUCH_SENSOR_PIN GPIO_PIN_0 #define MOTOR_DC_PORT GPIOB #define MOTOR_DC_PIN GPIO_PIN_7 // --- Stepper Mode --- const uint8_t STEP_SEQ_CW[4] = { (1<<0), // IN1 (1<<1), // IN2 (1<<2), // IN3 (1<<3) // IN4 }; const uint8_t STEP_SEQ_CCW[4] = { (1<<3), // IN4 (1<<2), // IN3 (1<<1), // IN2 (1<<0) // IN1 }; ADC_HandleTypeDef hadc1; void SystemClock_Config(void); void MX_GPIO_Init(void); void MX_ADC1_Init(void); void RunStepper(const uint8_t *sequence, uint8_t speed); void Error_Handler(void); int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_ADC1_Init(); uint8_t oscillate_dir = 0; while (1) { GPIO_PinState touch = HAL_GPIO_ReadPin(TOUCH_SENSOR_PORT, TOUCH_SENSOR_PIN); if (touch == GPIO_PIN_SET) { // Jika touch aktif → hidupkan motor DC, matikan stepper HAL_GPIO_WritePin(MOTOR_DC_PORT, MOTOR_DC_PIN, GPIO_PIN_SET); HAL_GPIO_WritePin(STEPPER_PORT, IN1_PIN | IN2_PIN | IN3_PIN | IN4_PIN, GPIO_PIN_RESET); } else { // Touch tidak aktif → baca potensiometer HAL_GPIO_WritePin(MOTOR_DC_PORT, MOTOR_DC_PIN, GPIO_PIN_RESET); HAL_ADC_Start(&hadc1); if (HAL_ADC_PollForConversion(&hadc1, 10) == HAL_OK) { uint16_t adc_val = HAL_ADC_GetValue(&hadc1); if (adc_val > 2048) { RunStepper(STEP_SEQ_CCW, 5); } else { // Mode Oscillate if (oscillate_dir == 0) { RunStepper(STEP_SEQ_CW, 5); } else { RunStepper(STEP_SEQ_CCW, 5); } oscillate_dir = !oscillate_dir; } } } HAL_Delay(1); } } // --- Fungsi Stepper --- void RunStepper(const uint8_t *sequence, uint8_t speed) { static uint8_t step = 0; HAL_GPIO_WritePin(STEPPER_PORT, IN1_PIN, (sequence[step] & (1<<0)) ? GPIO_PIN_SET : GPIO_PIN_RESET); HAL_GPIO_WritePin(STEPPER_PORT, IN2_PIN, (sequence[step] & (1<<1)) ? GPIO_PIN_SET : GPIO_PIN_RESET); HAL_GPIO_WritePin(STEPPER_PORT, IN3_PIN, (sequence[step] & (1<<2)) ? GPIO_PIN_SET : GPIO_PIN_RESET); HAL_GPIO_WritePin(STEPPER_PORT, IN4_PIN, (sequence[step] & (1<<3)) ? GPIO_PIN_SET : GPIO_PIN_RESET); step = (step + 1) % 4; HAL_Delay(speed); } // --- Inisialisasi GPIO --- void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOB_CLK_ENABLE(); // Touch sensor input GPIO_InitStruct.Pin = TOUCH_SENSOR_PIN; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(TOUCH_SENSOR_PORT, &GPIO_InitStruct); // Motor DC output GPIO_InitStruct.Pin = MOTOR_DC_PIN; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(MOTOR_DC_PORT, &GPIO_InitStruct); // Stepper motor output GPIO_InitStruct.Pin = IN1_PIN | IN2_PIN | IN3_PIN | IN4_PIN; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(STEPPER_PORT, &GPIO_InitStruct); } // --- Inisialisasi ADC untuk Potensiometer --- 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(); } } // --- Konfigurasi Clock Default --- 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; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE; 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(); } } // --- Error Handler --- void Error_Handler(void) { while (1) {} }




b. Flowchart





5. Kondisi [Kembali]
Kondisi  →Percobaan 8 Kondisi 4
        Buatlah rangkaian seperti gambar pada percobaan 8. Jika touch sensor mendeteksi maka motor dc berputar. Jika potensiometer bernilai besar maka motor stepper bergerak berlawanan jarum jam dan jika bernilai rendah maka motor stepper bergerak dengan Oscillate Mode


6. Video Simulasi [Kembali]





7. Download File [Kembali]

Download HMTL Klik disini
Download Simulasi Rangkaian Klik disini
Download Video Simulasi Klik disini
Download Datasheet STM32F103C8 Klik disini
Download Datasheet Touch sensorKlik disini
Download Datasheet Motor DC Klik disini
Download Datasheet Motor DC Stepper 
Klik disini
Download Datasheet ULN2003A Klik disini

Komentar

Postingan populer dari blog ini

MODUL I - GENERAL INPUT DAN OUTPUT

Sub Chapter 7.5

MODUL III - Counter