Laporan Akhir 2 : Modul 2

[menuju akhir]





PERCOBAAN 2 : Led RGB, Motor Stepper, & Soil Moisture

1. Prosedur[Kembali]
1. Sediakan alat dan bahan percobaan

2. Rangkailah rangkaian di breadboard

3. Download stlink. dan masukkan listing program ke aplikasi STM32 IDE

4. Hubungkan rangkaian dengan software dengan kabel stlink 

5. Jalankan program

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. Soil Moisture


Fungsi utama soil moisture sensor adalah mengukur dan memantau kadar kelembapan tanah. Sensor ini memberikan informasi penting tentang kelembapan tanah, yang sangat berguna untuk berbagai aplikasi seperti irigasi, pertanian, dan pemantauan lingkungan.

3. Resistor



Resistor adalah komponen elektronik pasif yang berfungsi untuk membatasi arus listrik dalam suatu rangkaian. Resistor bekerja berdasarkan hukum Ohm, yang menyatakan bahwa tegangan (V) = arus (I) × resistansi (R). Resistor memiliki satuan Ohm (Ω) dan digunakan dalam berbagai aplikasi seperti pembagian tegangan, kontrol arus, dan proteksi rangkaian elektronik.

4. RGB-LED
LED RGB adalah perangkat elektronik yang dapat menghasilkan warna merah,hijau dan biru.

5. 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.

6.  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. 

b. Diagram Blok



3. Rangkaian Simulasi dan Prinsip Kerja[Kembali]




Gambar Rangkaian Percobaan 2 Modul 2



Prinsip Kerja :

Rangkaian ini merupakan sistem otomatisasi berbasis mikrokontroler STM32 yang menggunakan sensor kelembapan tanah (Soil Moisture Sensor) sebagai input utama untuk mengendalikan arah putaran motor stepper serta memberikan indikator visual melalui LED RGB. Proses dimulai ketika sensor kelembapan tanah mendeteksi kadar air pada media tanam. Sensor ini bekerja berdasarkan konduktivitas tanah; semakin basah tanah, semakin rendah resistansinya, sehingga menghasilkan tegangan analog yang lebih tinggi. Tegangan analog ini kemudian diteruskan ke pin ADC (Analog to Digital Converter) pada mikrokontroler STM32 untuk dikonversi menjadi nilai digital.

Nilai digital dari sensor digunakan sebagai dasar penentuan mode operasi motor stepper, yang terbagi menjadi tiga: Clockwise (CW), Counter Clockwise (CCW), dan Oscillate (bolak-balik). Berdasarkan program yang dijalankan, jika nilai ADC kurang dari 1365, maka sistem berada dalam mode CW, motor berputar searah jarum jam dan LED merah menyala. Jika nilainya antara 1365 hingga 2730, maka sistem berada dalam mode CCW, motor berputar berlawanan arah jarum jam dengan LED hijau yang menyala. Jika nilai ADC lebih dari 2730, maka sistem masuk ke mode Oscillate, yaitu motor berputar secara bolak-balik (CW-CCW) dan LED biru menyala.

Prinsip kerja motor stepper dikendalikan melalui sinyal digital dari mikrokontroler yang dikirim ke pin IN1 sampai IN4 pada driver ULN2003 atau langsung ke motor stepper, dengan urutan langkah sesuai dengan pola dalam array STEP_SEQ_CW atau STEP_SEQ_CCW. Pola ini mengatur aktivasi gulungan motor secara bergantian untuk menghasilkan rotasi yang halus. Fungsi RunStepper() akan mengeksekusi satu langkah motor sesuai arah dan kecepatan yang ditentukan, sementara LED RGB menyala sebagai indikator mode aktif.


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 LED_RED_PIN    GPIO_PIN_12

#define LED_GREEN_PIN  GPIO_PIN_13

#define LED_BLUE_PIN   GPIO_PIN_14

#define LED_PORT      

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

}


5. Video Demo[Kembali]



6. Analisa[Kembali] 
ANALISA MODUL 2: PWM, ADC, INTERRUPT, & MILLIS 

1. Analisa bagaimana perbedaan implementasi PWM antara STM32 dan Raspberry Pi Pico 
serta dampaknya terhadap kontrol motor dan LED.

          Jawab :

PWM (Pulse Width Modulation) pada STM32 dikendalikan oleh hardware timer (TIMx) yang sangat fleksibel. Konfigurasi PWM pada STM32 melalui HAL Library memungkinkan pengguna untuk mengatur frekuensi, duty cycle, mode PWM (edge/center aligned), dan sinkronisasi antar timer. Fitur ini sangat berguna untuk kendali motor presisi tinggi (misalnya BLDC atau servo industri) dan sistem kendali tertanam real-time yang membutuhkan resolusi dan kestabilan sinyal tinggi.

Sementara itu, Raspberry Pi Pico menggunakan PWM slice sebanyak 8 buah, dengan masing-masing slice mampu menghasilkan 2 sinyal PWM. Implementasinya di MicroPython sangat sederhana, cukup dengan memanggil beberapa baris kode untuk mengatur frekuensi dan duty cycle. Meskipun Pico menawarkan resolusi 16-bit (lebih tinggi dari STM32 secara default), kontrol terhadap sinkronisasi antar channel dan presisi waktu tidak sekompleks STM32. Oleh karena itu, PWM di Pico lebih cocok untuk aplikasi non-kritis seperti kendali LED, buzzer, atau motor servo skala kecil.

Jadi, STM32 memberikan kontrol yang lebih akurat dan stabil untuk aplikasi kompleks, sedangkan Raspberry Pi Pico lebih unggul dalam kemudahan dan kecepatan pengembangan prototipe.


2. Analisa bagaimana cara pembacaan nilai sensor analog menggunakan ADC pada STM32  
dan Raspberry Pi Pico

Jawab :

STM32 memiliki ADC internal multichannel dengan dukungan resolusi hingga 12-bit, sampling rate tinggi, dan metode pembacaan fleksibel: polling, interrupt, atau DMA. Hal ini memungkinkan STM32 untuk membaca data analog dengan cepat, efisien, dan cocok untuk aplikasi real-time seperti sensor suhu, tekanan, atau sensor industri lainnya.

Pada sisi lain, Raspberry Pi Pico menggunakan ADC 12-bit juga, namun hanya tersedia 3 channel aktif (plus satu untuk pembacaan tegangan internal). Dalam MicroPython, pembacaan sangat mudah melalui fungsi ADC.read_u16(), meskipun hasil pembacaan perlu disesuaikan karena formatnya berupa nilai 16-bit dengan padding. Pico tidak menyediakan opsi DMA atau pengambilan data paralel secara default.

Jadi, STM32 lebih fleksibel dan andal untuk aplikasi dengan banyak sensor atau kebutuhan akuisisi data cepat, sedangkan Pico cocok untuk sistem sederhana dengan satu atau dua sensor analog.


3. Analisa bagaimana penggunaan interrupt eksternal dalam mendeteksi input dari sensor atau 
tombo pada STM32 dan Raspberry Pi Pico.

Jawab :

Pada STM32, interrupt eksternal ditangani oleh sistem EXTI (External Interrupt/Event Controller) yang dapat mengatur trigger (rising, falling, atau both edges), dan terintegrasi dengan NVIC untuk manajemen prioritas. Penanganannya dilakukan melalui callback HAL, yang membuat sistem lebih modular dan aman untuk aplikasi multitasking dan kendali real-time.

Di Raspberry Pi Pico, interrupt pada pin GPIO diakses melalui fungsi irq() di MicroPython. Meskipun cukup efektif untuk aplikasi dasar seperti deteksi tombol atau sensor digital, Pico tidak menyediakan manajemen prioritas atau interrupt nesting secara langsung di MicroPython.

Jadi, STM32 jauh lebih unggul untuk aplikasi yang membutuhkan interupsi simultan atau kompleks, sedangkan Pico cukup untuk aplikasi sederhana dan reaktif dasar.


4. Analisa bagaimana cara kerja fungsi HAL_GetTick() pada STM32 dan utime.ticks_ms() 
pada Raspberry Pi Pico dalam menghitung waktu sejak sistem dinyalakan

Jawab : 

Fungsi HAL_GetTick() pada STM32 menggunakan SysTick timer dengan presisi 1 ms, yang dihitung sejak sistem dinyalakan. Timer ini bebas blocking dan sangat cocok digunakan untuk pengukuran waktu, delay non-blocking, serta penjadwalan tugas dalam sistem real-time.

Di sisi lain, utime.ticks_ms() pada Raspberry Pi Pico juga menghasilkan nilai waktu sejak booting dengan satuan milidetik. Namun, karena dijalankan dalam konteks interpreter MicroPython, presisinya bisa terpengaruh oleh beban eksekusi skrip lainnya.

Jadi, STM32 memberikan akurasi waktu lebih tinggi dan kestabilan untuk sistem real-time. Pico mencukupi untuk aplikasi sederhana, tetapi kurang ideal untuk kebutuhan timing kritis.


5. Analisa bagaimana perbedaan konfigurasi dan kontrol pin PWM serta pemanfaatan timer 
internal pada STM32 dan Raspberry Pi Pico dalam menghasilkan sinyal gelombang persegi.

Jawab : 

PWM di STM32 sangat bergantung pada timer internal yang bisa disinkronkan, dikonfigurasi dalam berbagai mode (PWM mode 1/2, one-pulse mode, output compare, dll), dan dipakai untuk aplikasi seperti motor control, inverter, atau kendali dimmer. Setiap timer dapat memiliki beberapa channel output PWM, sehingga mendukung kendali multi-motor secara simultan.

Sedangkan Raspberry Pi Pico memiliki PWM slice berbasis hardware sederhana. Setiap slice dapat diatur independen namun tidak bisa disinkronisasi atau dipicu oleh sumber eksternal seperti timer pada STM32. Meski mendukung frekuensi tinggi dan duty cycle variatif, Pico tidak dirancang untuk kendali motor presisi tinggi atau sistem PWM kompleks.

Jadi, STM32 unggul dalam kontrol multi-channel presisi tinggi, sedangkan Pico cocok untuk PWM dasar dengan konfigurasi cepat dan mudah.


Kesimpulan 

STM32 adalah platform mikrokontroler yang dirancang untuk aplikasi teknis tingkat lanjut, dengan kekuatan di presisi, fleksibilitas konfigurasi, dan dukungan real-time. Cocok digunakan dalam robotika, automasi industri, dan sistem tertanam canggih. Raspberry Pi Pico, sebaliknya, lebih diarahkan untuk kemudahan penggunaan, prototyping cepat, dan pengembangan edukatif. Meski fitur-fiturnya lebih sederhana, Pico tetap efektif untuk membangun konsep awal atau sistem ringan. Praktikum ini memberikan pemahaman praktis bahwa pemilihan platform harus mempertimbangkan kompleksitas aplikasi, kebutuhan real-time, dan kemudahan integrasi.

7. Download File[Kembali]

Download HTML klik disini
Download File Analisa klik disini
Download Video Demo klik disini
Download Datashett STM32 klik disini
Download Datasheet Motor stepper klik disini
Download Datasheet  RGB-LED klik disini
Download Datasheet Resistor klik disini 
Download Datasheet ULN2003A klik disini 
 

Tidak ada komentar:

Posting Komentar

  BAHAN PRESENTASI  MATA KULIAH SISTEM DIGITAL 2024 Oleh : Fransiscus Asisi Andhika Darmawan 2210951014 Dosen Pengampu :  Dr. Darwison, M.T ...