# Roboti >  Nepieciešama palīdzība ar līnijsekotāju!

## slaists

Sveiki! Man skolā tuvojās trešā kursa beigas un nākamgad ir jābeidz skola, tāpēc jau laicīgi lika taisīt diplomdarbus un man ir nepieciešams izveidot un jāiemācās ieprogrammēt Līnijsekotāja robotu. Par cik skolā ar programmēšanu īpaši neesmu saskāries, vienīgi programmējis CMP stacijas un Festo stendus, tāpēc tālāk par to programmēšanā nekas nav zināms, bet ir vēlme apgūt tomēr vairāk.  :: 
	Kā jau ierasts sākumā savam darbam internetā meklēju informāciju par Līnijsekotāju un visu tam nepieciešamo. Dabūju pat shēmu un Sources kodu, lai to uztaisītu, bet problēma sākās tajā vietā kad vajadzēja iemācīties, kā to saprogrammēt un kādu programmēšanas valodu man ir jāizmanto PIC kontrolerim (kontroleru tipi ir šādi: AT89C2051 (8051 Core), AT89C51 (8051 Core), AT 89S52 (8051 Core), PIC16F84A (PIC Core)).
	Lasīju, ka iekš C vai C++ to var dabūt gatavu, taču skolotāja atbildēja ka tā ir pārāk sarežģīta valoda un labāk mēģināt ko iekš visual basic.
	Pat nezinu ar ko lai sāku un ko lai labāk vajadzētu mācītes, lai to dabūtu gatavu.  ::  Tāpēc griežos pie jums ar cerību, ka kāds man ko vairāk varēs izskaidrot sīkāk par šo lietu kas un kā, lai zinu konkrētāk ar ko sākt!  ::  Jau iepriekš paldies!

P.S. Pielikumā esmu pievienojis darbu pēc kura es robotu gribu taisīt un tur ir sīkāka papildinformācija par manu iecerēto darbu, ja kas kādam no mana teiktā palika nesaprotams.  :: 

Šo forumu pārlasot arī tika pieminēts ka pic programmēšanai var pielietot C, C++, Pascal un Basic. Bet kura no tām varētu būt vienkāršāka priekš iesācējiem?   ::  

*Source kods:*


```
/*****************************************************
Project : Line Follower
Version :
Date : 2/19/2006
Author : Priyank
Company : Home
Comments:

Chip type : ATmega16
Program type : Application
Clock frequency : 7.372800 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 256
*****************************************************/

//#define debug 1
#include <mega16.h>
#include <delay.h>
#ifdef debug
#include <stdio.h>
#endif

#define FWD 0xAA
#define REV 0x55
#define R 0x22
#define L 0x88
#define CW 0x99
#define CCW 0x66
#define STOP 0x00
#define B 0xFF
#define RSPEED OCR1AL
#define LSPEED OCR1BL
#define SPEED0 255
#define SPEED1 0
#define SPEED2 0
#define SPEED3 0
#define MAX 3
#define HMAX 1

void move (unsigned char dir,unsigned char delay,unsigned char power);
unsigned char i,rdev,ldev,ip,delay,dir,power,dirl,history[MAX],hcount=0,rotpow;

#ifdef debug
unsigned char rep=0,prev=0;
#endif

void main(void)
{

// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In

// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;

 
// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0xFF;

// Port D initialization
// Func7=In Func6=In Func5=Out Func4=Out Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=0 State4=0 State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x30;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 921.600 kHz
// Mode: Fast PWM top=00FFh
// OC1A output: Non-Inv.
// OC1B output: Non-Inv.
// Noise Canceler: Off
// Input Capture on Falling Edge
TCCR1A=0xA1;
TCCR1B=0x0A;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0xFF;
OCR1BH=0x00;
OCR1BL=0xFF;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

 
#ifdef debug
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud rate: 57600
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x07;
#endif

// 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;

while (1){

#ifdef debug
if(rep<255)
rep++;
if(prev!=PINA) {
prev=PINA;
printf("%u\r",rep);
for(i=0;i<8;i++)
printf("%u\t",(prev>>i)&0x01);
rep=0;
}
#endif

if(PINA!=255){
rotpow=255;
ldev=rdev=0;

if(PINA.3==0)
rdev=1;
if(PINA.2==0)
rdev=2;
if(PINA.1==0)
rdev=3;
if(PINA.0==0)
rdev=4;

if(PINA.4==0)
ldev=1;
if(PINA.5==0)
ldev=2;
if(PINA.6==0)
ldev=3;
if(PINA.7==0)
ldev=4;

if(rdev>ldev)
move(R,0,195+12*rdev);
if(rdev<ldev)
move(L,0,195+12*ldev);
if(rdev==ldev)
move(FWD,0,200);
}

else {
for(i=0,dirl=0;i<MAX;i++) {
if(history[i]==L)
{dirl++;}
}
if(rotpow<160) {rotpow=160;}
if(rotpow<255) {rotpow++;}

if(dirl>HMAX)
{move(CW,0,rotpow);}
else
{move(CCW,0,rotpow);}
}
};
}

void move (unsigned char dir,unsigned char delay,unsigned char power) {
PORTC=dir;
if(dir==L || dir==R) {
hcount=(hcount+1)%MAX;
history[hcount]=dir;
}
LSPEED=RSPEED=255;//power;
//delay_ms(delay);
}
```

 *Linijsekotāja darbs:* http://yy.lv/download.php?f=127079
*Uzbūves shēma:* http://img84.imageshack.us/img84/914...jashemauj2.jpg

----------


## Edzukins

> .. bet problēma sākās tajā vietā kad vajadzēja iemācīties, kā to saprogrammēt un kādu programmēšanas valodu man ir jāizmanto *PIC kontrolerim* ..


 Tu vēlies programmēt PIC, lai gan kodā un shēmā ir AVR?

----------


## karloslv

Arī AT89 sērija nav PIC, bet gan Atmel produkti.

----------


## slaists

Njā, nu tad būšu nošāvis ko greizi, bet par PIC ieminējos, jo detaļu sarakstā tas tika pieminēts PIC16F84A.   ::  Bet paldies tiem kas izlaboja manu sacīto, jo es to tagad tikai mācos un vēlos apgūt šo visu. Tāpēc labprāt uzklausīšu visus padomus un ieteikumus par to visu.

----------


## Epis

kad būsi izdomājis uz kādas mikrenes, ar kādu Valodu to visu taisīt,kodēt tad jautā kautko konkrētu, jo uz vispārīgiem, jautājumiem ir vispārīgas atbildes.

par AVR pročiem tad, lai zinātu kas īsti ir AVR tev ir jāizlasa, jāpameklē info par "AVR  RISC Architecture", 

ja intresē assembler  tad šeit ir pāris linki:
AVR asambler USer guide http://www.atmel.com/dyn/resources/prod ... OC1022.PDF 
AVR instruction Set http://www.atmel.com/dyn/resources/prod ... oc0856.pdf 

Ja kodēsi kādu AVR, vai citu mikreni neaizmirsti novilkt tās mikrenes Datasheetu, jeb dokumentāciju tur ir visa informācija par to kas ir tur iekšā, un kā ko kodēt. (pārsvarā kodu piemēri ir asm, un C, valodās)

----------


## Velko

Mikrokontrollerus parasti programmē vai nu C vai ASMā. Ar Visual Basic pavisam noteikti mikrokontrollerus programmēt nevar. Priekš AVR ir BASCOM-AVR - Basic kompilators priekš atmeļiem. Neesmu gan lietojis - nevarēšu pateikt vai ir vienkāršāk kā C vai nav.

Kaut gan kādreiz programmēšanu sāku mācīties tieši ar Basic, tagad tā šķiet diezgan piņķerīga un ne pārāk iespējām bagāta valoda.

----------


## slaists

Nu paldies par šīm abām atbildēm, tagad vismaz zināšu ar ko sākt un ko darīt. Tagad par to visu paskatīšos informāciju un centīšos ko saprast vairāk, lai nav vairs tā sauktie virspusējie jautājumi no manas puses.

----------


## Andrejs

Ieteiktu sākt tā:
1. Uztaisi robotiņam strādājošu mehanisko daļu - atrodi motorus, riteņus, izdomā no kā tas viss barosies. Tālāk domā kādi un cik sensori būs līnijas detektēšanai.
2. Visai veiksmīgu līnijsekotāju var uztaisīt bez procesora, ja nu tomēr gribas lietot  kādu no mikrokontrolieriem un tam obligāti jābūt PIC, tad labāk lieto 16F628, kājas praktiski vienādas ar 16f84, bet iespēju vairāk.
3. Nopērc vai ari uztaisi programatoru un atrodi programmu ar kuru to darbināt - iesaku winpic, tas strādā ar ļoti daudziem programatoriem, uztur praktiski visus PICus.
4. Iepazīsties ar picu ( to ko izvēlējies), uztaisi maketiņu, paprogrammē vienkāršas lietas - mirgojošu LED, kā nolasīt ieejas utml.
5. Ja tas ir skaidrs un izdodas, tad taisi shēmu līnijsekotājam ( izmanto gatavu, vai arī domā pats), montāžu var taisīt uz maketplates, bet labāk tomēr uzzīmēt platīti ( ja tas nav darīts, nāksies apgūt kādu no plašu zīmējamajām progrām - iesaku Eagle).
6. Pēc montāžas pabeigšanas nāksies rakstīt vairākas testa programas kuras pārbauda atsevišku mezglu ( motori, fotodevēji, visādi LEDI efektiem un indikācijai) darbību. Ja vienkāršas lietas var mēģināt rakstīt asm , tad nedaudz sarežģītākas sākumā var būt ļoti gruti - nemocies, ņem basic kompilātoru un raksti  ::  iesaku mikrobasic ( http://www.mikroe.com), var arī to darīt C, vai pascal, tas ir gaumes jautājums. Šādam vienkāršam robotiņam tas nav būtiski.
7. Sastādi algoritmu - vienkāršakā variantā tas būs: braucam taisni un izvairamies no melnās līnijas. Pirms neesi realizējis primitīvu algoritmu - necenties būvēt/programēt  ko sarežģītāku, PID pagaidām aizmirsti...
8. kārtīgi visu dokumentē (shēmas, kodus, algoritmus)- tas kas tagad liekas pilnīgi skaidrs, pēc mēneša ir  neglābjami aizmirsts.
9. Nav būtiski vai robotiņš ir ar eksotisku FPEGa proci un stereo CCD redzi, vai arī būvēts no bērnu konstruktora un veciem traņiem, svarīgākais ir - PABEIDZ uzsākto!

Andrejs

----------


## Edzukins

Secību gan ieteiktu savādāku, proti, vispirms izdomā kuram ražotājam tu dosi priekšroku. Šajā forumā tas ir daudz un dikti iztirzāts. Pēc tā arī tad izdomā kur dabūsi programmatoru, nopirksi, vai taisiisi pats, un tikai tad domā par to kādu MK izmantosi.
Ja izvēlies PIC tad augstkolās(iespējams arī skolās) nevajadzētu būt problēmām atrast kādu pasniedzēju kas varētu tevi pamācīt, bet ja izvēlies AVR tad ātrākais veids ir caur forumiem. Uzprasi lai Epis tev izskalo smadzenes, ja gribi iemeslus kāpēc tieši AVR  :: 

P.S. Es izvēlējos sākt apgūt Atmel, lai gan ar PIC man varētu palīdzēt liels cilvēku skaits. Pagaidām arī es neko daudz no šīs lietas nesaprotu, bet neliekas pārāk grūti, ja vien būtu vairāk brīvā laika. Tāpēc tik uz priekšu  ::

----------


## slaists

Nu ja skaidrs.  ::  Vakar jau paskatījos ko jau ieteicāt. Sameklēju mikroshēmu un tagad tikai vēl jāatrod piemērots programmators šai mikroshēmai. Pašu mikroshēmu izlēmu, ka izmantošu jau shēmā doto AVR ATmega16. Datasheetu jau šai mikroshēmai novilku un nedaudz pastudēju. Arī mācību materiālus atradu latviešu valodā, tāpēc labi ka priekšā ir garās brīvdienas un varēšu tam pieķerties klāt.   ::  Pēc brīvdienām būs vēl jāpasūta šīs detaļas, lai arī to visu var salodēt.   :: 

P.S. A un vel viena maza neskaidrība ar to AVR čipu ir. Ja es tagad viņu saprogrammēju un ielādēju viņā programmu, tad jau laikam ka to vairs nevarēja izdzēst un ielādēt citu programmu tajā pašā no jauna, vai arī var ko ierakstīt no jauna?   ::

----------


## Vikings

Neķer krenķi, programmu pārlādēt var vairākus tūkstošus reižu.  ::

----------


## slaists

Sveiki! Pēc ilga prombūtnes laika esmu atgriezies un šoreiz jau ticis gabalu uz priekšu. Teorētisko daļu šim līnijsekotājam būšu lielāko daļu pabeidzis un atlikuši tikai daži sīkumi, kas vēl ir jāpaveic.
Ķēros pie līnijsekotāja sensoru plates lodēšanas, taču, nevaru īsti saprast vienu lietu.

Zemāk attēlā ir redzama viena sensora shēma, kura darbojas ar infrasarkano diodi un IR fototranzistoru un LM324N komparatoru. Lieta ir tāda ka nevaru saprast kādu rezistoru īsti izmantot, jo šai shēmai bija autora apraksts kurā bija teikts, ka rezistoru vērtības ir jāizvēlas atkarībā no piemeklētajiem sensoriem.
Es izmantoju:
http://www.argus.lv/product_info.php?products_id=42058
http://www.argus.lv/product_info.php?products_id=23905

Kadus rezistorus R1 un R2 vajadzētu izmantot un varbūt kāds īsumā varētu izskaidrot šo izvēli?

----------


## Vikings

Ja pieņemam, ka gaismas diodes tiešā strāva ir 50mA un Vcc ir 5V tad R2 ir aptuveni 34 Omi (33 Omi tuvākais standarta lielums).
R1 būs jāpiemeklē pašam lai starpība starp atstarotu signālu un neatstarotu signālu būtu pietiekami liela lai komparators droši nostrādātu. Aši uzmetot aci tranzistora aprakstam R1 varētu būt 3,3KOmi un uz augšu.

----------


## Andrejs

līnijas detektēšanai ieteiktu lietot modulētu IR. Var ņemt gatavu mikreni, piem kādu no šiem: http://www.elfa.lv/cgi-bin/index.cgi?ar ... !75-222-61 vari pats ko būvēt.
Pasākums kļūs DAUDZ noturīgāks pret traucējumiem un apkārtējās gaismas izmaiņām. Arī montēt būs vieglāk  ::

----------

