Lego Mindstorms Ev3 Project - Ondrej Slovak

From RoboWiki
Revision as of 16:35, 1 July 2014 by Robot (talk | contribs)
Jump to: navigation, search

Zadanie

V tomto projekte si vytvoríme robota zo stavebnice Lego Mindstorms Ev3, ktorý bude ovládaný pomocou klávesnice PC, bude sa vyhýbať prekážkam a zároveň nebude vychádzať z vyznačeného priestoru.

Príprava

Budeme používať softvér pre Lego Mindstorms Ev3 od spoločnosti leJOS. Na jeho používanie budeme potrebovať nakonfigurovanú micro-SD kartu a vývojové prostredie, ktoré si môžeme nastaviť pomocou nasledujúcich odkazov.

- https://sourceforge.net/p/lejos/wiki/Windows%20Installation/

- https://sourceforge.net/p/lejos/wiki/Installing%20the%20Eclipse%20plugin/

Nakonfigurovanú SD kartu vložíme do SD portu Ev3 kocky a spustíme. Softvér od leJOS-u sa automaticky nahrá z karty a bude sa používať ako náhrada za oficiálny softvér, pokiaľ budeme mať vloženú kartu.

Ďalej budeme potrebovať nadviazané spojenie pomocou Bluetooth. Toto spojenie sa dá jednoducho nadviazať z PC pomocou Bleutooth zariadenia. V Bluetooth Devices si vieme nájsť Ev3 a nadviazať s ním spojenie.

Program

Program bude pozostávať z dvoch základných častí, časť, ktorá bude bežať na robotovi a časť, ktorá bude bežať na PC.

Popíšme si najskôr časť, ktorá bude na robotovi.

Program na robotovi sa skladá z viacerých častí. V prvom rade musíme zabezpečiť komunikáciu medzi robotom a PC. Keďže už máme nadviazané spojenie pomocou Bluetooth stačí nám na robotovi vytvoriť server, ktorý bude počúvať na požiadavky od používateľa, v našom prípade PC. Túto komunikáciu sme umiestnili do samostatného threadu aby robot stále počúval na požiadavky z PC.

 ...	
 serv = new ServerSocket(1111);
 Socket s = serv.accept(); // Wait for Laptop to connect
 DataInputStream in = new DataInputStream(s.getInputStream());
 ...


 ...
 String read = in.readUTF();
 switch (read) 
 ...


Na meranie vzdialenosti od prekážok budeme používať ultrazvukový senzor, ktorý bude neustále vracať hodnoty.

 ...	
 EV3UltrasonicSensor us = new EV3UltrasonicSensor(SensorPort.S4);
 ...
 ...
 us.enable();
 SampleProvider sampleProvider = us.getDistanceMode();
 while (true) {
   float[] sample = new float[sampleProvider.sampleSize()];
   sampleProvider.fetchSample(sample, 0);
   distance = sample[0];
 } 
 ...


Priestor, v ktorom sa bude robot môcť pohybovať bude označený čiernou páskou. Na zabezpečenie, aby robot nevyšiel z tohto priestoru budeme používať farebný senzor. Na spresnenie údajov z farebného senzora používame triedu na korekciu chyby. Pre presnejšie pracovanie tejto triedy sa vyžaduje kalibrácia, ktorá pozostáva z priloženia čierneho a bieleho objektu.

 ...	
 EV3ColorSensor colorSensor = new EV3ColorSensor(SensorPort.S3);
 ...
 ...
 SampleProvider redMode = colorSensor.getRedMode();
 SampleProvider reflectedLight = new autoAdjustFilter(redMode);
 int sampleSize = reflectedLight.sampleSize();
 float[] sample = new float[sampleSize];
 while (true) {
   reflectedLight.fetchSample(sample, 0);
   value = sample[0];
 } 
 ...


Na kontrolu robota budeme používať tri správania. Základné správanie sa pohybuje podľa prijatých údajov od používateľa z PC.

 ...	
 _suppressed = false;
 while (!_suppressed) {
   switch (BumperCarWithHandling.direction) {
     case "prava":
       BumperCarWithHandling.rightMotor.stop();
       BumperCarWithHandling.leftMotor.forward();
       break;
     case "lava":
       BumperCarWithHandling.rightMotor.forward();
       BumperCarWithHandling.leftMotor.stop();
       break;
     case "hore":
       BumperCarWithHandling.rightMotor.forward();
       BumperCarWithHandling.leftMotor.forward();
       break;
     case "dole":
       BumperCarWithHandling.rightMotor.backward();
       BumperCarWithHandling.leftMotor.backward();
       break;
     case "s":
       BumperCarWithHandling.rightMotor.stop();
       BumperCarWithHandling.leftMotor.stop();
       break;
     default:
       break;
    }
   Thread.yield();
}
 ...


Druhé správanie sa aktivuje ak ultrazvukový senzor detekuje prekážku príliš blízko robota. Toto správanie cúvne a náhodne sa otočí doprava alebo doľava.

 ...	
 BumperCarWithHandling.leftMotor.rotate(-180, true);
 BumperCarWithHandling.rightMotor.rotate(-180, true);
 if ((System.currentTimeMillis() & 0x1) != 0) {
   BumperCarWithHandling.leftMotor.rotate(-180, true);
   BumperCarWithHandling.rightMotor.rotate(180);
 } else {
   BumperCarWithHandling.rightMotor.rotate(-180, true);
   BumperCarWithHandling.leftMotor.rotate(180);
 }
 ...


Posledné správanie sa aktivuje ak farebný senzor detekuje čiernu čiaru vymedzujúcu hranicu priestoru, v ktorom sa môže robot pohybovať. Ak narazí na hranicu tak sa vráti späť.

 ...	
 BumperCarWithHandling.leftMotor.rotate(-180, true);
 BumperCarWithHandling.rightMotor.rotate(-180, true);
 ...