TUGAS PENDAHULUAN 2 M2

[menuju akhir]





1. Prosedur[Kembali]
1. Rangkai rangkaian di proteus sesuai dengan kondisi percobaan.
2. Tulis program untuk IC STM32 di software STM32IDE.
3. Compile program tadi, lalu upload file dengan format .hex ke dalam development board STM32.
4. Setelah program selesai di upload, jalankan simulasi rangkaian pada proteus.

2. Hardware dan Diagram Blok[Kembali]

a. Hardware
1. STM32F103C8
Fungsi utama STM32 adalah sebagai pengontrol sistem, mampu melakukan pemrosesan data dan menjalankan instruksi untuk berbagai aplikasi, mulai dari perangkat sederhana hingga sistem yang kompleks. 

2. Potensiometer

Potensiometer adalah resistor tiga terminal dengan sambungan geser yang membentuk pembagi tegangan dapat disetel.


3. Motor DC

Fungsi utama motor DC (direct current) adalah mengubah energi listrik menjadi energi mekanik. Motor DC digunakan dalam berbagai aplikasi, mulai dari perangkat elektronik kecil hingga mesin industri yang besar. 

4. Motor Stepper

Motor stepper memiliki fungsi utama untuk mengubah pulsa listrik menjadi gerakan mekanis yang presisi, yaitu gerakan diskrit atau langkah-langkah. Gerakan ini memungkinkan kontrol posisi dan kecepatan yang akurat tanpa sensor umpan balik.

5. ULN2003A
ULN2003 adalah IC driver yang berfungsi untuk mengendalikan beban induktif seperti motor stepper, solenoid, dan relai dari mikrokontroler atau rangkaian logika lainnya. IC ini dapat digunakan untuk menggerakkan perangkat berarus tinggi atau bertegangan tinggi yang tidak dapat ditoleransi oleh mikrokontroler. 

6. Touch Sensor
Fungsi utama sensor sentuh (touch sensor) adalah untuk mendeteksi sentuhan atau tekanan pada sebuah permukaan dan merespons dengan sinyal listrik atau tindakan tertentu.

b. Diagram Blok



3. Rangkaian Simulasi dan Prinsip Kerja[Kembali]


Gambar rangkaian percobaan 8 kondisi 1 
Prinsip Kerja:

Pada percobaan ini, sistem mengandalkan dua jenis input, yaitu input digital dari touch sensor dan input analog dari potensiometer. Touch sensor berfungsi sebagai saklar digital yang terhubung ke pin PB0 dari mikrokontroler STM32F103C8. Sensor ini akan mendeteksi sentuhan pengguna dan mengeluarkan sinyal logika HIGH (3.3V) jika disentuh, atau logika LOW (0V) jika tidak disentuh. Program membaca status sensor ini menggunakan fungsi HAL_GPIO_ReadPin(). Jika sensor mendeteksi sentuhan (HIGH), maka motor DC akan diaktifkan dengan memberi sinyal HIGH pada pin PB7 yang terhubung ke driver motor ULN2003A. Bersamaan dengan itu, motor stepper akan dimatikan dengan mengatur semua pin kendalinya (IN1–IN4) menjadi LOW.

Sebaliknya, jika touch sensor tidak mendeteksi sentuhan (LOW), maka motor DC akan dimatikan dengan memberikan sinyal LOW pada PB7. Selanjutnya, sistem akan membaca nilai analog dari potensiometer yang dihubungkan ke pin PA0 menggunakan ADC (Analog to Digital Converter) internal STM32. Potensiometer ini menghasilkan tegangan antara 0V hingga 3.3V, yang kemudian dikonversi menjadi nilai digital antara 0 hingga 4095. Program memulai proses pembacaan dengan HAL_ADC_Start() dan mengambil hasil konversi menggunakan HAL_ADC_GetValue(). Nilai ADC yang diperoleh dibandingkan dengan angka 2048. Jika nilai lebih besar atau sama dengan 2048, motor stepper akan bergerak searah jarum jam (clockwise) dengan mengikuti pola aktivasi STEP_SEQ_CW. Sebaliknya, jika nilai lebih kecil dari 2048, motor stepper akan bergerak berlawanan arah jarum jam (counter-clockwise) dengan mengikuti pola STEP_SEQ_CCW.

Motor stepper dikendalikan oleh empat buah output dari pin PB8, PB9, PB10, dan PB11. Keempat output ini diaktifkan secara bergiliran dalam pola tertentu yang diatur oleh fungsi RunStepperSmooth(), dengan delay antar langkah sebesar 5 ms untuk menghasilkan pergerakan yang halus. Setiap langkah mengaktifkan kombinasi pin sesuai dengan tabel step yang telah didefinisikan, kemudian langkah berikutnya dijalankan setelah jeda waktu tertentu. Sedangkan motor DC hanya memiliki satu kontrol sederhana, yaitu ON atau OFF berdasarkan status touch sensor.

Saat touch sensor aktif, motor DC berputar dan motor stepper berhenti; saat touch sensor tidak aktif, motor DC berhenti dan motor stepper bergerak dengan arah tergantung dari nilai analog potensiometer. Sistem ini menggunakan kontrol berbasis GPIO dan ADC dari STM32F103C8, dengan pemrograman berbasis HAL Library yang mempermudah pengelolaan peripheral mikrokontroler.



4. Flowchart dan Listing Program[Kembali]
a. Flowchart

b. 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<<0), // IN1
    (1<<3), // IN4
    (1<<2), // IN3
    (1<<1)  // IN2
};


ADC_HandleTypeDef hadc1;

// Function Prototypes
void SystemClock_Config(void);
void MX_GPIO_Init(void);
void MX_ADC1_Init(void);
void RunStepperSmooth(const uint8_t *sequence, uint8_t speed);
void Error_Handler(void);

// Global Variables
uint8_t step_index = 0;
uint32_t last_step_time = 0;

int main(void)
{
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_ADC1_Init();

    while (1)
    {
        GPIO_PinState touchState = HAL_GPIO_ReadPin(TOUCH_SENSOR_PORT, TOUCH_SENSOR_PIN);

        if (touchState == GPIO_PIN_SET)
        {
            // Jika sensor disentuh
            HAL_GPIO_WritePin(MOTOR_DC_PORT, MOTOR_DC_PIN, GPIO_PIN_SET); // Motor DC ON
            HAL_GPIO_WritePin(STEPPER_PORT, IN1_PIN | IN2_PIN | IN3_PIN | IN4_PIN, GPIO_PIN_RESET); // Stepper OFF
        }
        else
        {
            // Jika sensor tidak disentuh
            HAL_GPIO_WritePin(MOTOR_DC_PORT, MOTOR_DC_PIN, GPIO_PIN_RESET); // Motor DC OFF

            // Baca ADC
            HAL_ADC_Start(&hadc1);
            if (HAL_ADC_PollForConversion(&hadc1, 10) == HAL_OK)
            {
                uint16_t adc_val = HAL_ADC_GetValue(&hadc1);

                if (adc_val >= 2048)
                {
                    RunStepperSmooth(STEP_SEQ_CW, 5); // Bergerak searah jarum jam
                }
                else
                {
                    RunStepperSmooth(STEP_SEQ_CCW, 5); // Bergerak berlawanan jarum jam
                }
            }
            HAL_ADC_Stop(&hadc1);
        }

        HAL_Delay(1); // Delay kecil untuk stabilisasi
    }
}

void RunStepperSmooth(const uint8_t *sequence, uint8_t speed)
{
    if (HAL_GetTick() - last_step_time >= speed)
    {
        HAL_GPIO_WritePin(STEPPER_PORT, IN1_PIN, (sequence[step_index] & (1<<0)) ? GPIO_PIN_SET : GPIO_PIN_RESET);
        HAL_GPIO_WritePin(STEPPER_PORT, IN2_PIN, (sequence[step_index] & (1<<1)) ? GPIO_PIN_SET : GPIO_PIN_RESET);
        HAL_GPIO_WritePin(STEPPER_PORT, IN3_PIN, (sequence[step_index] & (1<<2)) ? GPIO_PIN_SET : GPIO_PIN_RESET);
        HAL_GPIO_WritePin(STEPPER_PORT, IN4_PIN, (sequence[step_index] & (1<<3)) ? GPIO_PIN_SET : GPIO_PIN_RESET);

        step_index = (step_index + 1) % 4;
        last_step_time = HAL_GetTick();
    }
}

void MX_GPIO_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};

    __HAL_RCC_GPIOB_CLK_ENABLE();
    __HAL_RCC_GPIOA_CLK_ENABLE(); // Untuk PA0 ADC

    __HAL_AFIO_REMAP_SWJ_NOJTAG(); // Optional: Membebaskan pin JTAG

    // Touch Sensor sebagai 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.Pull = GPIO_NOPULL;
    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.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.Instance = ADC1;
    hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
    hadc1.Init.ContinuousConvMode = DISABLE;
    hadc1.Init.DiscontinuousConvMode = DISABLE;
    hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
    hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
    hadc1.Init.NbrOfConversion = 1;
    if (HAL_ADC_Init(&hadc1) != HAL_OK)
    {
        Error_Handler();
    }

    sConfig.Channel = ADC_CHANNEL_0; // PA0
    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 Error_Handler(void)
{
    while (1)
    {
        // Loop error di sini
    }
}


 

5. Kondisi[Kembali]

Percobaan 8 Kondisi 1

Buatlah rangkaian seperti gambar pada percobaan 8. Jika touch sensor mendeteksi maka motor dc berputar. Jika potensiometer bernilai besar maka motor stepper bergerak searah jarum jam dan jika bernilai rendah maka motor stepper bergerak berlawanan jarum jam.

 

6. Video Simulasi[Kembali]




7. Download File[Kembali]
Download Video Simulasi klik disini
Download rangkaian proteus klik disini
Download program.hex klik disini
Download Datashett STM32 klik disini
Download Datasheet Touch sensor klik disini
Download Datasheet Motor stepper klik disini
Download Datasheet  Motor DC klik disini
Download Datasheet Resistor variabel klik disini
Download Datasheet ULN2003A klik disini


[menuju awal]

Tidak ada komentar:

Posting Komentar

MEMAHAMI ETIKA DI ERA DIGITAL

Menyelami Dunia Digital dengan Bertanggung Jawab: Memahami Etika Berkomunikasi di Era Digital (Lebih Detail) Memasuki Era Digital yang Pen...