# Roboti >  Robots Mickey Mouse - konstrukcija, shēma, programma

## Edzukins

Sākšu ar pateicības runām. 
Milzum lielais padies Kārlim G. un Guntim K., un daudziem citiem, kas man nesavtīgi palīdzēja, bez viņiem man nebūtu nekas vairāk par izjauktu peļu kaudzi.

Tātad konstrukcija:


Pirmā versija:


Motoriņi no vecajiem CD-Room, Baterijas – mainījās gandrīz katru dienu  ::  Beigās vienkārši iztiku ar veca Ericsson baču (vienu) Sacensību rītā robots vēl darbojās ar divām baterijām( Viena MK, otra motoriem), bet beigās vienu nokāvu jo nebija tam paredzētā lādētāja. Bet uz tik maziem ātrumiem kā man, mierīgi varēja iztikt ar vienu pat nepievēršot uzmanību trokšņiem. Riepas sākumā bija no divām citām pelēm(parastie rullīši ar visu pogu – gultņu imitācija  ::  ), bet beigās nolauzu spēļu mocītim. Ja ir iespēja dabūt gumijotus peles rullīšus iesaku labāk izmantot tos, jo, pirms es viņus saplēsu, pārnesums, bez nekādiem zobratiem, bija ideāls. 

Tad nu ķeramies klāt pie shēmas:


MK - Atmega8, 4 x sensori – qrd11142. Kā redzams shēmā, tad barošana sensoru gaismas diodēm tiek kontrolēta ar MK palīdzību (lai taupītu bateriju). MOSI, MISO, SCK un RESESET ir pārprogrammēšanai un tie gala variantā netika pielodēti, lai taupītu vietu un lai būtu mazāk problēmu, jo man, kā iesācējam, visu laiku kaut kas sagāja uz īso. Tāpēc arī vāku netaisīju ciet  ::  Žēl, jo tad būtu smukāks  ::  Protams, ka nosvilināju arī stabilizatoru (shēmā arī nav parādīts), un sacensībās iztiku bez tā.




Tad nu varam ķerties pie koda. Ideālas saķeres gadījumā, es savu kodu biju iedomājies šādi:


P.S. Uz leju -> True, uz sāniem -> False

Maksimālais ātrums - 255 (Pilna jauda uz priekshu)
Reāli galavariantā man bija 50 no 255 maksimālais ātrums, jo savādāk tas nebija vadāms.


Bet  man nācās pielāgot ātrumus katram motoram atsevišķi, jo kā redzat pārnesums ir vienkārši smieklīgs  :: 
Kodā ir redzams tas, ka konkrētajā gadījumā es atradu variantu, kā vienu ratu piespiest spēcīgāk pie motora ass, un tādējādi viņam vajadzēja padot lielāku jaudu. Un par brīnumu tieši divas reizes bija pietiekami labi  :: 
Diemžēl robots tika pabeigts pāris minūtes pirms starta, tādēļ kods ir diezgan neefektīvs un es paspēju tikai vienu apli notestēt  :: 
Tad nu gala varianta kods:


```
    #include <avr/io.h>
//#include <util/delay.h> 
enum {
	Maxspeed=50,
	Speed1=30,
	Speed2=23,
	Speed3=16,
	 };

    #define Sen1 PC0 //1. sensors
    #define Sen2 PC1 //2. sensors
    #define Sen3 PC2 //3. sensors
    #define Sen4 PC3 //4. sensors
    
    #define Sens_LEDs PD0//Izvads uz sensora gaismas diodēm (+5V) 
    
    #define MOTL PB1//Kreisais(Left) Motors
    #define MOTR PB2//Labais(Rght) Motors

    uint8_t skaititajs = 0,atrumsL = 0,atrumsR = 0;
    uint16_t Taimers = 0;
/*void wait_some_time()
{
 uint8_t i;
 for(i=0;i<10;i++) _delay_ms(100); 
}*/
	void Read_Sensors()
{
atrumsL=Maxspeed*2; atrumsR=Maxspeed;
       if ((PINC & (1 << Sen1)) != 0){
             if ((PINC & (1 << Sen2)) != 0)
                 {atrumsL=Maxspeed*2; atrumsR=Speed2;}
                else
                 {atrumsL=Maxspeed*2; atrumsR=Speed3;}
             }
	//	 else
			 //{
             if ((PINC & (1 << Sen2)) != 0) 
                 {
                 if ((PINC & (1 << Sen3)) != 0)
                        {atrumsL=Maxspeed*2; atrumsR=Maxspeed;}
                        else
                        {atrumsL=Maxspeed*2; atrumsR=Speed1;}
                }
             //    else
                 //{
                 if ((PINC & (1 << Sen3)) != 0)
                         {
                         if ((PINC & (1 << Sen4)) != 0)
                                {atrumsL=Speed2*2; atrumsR=Maxspeed;}
                                else
                                {atrumsL=Speed1*2; atrumsR=Maxspeed;}
                         }
                        // else
                        // {
                                 if ((PINC & (1 << Sen4)) != 0)
                                 {atrumsL=Speed3*2; atrumsR=Maxspeed;}
                      //   }               
                // } 

		//	  } 
			   if (((PINC & (1 << Sen1)) != 0) & ((PINC & (1 << Sen4)) != 0)) {atrumsL=Maxspeed*2; atrumsR=Maxspeed;}

        PORTD &= ~(1 << Sens_LEDs); // Izsleedzam sensora gaismas diodes
}

    int main()
    {    
        /* Vispirms uzliekam visu portu kā input, un ieslēdzam attiecīgo pull-up */
        DDRC = 0x00;
       //PORTC = (1 << Sen1)|(1 << Sen2)|(1 << Sen3)|(1 << Sen4);

		
		        
        /* Uzliekam, kur pini būs output, un lai nedeg sākumā  */

        PORTD = 0;
        DDRD = (1 << Sens_LEDs);
        PORTB = 0;
        DDRB =  (1 << MOTL)|(1 << MOTR);
       
PORTD |= (1 << Sens_LEDs);

    // Muuzhiigais cikls
    while (1) 
	{

if (Taimers == 450) PORTD |= (1 << Sens_LEDs);
if (++Taimers == 500) 
	  {
        Taimers = 0;
       Read_Sensors();

}

      //Te kontroleejam motorus
     if (skaititajs == 0) {PORTB |= (1 << MOTL); PORTB |= (1 << MOTR);}
     if (skaititajs == atrumsL) PORTB &= ~(1 << MOTL);
     if (skaititajs == atrumsR) PORTB &= ~(1 << MOTR);
     skaititajs++; // Izmantojam to, ka skaitiitajs pats paarleks no 255 uz 0

    }
	}
```

 Ā, un vēl kas rēcīgs – Mans robots bija par mazu, un starta sensori nespēja viņu uztvert, lai noteiktu laiku, tāpēc nācās uzlīmēt virsū tizlu izolācijas lentu  :: 

Pāris vietās jau atradu, kur esmu iebāzts, piemēram:
http://www.novonews.lv/news/2008/04/15/tech/036603.html
LNT ziņās ar esot bijis iebāzts, žēl ka neredzēju  :: 

Mazs video darbībā

Ja kādam ir vēlme uztaisīt kko līdzīgu, bet pilnīgi no šitā nekā nesaprot, tad neķer kreņķi, jo pirms mēneša es ar vēl pilnīgi nekā nesapratu.
Pateicoties labiem un atsaucīgiem cilvēkiem viss ir ok.
Laba pamācība, ar ko sākt, ir šeit.

----------


## karloslv

Malacis! Prieks, ka izdevās nobraukt! Tās dažas stundas pirms sacensībām ir visintensīvākās, reti kad tik saspringti nākas domāt, rīkoties un arī izdarīt  ::

----------


## Velko

> LNT ziņās ar esot bijis iebāzts, žēl ka neredzēju


 LNT Ziņas var arī noskatīties internetā. Sižets par Robotiku ir pašās beigās (ap 23. minūti).

----------


## Edzukins

> LNT ziņās ar esot bijis iebāzts, žēl ka neredzēju 
> 
> 
>  LNT Ziņas var arī noskatīties internetā. Sižets par Robotiku ir pašās beigās (ap 23. minūti).


 Jā, bet kad es to rakstīju  vēl nebija ielikts  :: 

Klau! Cik sapratu, nākoškad būs arī radiovadāmās sacensības, ja? Tādu es labrāt uzklabinātu.
Ar nepacietību jau gaidu nākamo sezonu...  ::

----------


## GuntisK

Malacis Edgar! Karloslv arī labs robots bija. Nenožēloju ka biju aizbraucis. Bija tiešām interesanti. Šajās neuzspēju, bet nākamajās tiešām gribētos piedalīties.   ::

----------


## deivs001

Būšu laikam nepieklājīgs un mēģināšu pats izpildīt šo projektu. Izveidošu plaģiātu mājas priekiem  :: 
Izveidosim kaut ko jaunu  ::  Sen nekas nav uzcepts  ::

----------


## Edzukins

> Būšu laikam nepieklājīgs un mēģināšu pats izpildīt šo projektu. Izveidošu plaģiātu mājas priekiem 
> Izveidosim kaut ko jaunu  Sen nekas nav uzcepts


 Bet droši!  ::  paziņo kā būs gājis  ::

----------


## deivs001

Un kas tie par sensoriem, kurus googles tante pat nespēj atrast?  ::

----------


## Edzukins

Ņem vienkārši kādus no šiem - http://www.argus.lv/advanced_search_...keywords=elitr

----------


## linux

Kā tas kods tiek iedabūts tajā procesorā?

----------


## Edzukins

> Kā tas kods tiek iedabūts tajā procesorā?


 Ar programmatora palīdzību, kas maksā, protams, ne pāris latus, bet drusciņ vairāk.
Man, piemēram, ir Mini Atmel pa 15Ls pa taisno no ķīnas caur ebay(kopā ar visu atvešanu)

----------


## karloslv

Ja gribas, var arī lētāk, skat. PonyProg shēmas:

http://www.lancos.com/e2p/siprog_base.png
http://www.lancos.com/e2p/betterSTK200.gif

Pats lietoju pēc otrās shēmas taisītu (STK200), strādāja labi. Tagad man būs jauns laptops, un paralēlā porta vairs nebūs.

----------

