LeJOS: базові операції з двигуном 1


З сенсорами ми більш-менш розібралися і настав час дати роботу можливість рухатися. Пора підключати до проекту двигуни і на перший раз це будуть два великих мотори EV3, роботу з якими забезпечує клас EV3LargeRegulatedMotor (всі двигуни EV3 реалізують інтерфейс RegulatedMotor, який крім власне керування двигуном дозволяє вимірювати деякі його параметри, але про це іншим разом).

Насправді нічого складного у роботі з двигунами немає. Двигун можна повернути на вказаний кут за допомогою методу rotate(int angle) – кут може бути і від’ємним; а можна задат йому швидкість у градусах на секунду методом setSpeed(int speed) а потім увімкнути обертання у прямому чи зворотньому напрямку за допомогою методів forward() та backward().

Цікавим нюансом, на якому варто зупинитися детальніше, є синхронізація роботи двигунів. Скажімо у нас є гусеничний робот (той самий EV3RSTORM) і кожну гусеницю приводить у дію окремий двигун. Якщо ми зробимо щось таке:

RegulatedMotor m1 = new EV3LargeRegulatedMotor(MotorPort.A);
RegulatedMotor m2 = new EV3LargeRegulatedMotor(MotorPort.B);
m1.forward();
Delay.msDelay(2000);
m2.forward();

То двигун m2 запрацює аж через 2 секунди після старту двигуна m1. Навіть якщо не робити штучну паузу, то все одно якісь мілісекунди затримки мають місце, а це може призвести до певних проблем: якщо мотори запускаються і зупиняються у циклі, то з часом робот таки добряче зіб’ється з курсу.

Щоб уникнути такої проблеми у LeJOS передбачена синхронізація двигунів. І робиться це за допомогою методу synchronizeWith(RegulatedMotor[] syncList), який приймає за аргумент масив моторів, з якими треба синхронізувати той, на якому викликається метод. Сама синхронізація здійснюється у “операторних дужках” – між викликами методів startSynchronization() та endSynchronization(). Відповідно, код керуваня моторами, розміщенйи між цими методами, буде виконуватися одночасно.

RegulatedMotor m1 = new EV3LargeRegulatedMotor(MotorPort.A);
RegulatedMotor m2 = new EV3LargeRegulatedMotor(MotorPort.B);
m2.synchronizeWith(new RegulatedMotor[] { m1 });
m2.startSynchronization();
m1.forward();
Delay.msDelay(2000);
m2.forward();
m2.endSynchronization();

Тепер робот просто чекатиме дві секунди між викликами m1.forward() та  m2.forward() і обидва мотори рушать одночасно.

З цими знаннями ми вже можемо спробувати зробити якусь рухому платформу, наприклад керовану з пульта. У якісь із наступних статей цим і займемся. Але насправді LeJOS надає і більш просунуті методи керування роботами, зокрема пілоти Pilot, які володіють інформацією про розміри робота (діаметр колеса та ширину бази) і тому можуть здійснювати переміщення на задані відстані. Про це теж трохи згодом 🙂

Почитайте ще оце:


Залиште коментар

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *

Думка на тему “LeJOS: базові операції з двигуном