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
6. ULN2003A
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.
#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) {}
}
ANALISA MODUL 2: PWM, ADC, INTERRUPT, & MILLIS1. Analisa bagaimana perbedaan implementasi PWM antara STM32 dan Raspberry Pi Picoserta 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 STM32dan Raspberry Pi PicoJawab :
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 atautombo 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 dinyalakanJawab :
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 timerinternal 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.
Download HTML klik disiniDownload File Analisa klik disiniDownload Video Demo klik disiniDownload Datashett STM32 klik disiniDownload Datasheet Motor stepper klik disini
Download Datasheet RGB-LED klik disiniDownload Datasheet Resistor klik disini
Download Datasheet ULN2003A klik disini
Tidak ada komentar:
Posting Komentar