Как положить программу на место

В этом разделе мы рассмотрим программу, которая управляет движением Ровера. Введите ее текст в программный редактор, который идет в комплекте с микроконтроллером BASIC Stamp, как мы уже делали в главе 13, и запустите ее; программная оболочка сама загрузит программу в память робота.

Не забудьте перед загрузкой соединить ваш компьютер с обучающей платой при помощи последовательного или универсального (USB) кабеля. Подключение платы к компьютеру показано на картинке все в той же главе 13.

' ( BS2)

OUTPUT 0

btn VAR Byte ' задаем переменную BUTTON

cnt VAR Byte    ' задаем вспомогательную переменную

' для использования в цикле FOR/NEXT

loop:

PULSOUT 12,1000 ' запускаем сервомотор А

PULSOUT 14,500  ' запускаем сервомотор Б

PAUSE 15  ' ждем 15 миллисекунд

BUTTON 1,0,255,250,btn,0,noSwitch

  OUT0 = btn ' включаем светодиод

  FOR cnt = 1 TO 50   ' в течение 50 итераций...

PULSOUT 12,1000   ' запускаем сервомотор А

PULSOUT 14,1000   ' запускаем сервомотор Б

PAUSE 15   ' ждем 15 миллисекунд

  NEXT  ' конец цикла

OUT0 = 0   ' выключаем светодиод

noSwitch: GOTO loop   ' повторяем цикл снова

Хм-м... Говорите, ваш робот вместо того, чтобы ехать вперед, мчится задним ходом? Что ж — эту проблему легко поправить: просто поменяйте местами цифры, обозначающие время выдачи сигнала (1000 и 500 периодов соответственно) в двух командах управления серводвигателями (А и Б), идущих непосредственно после указания метки loop:.

Вот как будет выглядеть программа после этих изменений:

PULSOUT 12,500  ' запускаем сервомотор А

PULSOUT 14,1000 ' запускаем сервомотор Б

Разбор полетов программистской мысли

Теперь не мешало бы взглянуть на программу для Ровера поближе, чтобы попытаться осмыслить, как она может управлять нашим роботом. Мы шаг за шагом подробнейшим образом рассмотрим все команды и выясним, что они делают. Итак, начнем:

' ( BS2)

В этой строке мы просто указываем сами себе, какой микроконтроллер используется в устройстве.

OUTPUT 0

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

btn VAR Byte   ' задаем переменную BUTTON

cnt VAR Byte   ' задаем вспомогательную переменную для  'использования в цикле FOR/NEXT

В этих двух строках мы задаем микроконтроллеру две переменные. Таким образом, под этими именами микроконтроллер будет хранить какие-то временные данные, значения которых затем программа будет использовать в своих нуждах.

loop:

Здесь начинается основной цикл программы. Команда loop: сообщает микроконтроллеру о начале цикла, который заканчивается командой GOTO loop в самой нижней строке кода. Цикл означает, что все команды, лежащие между двумя указанными строками, будут выполнятся бесконечно. Если вы планируете всерьез заняться роботами, то вам придется основательно изучить правила построения циклов — они используются во всех программах управления роботами.

PULSOUT 12,1000  ' запускаем сервомотор А

PULSOUT 14,500   ' запускаем сервомотор Б

Радиоуправляемые сервоприводы управляются импульсным током. Длина импульсов определяет время работы двигателей и, следовательно, направление движения всего робота. Инструкция PULSOUT сообщает микроконтроллеру о необходимости выдать импульс определенной длительности на определенный вывод микросхемы. Так, к примеру, команда PULSOUT 12,1000 предписывает BASIC Stamp выдать импульс длительностью 2000 микросекунд на вывод 12. (Длительность импульса указывается в интервалах по 2 микросекунды; соответственно, цифра 1000 обозначает 2000 мкс.) Однако внимательный читатель может спросить: "Почему же мотор А работает в течение 2 мс, тогда как мотор Б — только 1 мс?". Да потому, что сервомоторы монтируются на платформу робота в зеркальном отражении, и для того, чтобы робот перемещался, первый двигатель должен вращаться по часовой стрелке, а второй — против нее.

PAUSE 15 ' ждем 15 миллисекунд

В этой строке BASIC Stamp ждет в течение 15 мс, не предпринимая никаких действий.

BUTTON 1,0,255,250,btn,0,noSwitch

Инструкция BUTTON сообщает микроконтроллеру о необходимости проверить состояние лепесткового переключателя, подключенного к выводу 1 порта ввода-вывода. Эта команда требует дополнительного указания большого количества аргументов, назначение которых можно узнать из документации, поставляемой вместе с микроконтроллером и обучающей платой. Подробно эту команду мы уже анализировали в главе 13.

OUT0 = btn ' включаем светодиод

FOR cnt = 1 ТО 50   ' в течение 50 итераций...

PULSOUT 12,1000  ' запускаем сервомотор А

PULSOUT 14,1000  ' запускаем сервомотор Б

PAUSE 15   ' ждем 15 миллисекунд

NEXT

Эти команды будут выполняться тогда и только тогда, когда ключ на "носу" робота окажется переключенным вследствие наезда на препятствие. В строке OUT0 = btn выключается светодиод. Операторы цикла FOR/NEXT служат для указания того, какие команды попадают в тело этого цикла и сколько раз они будут выполнены: в нашем случае это три последующие строки (до оператора NEXT), которые будут повторяться целых 50 раз. После окончания последней, 50-й, итерации, программа выходит из цикла. За это время микроконтроллер 50 раз заставит один из двигателей робота вращаться в обратном направлении, и, таким образом, развернет Ровера!

OUT0 = 0  ' выключаем светодиод

noSwitch: GOTO loop   ' повторяем цикл снова

После того как робот изменит направление движения, микроконтроллер выключит светодиод (команда OUT0 = 0) и снова начнет основной цикл, как указано в последней строке.

Робот учится ходить

Когда немодифицированный сервомотор, работающий на радиоуправлении, получает последовательность управляющих импульсов длительностью 1000 мкс, его ротор вращается в одном направлении так долго, как сможет. Когда же робот получает последовательность импульсов длительностью 2000 мкс для второго сервомотора, он запускает этот двигатель в противоположном направлении, и его ротор тоже крутится так долго, как сможет. Логично было бы предположить, что при отсылке на оба сервопривода импульсов по 1500 мкс роторы обоих двигателей должны повернуться на одинаковое количество оборотов. Не так ли?

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

А вот и сама программка, которую можно использовать для точного позиционирования моторсв (предполагается, что оба серводвигателя подключены к обучающей плате (Board of Education) с микроконтроллером BASIC Stamp 2):

! ( BS2)

loop:  ' начало цикла

PULSOUT 12,750  ' запускаем сервомотор А

PULSOUT 14,750  ' запускаем сервомотор Б

PAUSE 15  ' ждем 15 миллисекунд

GOTO loop ' повторяем цикл снова

Как видите, программа совсем простая. Она отсылает на оба серводвигатели бесконечные циклы по 1500 мкс. Подстройте потенциометры таким образом, чтобы при запущенной программе их роторы стояли на месте.

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

Оглавление>>







© 2008 Электроника для начинающих | Programming V.Lasto | Povered by Nano-CMS | Designer S.Gordi