Laporan Projek Sensor Aktuator Yono Angka Nanda (Updated)
Laporan Projek Sensor Aktuator Yono Angka Nanda (Updated)
Oleh :
1. Hadi Supriyono
2. Holomarangka Ansari Nasution
3. Ernanda Jumantoro
[1110131047]
[1110131054]
[1110131060]
Dosen Pengampu
Niam Tamami, S.ST., MT
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
stepper
adalah
motor
yang
digunakan
sebagai
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-
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
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 yang
//Display ON
//Set entry mode
// 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
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);
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);
}
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);
}
}
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);
}
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
Hasil Percobaan
a. Hardware Projek (Motor Stepper dan Drivernya)
Gambar 7. Motor Stepper dan Rangkaian Drivernya