Controlling the Motors
Управление моторами

Это перевод, оригинал находится здесь

Введение в класс Motor.

Класс Motor предоставляет доступ к управлению моторами NXT. Для того, чтоб использовать моторы, они должны быть подключены к одному из трёх "моторных" портов NXT. Класс предоставляет экземпляр для каждого порта. Это: Motor.A, Motor.B и Motor.C.

Каждый из этих трёх объектов - это экземпляр класса NXTRegulatedMotor. Этот класс предоставляет методы для управления мотором и для узнавания, в каком состоянии сейчас находится мотор.

Мы предлагаем вам написать пять программ. С этими программами вы можете проводить эксперименты, которые помогут вам понять, как работают моторы NXT. Они достаточно просты, так что вам не понадобится особенно большой опыт в использовании языка Java (не считая умения программировать циклы). Наконец, мы предлагаем вам ознакомиться с другими методами управления моторами , которые не используются в программах, но могут быть полезны.

Программа 1 - Основы управления движением.

Эта программа использует самые основные методы управления мотором, которые контролируют движение мотора. Они перечислены ниже, вместе с другими методами, которые вам могут понадобиться при написании программы.

Методы, использованные в этой программе

Класс

Имя метода

Примечание

NXTRegulatedMotor, e.g. Motor.A

forward()

Запускает мотор на вращение вперёд

 

backward()

Запускает вращение назад

 

stop()

Немедленно останавливает мотор

Button

waitForPress()

Ожидает до тех пор, пока не будет нажата любая кнопка

LCD

drawString(String str, int x, int y)

Выводит строку в ряду y в позиции x

Что программа должна сделать:
  1. Напечатать "Program 1 " в ряду 0 на ЖК-экране.
  2. Дождаться, когда будет нажата кнопка
  3. Запустить мотор А в направлении "вперёд".
  4. Напечатать "FORWARD" в верхней строке.
  5. Дождаться, пока не будет нажата кнопка.
  6. Запустить мотор в направлении "назад".
  7. Напечатать "BACKWARD" в верхней строке.
  8. Дождаться, пока не будет нажата кнопка.
  9. Остановить мотор.

Решение задачи

Наверх страницы

Программа 2 - Использование тахометра.

У мотора NXT есть встроенный тахометр, который отслеживает текущий угол оси мотора (в градусах). Цель этого эксперимента - узнать, как быстро останавливается мотор. Программа попытается сделать в точности 4 оборота. Будет использовано два разных подхода, чтоб выполнить эту задачу. Первый подход: настроить мотор на вращение с частотой 2 оборота в секунду и остановить его через 2 секунды. Второй подход: останавить мотор когда он совершит 4 оборота по показаниям тахометра.

Новые методы, используемые в этой программе

Класс

Имя метода

Примечания

NXTRegulatedMotor, то есть Motor.A getTachoCount() Возвращает угол оси мотора в градусах

 

setSpeed(int speed) speed – градусы в секунду. Максимальная скорость, которая может поддерживаться с достаточно хорошей точностью - 110 умножить на напряжение батареи.
Delay msDelay(int interval)

Приостановить программу на intervalмилисекунд

Что будет делать эта программа
  1. Покажет номер программы, как и в предыдущем случае.
  2. Установит скорость мотора на 2 оборота в секунду
  3. Запустит Motor.A вперёд.
  4. Подождёт 2 секунды.
  5. Покажет угол оси мотора на ЖК-дисплее. (интересно, каким он должен быть?)
  6. остановит мотор.
  7. Покажет показания тахометра в следующей строке ЖК-дисплея.
  8. Запустит мотор на вращение назад.
  9. Дождётся, пока тахометр не покажет 0.
  10. Выведет показания тахометра на следующей строке.
  11. Остановит моторы.
  12. Покажет показания тахометра на следующей строке.
  13. Дождётся нажатия кнопки так, чтоб вы смогли прочитать показания на ЖК-дисплее.

При первом эксперименте обратите внимание, что команда на остановку выдаётся до того, как мотор завершил выполнение 4 оборотов за 2 секунды и что остановка не происходит мгновенно из-за инерции.

Решение

Наверх страницы

Программа 3 - Точное управление вращением.

У класса Motor есть специальный поток (thread) который всё время работает. У него две главных задачи, одна из которых - остановить мотор при заданном угле. Эта программа будет тестировать точность методов, предназначенных для точного управления вращением. Есть два варианта этого метода. Основной метод возвращает управление только когда вращение уже завершено, другой вариант метода возвращает управление немедленно, но мотор останавливается, когда поворот на нужный угол будет сделан.

Новые методы, использованные в этой программе

Класс

Имя метода

Примечание

NXTRegulatedMotor, то есть Motor.A

rotate(int angle)

Поворачивает на angle градусов

 

rotateTo(int angle)

Поворачивает до позиции angle

Что программа должна сделать
  1. Показать имя программы и дождаться нажатия кнопки.
  2. Прокрутить мотор на 4 полных оборота.
  3. Отобразить показания тахометра на ЖК-дисплее.
  4. Повернуть ось мотора до позиции 0 градусов.
  5. Вывести показания тахометра на ЖК-экран в следующей строке.
  6. Дождаться нажатия кнопки.

Обычно мотор останавливается в пределах 1 градуса от указанного угла, если поток, регулирующий вращение мотора справляется со своей работой. Он работает, вычисляя, как далеко мотор прокрутится после начала торможения и начинает тормозить до того, как достигнет заданного угла.

Пронаблюдайте: Как только мотор остановился, если вы попытаетесь провернуть его рукой, он будет сопротивляться и даже может вернуться обратно в позицию, в которой он остановился.

Решение

Наверх страницы

Программа 4. Прерывание вращения

Иногда вам может понадобиться, чтоб мотор остановился (или сделал что-нибудь ещё) до того, как он достигнет указанного угла. Эта программа обнаружит нажатие кнопки и завершит задачу вращения мотора если вы нажмёте кнопку достаточно быстро. Метод rotate() не возвращает управление пока мотор не остановится на заданном угле. Но новый метод, использванный в этой программе умеет возвращать управление немедленно. Мотор остановится на заданном угле, если только какой-либо другой метод управляющий мотором не будет вызван, пока идёт вращение.

Новые методы, использованные в этой программе

Класс

Имя метода

Примечания

NXTRegulatedMotor, то есть Motor.A

rotate(int angle,boolean immediateReturn)

Метод возвращает управление немедленно, если булевый параметрimmediateReturn установлен в true


rotateTo(int angle,booleanimmediateReturn)


(boolean)isRotating()

Возвращает false если мотор остановился на заданном угле

Что программа должна сделать
  1. Отобразить номер программы.
  2. Начать вращение на 4 оборота в направлении "назад".
  3. Пока мотор вращается, выводить показания тахометра.
  4. Когда кнопка будет нажата - остановить мотор.
  5. После того, как мотор будет остановлен, отобразить показания тахометра в следующей строке.
  6. Дождаться нажатия кнопки.

Обратите внимание: если вы нажмёте кнопку до того как вращение остановится, мотор остановится не завершив вращения. В противном случае, вызов метода stop() не будет иметь какого-либо эффекта.

Решение

Наверх страницы

Программа 5: Регулирование скорости вращения мотора

Другая основная задача регулирующего потока (regulator thread) - контролировать скорость вращения мотора. Одна из причин делать это в том, что тележка, у которой два колеса ведущие будет двигаться прямо только если они оба вращаются с одной и той же скоростью (это очевидно). Стандартная прошивка Lego решает эту задачу путём прямой синхронизации двух моторов. NXJ использует другой подход: поддержание вращения каждого мотора синхронизированным с системным тактовым генератором (system clock). Регулятор сравнивает показания тахометров (за вычетом начальной отметки) со скоростью раз за разом и подстраивает мощность моторов так, чтоб удержать эти два показателя практически равными. Поток регулятор сбрасывает начальную отметку и затраченное время в ноль и начинает сравнение заново всякий раз, когда вы вызываете любой из методов, которые здесь были описаны. Эта программа позволит вам поэкспериментировать с эффективностью механизма регулирования скорости во время удержания моторов синхронизированными.
Вам не понадобятся новые методы для написания этой программы.

Что программа должна сделать:
  1. Как обычно, показать номер программы.
  2. Установить скорость всех трёх моторов в 2 оборота в секунду.
  3. Запустить все три мотора на вращение одновременно указав им совершить 2 полных оборота.
  4. Каждые 200 милисекунд, выводить показания всех трёх тахометров в ряд.
  5. Повторять шаг 3, 8 раз, используя разные строчки каждый раз.
  6. Дождаться нажатия кнопки, чтоб вы могли записать массив чисел (можно ввести их в электронную таблицу).

Моторы должны остаться в пределах 1-2 градусов по отношению друг к другу как только целевая скорость будет достигнута.
Регулирование скорости производится увеличением или уменьшением мощности. Но если мотор не может достичь желаемой скорости даже на максимальной мощности - то регулирование скорости невозможно. Максимальная скорость для надёжной регулировки - это примерно 100 умножить на напряжение батареи. Вам нужно повторить эксперимент с целевой скоростьюю 1000 градусов/секунду чтоб убедиться в этом.

Решение

Наверх страницы
Когда возможна ситуация, что вам понадобится отключить регулировку скорости?

В некоторых роботах скорость двигателя не должна быть константной, но должна изменяться в ответ на показания датчиков, как в примере с роботом, который идёт вдоль линии или как в примере с балансирующим роботом. Если коррекция скорости происходит часто, то никакого смысла точно выдерживать скорость между её изменениями нет (т.к. на такую регулировку тратится производительность процессора). Чтоб использовать мотор в нерегулируемом режиме, необходимо создать экземпляр класса NXTMotor. Например:


	   NXTMotor m1 = new NXTMotor(MotorPort.A);
	   

У NXTMotor есть многие из методов NXTRegulatedMotor, но вместо метода setSpeed, у него есть метод setPower, и, т.к. у него нет потока-регулятора (regulation thread), он не поддерживает методов управления вращением.

Когда вы должны использовать регулирование скорости?

Если вы указываете очень медленную скорость, мощность мощность, необходимая для её поддержания, может быть недостаточной чтоб преодолеть внутреннее трение мотора, поэтому мотор никогда не придёт в движение. В этом случае вызов rotate() никогда не вернёт управление. Но с включённым регулированием скорости регулятор будет поддерживать нарастающую мощность пока мотор не достигнет заданной скорости.

Можете ли вы смешивать эти два метода управления мотором?

Да, можете. Просто создайте экземпляры обоих классов NXTRegulatedMotor и NXTMotor для одного и того же порта мотора. Когда нужно будет использовать метод setPower просто отключите управление мотором путём вызова suspendRegulation в экземпляре NXTRegulatedMotor.

Наверх страницы

Некоторые другие методы управления мотором

Узнавание, что мотор делает в данный момент
  • boolean isMoving();

    Этот метод полезен чтоб проверить, закончил ли мотор вращение. isMoving() возвращает true когда мотор работает, вне зависимости от причины (то есть метод forward() или backward() был вызван или задача запущенная методом rotate() в процессе выполнения)

  • int getLimitAngle()

    Возвращает текущее значение угла в котором находится ось мотора.

  • int getSpeed()

    Возвращает текущее значение настройки скорости

  • int getActualSpeed()

    Возвращает текущее реальное значение скорости вращения.

  • boolean isStalled()

    Говорит, остановлен ли мотор или произошёл ли сбой регулировки скорости мотора (состояние, когда вы запросили бОльшую скорость, чем это возможно).

Различные другие методы
  • resetTachoCount()

    Этот метод не только устанавливает счётчик тахометра в 0, но и также сбрасывает точку отсчёта, используемую потоком-регулятором при принятии решения, когда нужно остановить вращение.

  • void setAcceleration(int acceleration)

    Позволяет вам контролировать, как быстро будет меняться скорость мотора при изменении значения скорости от одного до другого. Ускорение устанавливается в единицах градусы в секунду за секунду. Используйте маленькие значения (попробуйте от 200 до 500) чтоб ваш робот плавно ускорялся.

  • void getAcceleration()

    Возвращает текущее значение ускорения для мотора

  • suspendRegulation()

    Отключает управление мотором. Используйте этот метод если вы хотите смешивать регулируемое и нерегулируемое управление одним и тем же мотором.

Наверх страницы

Методы NXTMotor
  • setPower(int aPower)

    Используется для управления мощностью мотора напрямую. Используйте значение от 0 до 100. Не вызывайте этот метод если регуляция включена, потому что поток-регулятор постоянно подстраивает мощность.

  • int getPower()

    возвращает текущее значение установки мощности от 0 до 100.

Наверх страницы

Hosted by uCoz