PID ALGORITHM Set position = 0 for run forward and set PWM L= R = constant Set position = -5 and that robot restrains for turn left have to set left medium slow or medium decrease and set right medium fast or medium increase .
Position =-5 for run L is medium decrease and R is medium increase. Else hand, Set position = 5 and that robot restrains for turn right have to set left medium fast or medium increase and set right medium slow or medium decrease .
Position = 5 for run L is medium increase and R is medium decrease.
Set position =-10 and that robot restrains for turn left have to set left very slow and set right very fast.
Position =-10 for run L is very slow and R is very fast. Else hand, Set position = 10 and that robot restrains for turn right have to set left very fast and set right very slow.
Position = 10 for run L is very fast and R is very slow.
Position =-15 to left and position =15 to right, set in memory SRAM after build left motor backward and right motor forward on condition turn left. And for turn right is opposite this condition.
PIDsensors(){
switch(sensor){
case 0b01000000: position=-10; break;
…
case 0b00110000: position=-5; break;
case 0b00011000: position=0; break;
case 0b00001100: position=5; break;
…
case 0b00000010: position=10; break;
}
int proportional = ((int)position); // The "proportional" term should be 0 when we are on the line.
int derivative = proportional - last_ proportional; // Compute the derivative
integral += proportional; //integral (sum) of the position.
last_proportional = proportional; // Remember the last position.
P=kp*proportional;
I=Ki*integral;
D=Kd*derivative;
// Compute the difference between the two motor power settings, m1 - m2. If this is a positive number //the robot will turn to the right. If it is a negative number, the robot will turn to the left, and the //magnitude of the number determines the sharpness of the turn.
Power=P+I+D;
L=max + power;
R=max - power;
Set _motors(L,R);
}
…
…
While(1){
Read _sensors(); // Get the position of the line.
PIDsensors(); // get PWM value for motors
}
Specification: Microcontroller ATmega16 with 16 kbyte flash, 512 byte EEPROM and 1kbyte SRAM or ATmega8535 with 8 kbyte flash, 512 byte EEPROM and 1 kbyte SRAM have 8 channel 10 bit A/D converter 12 Mhz or 16 Mhz crystal ( the ATmega experience is good on 16 Mhz ) 4 push on are connected on PD 4-7 as input pull-up LCD LM016 2x16 display characters is connected on PB as output set to LCD configuration are there too.
Pin LCD number 15 is connected to VCC or 5 volt and number 16 is connected to PORTB 3 as output set on high.
LED LCD on if PORTB.3 = 0
LED LCD off if else it
Photodiodes and infrareds are connected with PINA as ADC.
ADC value are gotten from reading photodiode as H/L on white/black on track. A/D converters are activated too with thick ADC ENABLE and USE 8 bit then chose clock to 750 Khz and ADC reference (V.ref ) on AVCC or AREF pin, therefore AVCC and AREF is connected with power high logic.
Read_ADC(); is already to use.
Reading sensor:
You have to insert a ADC variable to reverence of reading sensors 8 bit an example X variable. Cause x use 8 bit so you must set to unsigned char.
Unsigned char x;
Being easy and simple take this var on array.
Unsigned char x[8];
Building the C codes
n=0;
While (n==8){
n++;
sample=read_adc[n];
if (sample<255){ l="sample;}">0){
H=sample;}
x[n]=(((H[n]-L[n])/2)+L[n]);
delay_ms(10);}
Then saving ADC ref value on EEPROM or on SRAM
The values keep better in EEPROM than SRAM because with just 1 time to looks for reference ADC values and not necessary any time here to update values ADC reverence.
Making bit or scan sensors bit manipulation
n=0;
While(n==8){
n++;
If (read adc(n)>x[n]){sensor=sensor+2n;}
delay _us(50);}
sprint(buff,”<%x>”,sensor)
lcd_gotoxy(0,1);lcd_puts(buff);
Motor drivers is connected on PORTD 0-3. Motor drivers contain of two H-bridge transistor set in IC ld298 or make yourself this H-bridge from FET / TR. You must necessary to chose FET / TR so it works not better expected. Chose the FET or TR with low resistance , that can constrain current leave to motors.
The motors can run CW or CCW from generating PWM on timer set. Generating PWM can use time 0 / 2 interrupt overflow or time 1 16 bit too.
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{/*xcount++;
if (xcount<=lpwm) //on gedex blog ( gedex PID ) enki=1; //6 pin include ENABLE L&R else enki=0; if (xcount<=rpwm) enka=1; else enka=0; TCNT0=0xFF;*/ counter++; if (counter>=L){ //good performance
Lback=1;} //4 pin without ENABLE
else{ Lback=0;}
if (counter>=R){
Rback=1;}
else{ Rback=0;}
OCR0=0xff;}
H bridge FET driver search on this ( using keywords ).
ISP PROGRAMER.
PORTC is unused , you can configure to other control function such as sensors affix with comparator, wheel encoder, sensors ON/OFF control with super bright led can allowed you want.
LINE follower robot adalah robot penjejak garis,robot yang mengikuti garis dan dengan rintangan yang ada dari start sampai finish. Semakin banyak LF mengatasi berbagai rintangan track semakin perfect LF yang dibuat. Semua itu tergantung dari hardware, software dengan algoritma yang dibuat , sensor, presisi dari gearbox dan power battery.
Hardware yang dibutuhkan dalam pembuaan line follower robor:
1. Gearbox
2. Sensor
3. Modul microcontroller
4. Modul driver motor
5. Modul driver sensor
6. Battery
7. PCB
Ketujuh hal hardware diatas akan dikupas satu-persatu.
1. Gearbox
Hal yang harus terpecahkan adalah gearbox, karena gearbox ini hal yang paling dibutuhkan, gearbox selesai maka akan menjadi mudah dalam mengerjakan yang lainnya.
Kata temen saya buat gearbox 4 hari lamanya dan buat sampai line follower jadi cuma 1 hari….saja!!!
Buat gear box pasti akan membuat frustasi dan butuh kesabaran……pertanyaanya: Apakan bisa gearbox dibuat hanya dengan waktu 2 jam saja dan dapat digunakan untuk lebih dari 1 th??????
Harus bisa dong………!!!!!
Ayo buat gearbox yang paten……
Gearbox yang paling umum digunakan seperti yang ditampilkan dibawah ini.
Yang dibuhkan untuk membuat gearbox 1 sisi ( jika 2 sisi maka x2 ):
a. Spinser kecil 1cm 2 buah
b. Mur baut kecil 1 buah
c. Gear kecil 11 gigi 1 buah
d. Gear double 12:36 1 buah
e. Gear besar single +/-36 gigi 1 buah
f. PCB 2x ( 6cm x 4cm ) / menyesuaikan
g. Pelek ban yang sesuai dengan ban-nya
h. Ban 1 buah
i. As ban 1 buah
j. Keleng untuk as ban agar mulus 2 buah
k. Gear sembarang untuk toys tamia 1 buah
l. Alteco untuk lem
m. Karet gelang 1 gelang
n. Isi pena
o. Motor DC + bautnya
p. Double tape
Semakin banyak bahan yang digunakan untuk gearbox maka semakin lengkap dan hasilnya jelas akan semakin presisi dan bagus.
Langkahnya:
a. Merangkai ban dengan peleknya, as ban, karet gelang, alteco, gear besar single ( +/- 36 gigi ) gear tamiya sembarang.
As yang paling awet yaitu as besar sebagi contoh as pada gearbox tank mainan, bisa digunakan paling tidak lebih dari 1 th dan tidak mudah bengkong / melengkung. Jika menggunakan as tamiya biasa pasti akan melengkung / silahkan pakai yang bags menurut anda.
- As dipasang pada pelek ban, jika dibutuhkan perekat lem, silahkan pakai alteco.
- Pasang gear sembarang tamiya pada as, jangan terlalu mepet dengan pelek ban
- Akan ada sela dari pelek ban dan gear sembarang yang dipasang, disela-sela tersebut diberi karet gelang dengan kencang untuk itu perlu juga diberi alteco saat pelilitan karet gelangnya untuk merekatkan pelek ban dengan gear sembarang sehingga as dan ban dengan pleknya sangatlah kuat.
HE…hE…teringat saat ban beserta peleknya lepas dengan as-nya saat lomba berjalan,,,,it’s humorous moment. Perlukah terjadi??? Mungkin lucu….
- Selanjutnya pasang ban ke peleknya
- Selesai untuk tahap 1
b. Merangkai motor dengan gear 11 gigi,,,,,masih gampang!!!
c. Merangkai peletakan gear, motor beserta gear 11 gigi , as ban dll dengan gear +/-36 gigi, keleng spinser 1cm
- Pertama siapkan PCB yang kita inginkan 4cm x 6 cm 1 pasang atau sesuai selera
- Garisi tengah untuk kedua PCB
- Rekatkan jadi satu dengan double tape dengan sisi yang digarisi tampak dari luar
- Ukur dari bawah kira-kira 6/7 mm untuk peletakan as dan keleng yang dipersiapkan
- Tandai dan dibor dengan bor 1mm dan diperbesar 2 mm dengan screwdriver 2mm, ingat jangan memakai bor dijamin hasilnya akan jelek,coba saja kalau tak percaya.
- Pasang gear +/- 36 dengan mor dan baut kecil agak kencang
- Paskan geae double besar +/- 36 gigi dan kecil 12 gigi di atas gear single sampai gigi kecil menyentuh dari gigi besar ban, tandai dan pastikan tanda pas ditengah.
- Bor dan besarkan sampai 2mm
- Selanjutnya membuat lobang diatas gear tersebut sembarang kurang lebih 3 mm / selera
Dilobangi dan besarkan sampai 6mm / gear kecil gigi 11 masuk
- membuat tempat baut motor dengan menggaris vertical dengan garis tengah sama dengan motor terhadap baut yang diinginkan
- Membuat tempat spinser 1 cm ditempat yang tak mengganggu gear
- Lepas semua untuk gear dan mor baut dan double tape
- Membuat tempat as dengan kelengnya, apabila menggunakan as besar maka menggunakan mur 3mm dan apabila menggunakan as tamiya dengan keleng yang disediakan ditiko toys tamiya. Pelatakan pada as yang diperbesar 6 mm/ sampai keleng masuk dan di kencangkan dengan lem alteco.
Untuk yang tidak memakai keleng juga tidak apa-apa tapi dengan akibat yang ditimbulkan, saat robot berjalan gear berbunyi dan berisik, PCB aus dan termakan as jadi lambat laun akan membuat performance gear jelek.
- Memasang semuanya seperti yang terlihat pada dibawah:
Sensor
Sensor yang baik yaitu sensor yang sensitive, yang dapat melintasi berbagai rintangan seperti lancip , siku , pertigaan, perempatan. Untuk dapat melakukan hal tersebut bagaimana letak posisi sensor infrared dan photodiode atau led-superbright dan photodiode. Penempatan bisa lurus , melengkung , depan 7 dan 1 belakang , 6 depan 2 belakang, atau TERSERAH.
Banyak kelemahan pada sensor yang lurus, jelas pada siku, lancip, peerempatan, partigaan. Seringkali pembacaannya jadi salah siku untuk pertigaan/ perempatan seperti itu contohnya.
Sama dengan sensor melengkung tetapi kelebihannya saat belokan, sensor lurus saat belokan pasti akan mendapat sensor paling pinggir ( akan overshoot ) dan jika melengkung saat belokan akan seperti mulus karena langsung pergeseran per step. Dan dapat digunakan untuk rintangan siku langsung pada penerapannya.
Sensor yang bagus adalah lihat milik UGM untuk referensinya,jika perlu tanyakan dan perlu adanya perhitungan jarak persensor serta apakah digunakan untuk kecepatan, strategi atau kedua-duanya?.
Jika untuk kecepatan perlu digunakan sensor yang melengkung saja dengan jarak yang agak kecil 1 cm <>
Untuk strategi sama hannya perlu adanya penambahan sensor belakang yang telah diperihitungkan.
Untuk kecepatan dan strategi perlu sensor yang banyak agar saat jalan tak mudah untuk lepas dari garis dan semua rintangan terlampaui dengan algoritma peogram yang mumpuni tentu saja.
Seperti robotnya Mas TIKO dengan sensornya yang banyak keren jalannya dan menjadi juara GALELOBOT 2009 tentu kendalinya juga keren NJIH MAS.
Pakai berapa jika tau +/- 16 sensor jika g’ salah lho…………
Pakai APA ya?????????//
Pakai ADC-kah, pakai ADC vs komparatorkah, pakai komparatorkah?
Jangan pusing riset seperti itu membuat pusing, dan solusinya adalah 6 sensor didepan dan 2 sensor dibelakang sudah cukup…..dengan jarak persensor 1cm
Sensor depan 6 untuk jalan lurus dan siku dan sensor belakang untuk lancip.
Modul microcontollernya silahkan seach di google: dengan kata kunci gedex PID
Kira-kira seperti itu rangkaiannya dan programnya bisa didownload disana untuk reverensinya.
Modul driver
Ini yang paling penting untuk plannya, penggunaan driver umum dapat menggunakan L293D , L298N/D, transistor, fet, dll.
Jelas yang paling concrete adalah driver FET. Tapi bagaimana rangkaiannya silahkan search picture di google : dengan kata kunci h-bridge mosfet motor DC driver schematic. Dan silahkan dicoba@2.....!!!!
Kok dikatakan bagus karena hambatan dalam kecil sehingga arus yang mengalir ke motor besar dan bermain potensial sebagai contolnya. Tidak seperti driver motor L293d,l298n/d dan transistor yang contolnya adalah arus dan juga hambatan dalam yang agak besar serta kerugian VBE +/- 0,7 volt membuat arus berkurang dan tegangan berkurang juga. Tapi jangan khawatir untuk pengguna L298 dan L293 adacara mempercepat dengan tambah bateray dan dengan bermain gaya potensial motor.
Gimana caranya:
Dengan membuat enable kanan dan kiri dengan member logika 1/ diberi tegangan langsung 5 volt. Kaki input 1 diberi PWM dan input 2 sebagai directionnya .
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
/*xcount++;
if (xcount<=lpwm) //milik gedex PID
enki=1;
else
enki=0;
if (xcount<=rpwm)
enka=1;
else
enka=0;
TCNT0=0xFF;
*/
xcount++;
if (xcount>=lpwm){ //good performance
kirimundur=1;
}
else{
kirimundur=0;
}
if (xcount>=rpwm){
kananmundur=1;
}
else{
kananmundur=0;
}
TCNT0=0xff;
}
Terlihat diatas menggunakan enable untuk PWM, sekarang menggunakan direction untuk PWM.
Driver sensor
Untuk modul driver sensor bisa menggunakan komparator, transistor, ADC.
Menggunakan komparator seperti gambar dibawah:
Jara kerjanya yaitu mengcompare / membandingkan tegangan input kaki 2 dan reverensi kaki 3 sehingga output menjadi 1 dan 0.
Menggunakan transistor seperti gambar dibawah ini:
Mengunakan transistor sama saja mennyaklar tegangan ke port sehingga bernilai 1 dan 0.
Jika ADC langsung saja masuk ke port A, read ADC conversion diprogram dengan mengaktivkan ADC enable. Jelas memakai ADC adalah yang paling bagus karena langsung dari pembacaan tegangan photodiode terhadap infrared ke port A.
Pembacaan diatas track dengan hitam isolasi dan putih papan:
Karena pembacaan ADC adalah linier sebesar 0-255 rangnya maka cari nilai tengah antara pembacaan ADC tertinggi dan terendah diatas track dan dimasukkan ke variable vrefADC
Untuk pembacaan agar bernilai 1 dan 0
Logikanya
Jika ADCn1>vrefADCn1 maka bernilai 1
Else 0
Pada pendeklarasian sensor seperti ini :
sensor=sensor+1; //untuk bit ke 0
sensor=sensor+2; //untuk bit ke 1
sensor=sensor+4; //untuk bit ke 2
.
.
.
sensor=sensor+2n; //untuk bit ke-n
selengkapnya:
void scansensor()
{
lcd_clear();
lcd_gotoxy(0,0);
sensore=0;
for(count=0;count<8;count++){
kepekaan[count]=ekepekaan[count];
}
for(count=0;count<8;count++){
u=read_adc(count);
if(count==0){
if(u>kepekaan[count]){
sensore=sensore+1; lcd_putchar('1');
}
else lcd_putchar('0');
}
if(count==1){
if(u>kepekaan[count]){
sensore=sensore+2; lcd_putchar('1');
}
else lcd_putchar('0');
}
if(count==2){
if(u>kepekaan[count]){
sensore=sensore+4; lcd_putchar('1');
}
else lcd_putchar('0');
}
if(count==3){
if(u>kepekaan[count]){
sensore=sensore+8; lcd_putchar('1');
}
else lcd_putchar('0');
}
if(count==4){
if(u>kepekaan[count]){
sensore=sensore+16; lcd_putchar('1');
}
else lcd_putchar('0');
}
if(count==5){
if(u>kepekaan[count]){
sensore=sensore+32; lcd_putchar('1');
}
else lcd_putchar('0');
}
if(count==6){
if(u>kepekaan[count]){
sensore=sensore+64; lcd_putchar('1');
}
else lcd_putchar('0');
}
if(count==7){
if(u>kepekaan[count]){
sensore=sensore+128; lcd_putchar('1');
}
else lcd_putchar('0');
}
}
sprintf(buff,"<%x>", sensore);
lcd_puts(buff);
delay_ms(1);
}
U adalah pembacaan ADC ke n dan kepekaan adalah reverensi pembacaan ADC ke n dari track berbentuk variable array yang dimasukkan ke eeprom