mPuP M2 P8 K2




Tugas Pendahuluan 2 Modul 2
(Percobaan 8 Kondisi 2)

1. Prosedur 
[Kembali]

1. Rangkai rangkaian di proteus sesuai dengan kondisi percobaan.
2. Buat program untuk mikrokontroler STM32F103C8 di software STM32 CubeIDE.
3. Compile program dalam format hex, lalu upload ke dalam mikrokontroler.
4. Setelah program selesai di upload, jalankan simulasi rangkaian pada proteus.
5. Selesai.

2. Hardware dan Diagram Blok [Kembali]

Hardware :

a) STM32F103C8








2. Motor DC (Dinamo DC, Motor Servo, dan Motor Stepper










3. Touch Sensor






4. Power Supply

 




3. Rangkaian Simulasi dan Prinsip Kerja [Kembali]

Rangkaian Simulasi Sebelum dirunning:



Rangkaian Simulasi Setelah dirunning:
 









Prinsip Kerja : 

Rangkaian ini merupakan sistem kontrol berbasis Raspberry Pi Pico yang menggunakan potensiometer sebagai input, servo motor sebagai aktuator, dan buzzer sebagai alat pemberi peringatan. Potensiometer berfungsi menghasilkan sinyal analog berupa tegangan yang bervariasi sesuai dengan posisi knop-nya. Tegangan ini dibaca oleh salah satu pin analog pada Raspberry Pi Pico, kemudian dikonversi menjadi nilai digital. Nilai digital tersebut digunakan untuk menentukan posisi sudut dari servo motor melalui sinyal PWM (Pulse Width Modulation). Dengan demikian, posisi servo akan mengikuti putaran dari potensiometer secara proporsional. Selain itu, buzzer yang terhubung juga dapat diaktifkan oleh Raspberry Pi Pico untuk memberikan peringatan suara jika nilai potensiometer atau posisi servo melebihi batas tertentu yang telah ditentukan dalam program. Sistem ini sering digunakan dalam aplikasi pembelajaran mikrokontroler, kendali aktuator, serta sistem monitoring sederhana berbasis input manual.

4. Flowchart dan Listing Program [Kembali]

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 TOUCH_SENSOR_PORT GPIOB #define TOUCH_SENSOR_PIN GPIO_PIN_0 #define MOTOR_DC_PORT GPIOB #define MOTOR_DC_PIN GPIO_PIN_7 // Mode Stepper 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; uint8_t current_mode = 0; // 0=CW, 1=CCW volatile uint8_t touch_state = 0; 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(); while (1) { // Saat tidak disentuh, jalankan stepper seperti biasa if (HAL_GPIO_ReadPin(TOUCH_SENSOR_PORT, TOUCH_SENSOR_PIN) == GPIO_PIN_RESET) {HAL_ADC_Start(&hadc1); if (HAL_ADC_PollForConversion(&hadc1, 10) == HAL_OK) { uint16_t adc_val = HAL_ADC_GetValue(&hadc1); current_mode = (adc_val < 2048) ? 0 : 1; // 0 = CW, 1 = CCW } if (current_mode == 0) { RunStepper(STEP_SEQ_CW, 5); } else { RunStepper(STEP_SEQ_CCW, 5); } } HAL_Delay(1); } } void RunStepper(const uint8_t *sequence, uint8_t speed) { static uint8_t step = 0; void MX_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {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); __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_AFIO_REMAP_SWJ_NOJTAG(); // Optional: disable JTAG to free PB3-PB4 if needed // Konfigurasi Touch Sensor sebagai input dengan EXTI (interrupt) GPIO_InitStruct.Pin = TOUCH_SENSOR_PIN; GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(TOUCH_SENSOR_PORT, &GPIO_InitStruct); // Aktifkan NVIC untuk EXTI0 HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0); HAL_NVIC_EnableIRQ(EXTI0_IRQn); // Konfigurasi Motor DC (PB7) GPIO_InitStruct.Pin = MOTOR_DC_PIN; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(MOTOR_DC_PORT, &GPIO_InitStruct); hadc1.Instance = ADC1; hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE; // Konfigurasi Stepper Motor (PB8-PB11) GPIO_InitStruct.Pin = IN1_PIN | IN2_PIN | IN3_PIN | IN4_PIN; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(STEPPER_PORT, &GPIO_InitStruct); } void MX_ADC1_Init(void) { ADC_ChannelConfTypeDef sConfig = {0}; 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 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 HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) { if (GPIO_Pin == TOUCH_SENSOR_PIN) { GPIO_PinState pinState = HAL_GPIO_ReadPin(TOUCH_SENSOR_PORT, TOUCH_SENSOR_PIN); if (pinState == GPIO_PIN_SET) { // Touch sensor ditekan - nyalakan 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 sensor dilepas - matikan motor DC HAL_GPIO_WritePin(MOTOR_DC_PORT, MOTOR_DC_PIN, GPIO_PIN_RESET); } } } // IRQ Handler untuk EXTI0 void EXTI0_IRQHandler(void) { HAL_GPIO_EXTI_IRQHandler(TOUCH_SENSOR_PIN); } void Error_Handler(void) { while(1) {} }



5. Kondisi [Kembali]

Percobaan 8 Kondisi 2
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 searah jarum jam

6. Video Simulasi [Kembali]





7. Download File [Kembali]

Download File Rangkaian [Download]














Komentar

Postingan populer dari blog ini