Соревновония Lego роботов 2.Соревновония Lego роботов 1.

Управление мощностью двигателя по шинам данных в NXT-G

Сообщение об ошибке

Deprecated function: The each() function is deprecated. This message will be suppressed on further calls в функции menu_set_active_trail() (строка 2404 в файле /home/users/r/robohobby/domains/robohobby.myjino.ru/rostovrobot/includes/menu.inc).
Аватар пользователя Овсянников Алексей Юрьевич

Все, кто программирует Lego-роботов в NXT-G и собираются писать "продвинутые" программы, должны использовать шины данных - специальные линии связи для передачи данных от одного блока к другому в программе. Так, мы можем взять показания датчика расстояния и направить их как мощность двигателя. В результате робот будет снижать скорость по мере приближения к перпятствию.

dvigatel_1

Давайте подробно разберемся, как происходит управление мощностью двигателя по шинам данных в NXT-G.

Для управления двигателями роботов можно использовать два блока: "мотор"

 

или "движение"

.

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

,

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

Числа, передаваемые по желтой шине данных, могут быть разные: нуль, положительные, отрицательные, целые, дробные, больше 100. Для всех этих случаев характерны следующие правила:

  • число "нуль" полностью останавливает двигатель и не дает ему вращаться (аналогично активному торможению);
  • числа больше 100 запускают двигатель на вращение с максимальной скоростью;
  • дробные числа автоматически округляются до целого (в большую или меньшую сторону выяснить не удалось, хорошая тема для исследования);
  • отрицательные числа запускают двигатель на вращение вперед.

Последнее правило выглядит нелогичным, особенно для робототехников, ранее писавших программы в RoboLab или RobotC. Ведь зачастую в программе предполагается, что, при получении отрицательного значения скорости, двигатель должен начать вращаться в обратную сторону. Обойти подобное ограничение NXT-G можно используя другой вход концентраторов шин данных - "направление" ("Direction") 

//www.flickr.com/photos/77242245@N04/8137775215/" title="dvigatel_5 by RostovRobot, on Flickr"><img  data-cke-saved-src="http://farm9.staticflickr.com/8043/8137775215_8e053f82a1_t.jpg" src="http://farm9.staticflickr.com/8043/8137775215_8e053f82a1_t.jpg" width="58" height="28" alt="dvigatel_5"></a>.

 Этот вход имеет тип "логика" (то есть шина данных, подключенная к нему, должна быть зеленой).

По шине данных типа "логика"  может передаваться только два значения: "истина" ("true") или "ложь" ("false"). Приходящее значение "истина" задает вращение двигателя вперед, значение "ложь" - назад. Причем знак числа на входе "мощность" не учитывается в обоих случаях.

Таким образом, чтобы вращать двигатель в правильном направлении в зависимости от знака числа-скорости, достаточно использовать блок сравнения и собрать следующую консрукцию:

 

В блоке сравнения проверятся, больше ли значение скорости чем "нуль". Если это так, то блок сравнения на выходе устанавливает значение "истина", передаваемое на вход "направление" блока "мотор" или "движение". В этом случае двигатели будут вращаться в прямом направлении. Как только на вход блока сравнения придет отрицательное число (или "нуль"), он сразу устанавливает на своем выходе значение "ложь", которое заставит двигатели крутиться в обратном направлении.

Если расположить все шины данных как в примере, то блок сравнения не придется настраивать - подойдут настройки по-умолчанию.

Последнее, о чем хотелось бы сказать: при работе с шинами данных, блоки берут значения именно из шин данных, а не из заполненных полей в своих свойствах. Так, если в свойствах блока "движение" указана мощность 75, а по шине данных приходит число 20, то двигатели будут вращаться со скоростью 20%

Подобное разделение на входы для скорости и направления вращения открывает некоторый простор для программирования: при необходимости можно явно указывать направление вращения, вне зависимости от знака числа-скорости. Зачем это нужно? А какие варианты предложите Вы?