Lego Mindstorms Ev3 Project - Ondrej Slovak
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); } ...