Laporan Praktikum Aplikasi Mikrokontroller, Program Magister Teknik Elektro, Jurusan Teknik Elektro, Fakultas Teknik, Universitas Brawijaya, Malang. 22 Desember 2015.
Aplikasi Learning Board Module Nuvoton NUC140 untuk Pembacaan Sensor Accelerometer MMA7361L dan Pengiriman Data Sensor pada Perangkat Android Panji Peksi Branjangan, Panca Mudjirahardjo Jurusan Teknik Elektro, Fakultas Teknik, Universitas Brawijaya, Jl. MT. Haryono 167, Malang – 65145 email :
[email protected],
[email protected]. peripheral, seperti GPIO, Timer, Watchdog Timer, RTC, PDMA, UART, SPI/MICROWIRE, I2C, I2S, PWM, LIN, CAN, PS2, USB 2.0 FS Device, ADC 12-bit, komparator analog, Low Voltage Reset dan Brown-out Detector. Gambar 1 menunjukkan diagram blok dari NuMicro NUC130/140 Series.
Abstract – Dalam laporan praktikum aplikasi mikrokontroler ini, akan dipaparkan aplikasi mikrokontroler NUC140 untuk pembacaan sensor Accelerometer MMA7561L. Sistem yang akan digunakan terdiri dari learning board, sensor, dan sistem komunikasi bluetooth untuk menampilkan grafik pembacaan sensor. Hasil yang didapatkan adalah tampilan ADC pembacaan kemiringan sensor 3 axis serta data logger hasil pembacaan sensor tersebut pada aplikasi android. Kata kunci: ADC, Accelerometer, Bahasa C, data logger I. Pendahuluan Salah satu peran penting bagi mikrokontroler adalah sebagai sarana pembacaan sensor untuk tujuan tertentu. Seperti yang telah diketahui bahwa sensor merupakan perangkat atau alat yang dapat mengubah besaran non elektrik menjadi besaran elektrik. Namun besaran elektrik tersebut tidak berarti apapun apabila tidak diproses menjadi sinyal yang mengandung informasi. Learning board Nuvoton NUC140 adalah salah satu modul mikrokontroler yang berbasis ARM. Modul ini selain terdapat chip ARM utama, terdapat pula perangkat tambahan untuk mendukung pengembang aplikasi mikrokontroler untuk merancang prototipe tertentu sehingga memudahkan dalam proses perancangannya. Perangkat tambahan tersebut antara lain LCD grafik, potensiometer terhubung ADC, LED display berwarna merah, LED RGB, antarmuka serial, dan keypad. NUC140 series adalah ARM ® Cortex ™mikrokontroler dengan M0 core didalamnya yang cocok digunakan untuk kontrol industri dan aplikasi yang membutuhkan fungsi komunikasi khusus. Cortex ™-M0 adalah prosesor ARM terbaru dengan kinerja 32-bit dengan biaya yang setara dengan mikrokontroler 8-bit. NuMicro Seri NUC100 memiliki inti ARM Cortex M0 yang tertanam dengan kecepatan hingga 50 MHz, dilengkapi dengan memori flash untuk program 32K/64K/128Kbyte., SRAM sebesar 4K/8K/16K-byte dan memori flash loader untuk ISP (In System Programming) sebesar 4K-byte. Selain itu juga dilengkapi dengan berbagai macam
Gambar 1. Blok Diagram NUC140
NUC140VE3CN, sehingga perlu diperhatikan tegangan input ini maksimal adalah 5.5V (menurut datasheet NUC140). Pada board terdapat juga catudaya teregulasi 3.3V menggunakan chip LM1117. Tipe chip regulator ini tidak dinyatakan dalam skematik. Tegangan dari Powerjack 3 pin dan konektor USB dilewatkan melalui dioda sehingga aman dari kesalahan polaritas pemasangan, namun tidak melindungi dari kerusakan jika tegangan masuk melebihi 5.5V.
Gambar 2. Layout Learning Board NUC140
Sensor yang digunakan dalam praktikum aplikasi mikrokontroler ini adalah sensor Accelerometer – merupakan sensor pendeteksi kemiringan terhadap sudut tegak lurus gravitasi bumi. Sedangkan tipe sensor yang digunakan adalah MMA7361L produksi Freescale Semiconductor. MMA7361L adalah sensor accelerometer yang memiliki struktur
1
Laporan Praktikum Aplikasi Mikrokontroller, Program Magister Teknik Elektro, Jurusan Teknik Elektro, Fakultas Teknik, Universitas Brawijaya, Malang. 22 Desember 2015. Software untuk editor dan compiler menggunakan Coocox CoIde dengan tampilan awal sebagai seperti dalam gambar 6.
dasar berupa micromachine dan bekerja dengan sifat kapasitif. Sensor tersebut dapat mendeteksi gravitasi dengan dua mode sensitivitas yaitu 1,5g dan 6g. sensor tersebut juga memiliki mode sleep sehingga dapat digunakan untuk aplikasi yang berbasis mobile dan menggunakan battery sebagai power supply-nya.
Gambar 6. Tampilan awal software Editor dan Compiler
Software tersebut bersifat open source dan memiliki beberapa contoh driver atau library untuk aplikasi tertentu. Untuk program utama dalam praktikum ini adalah menggunakan struktur interrupt ADC. Sehingga tampilan akan di-update sesaat setelah mikrokontroler selesai mencuplik data dari ADC. Hal tersebut dilakukan untuk menghindari terjadinya program stuck atau hang. Flowchart sederhana dari program utama praktikum tersebut adalah sebagai berikut.
Gambar 3. Sensor Accelerometer MMA7361L
Fitur lain yang terdapat pada MMA7361L yaitu memiliki arus konsumsi 400µA pada saat aktif dan 3µA pada saat mode sleep. Tegangan operasi yaitu pada 2,2-3,6 volt. Sensitivitas 800mV/g pada mode 1,5g. Dapat mendeteksi jatuh bebas 0g.
Gambar 4. Blok diagram fungsional MMA7361L
Dalam blok diagram tersebut, sensor MMA7361L memiliki keluaran yang telah difilter sehingga meminimalisir noise yang timbul. II. Metode Dalam praktikum ini, pertama yang dilakukan adalah perancangan sistem melalui blok diagram sebagai berikut:
Gambar 5. Blok Diagram Sistem Gambar 7. Flowchart Program Eksperimen
Dari blok diagram yang sederhana tersebut, dapat diamati bahwa terdapat beberapa hubungan antara mikrokontroler dengan sensor dan output. Dari input sensor terdapat tiga output yaitu x-axis, yaxis, z-axis. Untuk NUC140, peripheral yang diaktifkan yaitu GPIO output yang terhubung dengan LED, ADC menggunakan 3 kanal untuk masing-masing axis, LCD graphic untuk menampilkan pembacaan nilai sensor, dan UART untuk mengirim data ke device data logger (dalam hal ini menggunakan smartphone android oppo seri neo-5).
Dari flowchart program dalam gambar 7, dapat diamati bahwa GPIO LED berfungsi sebagai indikator yang menunjukkan proses pembacaan sensor dan tampilan nilai sensor. Apabila telah berhasil, maka LED akan padam. Selama LED menyala, maka program akan berurutan menjalankan pembacaan ADC dari PORTA4, PORTA5 dan PORTA6. Data hasil pembacaan akan diproses dalam program dan ditampilkan pada LCD dengan format per baris yaitu:
2
Laporan Praktikum Aplikasi Mikrokontroller, Program Magister Teknik Elektro, Jurusan Teknik Elektro, Fakultas Teknik, Universitas Brawijaya, Malang. 22 Desember 2015. Baris 1 - “Nuvoton NUC140” Baris 2 - “Sensor MMA7361L” Baris 3 - “x= y= z=” Baris 4 - nilai masing-masing sensor Masing-masing data tersebut selanjutnya dikirim melalui UART dengan fomat sebagai berikut: “x’datax’ y’datay’ z’dataz’ ” Sehingga apabila misal terdapat data x=1011, y=2746, z=3009, maka UART akan mengirim data dengan format: “x1011 y2746 z3009”. Nilai ADC yang dibaca menggunakan resolusi 12 bit, dimana nilai minimum 0 dan maksimum 4095. Namun dalam pembacaan sensor, dibutuhkan kalibrasi kembali dari 0g, -1g dan 1g. Sehingga dalam kalibrasi akan dilakukan perhitungan nilai maksimum dan minimum sebagai 1g dan -1g, serta pembagian untuk memperoleh nilai 0g. Untuk setting UART channel 0 menggunakan parameter sebagai berikut: - Baud Rate 9600 - Data 8 bit - 1 stop bit - No parity - FIFO 1 byte Data UART akan dikirim dan dihubungkan melalui modul bluetooth. Pada Android menggunakan aplikasi “Arduino Centrale Free” untuk menyimpan data pembacaan sensor. Selanjutnya data yang telah disimpan dapat digunakan sebagai data sekunder untuk aplikasi lainnya. Pada program editor CoIde digunakan tiga driver utama yaitu driver GPIO, driver LCD dan driver UART. Pada project yang dibuat, nama ketiga file driver tersebut adalah DrvGPIO.h DrvADC.h dan DrvUART.h.
Tampilan LCD pada Gambar 8 menunjukkan pembacaan sensor x=1292, y=1867 dan z=1086. Apabila dihitung dari besaran gravitasi maka dapat dihitung nilai sensor sebagai berikut:
Dari hasil perhitungan tersebut maka dapat dihitung pula pembacaan y dan z axis dengan metode serupa. Untuk data logger, tampilan pada android adalah sebagai berikut:
III. Hasil Eksperimen Pembacaan ADC sensor MMA7361L dalam eksperimen ini adalah sebagai berikut:
Gambar 9. Tampilan data logger pada android
Tabel 1. Hasil pembacaan sensor
Data (int) Max (1g) Min (-1g)
x-axis 3014 996
y-axis 3106 1078
IV. Kesimpulan Dari hasil eksperimen terdapat beberapa kesimpulan antara lain sebagai berikut: 1. Setiap peripheral NUC140 / ARM M0 harus diinisialisasi terlebih dahulu sebelum digunakan 2. Driver dan library diperlukan untuk mempermudah perancangan program NUC140 3. ADC pada NUC140 memiliki resolusi default 12 bit 4. Nilai pembacaan ADC dapat disimpan dalam jumlah besar dengan memanfaatkan datalogger eksternal V. Saran Beberapa saran dari hasil eksperimen pembacaan sensor accelerometer menggunakan learning board Nuvoton NUC140 ini adalah sebagai berikut: 1. Pemahaman tiap fungsi dalam library diperlukan untuk mempermudah pemrograman
z-axis 2694 745
Dalam experimen NUC140 ini terdapat dua hasil utama yaitu tampilan pembacaan sensor pada LCD dan tampilan data logger pada android. Pada LCD Learning Board, tampilan hasil pembacaan sensor adalah sebagai berikut:
Gambar 8. Tampilan LCD Graphic
3
Laporan Praktikum Aplikasi Mikrokontroller, Program Magister Teknik Elektro, Jurusan Teknik Elektro, Fakultas Teknik, Universitas Brawijaya, Malang. 22 Desember 2015. 2. Penggunaan shield board seperti arduino diperlukan untuk menghindari pengkabelan yang rumit 3. Arsitektur learning board perlu dipahami terlebih dahulu untuk mempermudah perancangan sistem VI. Daftar Pustaka Nuvoton Nu_LB-002 Rev 2.0, 2010, User’s Manual NuMicro™ NUC130/NUC140, 2011, Technical Reference Manual Putra, A.E. dan Antony, C.A, 2012, Petunjuk Praktikum Nuvoton NUC140 ARM Cortex M0, AAERG – ELINS, UGM Datasheet Freescale Semiconductor Technical Data © Freescale Semiconductor, Inc., 2008. All rights reserved. MMA7361 ±1.5g, ±6g Three Axis Low-g Micromachined Accelerometer Michelle Clifford and Leticia Gomez, 2005, Measuring Tilt with Low-g Accelerometers
4
Laporan Praktikum Aplikasi Mikrokontroller, Program Magister Teknik Elektro, Jurusan Teknik Elektro, Fakultas Teknik, Universitas Brawijaya, Malang. 22 Desember 2015. DrvGPIO_Open(E_GPA,5,E_IO_INPUT); DrvGPIO_Open(E_GPA,4,E_IO_INPUT); DrvGPIO_Open(E_GPC,12,E_IO_OUTPUT);
Lampiran 1. Listing Program Utama #include "stdio.h" #include "DrvADC.h" #include "DrvSYS.h" #include "DrvGPIO.h" #include "DrvUART.h" #include "LCD_Driver.h"
DrvGPIO_Open(E_GPD,14,E_IO_OUTPUT); //mengatur PortD.14 sebagai OUTPUT DrvGPIO_ClrBit(E_GPD,14); //mengeluarkan logika LOW pada PortD.14 untuk menyalakan LED Backlight untuk LCD STR_UART_T sParam; DrvGPIO_InitFunction(E_FUNC_UART0);
#define xmin 996 #define xmax 3014 #define ymin 1078 #define ymax 3106 #define zmin 745 #define zmax 2694
sParam.u32BaudRate = 9600; sParam.u8cDataBits = DRVUART_DATABITS_8; sParam.u8cStopBits = DRVUART_STOPBITS_1; sParam.u8cParity = DRVUART_PARITY_NONE; sParam.u8cRxTriggerLevel = DRVUART_FIFO_1BYTES; if(DrvUART_Open(UART_PORT0,&sParam) != E_SUCCESS);
uint8_t read_buf[17]; uint8_t i; uint8_t j; int int int long
len; cont; pointer[15]; ucByte1 = 0;
DrvADC_Open(ADC_SINGLE_END, ADC_CONTINUOUS_OP, 0x70, EXTERNAL_12MHZ, 5); //Single-End, Contiuous Cycle Scan, kanal 7, 12Mhz, pembagi 5 //clock ADC = 12MHz/(5+1) = 6MHz DrvADC_StartConvert(); //konversi ADC dimulai DrvADC_EnableADCInt(AdcIntCallback, 0);//aktifkan interrupt ADC, dan ADC_IRQHandler diarahkan ke AdcIntCallback
uint8_t gu8AdcIntFlag; uint16_t u16ConversionData[3]; char temp[20]; void AdcIntCallback(uint32_t u32UserData) { DrvGPIO_ClrBit(E_GPC,12); u16ConversionData[0] = DrvADC_GetConversionData(6); u16ConversionData[1] = DrvADC_GetConversionData(5); u16ConversionData[2] = DrvADC_GetConversionData(4);
DrvSYS_Delay(500000); while(1) { } }
sprintf(temp,"%4d %4d %4d", u16ConversionData[0], u16ConversionData[1], u16ConversionData[2]); clr_all_panel(); print_lcd(0, " NUC 140 "); print_lcd(1, "Sensor MMA7361L"); print_lcd(2,"x= y= z="); print_lcd(3, " "); print_lcd(3, temp); sprintf(temp,"x=%4d y=%4d z=%4d \n",u16ConversionData[0],u16ConversionData[1],u16Conversio nData[2]); DrvUART_Write (UART_PORT0,temp, sizeof(temp)); DrvGPIO_SetBit(E_GPC,12); DrvSYS_Delay(1000000); //tunda selama 1000ms }
int main(void) { UNLOCKREG();DrvSYS_SetOscCtrl(E_SYS_XTL12M,1); DrvSYS_Delay(5000); DrvSYS_SelectHCLKSource(0); DrvSYS_Open(48000000); LOCKREG(); DrvSYS_SetClockDivider(E_SYS_HCLK_DIV,0); Initial_panel(); //inisial LCD clr_all_panel(); //hilangkan semua karakter di LCD DrvGPIO_Open(E_GPA,6,E_IO_INPUT);
5
Laporan Praktikum Aplikasi Mikrokontroller, Program Magister Teknik Elektro, Jurusan Teknik Elektro, Fakultas Teknik, Universitas Brawijaya, Malang. 22 Desember 2015. return (ADC->ADDR[u8ChannelNum].RSLT); else /* 2's complement */ { uint16_t u16AdcData = ADC>ADDR[u8ChannelNum].RSLT; if( u16AdcData&0x8000 ) return (0xFFFF0000|u16AdcData); else return (int32_t)u16AdcData; } } }
Lampiran 2. Bagian library terpakai dalam eksperimen DrvADC.c void DrvADC_Open(E_ADC_INPUT_MODE InputMode, E_ADC_OPERATION_MODE OpMode, uint8_t u8ChannelSelBitwise, E_ADC_CLK_SRC ClockSrc, uint8_t u8AdcDivisor) { /* reset ADC */ SYS->IPRSTC2.ADC_RST = 1; SYS->IPRSTC2.ADC_RST = 0; /* ADC clock source */ SYSCLK->CLKSEL1.ADC_S = ClockSrc; /* Set ADC divisor */ SYSCLK->CLKDIV.ADC_N = u8AdcDivisor; /* ADC engine clock enable */ SYSCLK->APBCLK.ADC_EN = 1; /* ADC enable */ ADC->ADCR.ADEN = 1; if( InputMode == ADC_SINGLE_END ) ADC->ADCR.DIFFEN = 0; /* single end input */ else ADC->ADCR.DIFFEN = 1; /* differential input */ if( OpMode == ADC_SINGLE_OP ) ADC->ADCR.ADMD = 0; /* single mode */ else if( OpMode == ADC_SINGLE_CYCLE_OP ) ADC->ADCR.ADMD = 2; /* single-cycle scan mode */ else ADC->ADCR.ADMD = 3; /* continuous scan mode */ ADC->ADCHER.CHEN = u8ChannelSelBitwise; }
void DrvADC_EnableADCInt(DRVADC_ADC_CALLBACK Callback, uint32_t u32UserData) { g_ptADCCallBack = Callback; g_pu32UserData[0] = u32UserData; _DRVADC_CLEAR_ADC_INT_FLAG(); /* clear the A/D interrupt flag for safe */ ADC->ADCR.ADIE = 1; NVIC_SetPriority(ADC_IRQn, (1<<__NVIC_PRIO_BITS) 2); NVIC_EnableIRQ(ADC_IRQn); } void DrvADC_StartConvert(void) { /* clear the A/D conversion interrupt flag (ADF) */ /* "ADC->ADSR.ADF = 1;" is not recommended. It may clear CMPF0 and CMPF1 */ outpw(ADC_ADSR, (inpw(ADC_ADSR)&(~0x7))|0x1); ADC->ADCR.ADST = 1; } int32_t DrvADC_GetConversionData(uint8_t u8ChannelNum) { if(ADC->ADCR.DIFFEN==0) /* Single-end input mode */ { return ((int32_t)(ADC->ADDR[u8ChannelNum].RSLT & 0xFFF)); } else /* Differential input mode */ { if(ADC->ADCR.DMOF==0) /* unsigned format */
6
Laporan Praktikum Aplikasi Mikrokontroller, Program Magister Teknik Elektro, Jurusan Teknik Elektro, Fakultas Teknik, Universitas Brawijaya, Malang. 22 Desember 2015. /* Enable UART clock */ SYSCLK->APBCLK.UART0_EN = 1;
DrvUART.c
} else if(u32Port == UART_PORT1) { /* Reset IP */ SYS->IPRSTC2.UART1_RST = 1; SYS->IPRSTC2.UART1_RST = 0;
int32_t DrvUART_Open(E_UART_PORT u32Port, STR_UART_T *sParam) { UART_T * tUART; if ((u32Port != UART_PORT0) && (u32Port != UART_PORT1) && (u32Port != UART_PORT2)) {
/* Enable UART clock */ SYSCLK->APBCLK.UART1_EN = 1; } else {
return E_DRVUART_ERR_PORT_INVALID; }
/* Reset IP */ SYS->IPRSTC2.UART2_RST = 1; SYS->IPRSTC2.UART2_RST = 0;
if ((sParam->u8cParity != DRVUART_PARITY_NONE) && (sParam->u8cParity != DRVUART_PARITY_EVEN) && (sParam->u8cParity != DRVUART_PARITY_ODD) && (sParam->u8cParity != DRVUART_PARITY_MARK) && (sParam->u8cParity != DRVUART_PARITY_SPACE)) { return E_DRVUART_ERR_PARITY_INVALID; } else if ((sParam->u8cDataBits != DRVUART_DATABITS_5) && (sParam->u8cDataBits != DRVUART_DATABITS_6) && (sParam->u8cDataBits != DRVUART_DATABITS_7) && (sParam->u8cDataBits != DRVUART_DATABITS_8)) { return E_DRVUART_ERR_DATA_BITS_INVALID; } else if ((sParam->u8cStopBits != DRVUART_STOPBITS_1) && (sParam->u8cStopBits != DRVUART_STOPBITS_2) && (sParam->u8cStopBits != DRVUART_STOPBITS_1_5) ) { return E_DRVUART_ERR_STOP_BITS_INVALID; }
/* Enable UART clock */ SYSCLK->APBCLK.UART2_EN = 1; } tUART = (UART_T *)((uint32_t)UART0 + u32Port);
/* Tx FIFO Reset & Rx FIFO Reset & FIFO Mode Enable */ tUART->FCR.TFR =1; tUART->FCR.RFR =1; /* Set Rx Trigger Level */ tUART->FCR.RFITL = sParam>u8cRxTriggerLevel; /* Set Parity & Data bits & Stop bits */ tUART->LCR.SPE =((sParam>u8cParity)&0x4)?1:0; tUART->LCR.EPE =((sParam>u8cParity)&0x2)?1:0; tUART->LCR.PBE =((sParam>u8cParity)&0x1)?1:0; tUART->LCR.WLS =sParam->u8cDataBits; tUART->LCR.NSB =sParam->u8cStopBits; /* Set Time-Out */ tUART->TOR.TOIC =sParam->u8TimeOut; /* Check Clock Source */ if(SYSCLK->PWRCON.XTL12M_EN) SYSCLK->CLKSEL1.UART_S = 0; else { if(SYSCLK->PLLCON.PD==0) SYSCLK->CLKSEL1.UART_S = 1; else if(SYSCLK->PWRCON.OSC22M_EN) SYSCLK->CLKSEL1.UART_S = 3; else return E_DRVUART_ERR_OPEN; }
else if ((sParam->u8cRxTriggerLevel != DRVUART_FIFO_1BYTES) && (sParam->u8cRxTriggerLevel != DRVUART_FIFO_4BYTES) && (sParam->u8cRxTriggerLevel != DRVUART_FIFO_8BYTES) && (sParam->u8cRxTriggerLevel != DRVUART_FIFO_14BYTES)&& (sParam->u8cRxTriggerLevel != DRVUART_FIFO_30BYTES)&& (sParam->u8cRxTriggerLevel != DRVUART_FIFO_46BYTES)&& (sParam->u8cRxTriggerLevel != DRVUART_FIFO_62BYTES)) { return E_DRVUART_ERR_TRIGGERLEVEL_INVALID;
/* Set BaudRate */ BaudRateCalculator(GetUartClk(), sParam->u32BaudRate, u32Port);
} return E_SUCCESS; }
if(u32Port == UART_PORT0) { /* Reset IP */ SYS->IPRSTC2.UART0_RST = 1; SYS->IPRSTC2.UART0_RST = 0;
7
Laporan Praktikum Aplikasi Mikrokontroller, Program Magister Teknik Elektro, Jurusan Teknik Elektro, Fakultas Teknik, Universitas Brawijaya, Malang. 22 Desember 2015. int32_t DrvUART_Write(E_UART_PORT u32Port,uint8_t *pu8TxBuf, uint32_t u32WriteBytes) { uint32_t u32Count, u32delayno; UART_T * tUART; tUART = (UART_T *)((uint32_t)UART0 + u32Port); for (u32Count=0; u32Count
FSR.TE_FLAG !=1) /* Wait Tx empty and Time-out manner */ { u32delayno++; if ( u32delayno >= 0x40000000 ) return E_DRVUART_ERR_TIMEOUT;
} tUART->DATA = pu8TxBuf[u32Count]; /* Send UART Data from buffer */ } return E_SUCCESS;
}
8
Laporan Praktikum Aplikasi Mikrokontroller, Program Magister Teknik Elektro, Jurusan Teknik Elektro, Fakultas Teknik, Universitas Brawijaya, Malang. 22 Desember 2015. Lampiran 3. Dokumentasi Eksperimen
Fig 5. Modul Bluetooth sebagai antarmuka ke Android
Fig1. Rangkaian Eksperimen
Fig 6. Tampilan LCD nilai sensor accelerometer
Fig 2. Pengujian data serial melalui USB 2 TTL
Fig 3. Koneksi PIN perangkat ke modul NUC140
Fig 7. Screenshoot Arduino Centrale Free data logger
Fig 4. Sensor Accelerometer dan konektornya
9