Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migration of unmigrated content due to installation of a new plugin

Esimerkki ohjelmasta, joka koostuu neljästä askelleesta.  Ohjelma seuraa teippiä lattiassa ja kääntyy teipin päässä. Askeleet eli ohjelman toiminnot ovat seuraavat:

  • odotus
  • ajo mustalle alueelle
  • ajo valkoiselle alueelle
  • kääntyminen teipin päässä

Tilakonemalli ohjelman toiminnasta

  • Image Modified
Code Block
#pragma config(Sensor, S1,     kosketus2,           sensorTouch)
#pragma config(Sensor, S2,     starttinappi,        sensorTouch)
#pragma config(Sensor, S3,     ultra,               sensorNone)
#pragma config(Sensor, S4,     RGB,                 sensorCOLORFULL)
#pragma config(Motor,  motorB,          motorB,        tmotorNormal, PIDControl, encoder)
#pragma config(Motor,  motorC,          motorC,        tmotorNormal, PIDControl, encoder)
//*!!Code automatically generated by 'ROBOTC' configuration wizard               !!*//

// esitellaan funktio, jolla kysellaan halusta ajella robotilla
int OnkoRobottiStartattuKosketusanturista();
void RobotinAjo();

// paaohjelma, jonka nimi on aina main
task main()
{
  while(1) // ikuinen silmukka alkaa tasta
  {
    RobotinAjo();
  } // ikuinen silmukka loppuu tahan
}

void RobotinAjo()
{
  // esitellaan muuttuja static maareella, jotta funktiossa sailyy edelliskerran arvo
  static int askel = 0;  // 0 =odotusaskel 1 = aja mustalle, 2 = aja valkoiselle 3= kaanny teipin paassa

  if// askel nollan toiminnot
  if(askel==0) // odotellaan starttausta
  {
     ClearTimer(T1);
	     eraseDisplay();
     nxtDisplayBigStringAt(0, 31,"odotellaan");
	     motor[motorC] = 0;
	     motor[motorB] = 0;
	     if(1==OnkoRobottiStartattuKosketusanturista()) // testataan koko ajan kayttajan halua ajaa robottia
	     {
	       askel=1;
	       ClearTimer(T1);
		       eraseDisplay();
	       nxtDisplayBigStringAt(0, 31,"a1 valkoinen");
		       motor[motorC] = 0;
		       motor[motorB] = 80;
	     }
  }

  // askel 1 iftoiminnot
  if(askel==1) // ollaan valkoisella ja yritetaan mustalle
  {
		    if(SensorValue(RGB) == 1)
		    {
		      askel=2;
		      ClearTimer(T1);
	      eraseDisplay();
	      nxtDisplayBigStringAt(0, 31,"a2 musta");
		      motor[motorC] = 80;
		      motor[motorB] = 0;
		    }
		    if(0==OnkoRobottiStartattuKosketusanturista()) {askel=0; }
	    if(time1[T1]>500) // ei loytynyt mustaa 0,5 sekunnissa
	    {
	      eraseDisplay();
	      nxtDisplayBigStringAt(0, 31,"a3 kaanto");
	      askel=3;
	    }
	}
	  }

  // askel 2 toiminnot
  if(askel==2) //ollaan mustalla ja yritetaan valkoiselle
	  {
	    if(0==OnkoRobottiStartattuKosketusanturista()){askel=0;}
		    if(SensorValue(RGB) != 1) //Poistuttiinko mustalta alueella
		    {
		      askel=0;        // kun musta teippi loytyi niin vaihdetaan takaisin askeleelle yksi
		      ClearTimer(T1); // nollataan ajastin seuraavaa suoraan ajoa varten
		      motor[motorC] = 0;
		      motor[motorB] = 80;
		    }
	  }
	
  //askel 3 toiminnot
  if(askel==3) // kaannytaan paikoillaan ympari
	  {
		    motor[motorC] = -40;
		    motor[motorB] = 40;       // moottori peruuttaa
		    if(SensorValue(RGB) == 1) // BLACKCOLOR) tultiinko takaisin mustalle alueella
		    {
		      askel=1;        // kun musta teippi loytyi niin vaihdetaan takaisin askeleelle yksi
		      ClearTimer(T1); // nollataan ajastin seuraavaa suoraan ajoa varten
		    }
	  }
}

// Talla funktiolla tutkitqaan takimmaisen kosketusanturin toimintaa
// joka toisella panalluksella funktio palauttaa nollan ja robotin pitaisi pysahtya
int OnkoRobottiStartattuKosketusanturista()
{
    static int flipflop = 0; // esitellaan muuttuja staattisena, jotta se muistaa edellisen kerran tilansa
    static int flipAskel = 0; // 0=odotellaan napin painallusta 1=nappi painettu alas 2=nappi paastetty ylos 3=nappi toisen kerran alas
    int kosketus2Value=0;
    kosketus2Value = SensorValue(starttinappi);
    if(kosketus2Value==1 && flipAskel==0) // eka painallus alas
    {
      flipflop=1;
      flipAskel=1;
    }
    if(kosketus2Value==0 && flipAskel==1) // eka paasto
    {
      flipAskel=2;
    }
    if(kosketus2Value==1 && flipAskel==2) // toka kerta alas
    {
      flipflop=0;
      flipAskel=3;
    }
    if(kosketus2Value==0 && flipAskel==3) // toka kerta ylos
    {
      flipAskel=0;
    }
    return flipflop;
}