LA 2 uP uC M2

 [KEMBALI KE MENU SEBELUMNYA]


LA 2 - Percobaan 8

Motor DC (Dinamo DC), Motor Stepper, Touch Sensor, Potensiometer


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. Jalankan simulasi rangkaian pada proteus.
5. Selesai.

2. Hardware dan Diagram Blok [Kembali]

Hardware:
1. Mikrokontroler STM32F103C8
STM32F103C8 board – Microscale

2. Touch Sensor

Touch Sensor Module — SunFounder Ultimate Sensor Kit documentation



3. Power Supply


4. Motor DC (Dinamo DC)


5. Motor Stepper


6. ULN2003A


7. Potensiometer


Diagram Blok:


3. Rangkaian Simulasi dan Prinsip Kerja [Kembali]

Rangkaian Simulasi :
 


Prinsip Kerja : 
Pada rangkaian ini, mikrokontroler STM32F103C8 berfungsi sebagai pusat pengendali utama yang menerima input dari touch sensor dan potensiometer, serta mengontrol keluaran untuk motor stepper melalui driver ULN2003A.

Saat touch sensor tidak mendeteksi adanya sentuhan, mikrokontroler akan mengaktifkan motor stepper sehingga motor stepper berputar, sedangkan motor DC tidak digunakan dalam sistem ini. Pada kondisi ini, mikrokontroler membaca nilai analog dari potensiometer melalui pin ADC (PA0) dan menentukan arah gerak motor stepper. Jika nilai potensiometer rendah (< 2048), maka motor stepper akan berputar searah jarum jam (CW). Sebaliknya, jika nilai potensiometer tinggi (≥ 2048), maka motor stepper akan berputar berlawanan arah jarum jam (CCW).

Sebaliknya, jika terdapat sentuhan yang terdeteksi oleh touch sensor, maka motor stepper tidak akan bergerak. Dalam kondisi ini, semua output yang mengontrol motor stepper akan diset ke keadaan LOW sehingga motor stepper diam.

Pergerakan motor stepper diatur menggunakan pola aktivasi langkah (step sequence) yang telah ditentukan sebelumnya untuk arah searah dan berlawanan jarum jam. Keseluruhan sistem ini bekerja secara real-time di mana pembacaan sensor dan pengontrolan motor dilakukan secara terus-menerus dalam loop utama program. Dengan demikian, sistem memastikan bahwa motor stepper hanya aktif saat tidak ada sentuhan, serta perubahan kondisi pada sensor atau potensiometer langsung tercermin pada gerakan motor dengan respons cepat dan stabil.
4. Flowchart dan Listing Program [Kembali]

Flowchart :


Listing Program :

#include "stm32f1xx_hal.h"


// ============================

// Konstanta dan Definisi 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 TOUCH_SENSOR_PORT GPIOB

#define TOUCH_SENSOR_PIN GPIO_PIN_0


#define MOTOR_DC_PORT GPIOB

#define MOTOR_DC_PIN GPIO_PIN_7


// ============================

// Variabel Global

// ============================

ADC_HandleTypeDef hadc1;


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

};


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

volatile uint8_t touch_state = 0; // Status sentuh (jika dibutuhkan untuk ekstensi)


// ============================

// Deklarasi Fungsi

// ============================

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


// ============================

// Fungsi Utama

// ============================

int main(void) {

HAL_Init();

SystemClock_Config();

MX_GPIO_Init();

MX_ADC1_Init();


while (1) {

// Saat sensor tidak disentuh

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;

}


if (current_mode == 0) {

RunStepper(STEP_SEQ_CW, 5);

} else {

RunStepper(STEP_SEQ_CCW, 5);

}

}


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

__HAL_AFIO_REMAP_SWJ_NOJTAG(); // Bebaskan PB3 dan PB4 jika dibutuhkan


// Touch Sensor (Input + 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);


HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0);

HAL_NVIC_EnableIRQ(EXTI0_IRQn);


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


// Stepper Motor (PB8 - PB11)

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

HAL_GPIO_Init(STEPPER_PORT, &GPIO_InitStruct);

}


// ============================

// Inisialisasi ADC

// ============================

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

// ============================

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

}

}


// ============================

// Callback EXTI (Interrupt)

// ============================

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

// Saat disentuh: 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 {

// Saat dilepas: matikan motor DC

HAL_GPIO_WritePin(MOTOR_DC_PORT, MOTOR_DC_PIN, GPIO_PIN_RESET);

}

}

}


// ============================

// Interrupt Handler

// ============================

void EXTI0_IRQHandler(void) {

HAL_GPIO_EXTI_IRQHandler(TOUCH_SENSOR_PIN);

}


// ============================

// Error Handler

// ============================

void Error_Handler(void) {

while (1) {}

}


5. Video Demo [Kembali]




6. Analisa [Kembali]

 1. Mengapa motor stepper perlu driver sedangkan motor DC tidak selalu?

Jawab:

A. Motor Stepper:

 Alasan perlu driver:

  •    Motor stepper memiliki beberapa kumparan (biasanya 4 atau lebih) yang harus diaktifkan dalam urutan tertentu untuk menggerakkan motor satu langkah demi satu langkah.
  •    Driver bertugas mengatur urutan pulsa (step), mengontrol arah, serta mengatur arus/tegangan ke tiap fasa motor.
  •    Pengendalian langsung dari mikrokontroler akan terlalu kompleks dan bisa merusak pin karena arus motor lebih besar dari kemampuan pin I/O biasa.
 B. Motor DC:

 Tidak selalu perlu driver, karena:
  •    Dapat langsung dikendalikan dengan tegangan DC sederhana — misalnya 0V untuk mati dan 5V atau 12V untuk hidup.
  •    Namun, jika ingin kontrol kecepatan atau arah, maka tetap perlu driver (HBridge) atau PWM control.
  •    Jadi, untuk kontrol sederhana, MDC bisa lebih mudah dihubungkan.


 2. Bagaimana potensiometer memengaruhi arah putar servo motor?

Jawab:

 A. Servo motor:

  • Umumnya memiliki feedback internal dari potensiometer untuk menentukan posisi poros.
  •  Servo menerima sinyal PWM, dan membandingkan nilai posisi PWM dengan posisi aktual dari potensiometer.

B.  Analisis hubungan arah putar dan potensiometer:

  •  Ketika sinyal PWM berubah (misalnya untuk mengatur sudut 0° ke 90°), kontroler internal membandingkan nilai ini dengan nilai resistansi potensiometer.
  •  Jika nilai PWM menunjukkan posisi target lebih besar dari posisi potensiometer saat ini, maka servo berputar ke kanan.
  •  Jika nilai PWM lebih kecil dari posisi sekarang, maka servo berputar ke kiri.
  •  Arah putar servo ditentukan oleh perbedaan nilai target dan nilai aktual potensiometer.


7. Download File [Kembali]
Download Video Demo [Download]
Datasheet Sensor Infrared [Download]
Datasheet RGB LED [Download]
Datasheet Sensor Touch [Download]
Download Datasheet STM32F103C8 [Download]
Download Datasheet Motor Stepper [Download]
Download Datasheet Sensor Touch [Download]
Download Datasheet Motor DC [Download]
Download Datasheet ULN2003A [Download]