Anda di halaman 1dari 17

LAPORAN AKHIR

PROYEK PRAKTIKUM SENSOR DAN AKTUATOR


Driving Stepper Motor 16HM34-0404A Using ARM STM32F4-Discovery
With GUI

Oleh :
1. Hadi Supriyono
2. Holomarangka Ansari Nasution
3. Ernanda Jumantoro

[1110131047]
[1110131054]
[1110131060]

Kelas : 3 D4 Teknik Elektronika B

Dosen Pengampu
Niam Tamami, S.ST., MT

Prodi Teknik Elektronika


POLITEKNIK ELEKTRONIKA NEGERI SURABAYA

2016
PROYEK PRAKTIKUM SENSOR DAN AKTUATOR
Driving Stepper Motor 16HM34-0404A Using ARM STM32F4-Discovery
With GUI
1.1

Tujuan
1. Menggerakkan motor stepper tipe 16HM34-0404A dengan sudut perputaran yang
dimasukkan.
2. Memproses nilai sudut yang masuk dengan menggunakan STM32F4.
3. Menampilkan hasil perputaran motor yang diolah oleh Mikrokontroller
STM32F4 pada GUI (Graphical User Interface).

1.2

1.3
1.3.1

Peralatan
1. Modul Mikrokontroller STM32 F4 Discovery
2. Motor Stepper tipe 16HM34-0404A
3. LCD 16x2

1 unit
1 unit
1 unit

Landasan Teori
Mikrokontroller STM32 F4 Discovery
STM32F4

Discovery

merupakan

board

mikrokontroler

yang

dikeluarkan oleh STMicroelectronics. IC mikrokontroler dari board ni adalah


STM32F407VGT6 yang memiliki 1 flash 1 MB dan RAM 192 kb, serta
kecepatan clock hingga 168 MHz. Selain itu board ini menggunakan kit STLINK/V2 (dengan konektror SWD). Board ini memiliki beberapa modul
modul seperti ADC, USART, dll.

Gambar 1. Board STM32F4 Discovery


1.3.2

Motor Stepper tipe 16HM34-0404A


Motor

stepper

adalah

motor

yang

digunakan

sebagai

penggerak/pemutar.Prinsip kerja motor stepper mirip dengan motor DC, sama-

sama dicatu dengan tegangan DC untuk memperoleh medan magnet. Bila


motor DC memiliki magnet tetap pada stator, motor stepper mempunyai
magnet tetap pada rotor. Motor stepper dinyatakan dengan spesifikasi :
berapa phasa , berapa derajat perstep, berapa volt tegangan catu untuk
tiap lilitan dan berapa ampere/miliampere arus yang dibutuhkan untuk tiap
lilitan. Motor stepper tidak dapat bergerak sendirinya, tetapi bergerak secara
per-step sesuai dengan spesifikasinya, dan bergerak dari satu step ke step
berikutnya memerlukan waktu, serta menghasilkan torsi yang besar pada
kecepatan rendah. Motor stepper juga memiliki karakteristik yang lain yaitu
torsi penahan, yang memungkinkan menahan posisinya. Hal ini sangat
berguna untuk aplikasi dimana suatu sistem memerlukan keadaan start dan
stop.
Gambar 2. Motor Stepper Bipolar dan Diagramnya

Motor stepper

dc terbagi

menjadi

tipe

yaitu

motor stepper bipolar dan motor stepper unipolar. Disini kami menggunakan
motor stepper tipe bipolar.Motor stepper tipe bipolar merupakan salah satu
motor yang ujung lilitannya tidak dikopel jadi satu untuk commond (tap) jadi
dalam dua lilitan atau koil yang telah dijadikan satu, sehingga arus dapat
mengalir dengan polaritas yang berbeda. Motor stepper yang kami gunakan
pada project ini adalah model no.16HM34-0404 . Karakteristik dari motor
stepper ini yaitu menggunakan catu daya sebesar 12 Volt DC dengan arus per
phase 0,4 Ampere. Motor ini juga memiliki resistansi 30 ohm per phase
dengan torsi 1800 g-cm. Motor ini akan menggunakan sistem 4-step baik
untuk arah putar kanan (cw: clockwise) maupun kiri (ccw: counter clock
wise), sehingga diperlukan sistem driver elektronik yaitu IC penggerak (IC
driver).
Pilihan yang tepat untuk driver motor stepper bipolar adalah IC Driver
L293D. Pemilihan L293D ini karena didalam IC terdapat rangakaian H-

Bridge yang sangat memungkinkan dipakai motor untuk pergantian polaritas


(putar kanan-putar kiri dalam satu lilitan)
1.4

Driver Motor Stepper


Berikut merupakan IC Driver Motor Stepper yang digunakan pada projek kali ini:

Gambar 3. IC Driver Motor Stepper


1.5

Prosedur
1.5.1 Hardware dan Mikrokontroller
1. Buka software Keil uVision Version 5.11.
2. Bukalah project baru untuk memulai pemrograman.
3. Agar dapat melihat data pada LCD, lakukan inisialisasi LCD dengan
program berikut ini:
#include"stm32f4xx.h"
#include"myDefinition.h"
#include<stdio.h>
chardata_f[7];
#define __LCD_CHAR
1
#define __LCD_DATA_PORT
0x000000003
#define __LCD_DATA_BIT
0x000000008
#define __LCD_RS_PORT
0x000000003
#define __LCD_RS_BIT
0x000000000
#define __LCD_EN_PORT
0x000000003
#define __LCD_EN_BIT
0x000000001
Enable
// Deklarasikan Port sambungan LCD
#if __LCD_CHAR
// inisalisasi LCD karakter
#if ((__LCD_DATA_PORT &7)==0)
#define LCD_PORT GPIOA->ODR
#elif ((__LCD_DATA_PORT &7)==1)
#define LCD_PORT GPIOB->ODR
#elif ((__LCD_DATA_PORT &7)==2)

//
//
//
//
//
//

//
port
posisi Data
PORT RS
posisi Bit RS
PORT Enable
posisi Bit

#define LCD_PORT GPIOC->ODR


#elif ((__LCD_DATA_PORT &7)==3)
#define LCD_PORT GPIOD->ODR
#elif ((__LCD_DATA_PORT &7)==4)
#define LCD_PORT GPIOE->ODR
#elif ((__LCD_DATA_PORT &7)==5)
#define LCD_PORT GPIOF->ODR
#elif ((__LCD_DATA_PORT &7)==6)
#define LCD_PORT GPIOG->ODR
#endif
#if ((__LCD_RS_PORT &7)==0)
#define LCD_RS
GPIOA
#elif ((__LCD_RS_PORT &7)==1)
#define LCD_RS
GPIOB
#elif ((__LCD_RS_PORT &7)==2)
#define LCD_RS
GPIOC
#elif ((__LCD_RS_PORT &7)==3)
#define LCD_RS
GPIOD
#elif ((__LCD_RS_PORT &7)==4)
#define LCD_RS
GPIOE
#elif ((__LCD_RS_PORT &7)==5)
#define LCD_RS
GPIOF
#elif ((__LCD_RS_PORT &7)==6)
#define LCD_RS
GPIOG
#endif
#if ((__LCD_EN_PORT &7)==0)
#define LCD_EN
GPIOA
#elif ((__LCD_EN_PORT &7)==1)
#define LCD_EN
GPIOB
#elif ((__LCD_EN_PORT &7)==2)
#define LCD_EN
GPIOC
#elif ((__LCD_EN_PORT &7)==3)
#define LCD_EN
GPIOD
#elif ((__LCD_EN_PORT &7)==4)
#define LCD_EN
GPIOE
#elif ((__LCD_EN_PORT &7)==5)
#define LCD_EN
GPIOF
#elif ((__LCD_EN_PORT &7)==6)
#define LCD_EN
GPIOG
#endif
//
//#include <stm32f10x_lib.h>
#definelcd_wait_const
#definelcd_delay

336000000 / 8769227
75000

voidwait_lcd(unsignedlongint xx)
{ xx*= lcd_wait_const;
while(xx--);
}
voidlcd_en_clk(void)
{
SetBit(LCD_EN,__LCD_EN_BIT);
set enable
wait_lcd(10);
// tunggu 2us
ClrBit(LCD_EN,__LCD_EN_BIT);
reset enable
}
voidlcd_ins(unsignedshort xx)
{
ClrBit(LCD_RS,__LCD_RS_BIT);
set enable

//

//

//

LCD_PORT = (LCD_PORT & ~(0xF << __LCD_DATA_BIT)) |


(xx<<__LCD_DATA_BIT); // kirim data
lcd_en_clk();
}
void lcd_ins2(unsignedshort xx)
{
SetBit(LCD_RS,__LCD_RS_BIT);
//
set enable
LCD_PORT = (LCD_PORT & ~(0xF << __LCD_DATA_BIT)) |
(xx<<__LCD_DATA_BIT); // kirim data
lcd_en_clk();
}
voidlcd_cmd (unsignedcharcmd)
{
lcd_ins ((cmd>>4) & 0x0F); // kirim nibble high
lcd_ins (cmd& 0x0F);
// kirim nibble low
wait_lcd(50);
// tunggu 0.05ms
}
voidlcd_data (unsignedchardat)
{
lcd_ins2 ((dat>>4) & 0x0F); // kirim nibble high
lcd_ins2 (dat& 0x0F);
// kirim nibble low
wait_lcd(50);
// tunggu 0.05ms
}
voidlcd_reset(void)
{
LCD_PORT |= (0xF<<__LCD_DATA_BIT);
SetBit(LCD_RS,__LCD_RS_BIT);
SetBit(LCD_EN,__LCD_EN_BIT);
wait_lcd(20000);
// tunggu 20ms
lcd_ins(3);
// reset #1
wait_lcd(15000);
// tunggu 15ms
lcd_ins(3);
// reset #2
wait_lcd(5000);
// tunggu 5ms
lcd_ins(3);
// reset #3
wait_lcd(5000);
// tunggu 5ms
lcd_ins(2);
// set data
transfer 4 bit
wait_lcd(5000);
// tunggu 5ms
}
voidlcd_init(void)
{
lcd_reset();
lcd_cmd(0x28);
digunakan = data 4 bit, 2 baris, 5x7 dots
wait_lcd(1000);
lcd_cmd(0x0c);
cursor OFF
wait_lcd(1000);
lcd_cmd(0x06);
- auto increement
wait_lcd(1000);
lcd_cmd(0x01);
wait_lcd(2000);
lcd_cmd(0x80);
wait_lcd(2000);
}
voidlcd_gotoxy(unsignedchar x, unsignedchar y)
{
ClrBit(LCD_RS,__LCD_RS_BIT);
lcd_cmd(0x80 | (y*0x40) + x);
}
voidlcd_clear(void)
{
lcd_cmd(1);}

//LCD yang
//Display ON
//Set entry mode

// menampilkan string kelCD


voidlcd_string(constchar *xx)
{
while(*xx) lcd_data(*xx++);
}
voidlcd_Test(unsignedchar xx)
{
ClrBit(LCD_EN,__LCD_EN_BIT);
enable
SetBit(LCD_RS,__LCD_RS_BIT);
enable
LCD_PORT = (LCD_PORT & ~(0xF << __LCD_DATA_BIT)) |
(xx<<__LCD_DATA_BIT); // kirim data
}
// menampilkan data integer ke LCD
void lcd_uint32(unsignedshort xx)
{ lcd_data(xx/10000 + 0x30);
lcd_data((xx%10000)/1000 + 0x30);
lcd_data((xx%1000)/100 + 0x30);
lcd_data((xx%100)/10 + 0x30);
lcd_data(xx%10 + 0x30);
}
void lcd_uint16(unsignedshort xx)
{ //lcd_data(xx/10000 + 0x30);
lcd_data((xx%10000)/1000 + 0x30);
lcd_data((xx%1000)/100 + 0x30);
lcd_data((xx%100)/10 + 0x30);
lcd_data(xx%10 + 0x30);
}
void lcd_uint8(unsignedshort xx)
{// lcd_data(xx/10000 + 0x30);
// lcd_data((xx%10000)/1000 + 0x30);
lcd_data((xx%1000)/100 + 0x30);
lcd_data((xx%100)/10 + 0x30);
lcd_data(xx%10 + 0x30);
}
void lcd_uint2(unsignedshort xx)
{
lcd_data(xx/10 + 0x30);
lcd_data(xx%10 + 0x30);
}
void lcd_uint1(unsignedshort xx)
{
lcd_data(xx%10 + 0x30);
}
void lcd_float6(float xx)
{
sprintf(data_f,"%2.2f",xx);
lcd_data(data_f[0]);
lcd_data(data_f[1]);
lcd_data(data_f[2]);
lcd_data(data_f[3]);
}
void lcd_int16 (shortint xx)
{ if(xx<0)
{
lcd_data('-');
xx=-xx;

// set
// set

}
elselcd_data(' ');
lcd_uint16(xx);
}
// menampilkan data dalambentukhexadesimal
voidlcd_hex (unsignedchar xx)
{ if (xx<10) lcd_data(xx + 48);
elselcd_data(xx + 55);

// menampilkanangka
// menampilkanhuruf

}
#endif
//untuk variable extern
#ifndef
#define

__MAIN_FUNGSI_H
__MAIN_FUNGSI_H

externunsignedcharusartStepper[5],puluhan,satuan;
externunsignedintratusan,angka;
externunsignedchar dataUsart1[10],count1;
extern uint8_t* dataS,dataUsart1[10];
externintflagC;
#endif

4. Masukkan program untuk inisialisasi dan deklarasi variabel:


#include"stm32f4xx_hal.h"
#include"usb_device.h"
#include"usbd_cdc_if.h"
#include"main.h"
#include"myLcdText.h"
voidSystemClock_Config(void);
voidError_Handler(void);
staticvoidMX_GPIO_Init(void);
intul;
unsignedchararah,angka2;
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init(); //
MX_USB_DEVICE_Init();
lcd_init();
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_12,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_13,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_14,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_15,GPIO_PIN_SET);
HAL_Delay(200);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_12,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_13,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_14,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_15,GPIO_PIN_RESET);
HAL_Delay(200);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_12,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_13,GPIO_PIN_SET);

HAL_GPIO_WritePin(GPIOD,GPIO_PIN_14,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_15,GPIO_PIN_SET);
HAL_Delay(200);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_12,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_13,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_14,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_15,GPIO_PIN_RESET);
HAL_Delay(200);

5. Jika sudah, lakukan konfigurasi pin-pin sebagai analog, input, output,


event_out, dan external interrupt, berikut programnya:
staticvoidMX_GPIO_Init(void)
{
GPIO_InitTypeDefGPIO_InitStruct;
__HAL_RCC_GPIOH_CLK_ENABLE();
__HAL_RCC_GPIOD_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOE_CLK_ENABLE();
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|
GPIO_PIN_15, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|
GPIO_PIN_4, GPIO_PIN_RESET);
GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|
GPIO_PIN_15;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_0|GPIO_PIN_8|GPIO_PIN_9|
GPIO_PIN_10|GPIO_PIN_11;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
}

6. Lalu lakukan juga konfigurasi sistem clock yang akan digunakan, dapat
dilakukan dengan menuliskan program seperti berikut:
voidSystemClock_Config(void)
{
RCC_OscInitTypeDefRCC_OscInitStruct;
RCC_ClkInitTypeDefRCC_ClkInitStruct;
__HAL_RCC_PWR_CLK_ENABLE();
__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCA
LE1);

RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 8;
RCC_OscInitStruct.PLL.PLLN = 336;
RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
RCC_OscInitStruct.PLL.PLLQ = 7;
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_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) !=
HAL_OK)
{
Error_Handler();
}
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}

7. Setelahnya, masukkan program utama seperti pada program di bawah ini:


while (1)
{

do{
lcd_gotoxy(4,0);
lcd_uint8(ratusan);
lcd_gotoxy(8,0);
lcd_uint8(puluhan);
lcd_gotoxy(12,0);
lcd_uint8(satuan);
}
while(!angka);
do{
lcd_gotoxy(0,1);
lcd_uint8(angka);
lcd_gotoxy(12,1);
lcd_uint8(flagC);
}
while(!flagC);
arah=flagC;
for(ul=0;ul<=angka/3.6;ul++){
if(arah==7){
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_1,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_2,GPIO_PIN_RESET);

HAL_GPIO_WritePin(GPIOE,GPIO_PIN_3,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_4,GPIO_PIN_RESET);
HAL_Delay(10);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_1,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_2,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_3,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_4,GPIO_PIN_RESET);
HAL_Delay(10);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_1,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_2,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_3,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_4,GPIO_PIN_RESET);
HAL_Delay(10);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_1,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_2,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_3,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_4,GPIO_PIN_SET);
HAL_Delay(10);
}
else{
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_1,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_2,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_3,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_4,GPIO_PIN_SET);
HAL_Delay(10);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_1,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_2,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_3,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_4,GPIO_PIN_RESET);
HAL_Delay(10);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_1,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_2,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_3,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_4,GPIO_PIN_RESET);
HAL_Delay(10);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_1,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_2,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_3,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOE,GPIO_PIN_4,GPIO_PIN_RESET);
HAL_Delay(10);
}
}
angka=0;
HAL_Delay(10000);
}
}

8. Selanjutnya masukkan program penerimaan dan pengiriman data VCP,


berikut adalah program untuk menerima data:

unsignedcharstateS=1,usartStepper[5],puluhan,satuan;
unsignedintratusan,angka;
unsignedchar dataUsart1[10],count1;
intflagC;
uint8_t* dataS,dataUsart1[10];
#define APP_RX_DATA_SIZE 4
#define APP_TX_DATA_SIZE 4
static int8_t CDC_Receive_FS (uint8_t* Buf, uint32_t *Len)
{
chardata[20];
int d;
uint8_t* buf2;
USBD_CDC_SetRxBuffer(&hUsbDeviceFS, &Buf[0]);
USBD_CDC_ReceivePacket(&hUsbDeviceFS);
CDC_Transmit_FS((uint8_t*)Buf,*Len);
dataUsart1[count1++]=*Buf;
if(stateS==1 && dataUsart1[0]!=0 )
{
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_12,GPIO_PIN_SET);
usartStepper[0]=dataUsart1[0]; //kec
ratusan=(usartStepper[0]-48)*100;
stateS=2;
}
elseif (stateS==2 && dataUsart1[1]!=0 ){
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_13,GPIO_PIN_SET);
usartStepper[1]=dataUsart1[1];
puluhan=(usartStepper[1]-48)*10;
stateS=3;
}
elseif (stateS==3 && dataUsart1[2]!=0 )
{
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_14,GPIO_PIN_SET);
usartStepper[2]=dataUsart1[2]; //kec
satuan=(usartStepper[2]-48)*1;
stateS=4;
}
elseif (stateS==4 && dataUsart1[3]!=0 )
{
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_15,GPIO_PIN_SET);
usartStepper[3]=dataUsart1[3]; //kec
flagC=usartStepper[3]-48;
angka=ratusan + puluhan + satuan;
stateS=0;
}
if(count1>3){
count1=0;
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_12,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_13,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_14,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_15,GPIO_PIN_RESET);
}
return (USBD_OK);
}

9. Selanjutnya program untuk mengirimkan data dengan VCP:


uint8_t CDC_Transmit_FS(uint8_t* Buf, uint16_t Len)
{
uint8_t result = USBD_OK;
USBD_CDC_HandleTypeDef *hcdc =
(USBD_CDC_HandleTypeDef*)hUsbDeviceFS.pClassData;
if (hcdc->TxState != 0){
return USBD_BUSY;
}
USBD_CDC_SetTxBuffer(&hUsbDeviceFS, Buf, Len);
result = USBD_CDC_TransmitPacket(&hUsbDeviceFS);
return result;
}

1.5.2 Software GUI


1. Buka software Microsoft Visual Studio 2010 untuk memulai project
2. Pilih project berbasis Visual Basic dan pilih tipe Windows Form
Application
3. Ambil fungsi Serial Port pada Toolbox. Hal ini dilakukan agar dapat
melakukan komunikasi serial.
Gambar 4. Tampilan Serial Port pada ToolBox

4. Lalu buat form seperti gambar berikut :


Gambar 5. Layout Interface
5. Masukkan gambar untuk interface melalui Resources, dapat dilakukan
melalui PictureBox properties, Image. Pilih gambar yang diinginkan.

Gambar 6. Memasukkan gambar ke resources.

6. Setelahnya, masukkan program di bawah ini pada button Open Port:


Private Sub ButtonOpenPort_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles ButtonOpenPort.Click
SerialPort1.PortName = ComboBox1.Text
SerialPort1.BaudRate = ComboBox2.Text
SerialPort1.Open()
ButtonOpenPort.Enabled = False
ButtonClosePort.Enabled = True
End Sub

7. Kemudian masukkan program berikut ini pada button Close Port:


Private Sub ButtonClosePort_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles ButtonClosePort.Click
SerialPort1.Close()
ButtonOpenPort.Enabled = True
ButtonClosePort.Enabled = False
MsgBox("Koneksi Terputus")
End Sub

8. Selanjutnya masukkan program Refresh Port dengan koding berikut ini:


Private Sub ButtonRefreshPort_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles ButtonRefreshPort.Click
Erase myPort
ComboBox1.Items.Clear()
myPort = IO.Ports.SerialPort.GetPortNames()
ComboBox1.Items.AddRange(myPort)
End Sub

9. Jika sudah, masukkan sedikit program tambahan pada Form:

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e


As System.EventArgs) Handles MyBase.Load
MsgBox("Klik Refresh Port, lalu tentukan PORT dan Baudrate")
Dim imgOrig As Image = My.Resources.Gambar11
PictureBox1.Image = imgOrig
ButtonClosePort.Enabled = False
End Sub

10. Masukkan juga program untuk menutup aplikasi pada button Exit:
Private Sub ButtonExit_Click(ByVal sender As System.Object, ByVal e
As System.EventArgs) Handles ButtonExit.Click
Application.Exit()
End Sub
End Class

11. Berikan program tambahan untuk CheckBoxCW dan CCW agar tidak
dapat dipilih bersamaan:
Private Sub CheckBoxCW_CheckedChanged(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles CheckBoxCW.CheckedChanged
If CheckBoxCW.Checked = True Then
CheckBoxCCW.Enabled = False
End If
If CheckBoxCW.Checked = False And CheckBoxCCW.Enabled = False
Then
CheckBoxCCW.Enabled = True
End If
End Sub
Private Sub CheckBoxCCW_CheckedChanged(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles CheckBoxCCW.CheckedChanged
If CheckBoxCCW.Checked = True Then
CheckBoxCW.Enabled = False
End If
If CheckBoxCCW.Checked = False And CheckBoxCW.Enabled = False
Then
CheckBoxCW.Enabled = True
End If
End Sub

12. Kemudian masukkan program untuk button Send Data yang memiliki
fungsi untuk mengirimkan data besarnya derajat yang ingin dikeluarkan
pada motor stepper dan juga arah putarannya (disertai dengan program
untuk menampilkan gambar pada interface).
Private Sub ButtonSendData_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles ButtonSendData.Click
Dim strSend As Char
strSend = TextBox1.Text
SerialPort1.Write(strSend)
Threading.Thread.Sleep(250)
strSend = TextBox2.Text
SerialPort1.Write(strSend)
Threading.Thread.Sleep(250)
strSend = TextBox3.Text
SerialPort1.Write(strSend)
Threading.Thread.Sleep(250)
If CheckBoxCW.Checked = True Then
SerialPort1.Write("7")
Dim imgOrig As Image = My.Resources.Gambar11
Dim imgClone As Image = imgOrig.Clone
Dim angle As Single
Dim var1 As Integer = Val(TextBox1.Text)
Dim var2 As Integer = Val(TextBox2.Text)
Dim var3 As Integer = Val(TextBox3.Text)

2)

2)

1.6

angle = var1 * 100 + var2 * 10 + var3


Dim g As Graphics = Graphics.FromImage(imgOrig)
g.Clear(Color.White)
g.TranslateTransform(imgClone.Width / 2, imgClone.Height / 2)
g.RotateTransform(angle)
g.TranslateTransform(-imgClone.Width / 2, -imgClone.Height /
g.DrawImage(imgClone, New Point(0, 0))
PictureBox1.Image = imgOrig.Clone
imgClone.Dispose()
imgOrig.Dispose()
g.Dispose()
End If
If CheckBoxCCW.Checked = True Then
SerialPort1.Write("8")
Dim imgOrig As Image = My.Resources.Gambar11
Dim imgClone As Image = imgOrig.Clone
Dim angle As Single
Dim var1 As Integer = Val(TextBox1.Text)
Dim var2 As Integer = Val(TextBox2.Text)
Dim var3 As Integer = Val(TextBox3.Text)
angle = -(var1 * 100 + var2 * 10 + var3)
Dim g As Graphics = Graphics.FromImage(imgOrig)
g.Clear(Color.White)
g.TranslateTransform(imgClone.Width / 2, imgClone.Height / 2)
g.RotateTransform(angle)
g.TranslateTransform(-imgClone.Width / 2, -imgClone.Height /
g.DrawImage(imgClone, New Point(0, 0))
PictureBox1.Image = imgOrig.Clone
imgClone.Dispose()
imgOrig.Dispose()
g.Dispose()
End If
End Sub

Hasil Percobaan
a. Hardware Projek (Motor Stepper dan Drivernya)
Gambar 7. Motor Stepper dan Rangkaian Drivernya

b. Tampilan pada GUI

Gambar 8. Hasil Percobaan pada Interface

Anda mungkin juga menyukai