Showing posts with label hobby. Show all posts
Showing posts with label hobby. Show all posts

Wednesday, May 1, 2019

Perbedaan antara varaibel global, variabel static dan variable lokal

Mungkin beberapa dari kita hanya mengetahui dua jenis variabel dalam pemrograman. Dalam hal ini pemrograman yang saya maksudkan adalah pemrograman C. Mungkin juga diantara kita, yang suka window shoping ke gitlab orang-orang jago kadang menemukan istilah static yang diikuti dengan nama tipe data kemudian nama variabel. Pada kesempatan ini, saya akan mengetik kembali (menyadur) dari link ini tentang perbedaan antara variabel global dan variabel static. Kemudian akan menambah penjelasan tentang variabel lokal. Dalam penuturan(anggap saja saya sedang berkisa) ini, akan saya tampilkan juga contoh dan penggunaan dari variabel variabel tersebut.

Mari langsung kita mulaikan saja.

Pertama adalah tentang variabel global. Jenis variabel ini sangat poluler bagi programer muda/awal/newbe. Karena sifatnya yang dapat diakses dari mana saja dan kapan saja. Pendeklarasian variabel global diletakkan pada file .c sementara pada file .h adalah extern nya. Kata extern akan menjadi penanda bahwa variabel global tersebut sudah pernah di deklarasikan, dalam hal ini di file .c. Tanpa penambahan extern, variabel global ini tidak dapat digunakan pada file yang berbeda, atau dapat namun dengan status warning setelah compile. Pesan sponsornya adalah

Global Variable Are Evil
Mengapa disebut demikian, gambar dibawah ini akan menjelaskan beberapa hal.

Atau lebih lengkatnya dapat berkunjung ke link ini

Selanjutnya tentang variabel static. Jenis variabel ini dapat ditemukan pada kode kode orang yang pro atau yang menuju pro. Mengapa, karen orang jenis ini sudah mulai merencanakan variabel apa saja yang dapat diakses global dan apa saja yang hanya dapat diakses atau digunakan pada lingkup file / proses tertentu. Mungkin variabel ini dapat dikatakan juga dengan variabel global terbatas. Mengapa disebut terbatas, karena variable ini hanya dapat dilakukan dalam satu file tersebut. Jika kita perlakukan seperti variable global, dengan menambahkan extern di file .h. yang akan terjadi malah compliler akan menulaknya alias memberikan pesan error.

variabel static kurang evil dibanding variabel global.
Terakhir adalah variabel lokal. Variabel ini sering dideklarasi dengan satu huruf dan huruf yang paling sering digunakan adalah i, setelah itu j dan k. Mengapa demikian, karena hampir semua programer diawal awal berkenalan dengan bahasa pemrograman akan menggunakan variabel ini dalam proses perulangan. Karena proses ini perlu variabel sebagai hal yang akan di incriment atau decriment. Maka si i menjadi pilihan untuk digunakan, berhubung pada beberapa buku dan text book juga menggunakan si i. Variabel lokal, hanya dapat digunakan dalam fungsi dimana variabel tersebut di deklaraskan. Tidak menggunakan kata static sebelum tipe data dan extern dengan harapan dapat di akses oleh fungsi yang lain (hehehe kalimat terakhir ini, hanya candaan saja).

Sekian dan terima kasih

Sunday, March 20, 2016

Terkait dengan StdPeriph dan Cube HAL


Setelah selesai menulis artikel tentang StdPeriph dan Cube HAL, karena saya sebelumnya menggunakan StdPeriph sebagai basis dari kode saya. Timbulah keinginan saya untuk bermigrasi ke perangkat berbasis Cube HAL.

Pada awalnya saya mengcreate beberapa project dengan CubeMX dan melanjutkannya dengan IDE trueStudio, namun karena masi dibayang-bayangi oleh IDE Coocox (CoID), maka saya coba mencari di internet, bagaimana menggunakan hasil generate code dari CubeMX dapat digunakan di CoID. sehingga saya bertemu dengan link ini. Waw saya sangat terkejut, karena untuk migrasi project trueStudio ke CoID sangatlah muda dan tanpa halangan apapun. namun ternyata itu hanyalah apa yang saya lihat diawal.

Saya melanjutkan dengan membuatkan BSP(Board Support Package) untuk board yang saya pakai (Gambar 1).
Gambar 1.Customize Dev board.

Dalam pembuatan BSP, saya ingin menggunakan library yang sebelumnya. yang ditulis diatas StdPeriph. Namun apa yang saya dapatkan. Ternyata library tersebut tidak bisa digunakan. saat di compile, terjadi infinite loop atau sampai saya endtask proses compile masi saja berjalan. 

Nah, muncul pertanyaan di benak saya... untuk menelusuri lebih jauh pendapat orang tentang StdPeriph dan CubeHAL. saya mulai dari kata kunci kira kira dalam bahasa indonesianya adalah bagaimana cara migrasi StdPeriph ke CubeHAL. dan apa yang saya dapat.

Ternyata saya menemukan diskusi yang seru di link ini, Singkatnya berdasarkan apa yang bisa saya mengerti yaitu, ternyata berdasarkan komentar dari kontributor, CubeHal bermaksud untuk, meningkatkan abstraksi dari peripheral yang ada pada uC ARM. maksudnya agar para pengguna awam dapat menggunakan semua fitur dari uC ARM tanpa direpotkan dengan setingan register yang cukup ribet(menurut segelintir orang). sehingga ada yang menyampaikan bahwa tujuan dari kemudahan ini yaitu akan seperti ARDUINO.... waw...waw....waw....

Sepintas setelah membaca diskusi tersebut. saya berefleksi sejenak. apakah yang saya baca itu benar... baiklah. mungkin perlu saya cerita pengalaman saya sejenak. ceritanya begini. Pada saat saya memutuskan untuk berpindah dari uC/OS dan Keil ke freeRTOS dan CoID. untuk mencari contoh project yang menggunakan freeRTOS pada CoID benar benar tidak ada (uC base STM32f103). sehingga saya harus menggunakan migrasi kecil kecilan dari uC yang tergolong saudara dekat yaitu STM32f100. dan setelah melakukannya beberapa hari akhirnya saya bisa menggunakan FreeRTOS di atas CoID dan rasanya sangat senang, dan akhirnya saya terus menggunakan tempalate project ini untuk develop prangkat selanjutnya.

Berbeda dengan perasaan yang saya alami saat menggunakan CubeMX. Sangat muda dan sekali compile langsung berhasil, dalam project tersebut sudah terpasang freeRTOS terbaru bahkan FreeRTOS yang telah dibasut oleh cmsis-os. waw teknologi apa lagi ini.... 

Dari kedua cerita diatas, sangat terasa perbedaan memulai project antara menggunakan StdPeriph dengan CubeHAL. dengan menggunakan CubeHAL, semua menjadi sangat mudah, namun saya tidak mendapatkan kebebasan seperti saat menggunakan StdPeriph. yaitu dapat langsung mengakses register berdasarkan inisilisasi yang telah didaftarkan dalam library nya.

jadi kesimpulannya mungkin saya akan mengembangkan perangkat saya saat ini dengan masi berbasis pada StdPeriph..


Sunday, February 14, 2016

Weekend project - remote WD-TV

Postingan pertama di tahun ini, baiklah.... selamat tahun baru. dan selamat menjalani resolusi ditahun yang baru ini.

Tidak perlu panjang lebar lagi, ayo kita langsung pada maksud dan tujuan... Weekend project. Project ini biasanya berisi konten yang ringan ringan, sama seperti isi weekend project yang lain, atau bahkan mirip dengan weekend project pada webside webside populer lainnya.

Namun yah sudah lah, weekend porject ini memang mungkin sama. Tapi satu yang pasti, ini adalah kerjaan sendiri yang meniru, merubah, dan menjadikan itu nyata. 

Weekend kali ini adalah membuat atau tepatnya merangkai remote WD-TV. Latar belakang pembuatan remote ini adalah karena remote bawannya rusak alias tidak berfungsi. sebenarnya ada alteratif lain agar WD-TV ini masi bisa digunakan yaitu dengan menggunakan kabel data yang langsung masuk ke TV yang ada konektor USB nya.

Menggunakan kabel data ternyata ada keterbatasanya, yaitu kemampuan dari WD-TV ini tidak dapat dinikmati secara maksimal. karena difungsikan sebagai perangkat storge biasa bukan sebagai pemutar film dengan definisi tinggi, alias HD.

Untuk mencari gantinya, hal pertama yang terpikirkan adalah kontak service center dan menanyakan apakah menyediakan remote cadangan atau tidak. Tapi begitulah telephon semua nomor yang ada di internet, tetapi tidak ada yang menyediakannya. Selanjutnya, browsing di internet apakah ada remote lain yang bisa digunakan. Ternyata ada, remote dari Creative, waw remote yang sangat canggih. Sebanding dengan harganya....bahkan remote ini bisa diprogram diganti ganti fungsinya... seperti HP saja... tambah aplikasi tinggal colok kabel data...

Mungkin karena latar belakang saya yang bisa elektronika, jadi hal selanjutnya yang terpikirkan adalah bagaimana kalau membuat remote tersebut. Berhubung dukungan hardware di daerah tempat tinggal saya cukup bervariasi, jadi apa salahnya untuk mencoba.

langkah pertama yaitu mengumpulkan resource dari internet dan berikut ini adalah beberapa resource yang diperoleh dan menjadi acuan.
  • WDTLIVE remote codes, link ini berisi kode-kode remote yang sudah di capture oleh orang lain, dan dipublis. yah mungkin sama latar belakannya yaitu ingin membuat remote pengganti. atau ada yang menyanyakannya di forum.
  • IR-Remote Library, Selanjutnya pustaka Arduino, perangkat hardware yang dapat diprogram. Perangkat ini merupakan perangkat favorit bagi para penghobby elektronik.
  • Keypad Library, lebrary ini juga digunakan untuk memprogram Arduino. Jika library sebelumnya berhubungan dengan data apa yang akan dikirim, library ini berhubungan dengan manusia, yaitu data apa yang dikenedaki untuk dikirim. (Sulit banget kalimat nya n_nV)
Selanjutnya adalah mempersiapakan dapur (meracik kode yang ada). Beberapa kode yang digabungkan adalah, Kode atau sinyal remote WD-TV, kode keypad, dan kode untuk mengirimkan data lewat irda. Tidak semua fungsi dari remote dikeluarkan dalam remote yang dibuat kali ini, hanya fungsi yang sering dipakai saja. berikut ini adalah gambar yang menggabarkan menu yang diracik.

Setelah kode selesai diracik dan menjadi customize remote, maka tahap selanjutnya adalah percobaan kode tersebut. Berikut ini adalah penampakan dari purnarupa (prototype) remote.


Untuk led irda ada di sebelah kiri. prototype ini sempat digunakan selama kurang lebih 2 bulan, namun, karena kurang fleksibel karena harus selalu terhubung dengan sumber tegangan atau adaptor.
Sehingga selanjutnya dibuatkan sebuah remote yang portable.

Berikut ini adalah alat dan bahan yang digunakan dalam pembuatan remote, proses ini yang saya sebut dengan weekend project. 
  • Kesing universal
  • Arduino Pro Mini, perangkat ini dipilih karena konsumsi tenganan 3.3v dan bentuknya yang kecil. Konsumsi tegangan sebanding dengan kecepatan komputasi, namun pada project ini tidak memerlukan proses komputasi yang cepat.
  • Kabel. Sudah tentu harus ada
  • Led Irda. apalagi untuk komponen yang satu ini, harus ada
  • Led indikator, opsional
  • Saklar ON OFF.
  • Battre Holder
  • LED Holder.
  • Lem Tembak.
  • Grinda tangan. untuk melubangkan kesing.
Foto persiapan alat dan bahan ditunjukkan pada gambar di bawa.


Hal yang pertama dilakukan adalah membaut garis bantu pada kesing dalam rangka pemotongan. beberapa lubang yang dibuat untuk komponen komponen sebagai berikut
  • keypad
  • Irda
  • saklar on/off dan
  • led indikator.
Setelah kesing selesai dilubang, maka tahap selanjutnya menyolder semua komponen yang telah disediakan. Seperti yang ditunjukkan pada gambar dibawa ini.



Dan beginilah penampakan akhir dari remote hasil dari weekend project kali ini. btw.. video pengujiannya nyusul yah... n_nV


berikut ini adalah video pengujiannya n_nV

Tuesday, September 30, 2014

LCD 4x20, Modul klasik yang masih asik


Ceritanya dimulai dari saat pengembangan perangkat yang membutuhkan modul LCD karakter 4x20. Modul ini adalah sebuah modul LCD karakter yang terdiri dari 4 barus dan 20 kolom.

Sebenarnya Perkenalan dengan modul ini sudah terjadi sejak lama, kurang lebih 8 tahun yang lalu, waktu itu menggunakan LCD 2x16. Menurut datasheet yang diperoleh, karakteristik dari LCD 4x20 mirip dengan LCD 2x16. Sehingga dalam pikiran saya hal ini tidak sulit untuk di jalani kembali. yang menjadi tantangannya adalah uC yang digunakan, berbeda dengan waktu lalu.

Seperti biasa, percobaan dimulai dengan mencari apakah sudah perna ada orang yang membuat kode atau librari modul ini sebelum nya dengan target uC yang digunakan saat ini. dan kemungkinan besar pasti sudah ada, lebih mengejutkan lagi saya menemukan dua library gihub yang mempublikasikan librari dari modul ini yang telah mereka buat.

Langkah selanjutnya adalah mencoba program tersebut. dan hasilnya adalah negatif. kedua library tersebut tidak dapat berjalan dengan baik, atau bahkan dapat dikatakan harus diberi sentuhan agar dapat digunakan sesuai dengan yang diinginkan. Sementara itu ada masalah lain yang mengnatui di pikiran, yaitu perbedaan tegangan kerja antar uC dengan modul.

Tegangan kerja modul LCD adalah 5v DC sementara tengangan kerja uC yang digunakan adalah 3.3 v DC. Ada kekawatiran dalam pikiran yaitu, perbedaan tengangan kerja ini dapat mempengaruhi proses antarmuka antara modul dan uC. Penarasan berlanjut, dengan mencari video di internet yang menampilkan percobaan yang berhasil antarmuka modul dengan uC, dan ternyata videonya juga sudah ada di internet. dari semua video yang ada, semuanya menunjukkan percobaan yang berhasil dengan cara hubungkan langsung, yaitu langsung menghubungkan kaki uC ke kaki control dan data pada modul.

Percaya diri pun bertambah, namun masi tetap pusing karena pikiran ini selalu berasumsi bahwa, apa yang telah di posting di internet sudah pasti benar dan akan selalu berhasil. Namun untuk kasus yang satu ini. asusmi itu salah. Di suatu ketika, saya bertekat untuk keluar dari kebiasaan atau dari pendirian selama ini dan rasa malas.

Saat itu saya coba untuk mengambil devboard dari uC yang digunakan dan menyolderkan kaki idc pada modul LCD. yang percobaan sebelumnya saya lakukan pada uC yang sudah terpasang pada board yang telah di kastem sesuai dengan kebutuhan. Berdasarkan tekat tersebut, dilakukan percobaan program diatas devboard dan LCD.

Hasilnya masi sama. kode yang didapat dari internet ternyata masi tetap tidak bisa jalan, meskipun pin dan portnya sudah disesuaikan dengan library yang diperoleh. untuk diketahui dua library yang saya peroleh tersebut, memiliki perbedaan cara mengakses modul yaitu, menggunakan cara komunikasi 8-bit dan komunikas 4-bit.

Dampak yang signifikan dapat dilihat dari beberapa sudut pandang. misalnya dari jumlah kabel yang nantinya akan menghubungkan modul dengan uC. Jika dalam desain perangkatnya mengharuskan modul terpasang pada kesing sehingga diperlukan kabel penghubung untuk menghubungkan board dengan modul. selain itu, jalur pada PCB Lebih sedikit sehingga area board dapat digunakan oleh rangkaian yang lain.

Saya rasa cukup basa basinya. berikut ini adalah contoh program yang sangat sederhana dan langsung pada penampakan satu karakter. oh ya... projek ini di kembangkan diatas keil uVision. namun sangat mungkin untuk menjalankannya diatas Coocox atau IDE yang lain sesuai dengan keterikatan kita dengan IDE/ Text editor yang kita gunakan.




Kode dari program ini adalah :
1:  /*  
2:   * main.c  
3:   *  
4:   * Created on: Sep 30, 2014  
5:   *   Author: Ricky  
6:   */  
7:    
8:  #include "stm32f4xx.h"  
9:  #include "stm32f4xx_gpio.h"  
10:  #include "stm32f4xx_rcc.h"  
11:  #include "stm32f4_discovery.h"  
12:    
13:  // Port yang digunakan  
14:  #define LCD_GPIO_D GPIOE  
15:  #define LCD_GPIO_C GPIOB  
16:    
17:  // Pin data yang digunakan  
18:  #define LCD_D4 GPIO_Pin_12  
19:  #define LCD_D5 GPIO_Pin_13  
20:  #define LCD_D6 GPIO_Pin_14  
21:  #define LCD_D7 GPIO_Pin_15  
22:    
23:  // pin control yang digunakan  
24:  #define LCD_RS GPIO_Pin_12  
25:  #define LCD_EN GPIO_Pin_13  
26:    
27:    
28:  // resume control pada LCD  
29:  #define HD44780_CLEAR                                0x01  
30:    
31:  #define HD44780_HOME                              0x02  
32:    
33:  #define HD44780_ENTRY_MODE                           0x04  
34:       #define HD44780_EM_SHIFT_CURSOR            0  
35:       #define HD44780_EM_SHIFT_DISPLAY       1  
36:       #define HD44780_EM_DECREMENT            0  
37:       #define HD44780_EM_INCREMENT            2  
38:    
39:  #define HD44780_DISPLAY_ONOFF                      0x08  
40:       #define HD44780_DISPLAY_OFF                   0  
41:       #define HD44780_DISPLAY_ON                 4  
42:       #define HD44780_CURSOR_OFF                 0  
43:       #define HD44780_CURSOR_ON                 2  
44:       #define HD44780_CURSOR_NOBLINK             0  
45:       #define HD44780_CURSOR_BLINK            1  
46:    
47:  #define HD44780_DISPLAY_CURSOR_SHIFT          0x10  
48:       #define HD44780_SHIFT_CURSOR            0  
49:       #define HD44780_SHIFT_DISPLAY            8  
50:       #define HD44780_SHIFT_LEFT                 0  
51:       #define HD44780_SHIFT_RIGHT              4  
52:    
53:  #define HD44780_FUNCTION_SET                 0x20  
54:       #define HD44780_FONT5x7                     0  
55:       #define HD44780_FONT5x10                4  
56:       #define HD44780_ONE_LINE                0  
57:       #define HD44780_TWO_LINE                8  
58:       #define HD44780_4_BIT                     0  
59:       #define HD44780_8_BIT                     16  
60:    
61:  #define HD44780_CGRAM_SET                      0x40  
62:    
63:  #define HD44780_DDRAM_SET                      0x80  
64:    
65:    
66:  void LCD_Initialize(void);  
67:  void LCD_GoTo(unsigned char, unsigned char);  
68:  void LCD_WriteText(char *);  
69:  void LCD_WriteData(u8 dataToWrite);  
70:  void LCD_WriteNibble(u8 nibbleToWrite);  
71:  void CharLCD_Delay(int Count);  
72:  void LCD_WriteCommand(u8 commandToWrite);  
73:    
74:    
75:  int main(void)  
76:  {  
77:   LCD_Initialize();  
78:   LCD_GoTo(1,1);  
79:   LCD_WriteText("LCD 4x20");  
80:   LCD_GoTo(1,2);  
81:   LCD_WriteText("Modul    KLASIK!!");  
82:   LCD_GoTo(1,3);  
83:   LCD_WriteText("yang masih");  
84:   LCD_GoTo(13,4);  
85:   LCD_WriteText("ASIK!!");  
86:    
87:   while(1)  
88:   {  
89:   }  
90:    
91:  }  
92:    
93:  void LCD_Initialize(void)  
94:  {  
95:       GPIO_InitTypeDef GPIO_InitStructure;  
96:       vu8 i = 0;  
97:       vu32 delayCnt = 0;  
98:    
99:       RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);  
100:       RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);  
101:    
102:    
103:       GPIO_InitStructure.GPIO_Pin  = LCD_D4|LCD_D5|LCD_D6|LCD_D7;  
104:       GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;  
105:       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;  
106:       GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;  
107:    
108:       GPIO_Init(LCD_GPIO_D, &GPIO_InitStructure);  
109:    
110:       GPIO_InitStructure.GPIO_Pin  = LCD_RS|LCD_EN;  
111:       GPIO_Init(LCD_GPIO_C, &GPIO_InitStructure);  
112:    
113:       GPIO_ResetBits(LCD_GPIO_C, LCD_RS | LCD_EN );  
114:    
115:       for(delayCnt = 0; delayCnt < 300000; delayCnt++);  
116:    
117:       for(i = 0; i < 3; i++)  
118:       {  
119:            LCD_WriteNibble(0x03);  
120:            for(delayCnt = 0;delayCnt < 30000; delayCnt++);  
121:       }  
122:    
123:       LCD_WriteNibble(HD44780_HOME);  
124:    
125:       for(delayCnt = 0;delayCnt < 6000; delayCnt++);  
126:    
127:       LCD_WriteCommand(HD44780_FUNCTION_SET |  
128:                            HD44780_FONT5x7 |  
129:                            HD44780_TWO_LINE |  
130:                            HD44780_4_BIT);  
131:    
132:       LCD_WriteCommand(HD44780_DISPLAY_ONOFF |  
133:                            HD44780_DISPLAY_OFF);  
134:    
135:       LCD_WriteCommand(HD44780_CLEAR);  
136:    
137:       LCD_WriteCommand(HD44780_ENTRY_MODE |  
138:                            HD44780_EM_SHIFT_CURSOR |  
139:                            HD44780_EM_INCREMENT);  
140:    
141:       LCD_WriteCommand(HD44780_DISPLAY_ONOFF |  
142:                            HD44780_DISPLAY_ON |  
143:                            HD44780_CURSOR_ON |  
144:                            HD44780_CURSOR_BLINK);  
145:    
146:       LCD_WriteCommand(HD44780_CLEAR);  
147:  }  
148:    
149:  void LCD_GoTo(unsigned char x, unsigned char y)  
150:  {  
151:       u8 position;  
152:    
153:       switch(y) {  
154:            case 1:  
155:                 position = x - 0x01;  
156:                 break;  
157:            case 2:  
158:                 position = x + 0x3F;  
159:                 break;  
160:            case 3:  
161:                 position = x + 0x13;  
162:                 break;  
163:            case 4:  
164:                 position = x + 0x53;  
165:                 break;  
166:            default:  
167:                 break;  
168:       }  
169:       LCD_WriteCommand(position | 0x80);  
170:    
171:  }  
172:    
173:  void LCD_WriteTextXY(char * text, u8 x, u8 y)  
174:  {  
175:       LCD_GoTo(x,y);  
176:       LCD_WriteText(text);  
177:  }  
178:    
179:  void LCD_WriteText(char * text)  
180:  {  
181:       while((*text !=0) && (*text != 13))  
182:             LCD_WriteData(*text++);  
183:  }  
184:    
185:  void LCD_WriteData(u8 dataToWrite)  
186:  {  
187:       GPIO_WriteBit(LCD_GPIO_C, LCD_RS, Bit_SET);  
188:    
189:       LCD_WriteNibble(dataToWrite >> 4);  
190:       LCD_WriteNibble(dataToWrite & 0x0F);  
191:    
192:  }  
193:    
194:  void LCD_WriteCommand(u8 commandToWrite)  
195:  {  
196:       GPIO_WriteBit(LCD_GPIO_C, LCD_RS, Bit_RESET);  
197:       LCD_WriteNibble(commandToWrite >> 4);  
198:       LCD_WriteNibble(commandToWrite & 0x0F);  
199:    
200:  }  
201:    
202:  void LCD_WriteNibble(u8 nibbleToWrite)  
203:  {  
204:       GPIO_WriteBit(LCD_GPIO_C, LCD_EN, Bit_SET);  
205:       GPIO_WriteBit(LCD_GPIO_D, LCD_D4, (nibbleToWrite & 0x01));  
206:       GPIO_WriteBit(LCD_GPIO_D, LCD_D5, (nibbleToWrite & 0x02));  
207:       GPIO_WriteBit(LCD_GPIO_D, LCD_D6, (nibbleToWrite & 0x04));  
208:       GPIO_WriteBit(LCD_GPIO_D, LCD_D7, (nibbleToWrite & 0x08));  
209:       CharLCD_Delay(0x1F000); // tundaan yang paling cepat yang masi dapat berjalan  
210:       GPIO_WriteBit(LCD_GPIO_C, LCD_EN, Bit_RESET);  
211:    
212:  }  
213:    
214:  void CharLCD_Delay(int Count)  
215:  {  
216:       while(Count--)  
217:       {  
218:       }  
219:  }  
220:    

Kode ini sebenarnya saya gabungkan dari beberapa sumber di internet yaitu:
Namun, kode tersebut tidak dapat langsung digunakan, sehingga saya berikan beberapa sentuhan asik. sampai bisa berjalan dengan baik (setidaknya menurut saya).

Tuesday, January 21, 2014

Kontrol Relay dengan sms (arduino, gsm dan relay shield), bagian kedua setup modul relay

postingan ini merupakan postingan yang berantai. maksudnya ini adalah bagian yang kedua dari total tiga postingan yang direncanakan, alasanya adalah saya saja tidak suka membaca postingan yang panjang-panjang oleh karena itu setelah menuliskan postingan sebelumnya, jadi perpikir gimana kalau dijadikan beberapa postingan saja berhubung banyak pengalaman yang diceritakan dalam mengkonfigurasi setiap modul (shield) sebelum di pakai sebagai alat kontrol relay dengan sms.

2. modul relay shield. modul yang di pakai adalah produksi dfrobot, mengapa memilih modul ini? karena modul ini yang tersedia di pasaran lokal (bandung). saat ini modul ini sudah mencapai versi dua, dengan perubahan yang sangat signifikan. mari kita melihat bentuk fisik dari kedua versi dari modul ini


relay shield versi 1
relay shield versi 2

dari gambar di atas, yang awalnya tanpa pin konfigurasi (versi 1), menjadi sangat banyak pin konfigurasi (versi 2) bahkan sampai ada konektor tambahan untuk servo, push button untuk reset system dan selekor state prog atau run. untuk fitur yang lain silahkan berkunjung ke halaman ini.

pada versi satu secara default relay terkoneksi pada :
D2 -> COM1
D3 -> COM2
D4 -> COM3
D5 -> COM4

map koneksi ini tidak akan ada masalah jika di pasangkan dengan modul gprs shield, karena tidak ada pin yang konflik. sementara

pada versi dua secara default relay terkoneksi pada :
D2 -> COM1
D7 -> COM2
D8 -> COM3
D10 -> COM4

map koneksi ini akan menyebabkan masalah karena pin D7 dan D8 digunakan juga dalam proyek ini sebagai pin softwareSerial agar mikrokontroler dapat berkomunikasi dengan modul gprs shield. namun karena pada versi dua memiliki kemampuan untuk konfigurasi pin sehingga hal ini tidak terlalu bermasalah. 

misalnya kita menganggap relay yang akan dikendalikan hanya 1 (relay D2). maka kita harus melepas jumper yang terdapat pada D7 dan D8 seperti pada gambar di bawah.



di bagian tengah, di samping kiri dari IC yang berwarna putih, merupakan tempat konfigurasi relay map, dan terlihat bahwa yang terhubung dengan relay hanya D2 untuk D7, D8, dan D10 jumper dihubugnkan dengan IO dari zigbee. 

pengalaman waktu menggunakan modul ini adalah di konfigurasi map relay tadi, saat hanya menggunakan modul gprs shield dan arduino, maka perogram berjalan dengan lancar, namun ketika menambahkan modul relay shield, kok ada masalah yah......setelah di perhatikan ternyata, perlu konfigurasi map relay lebih lanjut. karena pin yang saling konflik.

bagian kedua berakhir di sini.

Monday, January 20, 2014

Kontrol Relay dengan sms (arduino, gsm dan relay shield), bagian pertama setup modul gprs

jika di search sudah banyak sekali refernesi untuk membuat

hasil pencarian di google dengan kata kunci kontrol relay dengan sms

  1. http://telinks.wordpress.com/tag/kontrol-relay-via-sms/
  2. http://delta-electronic.com/article/2012/03/an0187-aplikasi-kendali-peralatan-dan-monitoring-kondisi-sensor-melalui-sms/
  3. http://www.instructables.com/id/Control-the-relays-via-GPRS-SMS/?ALLSTEPS
  4. http://www.serasidis.gr/circuits/smscontrol/smscontroller.htm
  5. http://www.acmesystems.it/beeboard_gsm
setelah di cari di internet ternyata sudah banyak yang membuat hal yang sama, namun mengapa masi coba untuk di bahas lagi? jawabanya adalah mungkin yang di bahas pada blog ini adalah lebih generik dengan modul modul yang tersedia di pasaran, dan blog tidak terikan dengan produk tertentu (jualan produk).

modul yang digunakan :

dari ketiga modul ini tentunya yang tidak perlu di konfigurasi awal adalah modul arduino, konfigurasi awal maksudnya setingan hardware, karena sudah berupa dev board yang siap pakai, bedakan istilah ini dengan memprogramnya... n_nV

langkah awal yang dilakukan adalah memastikan bahwa modul modul yang di gunakan berfungsi sebagaimana yang di harapkan.

1. modul gprs shield : modul ini adalah modul yang berfungsi untuk menerima sms. pada modul ini terdapat submodul yang merupakan bagian inti dari modul ini yaitu sim900. Parts ini sudah berupa modul yang di paket dalam bentuk IC dengan antarmuka usart. Pada waktu dibeli modul ini memiliki konfigurasi default yaitu jenis sms PDU dan baudrate serial = 0 (auto baudrate), dan masi ada lagi yang lain. tapi untuk proyek ini, dua hal itu yang perlu di perhatikan.

konfigurasi yang harus dilakukan adalah mengubah jenis sms menjadi TEXT dan mengubah baudrate menjadi sesuai dengan baudrate komunikasi serial yang digunakan (19200).

pertanyaan selanjutnya, bagaimana cara mengubah dua konfigurasi di atas... betul juga yah..???

caranya adalah dengan menggunakan arduino sebagai antarmuka awal konfigurasi, kodenya dapat di ambil di sini, pada test pertama dengan nama Test Setup. Perlu di perhatikan sim900 perlu di aktifkan manual dengan menekan tombol yang ada pada shield di bagian tepi dari shield ini, tahan sekitar tiga detik. Perhatikan lampu yang indikator sinyalnya, awalnya akan berkedip dengan cepat. jika kedipan sudah lambat(sekitar satu detik tiap kedipan) artinya modul sudah terhubung dengan jaringan telekomunikasi sesuai dengan kartu yang digunakan (jangan lupa menggunakan sim card yang aktif). 

sebagai antarmuka dengan komputer dapat menggunakan hyperterminal atau yang sejenisnya dengan baudrate (19200) sesuai dengan contoh program yang digunakan.

jangan lupa untuk membuka device menager pada windows properties untuk mengetahui Port(com) berapa yang terdaftar sebagai arduino.

setelah modul terhubung dengan komputer, biasanya pada hyperterminal belum akan menampilkan apa apa, atau terkesan belum terhubung (tombol open di tekan). jika terjadi hal seperti ini, coba matikan modul gprs nya dengan cara menekan selama kurang lebih 3 detik tombol yang tadi. biasanya akan muncul "yyyyyyyyyy" itu artinya koneksi sudah berhasil tetapi baudratenya masi salah. coba di restart lagi, dan ketik at terus enter, ulangi proses ini (at + enter) sampai ada balasan ok dari mesin (modul gprs).

setelah ada balasan ok dari mesin ini berarti modul gprs siap di konfigurasi. ada tiga perintah yang harus di ketikkan masing masing perintah di akhri dengan menekan enter :

set baudrate :
at+ipr=19200

set format sms :
at+cmgf=1

save setting yang di lakukan :
at&w

setelah langkah ini dilakukan. maka setup modul gprs telah selesai dilakukan.

ref sim900 : at+command, design
referensi kode di tutorial ini