Industrial 4-20 mA Loop Calibrator [Home Made]


Berikut skema calibrator versi sederhana.. (dengan LM317) untuk kalibrasi standard signal 4-20 mA yang biasa digunakan di dunia industri.. untuk transmisi data analog antara field dan kontroler (DCS, PLC, dll)..

skema calibrator

penampakan alat nya saudara…
atas

depan

Hasil setting alat dan ujicoba (Diklaibrasi dengan miliamperemeter standard- Yokogawa) sebagai berikut :

Alat ini sudah teruji untuk kalibrasi posisi 3 kontrol valve, dan untuk 24VDC external power untuk setting 2 wire active transmitter (seperti dp level transmitter).. Uraian lengkapnya menyusul ya GANNN..

Best Regards,

Ainun Fithro

Robot Pemindah Barang – by BengkeL WEIP (2013)


Robot ini seperti yang anda lihat di video, dibuat dari komponen2 bekas… dan tidak ada motor servo di dalamnya (maklum ga ada budget).. tapi hasilnya cukup memuaskan. bisa memindahkan gelas, bahkan rokok pun dia mau.. hehehe 😀

VIDEO 1:

VIDEO 2:

VIDEO 3 (DOYAN ROKOK) :

Thanks for watching.. dedicated by bengkel weip community.. ITS Physics Surabaya.
@2013

Digital Power Supply Berbasis Mikrokontroler ATmega16


Sudah lama nggak posting di blog ini.. mangkanya keliatan sepi (pancene biasane wes sepi)… 😀

Pada kesempatan ini penulis ingin ngeshare sedikit pengalaman membuat catu daya digital sederhana. Mengapa disebut digital, ya karena tegangan maupun arus outputnya dapat diatur secara software sehingga bersifat fleksibel. Ide ini berawal dari artikel yang cukup menarik tentang “digital power supply”, bisa dibaca di sini.. dan keliatan lebih powerful dibandingkan catu daya analog baik yang menggunakan regulator fix seperti LM78xx, LM79xx atau regulator variabel LM317. Selain lebih fleksibel dalam pengontrolan outputnya, juga lebih presisi dan stabil / adaptif terhadap perubahan beban (load).

Konsep pembuatan catu daya digital ini adalah memanfaatkan DAC (digital to analog converter) yang telah dikuatkan oleh rangkaian penguat sebagai pengendali tegangan outputnya, dan sebagai feed back nya, penulis menggunakan ADC 10 bit mikro ATMega16 untuk mengukur tegangan outputnya secara pasti. Tegangan output catu daya ini bisa di-set mulai 0 volt sampai 32 volt DC dg arus maksimumnya ±1,5 Amper. Diagram bloknya seperti di bawah ini:

Kita bahas satu-satu,

Sebagai pusat kendali adalah ATMega16. Yang berfungsi memberikan output biner 1 dan 0 sebanyak 16 bit secara paralel ke rangkaian DAC. dan melakukan pembacaan tegangan output akhir dg ADC 10 bit internalnya.  Rangkaian sistem minimumnya seperti ini:

DAC yang digunakan adalah rangkaian R2R ladder yang mengkonversi nilai biner 16 bit ke besaran tegangan analog. Dikatakan R2R ladder karena mirip seperti tangga yang menaikkan tegangan outputnya sebesar Vref/65536 volt setiap penambahan 1 bit pada masukannya. Rangkaian R2R laddernya seperti di bawah ini:

Nilai output tegangan DACnya adalah Z*(Vcc/((2^n)+1))), dengan Z adalah bilangan desimal 16 bit (mulai 0 s/d 65535) Vcc adalah 5 volt, n = jumlah bit, yaitu 16 bit. Shingga output DACnya bisa disederhanakan menjadi DAC out = Z*(5Volt/65536) volt. Nilai z ditentukan dengan memberikan logika 1 atau 0 (5volt atau 0 volt) pada PORTB dan PORTD mikro. Bila PORTB dan PORTD mikro berlogika 1 semua (0Xff) didapatkan:

Z=1*(2^15)+ 1*(2^14)+ 1*(2^13)+………. +1*(2^1)+ 1*(2^0)=65535 maka DAC out nya adalah 65535*(5volt/635536) = 4,9999237060546875 atau mendekati 5 volt (maksimum).

Rangkaian penguat berfungsi mendapatkan tegangan dan arus output yang lebih besar, karena catu daya ini didesain untuk tegangan output maksimum 32 volt.. mengandalkan output tegangan DAC saja tentunya tidak cukup karena maksimumnya hanya 5 volt. Rangkaian penguat ini terbagi menjadi 2 bagian, yaitu penguat tegangan dan penguat arus, Komponen utama penguatnya adalah transistor.

Sebagai penguat tegangan, digunakan transistor BC547 dan BC557 yg memiliki gain cukup besar. Besarnya gain (penguatan) tegangan di atas ditentukan oleh R2 dan R3 sebesar (R2+R3)/R3 atau sekitar 7,8 kali tegangan DAC. Untuk pnguat arusnya digunakan rangkaian darlington kombinasi TIP122 dan jengkol 2N3055 sehingga drop tegangan output anggaplah sekitar 0,7×2 volt = 1,4 volt (drop tegangan basis-emitor ). Anggaplah tegangan DAC maksimum adalah 5 volt, maka output penguatnya adalah (5×7,8)-1,4 volt = sekitar 37,6 volt. Tapi hal ini tidak mungkin terjadi karena maksimum tegangn input DC yang digunakan adalah 35 volt. Sehingga maksimum teg. Outputnya  ya  sekitar 35 volt – 1,4 volt = 33,6 volt saja. Dari sini rangkaian di atas sudah cukup bila digunakan untuk mendesain catu daya tegangan output dari 0 s/d 32 volt.

R4 dan R5 di atas berfungsi sebagai rangkaian pembagi tegangan agar tegangan output nya dpat dibaca oleh mikro. Tegangan output catu daya maksimum adlah 32 volt. Bila langsung dibaca oleh mikro.. bisa bisa pin mikronya langsung meleduk (kobong):D, untuk itu diperlukan rangkaian penurun tegangan seperti di atas.  Tegangan drop pada pin “teg.” Adalah Vout x R5/(R4+R5) atau 32 volt x 150k / 1150k atau sekitar 4,17 volt. Nilai inilah yang maksimum terbaca oleh ADC sehingga mikro masih aman.. R4 dan R5 sengaja dibuat besar agar tidak terjadi drop arus pada beban outputnya . Sedangkan R Shunt di atast fungsinya untuk sensitivitas pengukuran arus beban pada output. R shunt dibuat sekecil mungkin agar tidak terjadi drop tegangan dan arus yang terlalu besar pd output. TRUS Bagaimana kita tahu arus pada beban..?  caranya adalah dg mengukur tegangan pada R shunt melalui ADC mikro dan membaginya dengan nilai R shunt.. misal, diketahui R shunt adalah 0.2 ohm dan tegangan pada pin “arus” yang yg terbaca mikro adalah 100 mVolt, maka Arusnya sekitar 100 mVolt/0.2 ohm = 500 mA.

ADC seperti telah di jelaskan di atas. Terdpt dua channel ADC yang digunakan , yaitu channel 0 (PORTA.0) dan channel 1 (PORTA.1). channel 0 untuk mengukur tegangan output sedangkan channel 1 untuk arusnya. ADC yang digunakan 10 bit sehingga resolusi tegangan output yang bisa diukur adalah Vcc/1024, yaitu sekitar 4,88 mV. Nilai tegangan dan arus yang terbaca ini kemudian digunakan sebagai masukan kendali DAC oleh mikro ATMega16, bila tegangan output kurang dari set point, maka mikro harus menambah nilai DAC nya untuk menambah tegangan dan sebaliknya. Sehingga didapatkan tegangan output yang fix sesuai set point yang diatur pada program.

Rangkaian keseluruhan sistem seperti dibawah, , (klik untuk memperbesar)

setelah merancang hardware, saatnya membuat software/algoritma pengendalian tegangan dan arusnya.. secara umum algoritma untuk regulasi tegangan adalah dengan membaca tegangan dari sambungan “teg.” melalui ADC pada PINA.0. tegangan tersebut dikalikan dg suatu konstanta untuk kalibrasi dg tegangan output sebenarnya. Bila tegangan kurang dari tegangan set point-20 mV maka tegangan output DAC ditambah terus, sebaliknya bila tegangan output catu daya lebih dari set point+20 mV maka tegangan output DAC dikurangi. 20 mV adalah toleransi setpoint tegangan output. Untuk regulasi arus pada sumber arus prinsipnya sama, dg membaca tegangan R shunt pada ADC PINA.1 dan membaginya dengan 0.2 ohm (hambatan R shunt/lihat rangkaian di atas). lebih jelasnya, flow chart sistem umumnya seperti ini :

nah ini  source code lengkapnya, dalam bahasa c dg compiler CodevisionAVR :

/////////////////////////////////////////////////////////
#include <mega16.h>
#include <delay.h>
#include <stdio.h>
#define ARUS     3
#define TEGANGAN 4
#define LED     PORTA.2
//#define out_LED DDRA.2

#define OK     PINA.3
#define CANCEL PINA.4
#define UP     PINA.5
#define DOWN   PINA.6

// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd.h>

#define ADC_VREF_TYPE 0x40

// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}

eeprom float e_tegangan_set=0.0;
eeprom float e_arus_maks_set=10.0;
eeprom float e_arus_set=10.0;

unsigned char buff[16];
unsigned int adc_teg,adc_arus;
unsigned long a,desimalx;
float tegangan_out, arus_out, tegangan_set, arus_set, arus_maks_set, tegangan_maks_set;
bit tanda_save=1, tanda_pindah=0, ready=0;

unsigned char kursor_0, kursor_1, kursor_1_1, kursor_1_2;

void running_DAC();
void Desimal_ke_biner(unsigned long desimal);
void baca_tegangan_dan_arus();
void set_awal(unsigned char set, float set_point);
void regulasi_tegangan(float set_point, float arus_maks);
void regulasi_arus(float set_point);
void display();
void set_sumber(unsigned char sumber);
void pilih_menu();

typedef unsigned char byte;
/* table for the user defined character
arrow that points to the top right corner */
flash byte char0[8]={
0b1000000,
0b1110000,
0b1111100,
0b1111111,
0b1111111,
0b1111100,
0b1110000,
0b1000000};

/* function used to define user characters */
void define_char(byte flash *pc,byte char_code)
{
byte i,a;
a=(char_code<<3) | 0x40;
for (i=0; i<8; i++) lcd_write_byte(a++,*pc++);
}

void main(void)
{
PORTA=0xFC;
DDRA=0x04;

PORTB=0x00;
DDRB=0xFF;

PORTC=0x00;
DDRC=0x00;

PORTD=0x00;
DDRD=0xFF;

TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x84;
//out_LED=1; LED=1;
Desimal_ke_biner(0);

lcd_init(16);
define_char(char0,0);
lcd_gotoxy(0,0);
lcd_putsf("    CATU DAYA");
lcd_gotoxy(0,1);
lcd_putsf("     DIGITAL");
delay_ms(2000);
lcd_gotoxy(0,0);
lcd_putsf(" by Fithro L.A.");
lcd_gotoxy(0,1);
lcd_putsf("    = WEIP =");
delay_ms(1000);
//running_DAC();

tegangan_set=e_tegangan_set;
if (!(tegangan_set>=0 && tegangan_set<=30)) tegangan_set=0;
arus_maks_set=e_arus_maks_set;
if (!(arus_maks_set>=0 && arus_maks_set<=2000)) arus_maks_set=0;
arus_set=e_arus_set;
if (!(arus_set>=0 && arus_set<=2000)) arus_set=0;

//tegangan_set=5;
//arus_maks_set=500;
//arus_set=100;
tegangan_maks_set=30.0;

pilih_menu();

//set_sumber(TEGANGAN);

while (1)
{
//Desimal_ke_biner(800/(5000/(65535.0)));
//regulasi_tegangan(tegangan_set,arus_maks_set);
//regulasi_arus(arus_set);
};
}

void Desimal_ke_biner(unsigned long desimal)
{unsigned char b, bin[16];
for (b=0; b<16; b++)
{
bin[b]=desimal%2;
desimal=desimal/2;
}
PORTB.0=bin[0]; PORTB.1=bin[1]; PORTB.2=bin[2]; PORTB.3=bin[3]; PORTB.4=bin[4]; PORTB.5=bin[5]; PORTB.6=bin[6]; PORTB.7=bin[7];
PORTD.0=bin[8]; PORTD.1=bin[9]; PORTD.2=bin[10]; PORTD.3=bin[11]; PORTD.4=bin[12]; PORTD.5=bin[13]; PORTD.6=bin[14]; PORTD.7=bin[15];
}

void baca_tegangan_dan_arus()
{
adc_teg=read_adc(0);
adc_arus=read_adc(1);
tegangan_out=( (float)(adc_teg*0.0048828125)-(float)(adc_arus*0.0048828125))*8.107200201; // Vout - V-R-shunt (mili Volt)
arus_out    =(float)(adc_arus*20.623416649560779960854973335935*1.05); //(5000/1024)/0.2367606; // V-R-shunt/R-shunt (mili Amper)
}

void set_awal(unsigned char set, float set_point)
{
if (set==TEGANGAN)
{
desimalx=(long)(set_point*1000.0)/0.453402507;
Desimal_ke_biner(desimalx);
}
else if (set==ARUS)
{
desimalx=0;
Desimal_ke_biner(desimalx);
}
}

void regulasi_tegangan(float set_point, float arus_maks)
{
baca_tegangan_dan_arus();
if ( (tegangan_out<(set_point-0.02))||(tegangan_out>(set_point+0.02)) )
{LED=1;
while (tegangan_out<set_point-0.005)
{
desimalx=desimalx+1;
if (desimalx>=62913) desimalx=62913;
Desimal_ke_biner(desimalx);
delay_ms(1);
baca_tegangan_dan_arus();
}
while (tegangan_out>set_point+0.005)
{
desimalx=desimalx-1;
if (desimalx<1000) desimalx=1000;   //10485
Desimal_ke_biner(desimalx);
delay_ms(1);
baca_tegangan_dan_arus();
}
}
if (arus_out>arus_maks) { lcd_gotoxy(8,1); lcd_putsf("^"); }
else                    { lcd_gotoxy(8,1); lcd_putsf(" "); }
if ( (tegangan_out>=(set_point-50.0))||(tegangan_out<=(set_point+50.0)) ) { LED=0; display();}
}

void regulasi_arus(float set_point)
{
baca_tegangan_dan_arus();
if ( (arus_out<(set_point-5.0))||(arus_out>(set_point+5.0)) )
{LED=1;
while (arus_out<set_point-1.0)
{
desimalx=desimalx+1;
if (desimalx>=62913) desimalx=62913;
Desimal_ke_biner(desimalx);
delay_ms(1);
baca_tegangan_dan_arus();
}
while (arus_out>set_point+1.0)
{
desimalx=desimalx-1;
if (desimalx<1000) desimalx=1000;
Desimal_ke_biner(desimalx);
delay_ms(1);
baca_tegangan_dan_arus();
}
}
//if (tegangan_out>tegangan_maks_set) { lcd_gotoxy(8,0); lcd_putsf("^"); }
//else                                { lcd_gotoxy(8,0); lcd_putsf(" "); }
if ( (arus_out>=(set_point-50.0))||(arus_out<=(set_point+50.0)) ) { LED=0; display();}
}

void running_DAC()
{
for (a=0; a<=65535; a++)
{
Desimal_ke_biner(a);
//delay_ms(1);
lcd_gotoxy(0,1);
sprintf(buff,"*%ld   ",a);
lcd_puts(buff);
}
}

void display()
{
lcd_gotoxy(10,0);
sprintf(buff,"%0.2f ",tegangan_out);
lcd_puts(buff);

lcd_gotoxy(10,1);
sprintf(buff,"%0.2fA",arus_out/1000.0);
lcd_puts(buff);

lcd_gotoxy(0,0); lcd_putsf("[");  lcd_gotoxy(6,0); lcd_putsf("]");
lcd_gotoxy(9,0); lcd_putsf("[");  lcd_gotoxy(15,0); lcd_putsf("]");
lcd_gotoxy(0,1); lcd_putsf("[");  lcd_gotoxy(6,1); lcd_putsf("]");
lcd_gotoxy(9,1); lcd_putsf("[");  lcd_gotoxy(15,1); lcd_putsf("]");

}

void set_sumber(unsigned char sumber)
{
lcd_clear();
if (sumber==TEGANGAN)
{
lcd_gotoxy(1,0);
sprintf(buff,"%0.2f ",tegangan_set);
lcd_puts(buff);
lcd_gotoxy(1,1);
sprintf(buff,"%0.2fA",arus_maks_set/1000.0);
lcd_puts(buff);
set_awal(TEGANGAN, tegangan_set);
}
if (sumber==ARUS)
{
lcd_gotoxy(1,0);
sprintf(buff,"%0.2f ",tegangan_maks_set);
lcd_puts(buff);
lcd_gotoxy(1,1);
sprintf(buff,"%0.2fA",arus_set/1000.0);
lcd_puts(buff);
set_awal(ARUS, tegangan_set);
}
lcd_gotoxy(0,0); lcd_putsf("[");  lcd_gotoxy(6,0); lcd_putsf("]");
lcd_gotoxy(0,1); lcd_putsf("[");  lcd_gotoxy(6,1); lcd_putsf("]");
}

void pilih_menu()
{ kursor_0=1;
lcd_clear();
////////////////////////// MENU 0 /////////////////
menu_0:
lcd_gotoxy(0,0);
lcd_putsf("Sumber:");
lcd_gotoxy(0,1);
lcd_putsf("[START]");
lcd_gotoxy(9,0);
lcd_putsf("TGANGAN");
lcd_gotoxy(9,1);
lcd_putsf("ARUS");
switch (kursor_0)
{
case 1:
lcd_gotoxy(8,0);
lcd_putchar(0);
lcd_gotoxy(8,1);
lcd_putchar(' ');
break;
case 2:
lcd_gotoxy(8,1);
lcd_putchar(0);
lcd_gotoxy(8,0);
lcd_putchar(' ');
break;
}
if (!OK)
{ delay_ms(200);
if (kursor_0==1) {set_sumber(TEGANGAN);  goto start1;}
if (kursor_0==2) {set_sumber(ARUS);  goto start2;}
//goto start;
}
if (!UP)
{ delay_ms(200);
if      (kursor_0==1) kursor_0=2;
else if (kursor_0==2) kursor_0=1;
}
if (!DOWN)
{ delay_ms(200);
if      (kursor_0==1) kursor_0=2;
else if (kursor_0==2) kursor_0=1;
}
if (CANCEL) ready=1;
if (!CANCEL && ready==1)
{ready=0;
delay_ms(200);
lcd_clear();
kursor_1=1;
goto menu_1;
}
goto menu_0;

////////////// MENU 1 /////////////////////
menu_1:
lcd_gotoxy(1,0);
lcd_putsf("Sumber Teg.");
lcd_gotoxy(1,1);
lcd_putsf("Sumber Arus");
switch (kursor_1)
{
case 1:
lcd_gotoxy(0,0);
lcd_putchar(0);
lcd_gotoxy(0,1);
lcd_putchar(' ');
break;
case 2:
lcd_gotoxy(0,1);
lcd_putchar(0);
lcd_gotoxy(0,0);
lcd_putchar(' ');
break;
}
if (!OK)
{ delay_ms(200);
lcd_clear();
tanda_save=1; tanda_pindah=0;
if      (kursor_1==1) {kursor_1_1=1; goto menu_1_1;}
else if (kursor_1==2) {kursor_1_2=1; goto menu_1_2;}
}
if (!UP)
{ delay_ms(200);
if      (kursor_1==1)  kursor_1=2;
else if (kursor_1==2) kursor_1=1;
}
if (!DOWN)
{ delay_ms(200);
if      (kursor_1==1) kursor_1=2;
else if (kursor_1==2) kursor_1=1;
}
if (CANCEL) ready=1;
if (!CANCEL && ready==1) {delay_ms(200); lcd_clear(); ready=0; goto menu_0;}
goto menu_1;

////////////// MENU 1 - 1///////////////////// sumber tegangan
menu_1_1:
lcd_gotoxy(0,0);  lcd_putsf("Volt(V)");
lcd_gotoxy(8,0); lcd_putsf("Imax(mA)");
lcd_gotoxy(1,1);  sprintf(buff,"%0.2f ",tegangan_set);  lcd_puts(buff);
lcd_gotoxy(9,1); sprintf(buff,"%0.2f ",arus_maks_set); lcd_puts(buff);
switch (kursor_1_1)
{
case 1:
lcd_gotoxy(0,1);
lcd_putchar(0);
lcd_gotoxy(8,1);
lcd_putchar(' ');
break;
case 2:
lcd_gotoxy(8,1);
lcd_putchar(0);
lcd_gotoxy(0,1);
lcd_putchar(' ');
break;
}
if (!OK)
{ delay_ms(200);
if      (tanda_save==0)
{tanda_save=1;
tanda_pindah=1;
lcd_clear();
lcd_gotoxy(0,0);  lcd_putsf(" Geser...");
delay_ms(500);
lcd_clear();
}
else if (tanda_save==1)
{ tanda_pindah=0;
tanda_save=0;
if (kursor_1_1==1)
{
e_tegangan_set=tegangan_set;
}
else if (kursor_1_1==2)
{
e_arus_maks_set=arus_maks_set;
}
lcd_clear();
lcd_gotoxy(0,0);  lcd_putsf(" menyimpan..");
delay_ms(500);
lcd_clear();
}
}
if (!UP)
{
if (tanda_pindah==1)
{ delay_ms(200);
if      (kursor_1_1==1)  kursor_1_1=2;
else if (kursor_1_1==2) kursor_1_1=1;
}
else if (tanda_pindah==0)
{delay_ms(100);
if      (kursor_1_1==1)
{ tegangan_set=tegangan_set+0.05;
if (tegangan_set>30) tegangan_set=0;
}
else if (kursor_1_1==2)
{ arus_maks_set=arus_maks_set+5.0;
if (arus_maks_set>2000) arus_maks_set=0;
}
}
}
if (!DOWN)
{
if (tanda_pindah==1)
{ delay_ms(200);
if      (kursor_1_1==1)  kursor_1_1=2;
else if (kursor_1_1==2) kursor_1_1=1;
}
else if (tanda_pindah==0)
{delay_ms(100);
if      (kursor_1_1==1)
{ tegangan_set=tegangan_set-0.05;
if (tegangan_set<0) tegangan_set=30;
}
else if (kursor_1_1==2)
{ arus_maks_set=arus_maks_set-5.0;
if (arus_maks_set<0) arus_maks_set=2000;
}
}
}
if (CANCEL) ready=1;
if (!CANCEL && ready==1) {delay_ms(200); lcd_clear(); ready=0; goto menu_1;}
goto menu_1_1;

////////////// MENU 1 - 2/////////////////////  sumber arus
menu_1_2:
lcd_gotoxy(0,0);
lcd_putsf("Set Arus");
lcd_gotoxy(1,1);  sprintf(buff,"%0.2f mA",arus_set);  lcd_puts(buff);
lcd_gotoxy(0,1);
lcd_putchar(0);
if (!OK)
{ delay_ms(100);
e_arus_set=arus_set;
lcd_clear();
lcd_gotoxy(0,0);  lcd_putsf(" menyimpan..");
delay_ms(500);
lcd_clear();
}
if (!UP)
{ delay_ms(100);
arus_set=arus_set+10.0;
if (arus_set>1000.0) arus_set=0.0;
}
if (!DOWN)
{ delay_ms(100);
arus_set=arus_set-10.0;
if (arus_set<0.0) arus_set=1000.0;
}
if (CANCEL) ready=1;
if (!CANCEL && ready==1) {delay_ms(200); lcd_clear(); ready=0; goto menu_1;}
goto menu_1_2;
start1:
delay_ms(200);
while (1)
{regulasi_tegangan(tegangan_set,arus_maks_set);
}
start2:
delay_ms(200);
while (1)
{regulasi_arus(arus_set);
}
}

hasil videonya menyusul ..
Wassalam 🙂

Referensi :
http://www.linuxfocus.org/~katja/electronics/201005/bench-power-supply-v3.shtml

Membaca Karakter Keyboard dengan ATmega32


Skedar sharing saja:

Dengan ATmega32 kita bisa melakukan pembacaan data karakter dari tombol-tombol keyboard yang koneksinya PS/2. Source code yang digunakan pake C dengan software compilernya CodevisionAVR. Setelah scanning data dari keyboard sukses,  selanjutnya data karakter hasil pembacaannya ditampilkan pada LCD.

berikut hasil videonya :

Thanks for watching…

Line Follower dengan Kontrol PID biar nggak ‘gedek’


wah ha … ha 😀 postingan kali ini berawal dari pengalaman ikut lomba galelobot 2009 bareng singo wage, mblantong, nucleon eatermas Adi, mas dop, karo mas Rosyid di ITB dulu.. lihat foto.  yang entah suplai airnya dari PDAM apa nggak.. 😀 😀 😀 he he he piiiiiizzss :p. Waktu itu si singo wage dkk pengen banget ikut galelobot 2009 selain cari pengalaman, belajar, juga ben ketok keren sitik tau nang ITB he he he.. :). Dengan modal dungo slamet dan nekad, tim “WEIP 07” budallll…

setelah melihat lintasan / track lombanya wah.. dipikir pikir susah kalo ngandalkan robot analog an karena ketentuannya robot harus melintasi track dari start hingga finish sesuai rute.. padahal disitu ada jebakan2 sing aneh aneh :). timbullah ide untuk pake robot yng bisa diprogram alias pake mikro. padahal gak ngerti opo iku mikro he he he.. wes lah sekali lagi budalllllllllll .. |<>0<>|

Selama kurang lebih (lebih kurangnya) sebulan ngutek ngutek solder, bor, dkk akhirnya selesailah proses pembuatan robotnya dg desain body ala kadarnya maklum newbe (alias nyuba-nyuba) he he he.. lek jek eling bangkai robot e ruwet smrawut penuh dg pengkabelan yg mbulet tentunya :D. Rangkaian robotnya ngeplek (kopas) dari web.. (download di sini) plus source code program mikronya.. Tibalah saat pengujian robot atau running test bahasa kerennya. dengan modal kertas karton berukuran 1×1 meter dan solasi item 1 glondong buat simulasi lintasannya robot siap diuji. Dan hasilnya …….  robot e mlaku sak karep e dewe gak manut program/sing gawe he he he… 😀 jalannya gedek2 kayak orang sing wes  kulino dzikir wengi… terjadilah utek mengutek hardware maupun programnya dengan 1 tujuan: robot bisa jalan dengan smooth manut lintasan gak gedek2 gitu..

tibalah hari H-1 keberangkatan ke ITB. tapi kondisi robot masih belum sadar dari keasyikan dzikir malemnya.. yo wes lah budallllllll… (alfi style).  singkat dongeng, di ITB robot tim WEIP 07 gak berkutik. tapi itu penglaman. sing penting lak iku to masbrow… :D. sepulang dari ITB tetep kepikiran dibenak saya yg paling dalam 🙂 “Damput..!!. opo’o kene kok gedak-gedek, tapi nggone peserta liane kok alus2 mlakune…”

usut punya usut biar line tracer jalnnya aluuss bisa pake kontrol PID. (proportional-integral-diferensial).. alah alah opo iku..???# koyok kalkulus  ae integral-diferensial barang.. Mbuh iku PID beneran opo imitasi ne. jarene seh ngono..  baca PID control Program robot saya yg dulu ternyata hanya pake kontrol proportional aja dengan memberikan aturan setiap kondisi eror sensor robot.

Gambar di atas adalah skema posisi 8 buah sensor robot terhadap garis lintasan. idealnya robot selalu berada di tengah-tengah trhadap garis atau pada kondisi ke-4. ketika robot semakin menyimpang ke kiri dari garis maka dikatakan eror robot semakin besar utuk sisi kiri begitu pula untuk sisi kanan garis. dengan demikian eror terbesar adalah kondisi ke-7 dan ke-1 sedangkan eror terkecil adalah kondisi ke-4. Karena prinsip line tracer ini menggunakan differential wheel atau dua roda dengan masing masing kendali, maka agar robot berada di tengah lintasan adalah dengan mengatur kecepatan masing masing motor penggeraknya. kalau di sini saya pake pwm (modulasi lebar pulsa). dudu pulsa elektrik lho :D.

Fungsi proportional control pada robot line tracer ini adalah hanya menentukan aksi kecepatan motor kanan dan kiri setiap keadaan eror robot (menyimpang dari garis). ketika robot menyimpang ke kanan dari garis dengan kondisi ke-5 maka motor kanan harus lebih cepat dari motor kiri agar robot kembali ke kiri (manut garis). ketika kondisi eror ke-7 maka motor kanan harus tambah semakin cepat lagi dari motor kiri agar robot kembali ke lintasan,, dst.. kelemahan dari kontrol ini adalah masih adanya overshoot eror terhadap set point (nilai yg diinginkan) karena hanya merespon nilai eror. akibatnya robot masih terlihat bergelombang saat jalan. seperti ini.

kontrol diferensial berfungsi untuk merespon perubahan eror setiap saatnya,, sehingga ketika robot semakin cepat berubah erornya, misal dari kondisi eror=0 tiba tiba eror menjadi 6 maka motor kanan robot sebelah kanan akan semakin cepat dibandingkan ketika perubahan eror dari 0 ke eror=4. ini berguna untuk tikungan tikungan tajam di lintasan. Sedangkan kontrol integral berfungsi merespon jumlah total error yg telah terakumulasi. semakin lama robot menemukan set point semakin besar akumulasi erornya sehingga semakin besar respon integralnya.

agar robot bisa lebih alus (smooth) lagi jalannya, perlu ditambahkan kontrol integral dan diferensial (“I” dan “D”).

ini source code Kontrol “PID” gatel gatelannya yg disruput dari program line tracer mikro.

////////////////////////////////////////////////////////////
void scanDalan()
{
switch(SENSOR)
{
case 0b11111110: PV=20;  break;  //error sebelah kiri garis
case 0b11111101: PV=17;   break;
case 0b11111011: PV=11;   break;
case 0b11110111: PV=4;   break;
case 0b11101111: PV=-4;   break;
case 0b11011111: PV=-11;  break;
case 0b10111111: PV=-17;  break;
case 0b01111111: PV=-20; break;  // error sebelah kanan garis

case 0b11111100: PV=18;  break;  //error sebelah kiri garis
case 0b11111001: PV=15;   break;
case 0b11110011: PV=9;   break;
case 0b11100111: PV=0;   break; //error = 0 (tepat di tengah garis)
case 0b11001111: PV=-9;  break;
case 0b10011111: PV=-15;  break;
case 0b00111111: PV=-18; break;  // error sebelah kanan garis

case 0b11111000: PV=15;   break; // kondisi-kondisi tertentu
case 0b11110001: PV=8;   break;
case 0b11100011: PV=3;   break;
case 0b11000111: PV=-3;  break;
case 0b10001111: PV=-8;  break;
case 0b00011111: PV=-15;  break;

case 0b11100000:
case 0b11110000: PV=30; break;
case 0b00000111:
case 0b00001111: PV=-30; break;

/* case 0b11111111:
if (PV>0) PV=10;
else if (PV<0) PV=-10;
break;*/
}

error = 0 - PV;
P = (Var_Kp * error)/4;

tot_error = error + last_error;
I = (Var_Ki * tot_error)/10;

dif_error = error - last_error;
D = (Var_Kd * dif_error)/2;

last_error = error;

PID = P + I + D;
lpwm = set_speed - PID;
rpwm = set_speed + PID;

if (lpwm>0)
{ if (lpwm>MAXPWM) lpwm=MAXPWM;
ROBOT(kiri_maju);
}
else if (lpwm<0)
{
if (lpwm<-MAXPWM/2) lpwm=-MAXPWM/2;
ROBOT(kiri_mundur);
}
pwm_kiri=abs(lpwm);
OCR1B=pwm_kiri;
if (rpwm>0)
{ if (rpwm>MAXPWM) rpwm=MAXPWM;
ROBOT(kanan_maju);
}
else if (rpwm<0)
{
if (rpwm<-MAXPWM/2) rpwm=-MAXPWM/2;
ROBOT(kanan_mundur);
}
pwm_kanan=abs(rpwm);
OCR1A=pwm_kanan;
}
////////////////////////////////////////////////////////////

untuk penjelasan programnya lain waktu ya.. 🙂 🙂

‘Mouse’ Komputer Wireless dari Remote TV SONY


he he e… blognya kelihatan sepi tulisan.. mangkane ben ketok rodok rame perlu dicorat-coret ..

kali ini saya pengen ngepost artikel tentang aplikasi remote tv merk SONY untuk kendali mouse di PC… ide ini didapat dari artikel yg sudah ada yaitu akses remote kontrol (tv-sony) dengan mikrokontroller atmega silahkan dibaca dulu.. :).

skema keseluruhan alat seperti berikut:

Remote yang saya pake sebenarnya tidak ada tulisan “SONY” tapi “HUAYU”.. jare sing dodol “iku yo biasane gawe remote tv SONY” yo wes lah.. sing pentin g iso.. ini dia contoh gambar remote nya.. 😀

untuk sensor IR nya pake TSOP1740 atau kalau gak ada di tokonya bilang aja sensor AC untuk TV he  he he.. 🙂 ) berikut gambarnya:


untuk pemroses data dari sensor dan untuk interfacing diperlukan mikrokontroler ATmega16 dan perangkat usb to serial –> silahkan baca di sini

secara umum prinsip kerja alatnya, Remote mengeluarkan cahaya IR (infra red) berfrekuensi 40 kHz  yang dimodulasi, sehingga data/kode tertentu  terkirim sesuai dengan aturan protokol pengiriman data. kemudian sensor IR TSOP1740 ( datasheetnya di sini) menerima cahaya IR dengan logic aktif low. mikro kontroler ATmega16 kemudian memproses sinyal dari TSOP1740 untuk mendapatkan data/kode dari remote yang selanjutnya dikirim ke PC via serial dengan USART.

Biar terkesan tidak ngulang-ngulang lagi/repost punya e orang.. di sini perlu saya jelaskan sedikit aja tentang cara akses data dari remote SONY ini.

remote sony mempunyai protokol pengiriman data seperti ini

remote sony mengirimkan 12 bit data (7 bit command/perintah dan 5 bit address/alamat) dengan start bit selama 24 ms, logic 1 berlebar pulsa 18 us (12 us high+6 us low), logic 0 berlebar pulsa 12 us (6 us high+6 us low) seperti gambar di atas. Tugas mikro ATmega16 adalah menghitung lebar pulsa dari sinyal yg masuk dengan mode external interrupt 0  pada PIND.2

setelah mikrokontroler mendapatkan data dari remote, selanjutnya  data ini digunakan sebagai kode perintah untuk mengontrol pergerakan mouse di PC dengan program delphi…

Berikut adalah kode-kode perintah dari tombol remote SONY yang digunakan untuk mengakses pointer mouse:

Tombol No. 2                —> untuk aktivasi

Tombol panah kanan –> geser pointer mouse ke kanan

Tombol panah kiri      –> geser pointer mouse ke kiri

Tombol panah atas    –>  geser pointer mouse ke atas

Tombol panah bawah –> geser pointer mouse ke bawah

Tombol volume (+)  –>  percepat gerakan pointer

Tombol volume (-)  –>  perlambat gerakan pointer

sebelah kiri tombol volume (-) —-> klik kiri satu kali

sebelah kanan tombol volume (-)—> klik kanan satu kali

tombol yg lain bisa coba sendiri…

download file heksa untuk mikro atmega16 dan program delphi nya di sini

sekian postingan kali ini… mohon dikoreksi..

suwun 😀 🙂

Membaca RTC DS1307 dengan Codevision AVR


RTC (Real time clock) adalah jam elektronik  berupa chip yang dapat menghitung waktu (mulai detik hingga tahun) dengan akurat dan menjaga/menyimpan data waktu tersebut secara real time. Karena jam tersebut bekerja real time, maka setelah proses hitung waktu dilakukan output datanya langsung disimpan atau dikirim ke device  lain melalui sistem antarmuka.

Chip RTC sering dijumpai pada motherboard PC (biasanya terletak dekat chip BIOS). Semua komputer menggunakan RTC karena berfungsi menyimpan informasi jam terkini dari komputer yang bersangkutan. RTC dilengkapi dengan baterai sebagai pensuplai daya pada chip, sehingga jam akan tetap up-to-date walaupun komputer dimatikan. RTC dinilai cukup akurat sebagai pewaktu (timer) karena menggunakan osilator kristal.

Banyak contoh chip RTC yang ada di pasaran (pasar genteng, dll) seperti DS12C887, DS1307, DS1302, DS3234.

         

DS3234                    DS12C887                        DS1307

Salah satu chip RTC yang mudah digunakan adalah DS1307. Pin out chip seperti gambar di bawah.

DS1307 memiliki akurasi (kadaluarsa) hingga tahun 2100. lihat datasheet. Sistem RTC DS1307 memerlukan baterai eksternal 3 volt yang terhubung ke pin Vbat dan ground. Pin X1 dan X2 dihubungkan dengan kristal osilator 32,768 KHz. Sedangkan pin SCL, SDA, dan SQW/OUT dipull-up dengan resistor (nilainya 1k s.d 10k) ke vcc. Skema lengkapnya:

Pada topik ini akan dibahas cara pembacaan data waktu dari DS1307 dengan Codevision AVR. alasan penggunaan chip ini adalah karena mudah dalam komunikasi datanya, yaitu menggunakan antarmuka Serial I2C yang hanya butuh dua jalur saja (clock dan data). berbeda dengan DS12C887 yang antarmukanya secara paralel. pada project ini digunakan mikrokontroler ATmega16 dan LCD2X16 untuk display waktu RTC nya. PORTC terhubung ke pin LCD. dan pin SDA DS1307 terhubung ke PORTB.0 sedangkan pin SCLnya ke PORTB.1.

Untuk menampilkan jam dan tanggal dari RTC DS1307 dilakukan dengan pengaksesan register pewaktu pada RTC. Pada Codevision AVR terdapat fitur I2C bus dan koneksi pada RTC DS1307 sehingga hanya tinggal melakukan pengaksesan data pada register timekeeper RTC. Berikut langkah pengaturan pada widzard CodevisionAVR untuk pengaturan fitur I2C bus dan koneksi pada RTC DS1307.

Dari pengaturan widzard I2C bus dan koneksi RTC DS1307 diatas di ketahui bahwa jalur I2C berada pada PORTB.0 sebagai serial data (SDA) dan PORTB.1 sebagai serial clock (SCL). Dari pengaturan tersebut akan ter-include fungsi-fungsi pengaksesan register RTC DS1307 yang terdapat pada file “ds1307.h.” fungsi-fungsi tersebut antara lain:

  • unsigned char rtc_read(unsigned char address); —> untuk membaca pada alamat tertentu dari register timekeeper RTC
  • void rtc_write(unsigned char address,unsigned char data); —> untuk menulis pada alamat tertentu dari register timekeeper RTC
  • void rtc_init(unsigned char rs,unsigned char sqwe,unsigned char out); —>  untuk inisialisasi ­IC DS1307
  • void rtc_get_time(unsigned char *hour,unsigned char *min,unsigned char *sec); —> untuk membaca waktu ( jam, menit dan detik ) dari RTC dalam satu kali akses
  • void rtc_set_time(unsigned char hour,unsigned char min,unsigned char sec); —> untuk mensetting waktu sekarang ( jam, menit dan detik ) dari RTC dalam satu kali akses
  • void rtc_get_date(unsigned char *date,unsigned char *month,unsigned char *year); —> untuk membaca tanggal, bulan dan tahun dari RTC dalam satu kali akses
  • void rtc_set_date(unsigned char date,unsigned char month,unsigned char year);  —> untuk mensetting tanggal, bulan dan tahun dari RTC dalam satu kali akses.

pada topik ini, kita ingin mengatur waktu pada RTC sesuai jam dan tanggal sekarang misanya, jam 08, menit: 19, detik:00 || tanggal: 24, bulan:04, tahun:2011. kemudian melakukan pembacaan jam dan waktu dari RTC setiap 100 ms sekali dan menampilkan hasilnya pada LCD Display. berikut listing programnya:


/*****************************************************
This program was produced by the
CodeWizardAVR V1.25.3 Professional
Automatic Program Generator
© Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project : Real Time Clock DS1307
Version :
Date    : 4/24/2011
Author  : KurangSangu
Company : PT GolekSangu
Comments:

Chip type           : ATmega16</span>
Program type        : Application</span>
Clock frequency     : 11.059200 MHz</span>
Memory model        : Small</span>
External SRAM size  : 0</span>
Data Stack size     : 512</span>
*****************************************************/

#include <mega16.h>
#include <ds1307.h>
#include <delay.h>
#include <stdio.h>

// I2C Bus functions
#asm
    .equ __i2c_port=0x18 ;PORTB
    .equ __sda_bit=0
    .equ __scl_bit=1
 #endasm
 #include <i2c.h>

// Alphanumeric LCD Module functions
 #asm
    .equ __lcd_port=0x15 ;PORTC
 #endasm
 #include <lcd.h>

void main(void)
{
 unsigned char jam, menit, detik, tanggal, bulan, tahun, buff[17];

// Timer(s)/Counter(s) Interrupt(s) initialization</span>
TIMSK=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// I2C Bus initialization</span>
i2c_init();

// DS1307 Real Time Clock initialization
// Square wave output on pin SQW/OUT: Off
// SQW/OUT pin state: 0
rtc_init(0,0,0);

// LCD module initialization
lcd_init(16);
lcd_gotoxy(0,0);
lcd_putsf("Real Time Clock");
delay_ms(2000);
lcd_clear();

rtc_set_time(8,19,0);   // set jam 08:19:00
rtc_set_date(24,4,11);  // set tanggal: 24 april 2011

while (1)
{
// Place your code here
rtc_get_time(&jam,&menit,&detik); // mengakses jam
rtc_get_date(&tanggal,&bulan,&tahun); //mengakses tanggal
lcd_gotoxy(0,0);
sprintf(buff,"Jam: %d:%d:%d  ",jam,menit,detik);  // menampilkan jam
lcd_puts(buff);
lcd_gotoxy(0,1);
sprintf(buff,"Tgl: %d:%d:%d  ",tanggal,bulan,tahun); // menampilkan tanggal
lcd_puts(buff);
delay_ms(100);
lcd_clear();
};
}

untuk full sourcecode nya silahkan diunduh di sini

Sistem minimum ATmega16


Untuk merancang sistem yang berbasis mikrokontroler baik yang sederhana maupun yang kompleks dibutuhkan rangkaian minimal (minimum system) agar uC (mikrokontroler red) tadi dapat beroperasi atau bekerja.  pada topik ini akan dibahas sistem minimum untuk mikrokontroler ATmega16 keluarga AVR (Alf and Vegard’s Risc)  yang umum dipakai di kalangan pecinta elektronika dan instrumentasi he he he… ATmega16 merupakan mikrokontroler 8 bit  yang memiliki memori Flash 16k Bytes, SRAM 1024 ByteS dan EEPROM 512 ByteS, datasheet bisa dilihat di sini

komponen yang diperlukan pada minimum sistem ATmega16 hanya ada tiga:

1. Power supply (5 Volt vcc)

2. Rangkaian reset; untuk  mengembalikan eksekusi program uC dari awal.

3. Sumber clock; untuk menghasilkan pulsa clock (detak).

sebenarnya untuk clock, uC ATmega16 sudah memiliki internal clock yang nilai maksimumnya 8 MHz. Namun bila ingin dipasang external clock maka perlu ditambahkan CRYSTAL (XTAL) dan dua buah kapsitor bypass.

berikut adalah skema rangkaian sistem minimum ATmega16 dengan external clock 11.0592 MHz:

Pentingnya golek ‘sangu’


Ilmu merupakan sebuah bekal yang paling utama. Alloh sangat mencintai orang-orang yang berilmu dan mencari ilmu. Saking pentingnya mencari ilmu, orang yang meninggal dalam majlis ilmu sama dengan orang yang mati syahid. Alloh akan meninggikan derajat atau kedudukan hambanya yang mencari dan memiliki ilmu, sebagaimana dalam firmannya: ” YARFA’ILLAAHULLADZIINA AAMANUU MINKUM, WALLADZIINA UTUL ILMA DAROJAAT”, Alloh akan meninggikan kedudukan atau derajat diantara kamu yang beriman dan mencari ilmu. Tetapi, ilmu yang bagaimana yang dimaksud? yaitu ilmu yang memberikan manfaat baik bagi dirinya sendiri maupun bagi orang banyak atau masyarakat. Dalam sebuah hadits Rosululloh SAW bersabda: “MAN AROODA DUNYA FA’ALAIHI BIL ILMI, WAMAN AROODALAKHIROH FA’ALAIHI BIL ILMI, WAMAN ARODAHUMAA FA’ALAIHI BIL ILMI” Barang siapa yang menginginkan/mengharapkan keutamaan dunia, keutamaan tersebut dapat diperoleh dengan ilmu, Barang siapa yang menginginkan keutamaan di akhirat, keutamaan tersebut dapat diraih dengan ilmu, dan barang siapa yang menginginkan kedua-duanya maka, maka hal tersebut dapat diraih dengan ilmu.

hadist menuntut ilmu :

Sesungguhnya Islam adalah agama yang menghargai ilmu pengetahuan. Bahkan Allah sendiri lewat Al Qur’an meninggikan orang-orang yang berilmu dibanding orang-orang awam beberapa derajad.

“Niscaya Allah akan meninggikan orang-orang yang beriman di antaramu dan orang-orang yang diberi ilmu pengetahuan beberapa derajad.” (Al Mujadilah: 11)

Pada surat Ali ‘Imran: 18 Allah SWT bahkan memulai dengan dirinya, lalu dengan malaikatnya, dan kemudian dengan orang-orang yang berilmu. Jelas kalau Allah menghargai orang-orang yang berilmu.

“Allah menyatakan bahwasanya tidak ada Tuhan melainkan Dia, Yang menegakkan keadilan. Para malaikat dan orang-orang yang berilmu (juga menyatakan yang demikian itu)” (Ali Imran:18)

Allah juga menyatakan bahwa hanya dengan ilmu orang bisa memahami perumpamaan yang diberikan Allah untuk manusia.

“Dan perumpamaan-perumpamaan ini Kami buatkan untuk manusia, dan tiada memahaminya kecuali orang-orang yang berilmu” (Al ‘Ankabut:43)

Ingatlah wahai manusia, tidak akan pernah kalian semua mendapatkan ilmu kecuali dengan 6 persyaratan:

1. Harus memiliki akal yang sehat

Orang tidak akan memperoleh ilmu apapun, jika fikirannya selalu dipenuhi dengan kekotoran. Atau tidak akan memperoleh ilmu seseorang jika ada gangguan kesehatan akalnya. Manfaatkan anugerah dan potensi yang Alloh berikan kepada kita, yaitu akal yang sehat.

2. Memiliki keinginan yang kuat

Tanpa keinginan yang kuat, sekecil apapun cita-cita kita, sekecil apapun tujuan kita, tidak akan pernah tercapai. Lawannlah segala bentuk kemalasan yang ada pada diri kita. Perjalanan waktu tidak akan surut kebelakang, cegahlah penyesalan dengan keinginan yang kuat untuk menuntut ilmu.

3. Kesabaran

Dengan kesabaran dan keuletan, sesulit apapun keinginan dan tujuan yang ingin kita capai, semuanya akan terasa mudah. Karena dengan bekal kesabaran dan keuletan akan tumbuh keikhlasan, dengan tumbuhnya keikhlasan segala urusan akan terasa ringan, sesulit apapun ilmu yang kita pelajari akan terasa mudah untuk dipahami.

4. Bekal yang cukup

Bekal bukan berarti hanya materi, tetapi yang paling utama adalah potensi atau anugerah yang Alloh berikan kepada kita yaitu kesehatan. Gunakannlah waktu sebaik-baiknya, mumpung dalam keadaan sehat sebelum datang sakit. Dengan bekal kesehatan, bekal materi akan mudah diperoleh.

5. Petunjuk Ahli ilmu

Guru adalah tempat yang tepat untuk bertanya secara interaktif. Guru adalah tempat yang tepat untuk menggali seluruh keilmuan yang dimilikinya. Guru disini adalah orang ahli ilmu, atau expert dalam bidang keilmuan. Mencari ilmu tidak cukup hanya berguru kepada buku, mencari ilmu tidaklah cukup hanya mengandalkan pengalaman. Untuk menghindari dari salahnya kita memahami ilmu, harus ada tempat bertanya. Sebaik-baiknya tempat bertanya adalah ahli ilmu.

6. Meluangkan waktu

“Gunakan masa luangmu sebelum datang masa sempitmu”, itu adalah potongan hadits Rosululloh SAW yang mengisyaratkan pentingnya memanfaatkan waktu luang. Malas adalah musuh besar bagi pencari ilmu. Dengan kemalasan, waktu akan terasa sempit. Dengan memanfaatkan waktu luang, mumpung masih diberi umur, mumpung masih muda, mumpung sehat dan aji mumpung lainnya niscaya keinginan dalam memperoleh ilmu akan tercapai.

Jangan pernah bermimpi akan dapat ilmu dengan sendirinya, tanpa ada keinginan yang kuat yang tertanam dalam diri kita masing-masing.

dibaca dari: http://bellafitriana.blogspot.com/2010/01/menuntut-ilmu.html