С. А. Филиппов
Под редакцией
д-ра техн. наук, проф.
А. Л. Фрадкова
Санкт-Петербург
«НАУКА»
2011
Ф илим ион ('.А . Р об ототехн и ка д л я д е н и и родителей. СПб.:
11аука, 2 0 1 1. 263 с.
ISBN 978-5-02-025-479-4
Р ец ен зен ты :
д-р техн. наук, проф. Б. Р. Андриевский
С. Н. Лебедев
Введение.............................. .........................................................ч................................................11
Механическая передача..............................................................................................................28
Передаточное отношение........................................................................................................ 28
Волчок............................................................................................................................................32
Редуктор........................................................................................................................................ 36
Моторы вперед!..............................................................................................................................38
NXT Program................................................................................................................................ 38
NX T-G ............................................................................................................................................39
Robolab 2 .9 ........................................ ...........................................................................................40
RobotC........................................................................................................................................... 40
Тележки............................................................................................................................................. 40
Одномоторная тележка.............................................................................................................41
Полноприводная тележка........................................................................................................44
Тележка с автономным управлением.................................................................................. 45
Тележка с изменением передаточного отношения.......................................................... 52
3
Шнгшощпс ро(ю ты ........................................................................................................................56
Введение....................................................................................................................................... 56
'IriHeponoi ий пеш еход............................................................................................................. 58
Универсальный ходок для NXT 2 .0 ...................................................................................... 65
Дмухмоторная тележка.................................................................................................................74
Три колеса..................................................................................................................................... 74
11рограммирование без компьютера..................................................................................... 81
Компактная тележка..................................................................................................................88
Полный привод............................................................................................................................ 90
Введение.............................................................................................................................................91
Знакомство с N X T -G .....................................................................................................................91
Новая программа.........................................................................................................................92
Интерфейс N X T -G ..................................................................................................................... 93
Ветвления...................................................................................................................................... 95
Циклы.............................................................................................................................................96
11еременные................................................................................................................................. 97
Kobo Center....................................................................................................................................... 97
TriBot.............................................................................................................................................. 98
RoboArm...................................................................................................................................... 100
Spike..............................................................................................................................................101
Alpha R ex.................................................................................................................................... 102
Режим «Администратор»..........................................................................................................106
Режим «Программист»...............................................................................................................107
Основные окна.......................................................................................................................... 108
Готовые примеры программ.................................................................................................. 109
Взаимодействие с NX T........................................................................................................... 110
Команды ож идания.....................................................................................................................118
Ожидание интервала времени...............................................................................................118
Ожидание показаний датчика...............................................................................................120
Ожидание значения контейнера...........................................................................................121
Ожидание значения таймера..................................................................................................121
Контейнеры................................................................................................................................. 135
Операции с выражениями.......................................................................................................140
Введение.......................................................................................................................................... 145
Firmware........................................................................................................................................145
Hello, world!.................................................................................................................................146
Структура программы...............................................................................................................147
Датчики........................................................................................................................................... 151
Настройка моторов и датчиков..............................................................................................15 1
Тип датчика.................................................................................................................................153
Задержки и таймеры.....................................................................................................................153
Задержки.......................................................................................................................................153
Таймеры........................................................................................................................................154
Кубическая составляющая.....................................................................................................183
11ИД-регулятор............................................................................................................................. 185
Объезд предметов........................................................................................................................226
Новая конструкция...................................................................................................................226
11оворот за угол........................................................................................................................ 227
Фильтрация данных................................................................................................................ 230
Роботы-барабанщики.................................................................................................................232
11редыстория.............................................................................................................................. 232
Калибровка и удар.................................................................................................................... 233
Управление с помощью датчика..........................................................................................235
Создаем свой ритм...................................................................................................................236
Барабанщик с двумя палочками...........................................................................................238
Барабанщик на 11-регуляторе............................................................................................... 239
З а к л ю ч ен и е........................................................................................................................................253
Л и тер а т у р а .........................................................................................................................................254
П р и л ож ен и я ...................................................................................................................................... 255
Введение
1 Мели у Мае уже ссп . Lego Technic, будьте уверены: они с Lego Mindstorms
дополня т друг друга.
Н абор 8547 носит гордое имя N X T 2.0, хотя изменений в нем со
всем немного: добавлена память, разработаны несколько новых деталей
и конструкций, изменен состав датчиков и улучш ена среда программ и
рования для малышей. Неприятным открытием оказалось уменьш ение
числа ш естеренок, которые так важны ю ному робототехнику. Недос
таю щ ие детали теоретически можно приобрести у компании Lego, но в
России этот процесс затруднен.
В Интернет-магазине робототехнические наборы будут стоить не
много д еш евле1, чем в обычном. Это так называемое «коммерческое
Lego», версия для дома.
Сущ ествует также версия «образовательного Lego», представлен
ная компанией Lego Education. С таким набором встретиться в отделе
игруш ек в России нельзя. П оставки конструкторов Lego M indstorm s
N X T Edu с кодом 9797 ведутся централизованно по ш колам через пред
ставительство Lego Education в России. Однако такой же конструктор, а
также ресурсны й набор к нему (с кодом 9648) можно приобрести через
И нтернет-магазины, но уже не в России, а за границей. И сущ ественно
деш евле. К сожалению , из И нтернет-магазина
http://w w w .legoeducation.us/store доставка в Россию так называемого
«образовательного Lego» не осущ ествляется (по крайней мере, на мо
мент написания этой главы), поэтому придется искать обходные пути,
приобретать через посредников либо на И нтернет-аукционах. Кроме
того, к набору 9797 не прилагается программное обеспечение. Его мож
но приобрести отдельно.
Если наш читатель уже продвинутый робототехник и готов усо
верш енствовать конструктор, дополнив его новыми датчиками, то и
этом пом огут производители дополнительных устройств и расширений
для Lego M indstorm s NXT: компании HiTechnic (w w w .hiTechnic.com ),
M indSensors (w w w .m indsensors.com ), V ernier (w w w .vem ier.com ) и дру
гие. Интернет-магазины, располож енны е на сайтах этих компаний, как
правило, осущ ествляю т доставку в наш у страну. Дополнительные ком
плектую щ ие теоретически можно приобрести и в И нтернет-магазине
Lego (http://shop.lego.com ), но, как было сказано выше, с доставкой за
казов в Россию у Lego не все гладко.
Рис. 1.3. О бразовательны й набор Lego M ind storm s N X T 9797 (слева) и ресурс
ны й набор 9648 (справа).
Электроника
Программное обеспечение
Зарубежны е разработки
Рис. 1.6. П рограм м ное обесп ечени е для M indstorm s к августу 2006 г.
MINDSTORMS
Education Science
II этап
LabVIEW tor Full
MINDSTORMS LabVIEW
III этап
MINDSTORMS Education NXT
I этап
шX
II Начальная школа Основная средняя Старшая средняя Техникум, Реальная
3-5 класс школа, 6-8 класс школа, 9-11 класс Университет жизнь
Отечественны е разработки
Рис. 2.1. Н е все пары получаю тся п охож им и, но что-то в этом есть.
Высокая башня
М еханический манипулятор
Механическая передача
►•
► J
► шф
Рис. 2.6. П ри передаче с м алого колеса на больш ое вы игры ваем в силе, но
теряем в скорости. П ри передаче с больш ого на м алое - все н аоборот |3].
• - Z2
1— , где i - передаточное отнош ение, Z2 - количество зубцов
z,
на ведомой ш естерне, z i - количество зубцов на ведущ ей шестерне.
Таким образом, при / < 1 тяговая сила уменьш ается, а угловая ско
рость возрастает (рис. 2.7); при / > I сила увеличивается, а скорость па
дает. Очевидно, что при / I и сила, и скорость остаются прежними. И
этом случае мы можем ощ утить изменения только за счет потерь при
трении.
Рис. 2.7. П ередача с пониж ением скорости: слева i= 3 :l, справа i=5:3 [3].
■_ ■ • • i = h. i - / = f i.
I ln ■l34 ■l56... , где 12 34 ,5 6 . ..
^3 5
Нетрудно догадаться, что ш естеренки, Находящиеся на одной оси,
вращ аю тся абсолю тно одинаково и их передаточное отнош ение равно
единице. Следовательно, эти значения в произведении м огут не участ
вовать (рис. 2.9).
■" И, наконец, оп
ределим понятие
«передаточное чис
ло». Его используют,
когда необходимо
вычислить коэф фи
циент изменения
скорости или силы
вне зависимости от
направления возрас
тания. Таким обра
зом, передаточное Р и с- 2.10. П ередаточ н ое число 15.
число можно опреде
лить как наибольш ее из отнош ений и=И 1 или и= 1/г. Следовательно, пе
редаточное число всегда не меньш е единицы: / > 1. Для примера, при
передаточном отнош ении /=1:15, как и при /=15:1, передаточное число
и= 15 (рис. 2.10).
Червячная передача - это частный случай зубчатой (рис. 2.1 1). В
наш ем конструкторе она обладает определенными свойствами. Во-
первых, один оборот червяка соответствует одному зубцу любой шес
терни. Значит, при расчете передаточного отнош ения количество зуб
цов червяка можно считать равны м единице: z4= 1. Во-вторых,
червячная передача работает только в одном направлении от червяка к
шестерне и блокирует движение в обратном направлении.
Задача. Постройте механическую передачу с максимальным пере
даточным отнош ением. По приблизительным подсчетам из всех ш есте
ренок конструктора 8527 можно построить передачу, увеличиваю щ ую
силу вращ ения (и понижаю щ ую скорость) примерно в 2 млн раз. Это,
конечно, теоретически. Но по сути это означает, что для одного полного
оборота ведомой оси потребуется около 2 млн оборотов ведущей. М но
говато.
• ► о
1 - Х
Рис. 2.11. Ч ервячная передача р аботает тольк о в одну сторону: от ч ервяка к
ш естерне [3].
Волчок
5-модульная ось
___
Рис. 2.15. Д вухступен чатая передача 1:9 (с уч етом м алой ш естерни волчка).
|= >
Редуктор
Моторы вперед!
NXT Program
а' Г а ] '(? я П 1 tf 0 * r u
u sb NXTnane 3 m usbNXTnane G «■ NXTnane 0 m
u sb
Е Ш H 3 -o - n
ж
EH D U S - 0 - 0 ЕНГНЭЧГНЗ]
-O O P Run Runn inq
(s t o )
Ф DO-
0 ||p o o ||
Рис. 3.1. С оставлен ие и запуск програм м ы для вклю чения м отора В или С.
NXT-G
ПОВОРОТ: ■ ■■;,,■■■■
е
Рис. 3.3. М отор А вперед на язы ке N X T-G .
Robolab 2.9
RobotC
Тележки
О дномоторная тележка
Рис. 3.6. О дном оторная тележ ка. П ервая 12-м одульная ось будет ведущ ей.
Д р угая ось вставляется в угл овую балку, второе от угла отверстие.
о
Рис. 3.7. О бе оси ф и ксирую тся 13-м одульны м и балкам и, расп олож ен н ы м и
параллельно корпусу двигателя.
Рис. 3.11. Н аиболее эф ф ективное расп олож ени е ш естеренок для полн оп ри
водной тележ ки.
51
Рис. 3.25. N X T с аккумулятором зак реп лен успеш но.
Шагающие роботы
Введение
Четвероногий пешеход
Рис. 3.35. Вид снизу. В едущ ие оси будут разн ой длины : 5 и 6 м одулей.
с
П реобразование вращ ательного движения в поступательное со
верш ается с помощ ью системы из двух коленец (балок), скрепленных
гладкими ш тифтами (рис. 3.42). С подобными креплениями мы столк
нулись, когда строили игруш ку «Хваталка». По сути же нам придется
построить кривош ипно-ш атунный механизм, который используется,
например, в двигателе внутреннего сгорания.
Рис. 3.4‘). Ш естерни 12-зубая ставится на беж евы й ш тиф т с поворотом на п ол
зубца.
Рис. 3.50. Ш естерни 20-зубы е сты кую тся с 12-зубой.
Рис. 3.51. В торая 12-зубая ш естерня тож е поворачи вается на ползубца для
сты ковки с 36-зубы м и.
T 'r > f
Рис. 3.54. На левой стороне используем 4-зубы е ш естерни.
Рис. 3.55. Д ля сты ковки 4-зубы х ш естерен ок следует поверн уть центральную .
Рис. 3.56. П осле установки черн ы х дв ухм одульн ы х балок с двум я серы м и
ш тиф там и переходим к креплению для контроллера.
Рис. 3.62. Балки 11-м одул ьн ы е на черны х ш тиф тах крепятся под дви гателем .
Маятник Капицы
Днухмоторная тележка
Три колеса
LL, . ^
----------------------------------------------,---- :------------ .------------
’ ) i о самая распространенная
•
■
■
••
••
■
•■
■
1
ршноипдность роботов. Тележ ка мо-
V*.
ж п 1)1.1 гь с тремя точками опоры, две А
in м п оры х - ведущ ие колеса, а тре- J 1/ )
п.» волокуша, или свободно вра- У
Ш11Ю1ЦСССЯ колесико (рис. 3.67).
Гимн.' модели являю тся базовыми для
ииОоров S527 и 9797. Их инструкции
но с(юрке содержатся в прилагаемых
u mu юру книжечках. Если попытае-
и ч 1. нос I роить такую тележ ку сами, Рис. 3.67. С хем а трехколесной
1ЮМ11П1С, что центр масс должен на- тележ ки с подвиж ны м третьим
чодиH.OI не над волокуш ей, а ближе колесом
I' игцущнм колесам.
Именно по этой схеме построена стандартная тележ ка из наборов
H V / н ‘>797 (рис. 3.68). В инструкциях этих наборов есть небольш ие
о 1 Пичи»!, по суть одна.
Простейшая тележка
Рис. 3.71. В зави сим ости от расп олож ени я балок м ож ет бы ть см ещ ен центр
тяж ести тележ ки.
Рис. 3.73. К олеса устан авли ваю тся на 6-м одул ьн ы е оси, втулки предохраняю т
от неж елательн ого трения ш ин о корпуса двигателей.
Остановить моторы В
и С (в стандартной
Empty
прошивке Empty не
останавливает мото Двигаться с остановками:
ры, а просто пропус- 2 с е х а т ь , 2 с стоять
кает х о д )7____________
Turn right
Включить мотор В
вперед со скоростью 2
"Е?ГИ И [Ж[Ф| 1
Двигаться по волнистой
об/с, мотор С вперед л и н и и : 2 с направо, 2 с
со скоростью 1 об/с налево
B ack r i g h t То же назад
им иш
7 Следует различать команду действия Empty и пустую команду ожидания
I■Imply
Блок Назначение Пример использования
Проехать вперед 5 с , в ы
I о> полнить поворот назад н а
право за 2 с и
остановиться
Включить мотор В
Turn left
вперед со скоростью 1 Двигаться по волнистои
об/с, мотор С вперед линии: 2 с направо, 2 с
со скоростью 2 об/с налево
m ! ж 1 н и г а
0 ’ 0 0 З Н п I 0 £ t f я П 2
USB 0 ш
NXTnane
EH Z НЗЭ-C H жS
Loop
(stop )
Back left 2
[?l ft! PI ГШ
Проехать 2 с вперед,
То же назад выполнить точный п о
ворот налево назад и
остановиться
Touch
Ждать нажатия кнопки
датчика касания.
тж ж ж т?
Ехать вперед до каса
Срабатывает мгновенно, ния, затем отъехать 2
для ожидания повторного с назад и остановить
нажатия требуется пауза ся
Повторять бесконечно:
Object Ждать показания датчика {ехать вперед, пока
ультразвука меньше 25см. впереди не появится
объект, затем развер
нуться назад направо
в течение 2 с}
ЖП РТП [ФГ
Ездить по многоуголь
Empty нику, на углах пово
Пропустить ожидание рачивая назад нале в о .
Все команды высокого
уровня, ожидание не
требуется
Блок Назначение
Повторять бесконечно:
Остановить моторы, из {ехать вперед, пока
Tone 1 Топе 2 дать звуковой сигнал, по освещенность не пре
Компактная тележка
х2
Рис. 3.S7. Н абор деталей для компактной основы [4|.
х2
Рис. 3.88. П одготовка обвязки [4].
Введение
Знакомство с NXT-G
Iloitan программа
Move
К&Рап- о А 0 В 0С Ш*""" — О - eQ i:3a
19'
Direction: <! t r О * О © И |й | Duration; j 1 j j Rotations (?)! .,
* «■« a
■ Общий вид
ЕЗ t !Ш Ne,t Actionl ’ ' H i Brak« О Coast программы
Ш 0 v
Р ис. 4.2. И н терф ей с N X T -G .
Ветвления
Рис. 4.6. В етвления: по датчик у наж атия (слева), по логи ческ ом у или чи сл о
вом у зн ачен ию (справа).
Ц иклы
Рис. 4.S. П иктограм м а беск онечного цикла (слева), цикл по датчи к у освещ ен
ности (справа).
Robo Center
TriBot
г-Ш
Spike
01
Alpha Rex
Alpha Rex умеет делать то, что под силу только самым развитым
,юбогам-андроидам. Он ходит на двух ногах, почти как настоящ ий че-
ионок. В е ю ноги встроена пара сервомоторов, которые позволяю т ему
п и та т ьс я , а ультразвуковой датчик дает роботу возможность видеть
препятствия. На руках у A lpha Rex находятся датчики звука и прикос
новения.
Датчики и элементы, которые использует Alpha Rex:
контроллер NXT;
ультразвуковой датчик;
датчик звука;
датчик прикосновения;
два сервомотора.
Рис. 4.17. A lpha Rex.
эежим «Администратор»
1’ис. 5.3. О кно вы бора устройства, с которы м будет устан овлена связь.
Режим «Программист»
О сновны е окна
Jaljsl
Передняя панель (для режима "Исследователь")
■К» R O BO LA B U n title d l . v i F r o n t P an e *
_______________ ___
File Edit O p e rate P rojects B ro w se W in d o w H elp
ra
Ш
Добро по ж ало вать в Конструирование
a a a
___________ Н апиш ите вашу програм му в окне ниже
IN V E N T O R д п я 11.. :(р it . t основное меню, закройте все окна Коне
ы
% * R OBOLAB U n title d l . v i B lo c k D ia g r a m *
Палитра
■ ■ B IS
инстру и
Рабочее поле программы
ментов
kd
UIJ.W.IJJ.I.IIUWWW ig jx j
| 0» Search j J [
ш Ы И ГН Ш т
100 тшг
ГО
@ 3 *1
g E
Ш
Рис. 5.9. С одер ж ан ие при м ера и р азм ещ ение его м еж ду светоф орам и.
В за и м о д е й с т в и е с N X T
Типы команд
Команды действия
Мотор назад на
соответствующем
порту (А, В или
С) с заданной
мощностью 1..5 М о то р В н а з а д с м и н и м а л ь н о й м ощ
(по умолчанию 5) н остью в т е ч е н и е 1 с, затем ос
танови ться
Включить лам
почку на соответ
ствующем порту В кл ю чить л а м п о ч к у н а порту А и
(А, В или С) ч е р е з 1 с вы кл ю чить
Включить лам
почку на указан
ном порту(п о
умолчанию все)
В кл ю чить л а м п о ч ки на портах А и
С с м ощ н остью 3, через 6 с вы
кл ю чить в с е
Остановить мотор
или выключить
В клю чить л ам почку на порту А и
лампочку
через 1 с вы клю чить
Блок Назначение Пример использования
Остановить мотор
иш ш ЕШ
т
или выключить
лампочку(по
|ЩЯ
■ РМ ш
Ехать вперед 2 с и остановиться
умолчанию - все)
Снять напряжение
с моторов (плав
Мотор А вперед в течение 1 с,
ная остановка)
затем плавно затормозить
Сменить направ
ление вращения
Мотор А вперед 1 с, назад 1 с и
(реверс) остановиться
Моторы вперед
или назад на ука
занном порту
Включить мо
тор в случай
ном
направлении
Мотор А в случайном направлении
работает 10 с и выключается
Задать мотору
мощность (не
изменяя на
правления Мотор А вперед в течение 1 с, за
движения) тем задать ему мощность 3 и через
10 с выключить
Задать мотору
И направление
(не изменяя
Установить параметры движения м о
мощности)
тора В : мощность 3, направление
назад. Включить его с этими пара
метрами и через 2 с выключить
Задать мотору
случайное на
правление (не
изменяя мощ Мотор А вперед, но сразу выбирает
ности) ся случайное направление и через
10 с мотор выключается
Включить мо
торы и лам
почки с
последними
т заданными
Установить параметры движения м о
значениями
тора В : мощность 3, направление
мощности и
н а з а д . Включить его с этими пара
направления
метрами и через 2 с выключить
Клок Назначение Пример использования
Задать мощ
гш т о с
ность и на
правление
мотора одним
числом -7..7 Положить в контейнер по умолчанию
(положитель (red) число -5, затем 11 раз п о
ное - вперед, вторить : {включить мотор А с м ощ
отрицательное ностью red, через 1 с издать звук,
- назад, ноль - добавить 1 в контейнер (red)}. З а
стоп) и вклю тем выключить мотор А.
чить мотор. В процессе движения мотор сперва
крутится назад, затем плавно оста
навливается и вращается вперед
Включить м о
тор с мощно
стью
-100..100
(в режиме тор
можения)
Моторы А и С вперед с мощностью
50%, через 4 с остановиться
гг
И
jrotation
Включить м о
тор с мощно
стью - -1 * rotation |
П
ТТГ -100.. 100 (в Бесконечно повторять: {В перемен
режиме тор ную rotation записать показания
можения) датчика оборотов мотора А, в пере
с помощью менную speed записать противопо
строковой ложное значение, на мотор А подать
формулы мощность, равную значению speed}.
По сути эта программа удерживает
мотор в фиксированном положении,
не позволяя вращать его извне
I
-
ления моторами содержатся в палитре N X T (табл. 5.3). С их по
мощ ью можно:
ехать с заданной скоростью;
- проезжать заданное расстояние и останавливаться;
- синхронизировать движение моторов;
- менять ориентацию моторов на противоположную.
Синхронизация
одного мотора
с другим. Воз
Мотор С синхронизировать с мотором
можно измене
А в противоположном направлении,
ние мощности
включить мотор А вперед (С назад),
в процентах и
ждать 2 с, выключить синхронизацию,
направления
включить мотор С на з а д , ждать 2 с ,
(знак)
выключить все моторы. Вращение м о
торов в разные стороны будет проис
ходить в общей сложности 4 секунды
Контроль ско
рости моторов.
Максимальная
скорость при
свежих акку
муляторах -
75 0 % (на ба Задать максимальную скорость мото
тарейках 1,5В ров А и С на 750, включить их со
может достиг- скоростью 375 (т.е. 50%), ждать 2
нуть 1000) с , выключить моторы
Контроль рас
стояния. Задает
градусы, на
которых после
следующ его
запуска мотор Задать точку останова моторов А и С
должен оста на 750°, Включить моторы с мощно
новиться стью 50, ждать 4 с . Моторы могут
остановиться примерно через 2 с
Н азначение Пример использования
Изменить ори
ентацию мото
Включить мотор А в п еред, ждать 1 с ,
ра на
сменить ориентацию мотора А, вклю
противопо
чить мотора А вперед (но уже в дру
ложную
гую сторону), ждать 1 с
Команды ожидания
Ждать задан
ное количество
секунд (укачать
н модификато
ре)
Блок Назначение Пример использования
Запустив две параллельные задачи, в
верхней проиграть мелодию, храня
щуюся в красном свитке, а в нижней
подождать 10 с и прервать выполне
ние всех з а д а ч , т .е . завершить про
грамму, не дожидаясь окончания
мелодии
Ждать случай
ное количество
секунд (по
Мотор А вперед, через случайное
умолчанию
время от 0 до 5 с остановиться
ДО 5)____________
Ждать N сотых
долей секунды
(указать в м о
Повторять в бесконечном цикле: {Мо
дификаторе)
торы В и С вперед на полную м ощ
ность , через 1 секунду развернуть
мотор В в обратную сторону на
30 мс}
Получается движение по квадрату или
ломаной линии
rfn
-Ж- .
Ждать задан
ное количество В бесконечном цикле повторять:
минут {ждать нажатия датчика на 1-м пор
ту, включить мотор А на 2 мин, за
тем выключить}
О жидание показаний датчика
Ж Л Ж ди нажато 0..231-1
ж Ж ди отпущено -
в Ж ди оборот на ...
Ж ди оборот на (с вклю че
- 2 31..231-1
- 2 31..231-1
нием мотора) ...
Жди значение
0 таймера в 1/10 с
(серая подсветка)
Обнулить таймер, включить мотор А,
ожидать значение таймера по умол
чанию , выключить м о т о р .
Жди значение ш ш
таймера в 1/100 с
[600]
(бежевая под
Обнулить тай м е р , подождать, когда
светка)
на таймере натикает 6 с , издать
звуковой сигнал
Управляющие структуры
Ш
Рассмотрим основные f Search j
Е структуры, которые встре
тятся в этой книге. Все они
...............- ..........1
Параллельные задачи
нэпа
Начать новую па
раллельную задачу
Включить мотор А и через 2 секунды
сменить его направление из основ
ной задачи, а через 4 секунды в ы
ключить из параллельной
Перезапустить
одну или все зада
чи, после того как В основной задаче включить мотор
они были выпол и ожидать нажатия датчика, после
нены или останов чего все отключить. В параллельной
лены задаче включать лампочку, через 6
с выключать, издавать сигнал и п о
вторять все заново
Остановка одной
или всех задач
может означать
окончание про
граммы С м . выше
Подпрограммы
с _| в - ,Е -
Создание новой
подпрограммы. l l l l
Объявить подпрограмму, в которой
По умолчанию
проигрываются три ноты, и вызвать
номер О
ее из основной программы через 4 с
после включения мотора А. По окон
чании мелодии мотор А будет отклю
чен
Вызов подпро
«О граммы по ее
номеру
i n U
С м . выше
Ветвления
Датчик касания:
отпущен или на
Включить мотор А и ждать 4 с. В
жат
зависимости от состояния датчика
нажатия либо просто отключить м о
тор А, либо перед этим издать
сигнал
ш ш и
Датчик звука: л
проверка уровня
громкости Включить мотор А и при уровне
громкости, не равном 55%, издать
звуковой с и гн а л . Через 2 с выклю
чить мотор
Ультразвуковой
датчик: проверка
расстояния до
объекта Бесконечно повторять: {если р ас
стояние до объекта больше 10 см,
то включить мотор А вперед, иначе
включить мотор А назад}
Датчик оборотов
1?
№
мотора: проверка
текущего угла по Бесконечно повторять: {Ждать 1 с,
ворота если обороты мотора А превышают
720°, то {остановить мотор, и з
дать сигнал, обнулить датчик обо
ротов }, иначе включить мотор А
вперед}
Датчик касания:
проверка количе
л 1
ства нажатий
Бесконечно повторять: {Обнулить
счетчик нажатий на дачике каса
ния , включить мотор А в п еред,
ждать 10 с, если датчик нажат бо
лее 5 р а з , то издать звуковой
сигнал, иначе {выключить мотор А ,
Блок Назначение Пример использования
ждать 2 с}}
$7 \ т гг 1
т
Проверка показа
«Ц
ний таймера Обнулить таймер, включить лампоч
ку, подождать случайное время от
О до 5 с, если прошло меньше 3 с,
издать сигнал, затем выключить
мотор
О!
О—
вв
Д
Проверка значе
ния контейнера <1|>аР
В красный контейнер положить слу
□-
чайное число от 0 до 8, если оно
на равно 1, издать сигнал
Прыжки
Циклы
Search
г£» П>
3
tSfc*
5
dm fv"
<Цъг r
n>
> l-
ett:
"С ,-
j’
< thsr > Lici:
4 S f t e g
> c с
,_r> __r>
rfr
>•l—-
ш*т!Ш
ft8?].
Цикл с беско
Бесконечно повторять: {вклю
|£ нечным числом
чить лампочку А, ждать 2 с,
повторений
выключить, ждать 2 с}. Коро
че г о в о р я , м игалка.
Цикл с задан-
повторений
То же самое повторить 10 раз
Циклы с предусловием
тгУ ____
V ЬЭ!:_
3 —4^_—
п>
- 1 L±. Цикл пока Пока не нажат датчик касания, п о
датчик касания вторять : {сыграть н о т у , ждать пау
нажат (отпу зу} , после нажатия издать сигнал.
г> -А.
щен) Если нажатие произойдет только во
время звучания ноты или паузы, оно
не будет зафиксировано
$ ft
<7&г Цикл пока
расстояние п>
меньше
(больше)
, Iij;;r
Блок Назначение Пример использования
Повторять бесконечно: {пока р ас
стояние до объекта больше 50 см,
повторять:{сыграть н о т у , ждать пау
зу} , затем включить мотор А на 2 с
и выключить}
Цикл пока
значение тай Обнулить тайм е р , пока его значение
мера меньше меньше 50 десятых долей секунды (5с),
(больше) п овторять: {сыграть н о т у , ждать пау
зу}
Цикл пока
значение кон
тейнера мень Обнулить контейнер, пока значение
ше (больше) контейнера меньше 5, повторять: {сыг
т рать ноту, добавить в контейнер чис
ло 1}
■
|_
г H ayI
Цикл пока
значение кон
тейнера равно
(не равно) Обнулить контейнер, пока значение
контейнера равно 0, повторять: {если
датчик касания н а ж а т , добавить в кон
тейнер число 1}
[В® Щ 0 S ШШ S я
Ш Ishort сПск~П jBuzz Н
Рис. 5.20. Зам ена циклом ветвления по усл ови ю «м еньш е».
События
Модификаторы
♦ из палитры N X T
П ф
ффф Порт подклю чения мотора
(из стандартной палитры)
См. ниже
'ife'4% из палитры N X T
О
Цветные контейнеры (крас
t 4. i. Iх*9
н !f(x!
ф Случайное значение от 0 до 8
Контейнеры
Вычесть значение
* шмтт\
из текущего зна
чения контейнера т *
Положить в синий контейнер число
1, вычесть из него число 2, р е
зультат вывести на экран NXT
Умножить теку
щ ее значение кон
* тейнера на
заданное число
Положить в синий контейнер число
1, умножить его на 2, результат
вывести на
Разделить теку
щ ее значение кон
тейнера на
заданное число Положить в синий контейнер число
1, разделить его на 2, результат
вывести на экран NXT
136
Модуль числа
Логическое «И»
5 = 0101
1 = 0001
1 = 0001 Положить в красный контейнер число
5, побитово умножить его на число
1, результат вывести на экран NXT
Логическое
«ИЛИ»
5 = 0101
1 = 0001
Положить в красный контейнер число
5 = 0101
5, побитово сложить его с числом
1, результат вывести на экран NXT
Присваивание.
Положить новое
значение в кон Обнулить красный контейнер, поло
тейнер жить в него число 2, издать сиг
нал , включить мотор А с мощностью
равной значению красного контейне-
А
Формула
с0/10+4*2
В красный контейнер считать пока
зания датчика освещенности, заме
нить их на результат формулы, где
137
Блок Назначение Пример использования
сО - значение красного контейнера,
вывести на экран NXT
Вычисление вы
ражения. Резуль
тат присвоить
переменной типа,
int, long или float.
Irate = rotations/360|
М ожно выполнить
Обнулить датчик оборотов мотора А,
сразу несколько
включить мотор А, ждать 4 с, в ы
присваиваний в
ключив мотор А, считать показания
одном блоке
с порта А в переменную rotations
Положить значе (в градусах), в переменную rate
ние выражения в положить значение в оборотах, в
контейнер красный контейнер положить значе
Положить значе ние переменной rate, вывести на
ние в именован- экран NXT
ный контейнер
Положить в кон
тейнер случайное
число от 0 до 8 Положить в красный контейнер слу
чайное ч и с л о , издать сигнал, в ы
вести на экран значение красного
контейнера, ждать 2 с
Положить в кон
тейнер значение
таймера 1/10 с Положить в красный контейнер пока
зания таймера, издать сигнал, в ы
вести на экран значение красного
контейнера, ждать 2 с
t
штшгве string
Положить в кон
тейнер значение
Обнулить таймер, издать сигнал,
таймера 1/100 с
положить в красный контейнер пока
зания таймера в сотых долях секун
ды, вывести на экран значение
Блок Назначение Пример использования
красного контейнера, ждать 2 с
Положить в кон
тейнер значение
Б датчика освещен
ности
Положить в красный контейнер пока
зания датчика освещенности на 4
порту, умножить на 10, играть ноту
с длительностью 1/4 и частотой,
равной значению красного контейне
ра______________________________
Положить в кон
тейнер значение
Инициализировать датчик расстояния
EEL датчика расстоя-
на 4 порту, бесконечно повторять:
{положить в контейнер показания
датчика расстояния на 4 порту, ум
ножить их на 5, включить мотор А с
полученной мощностью}
Положить в кон
тейнер значение
датчика нажатия Положить в красный контейнер зна
(0 или 1) чение датчика нажатия на 1 порту,
повторить заданное в контейнере
число р а з : {играть н о т у , сделать
паузу}. Цикл выполнится не более 1
раза.
Положить в кон
тейнер значение
датчика звука Инициализировать датчик звука на 2
порту, бесконечно повторять: {по
ложить в контейнер показания дат
чика звука на 2 порту, включить
мотор А с полученной мощностью}
Блок Назначение Пример использования
О перации с выражениями
Сложение: +
Вычитание: -
Умножение: *
Деление: /
О статок от деления: %.
П р и м е р : 3 % 2 = 1.
Битовое И: &.
П р и м е р : 7 & 5 = 5.
Битовое ИЛИ: |.
Пример: 5 | 2 = 7 .
О пределение типов переменных: int, long, float,
int b
long c=2147483647
float a = 2 .5
По умолчанию все переменные целые.
Разрешены круглые скобки.
5 + (red*2)/abs(sqrt(yellow/5.0))
У казание числа 5.0 означает, что все математические операции бу
дут производиться над числом с плаваю щ ей точкой.
Если к переменной целого типа присвоить дробное значение, оно
автоматически будет приведено к целому, т.е. произойдет округление.
Поэтому рекомендуется заранее определять тип переменных.
Допустимые функции
Интерфейс NXT
Очистить экран N X T
Библиотеки пользователя
!Д.ЯДЧ.-Щ?Г-1 —1□! xl
10^ Search | j
R F ID
1«=>1 «Г] иг ив
W
Введение
Firmware
File
ROBOTC -S o u ic e C o d e
Edit View Robot W indow Help
BBal
Compile an d D ow nload Program F5
П Й Н
Compile Program F7
+ _ C Constructs
+ B a tte ry 8t Row D e bugger
+ Bluetooth
+ M ath NXT Brick
+ Messaging
P latform Typ e
l+l M otors
M oto rs a n d Sensors S etup
1+1 Sensors
+ Servos D ow nload Firm w are
+ Sound
i+ i Timing
• User D efined
task m a i n ()
{
nxtDisplayTextLine(0, "Hello world!");
wa i t l M s e c (5000);
}
Команда nxtD isplayTextLine(0, "Hello world!"); вы ведет в строку
экрана N X T с номером ноль сообщ ение «Hello world!». П о прош ествии
5 с программа закончит выполнение и текст исчезнет. Сохраните про
грамму на жесткий диск с именем "hello.с".
Для загрузки в микроконтроллер подклю чите его к компьютеру,
вклю чите N X T и нажмите на клавиатуре компью тера клавиш у F5. Если
программа загрузилась успеш но, на экране компью тера появится окно
отладки Program D ebug (рис. 6.2).
P ro g ram Debug
2400
Debug Status Refresh Rate
Continuous
Clear All
task m a i n ()
{
nxtDisplayCenteredTextLine(3, "Hello world!");
wa i t l M s e c (5000);
}
На этот раз сообщ ение будет выведено в третьей строке дисплея
N X T с выравниванием посередине.
И спользуя набор команд по работе с экраном NX T, в том числе и
графических, можно написать собственные миниигры для микрокон
троллера. Но это тема отдельной главы или даже книжки.
Структура программы
Управление моторами
Состояние моторов
task m a i n ()
{
motor[motorC] = 100;
w aitlMsec(3000);
>
task main ()
{
motor[motorC] = 50;
motor[motorB] = 50;
w aitlMsec(2000);
motor[motorC] = 0;
motor[motorB] = 0;
}
В программе последовательно вклю чаю тся моторы С и В с мощ но
стью 50, работаю т в течение 2 с, после чего последовательно вы клю ча
ются. По сути вклю чение обоих моторов произойдет практически
одновременно, как и их выключение.
Следующ ий пример демонстрирует возожность бесконечного вра
щения мотора с помощ ью цикла while. О становить его можно, прервав
выполнение программы на NXT.
task m a i n ()
{
while (true)
motor[motorA]=100;
}
nMotorEncoder[motorA] = 0;
task m a i n ()
{
motor[motorA]=50;
while (nMotorEncoder[motorA] < 1000)
{
// никаких действий можно не производить
}
}
task m a i n ()
{
nMotorEncoderTarget[motorA] = 1000;
motor[motorA] = 50;
wait l m s e c (10000) ;
>
С инхронизация моторов
// Движение по прямой
n S y n c e d T u m R a t i o = +100; // Режим движения прямо
nMotorEncoder[motorA] = 0;
// остановиться через 1000 градусов
nMotorEncoderTarget[motorA] = 1000;
motor[motorA] = 100;
// Повернуться на месте
nSyncedTurnRatio = -100; // Режим поворота
// остановиться через 200 градусов
nMotorEncoderTarget[motorA] = 200;
motor[motorA] = 50;
wa i t l M s e c (3000);
Зеркальное направление
Датчики
53 No Sensor 3
54 INo Sensor
task main()
{
while(SensorValue[Ultrasound]>20)
{
motor[LMotor]=50;
motor[RMotor]=50;
}
}
П рограмма вы глядит длиннее, но в ней четко указано, какой мотор
на какой порт следует подключать: левый LM otor - на порт А, правый
RM otor - на порт В. Впоследствии при построении сложных программ
это может пригодиться. На рисунке 6.4 показано, как были сконф игу
рированы моторы.
Тип датчика
SensorType[sonarSensor]=sensorSONAR;
Задержки и таймеры
Задержки
Т айм еры
C learT im er(Т 1 );
ti m e l []
tim e l O []
timelOO[]
t a s k m a i n ()
{
C le a r T im e r (T l);
w h ile (t im e lO O [T l]<100)
{
n x t D is p la y T e x t L in e (0 , "% d ", t im e l[T l]);
n x tD is p la y T e x t L in e (1 , "% d ", tim e lO [T l]) ;
n x t D is p la y T e x t L in e (2 , "% d ", tim elO O[T l]) ;
w aitlM sec(1 );
}
}
Параллельные задачи
У п р ав л ен и е задачам и
task f i r s t ()
{
motor[motorA] = 100; // Мотор А вперед
Waitlmsec(1000);
}
task s e c o n d ()
{
motor[motorA] = -100; // Мотор А назад
Wait l m s e c (1000);
}
task main()
{
StartTask(first) ;
StartTask(second);
}
task f i r s t ()
{
while(true)
motor[motorA] = 100; // Мотор А вперед в бесконечном
цикле
task s e c o n d ()
(
Waitlmsec(1000) ;
StopTask(first); // Остановить первую задачу
motor[motorA] = -50; // Мотор А назад
Waitlmsec(10000); // Задержка на 10 секунд
)
task m a i n ()
{
StartTask(first);
StartTask(second);
Wait l m s e c (2000);
StopAllTasks(); // Остановить все задачи
>
task f i r s t ()
{
while(true)
motor[motorA] = 100; // Мотор А вперед в бесконечном
цикле
}
task sec o n d ()
{
Wa i t l m s e c (1000);
hogCPU(); // Захватить управление
motor[motorA] = -100; // Мотор А назад
W a i t l m s e c (1000); // Ждать 1 секунду
r e l e a s e C P U O ; // Вернуть управление
}
task m a i n ()
{
StartTask(first);
StartTask(second);
}
int Lig h t l ;
task f i r s t ()
{
while(Lightl>40) // Пока датчик на светлом
motor[motorAj = i u u ; // мотор а вперед
StopAllTasks(); // Увидев темное, остановить все
}
task s e c o n d ()
{
while(true)
Lightl=SensorValue[SI]; // Считывание показаний датчика
>
task m a i n ()
{
SensorType[SI]=sensorLightActive; // Объявляем датчик
StartTask(second);
W aitlmsec[100]; // Задержка, чтобы датчик начал работу
StartTask(first);
while(true)
if (Lightl>50) // При высокой освещенности пиликать
PlaySound(soundBeepBeep);
}
task m a i n ()
{
while(true)
motor[motorA] — 100;
}
task m a i n ()
<
motor[motorA] = 100; // Мотор А вперед
while(true); // Бесконечный пустой цикл
>
int flag=l;
task f i r s t ()
{
motor[motorA] = 100; // Мотор А вперед
Wa i t l m s e c (1000);
flag=0;
}
task s e c o n d ()
{
while(flag=l); // Пустой цикл
motor[motorA] = -100; // Мотор А назад
Wai t l m s e c (1000);
}
task main()
{
StartTask(second);
StartTask(first);
}
Релейный регулятор
У п р а в л е н и е м о то р о м
task m a i n ()
{
int grey=45; Рис. 7.4. Р асполож ение
while (true) м оторов и датчи к а ос
{ // grey - значение серого вещ енности.
if (SensorValue[SI]>grey)
{
motor[MotorB]=100;
motor[MotorC]=0;
}
else
{
motor[MotorB]=0;
motor[MotorC]=100;
}
w a i t l m s e c (1);
}
}
Значение «серого» (grey) может быть константой для данной сис
темы или вырабатываться в результате предварительной калибровки
как среднее арифметическое черного и белого.
Под управлением такого регулятора робот движется вдоль линии
границы по ломаной кривой, периодически наезжая то на черное, то на
белое. Скорость его невысока, стабильность тоже, а траектория движ е
ния оставляет желать лучшего. Все это издержки использования двух
позиционного релейного регулятора.
П рограм ма для движения по линии с помощ ью релейного регуля
тора в Robolab вы глядит так (рис. 7.5):
Рис. 7.5. А лгори тм дви ж ени я вдоль границы черного и белого на релейном
регуляторе.
Iask main ()
{
int greyl=45, grey2=45;
while(true) {
if(SensorValue[SI]>greyl) {
if(SensorValue[S2]>grey2) // Оба на белом
{
motor[MotorB]=100;
motor[MotorC]=100;
}
else // Правый на черном
{
motor[MotorB]=100;
motor[MotorC]=-100;
}
}
else {
if(SensorValue[S2]>grey2) // Левый на черном
{
motor[MotorB]=-100;
motor[MotorC]=100;
}
else // Оба на черном
{
motor[MotorB]=100;
motor[MotorC]=100;
}
}
}
>
To же самое в Robolab.
Рис. 7.7. А лгоритм движ ени я вдоль черной линии с двум я датчи к ам и на ре
л ей ном регуляторе.
Описание
e(t)=x0(t)-x(t)
uo(t)=ke
Управление мотором
u«k*(45-el)
task m a i n ()
{
int k = 5 , u ;
nMotorEncoder[motorA]=0;
while(true)
{
u=k*(45-nMotorEncoder[motorA]);
motor[motorA]=u;
w a i tlMsec(1);
}
}
|2»(36*Г1-е1)1 [1J
Рис. 7.9. У правлен ие скоростью м отора - один оборот в секунду.
Т1 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
Т1%5 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4
Т1%5%2 0 1 0 1 0 0 1 0 1 0 0 1 0 1 0
М ы выяснили, что изменяя уставку, можно вынудить регулятор не
стоять на месте, а соверш ать порой довольно замы словатые движения.
Этот принцип может быть положен в управление роботом-
манипулятором или, например, конечностями робота, имитирую щ его
живое существо.
Напоследок предлагаем читателю самостоятельно построить бара
банщ ика с двумя моторами, каждый из который будет играть свою пар
тию. Разница в алгоритме будет заклю чаться в добавлении двух
команд: инициализации энкодера В и управления мотором В с анало
гичной зависимостью от таймера Т 1.
Синхронизация моторов
u = k * (еЗ-е2)
Рис. 7.12. А лгоритм синхронизации м оторов для прям олинейного движ ения с
использованием 11-регулятора.
task main ()
{
int k=5, v=50, u;
nMotorEncoder[motorB]=0;
nMotorEncoder[motorC]=0;
while(true)
{
u=k*(nMotorEncoder[motorC]-nMotorEncoder[motorB]);
motor[motorB]=v+u;
motor[motorC]=v-u;
wa i t l M s e c (1);
}
}
В з я т ь а зи м у т
task m a i n ()
{
float u , k = 3 ;
int alpha=SensorValue[si];
while (true)
{
u = k * (alpha-SensorValue[si]);
motor LmotorBj = 5 U + u ;
motor[motorC]=50-u;
}
}
t N
0
alpha=s1
к=3
err=alpha-s1
I u=k*(err-err/180*360)
Рис. 7.15. А лгоритм движ ени и ио ком пасу с огран и чен и ем ди ап азон а отк л о
нения.
task m a i n ()
{
float u, k=3;
int err, alpha=SensorValue[si];
while (true)
{
err=alpha-SensorValue[si];
u=k*(err-err/180*360);
motor[motorB]=50+u;
motor[motorC]=50-u;
}
}
Теперь робот при лю бых отклонениях будет выравниваться в нуж
ном направлении, если только его не собью т с пути внеш ние магнитные
излучения. П олученные результаты можно использовать как в навига
ции, так и ряде увлекательны х соревнований: кегельринг, футбол, тен
нис и др.
%
Рис. 7.16. И нф ракрасны й мяч, ком пас, и нф ракрасны й п оисковик и его секто
ры обзора.
| direction ^1
| direction Я |u=10*(5-s1)1
Д вижение по линии
left=S1
right=S2
k=2
task m a i n ()
{
int left=SensorValue[si];
int right=SensorValue[s2];
float k = 2 , u;
while(true)
{
u = k * ((SensorValue[si]-left)- (SensorValue[s2]-right));
motor[motorB]=50+u;
motor[motorC]=50-u;
wa i t l m s e c (1);
}
}
Motor[MotorB]=50+u;
Motor[MotorC]=50-u;
н-к*(SensorValue[si]-L);
t a s k m a i n ()
{
flo a t u , k=3;
in t L = Se n so rV a lu e [S I];
w h ile (tr u e )
{
u = k *(S e n s o r V a lu e [S I]- L );
m o to r[m o to rB ]=50+u ;
m o to r[m o to rC ]=50- u;
w aitlM sec(1 );
Пропорционально-дифференциальный регулятор
■
V/.
task m a i n ()
{
float u, kl=2, k2=10;
int Sold, L;
Sold=L=SensorValue[SI];
while(true)
{
u= kl*(SensorValue[SI]-L) + k2*(SensorValue[SI]-Sold);
motor[motorB]=50+u;
motor[motorC]=50-u;
Sold=SensorValue[SI];
w a i tlMsec(1);
}
|U=3*(s1-48)+10*(S1-Sold7|
Рис. 7.30. Д виж ени е по линии на П Д -регуляторе с одним датчи к ом света,
task m a i n ()
{
float u, k l = 3 , k2=10, grey=48, v=80;
int Sold;
Sold=SensorValue[SI];
while(true)
{
u=kl*(SensorValue[SI]-grey)+k2*(SensorValue[SI]-Sold);
Sold=SensorValue[SI];
motor[motorB]=v+u;
motor[motorC]=v-u;
w a i tlMsec(1);
}
}
le*=S1 I err=(S1-leltHS2-figM)
right=S2 |u=fc1*err*-K2*err*err err
float k1=2
float K2=0.03
Рис. 7.32. П ропорци ональн о-кубическ ий регулятор для дви ж ен и я по линии с
двум я датчи кам и.
<J> ф
№ - К
7\ 1' 0 Ф
left=S1 k l= l+ (S 3-center)/3
I right=S2 u=k1*((S1-leftHS2-right))
lcenter=S3
Формат RA W
Балансирующий робот
int grey=Senso-rR.aw3
irtt errotd=0
int err
float kp=25
float 16=350 efr=Senso»Raw3-grey
float № 0.3 р=1ф*егг
float sca(e=l0 |=И'И*егг*Ш
float dt=0.001 <3=М*(еп-етЩ1«Ж
float p erroldfeerr
float i=0 u-Cp-H-t-fffecale
float a
float u
Рис. 7.37. А лгоритм балан си ровщ ик а основан на П И Д -регуляторе.
task m a i n ()
{
int grey=SensorRaw[S3];
int err, errold=0;
float kp=25, ki=350, kd=0.3;
float scale=14;
float d t = 0 .001;
float p, i=0, d, u;
while (true)
{
err= grey-SensorRaw[S3]; //Отклонение с обратным знаком
p=kp*err;
i=i+ki*err*dt;
d=kd*(err-errold)/dt;
errold=err;
u=(p+i+d)/sc a l e ;
m oto r[m o to rB ]=u;
motor[motorC]=u;
w aitlM sec(1 );
}
}
Элементы теории автоматического управления в школе1
xt +2-2 х, +1 + xt = gu , , (4)
где g= h2vr/b.
Зададим желаемое расстояние до стены х*>0 и определим цель
управления (ЦУ) соотнош ением
Управляющий Объект
объект управления
ta s k m a in ( )
{
m o to r[m o to rB ] = 100;
m o to r[m o to rC ] = 100;
m o to r[m o to rB ] = 0 ; / / стоп м отор
m o to r[m o to rC ] = 0;
}
Таким образом, для осущ ествления движения требуется некоторая
задержка перед выклю чением моторов. Команды ожидания не произво
дят никаких конкретных действий, зато даю т возможность моторам вы
полнить свою часть работы (рис. 8.4).
ta s k m a in ()
{
m o to r[m o to rB ] = 100;
m o to r[m o to rC ] = 100;
w a i t l M s e c (1000); // Ж д а т ь 1000 мс
m o t o r [ m o t o r B ] = 0;
m o t o r [ m o t o r C ] = 0;
>
j j j
Рис. 8.5. П роехать секун ду вперед, сек ун ду назад и остановиться,
ta s k m a in ()
{
m o to r[m o to rB ] = 100;
m o to r[m o to rC ] = 100;
waitlMsec(1000) ;
motor[motorB] = -100; // «Полный назад»
motor[motorC] = -100;
waitlMsec(1000) ;
motor[motorB] = 0;
motor[motorC] = 0;
>
В момент смены направления на высокой скорости возможен за
нос. П лавное тормож ение возможно. Для этого перед подачей команды
«назад» с моторов снимается напряжение и робот некоторое время едет
по инерции (рис. 8.6).
ta s k m a in ()
{
m o to r[m o to rB ] = 100;
m o to r[m o to rC ] = 100;
w a itlM s e c (1 0 0 0 );
// В кл ю чить плаваю щ ий реж им управления м о то рам и
b F lo a tD u r in g ln a c tiv e M o to r P W M = tru e ;
m o to r[m o to rB ] = 0;
m o to r[m o to rC ] = 0;
w a itlM s e c (5 0 0 );
m o to r[m o to rB ] = -1 0 0 ;
m o to r[m o to rC ] = -1 0 0 ;
w a it lM s e c (1 0 0 0 );
/ / В кл ю чить реж им « то р м о ж е н и я »
b F lo a tD u r in g ln a c tiv e M o to r P W M = fa ls e ;
m o to r[m o to rB ] = 0;
m o to r[m o to rC ] = 0 ;
»
В Robolab обычными командами моторы вклю чаю тся в плавающем
режиме, а в RobotC по умолчанию используется режим «торможения»,
который позволяет достичь более точного управления. Но и в Robolab
существую т «продвинутые» команды управления моторами в режиме
тр м о ж ен и я да еще с диапазоном мощ ностей от -100 до 100.
Повороты
30
ta s k m a in ()
{
m o to r[m o to rB ] = 100; / / М о то ры в р а з н ы е
m o to r[m o to rC ] = -1 0 0 ; / / стороны
w a itlM s e c (3 0 0 );
m o to r[m o to rB ] = 0;
m o to r[m o to rC ] = 0;
}
Сущ ествует другой тип поворотов. Если один из моторов остано
вить, а другой вклю чить, то вращ ение будет происходить вокруг стоя
щего мотора. П оворот получится более плавным (рис. 8.8).
ta s k m a in ()
{
m o to r[m o to rB ] = 100;
m o to r[m o to rC ] = 0;
w a i t l M s e c (1000) ; / / вращ ается то л ь ко м о то р В
m o to r[m o to rB ] = 0;
}
task main ()
{
while (true){
motor[motorB] = 100;
motor[motorC] = 100;
wa i t l M s e c (1000);
motor[motorC] = 0;
wa i t l M s e c (1000) ;
motor[motorB] = 0;
}
}
У точнив длительность поворотов и количество повторений, нау
чим тележ ку объезжать квадрат по периметру один раз (рис. 8.10). Для
точности поворотов снизим мощ ность моторов примерно вдвое. За
держки придется подобрать самостоятельно.
task m a i n ()
{
for(int i=0;i<4;i++){ // Цикл выполняется 4 раза
motor[motorB] = 50;
motor[motorC] = 50;
wa i t l M s e c (1000);
motor[motorC] = -50;
wa i tlMsec(400);
motor[motorB] = 0;
)
I Л
О братная связь
task m a i n ()
{
nMotorEncoder[motorB]=0; // Инициализация энкодера
motor[motorB] = 100;
motor[motorC] = -100;
// Пустой цикл ожидания показаний энкодера
while(nMotorEncoder[motorB]< 2 5 0 ) ;
motor[motorB] = 0;
motor[motorC] = 0 ;
>
Теперь читателю нетрудно будет самостоятельно построить алго
ритм движения по квадрату с использованием датчика оборотов. А при
движении по лабиринту использование датчика оборотов значительно
повысит вероятность его прохождения.
Кегельринг
Т ан ец в круге
'1
\ \
Рис. 8.13. Т рехк олесн ая тележ к а с креплением датчи к а освещ енности.
щ ft
И
60
task m a i n ()
{
int white=SensorValue[SI]; // Запомнить показания
while (true){
motor[motorB] = 100;
motor[motorC] = 100;
while(SensorValue[SI]>white-5); // Ждать понижения
motor[motorB] = -100;
motor[motorC] = -100;
w a i t l M s e c (500);
motor[motorB] = 100;
w a i t l M s e c (600);
}
}
В результате выполнения
программы робот будет дви
гаться внутри круга, «вы чер
чивая» ломаную линию (рис.
8.15).
Параметры, указанные в
модификаторах, можно подоб
рать самостоятельно: степень
понижения освещ енности на
черной линии, время отъезда Рис. 8.15. Т раектория дв и ж ен и я робота
назад и время поворота. в круге.
Н е упасть со стола
task m a i n ()
{
int white=SensorValue[SI];
while (true){
motor[motorB] = motor[motorC] = 100;
while(SensorValue[SI]>white-10);
while(SensorValue[Sl]<white-5);
motor[motorB] = motor[motorC] = -100;
w a i tlMsec(500);
motor[motorB] = 100;
wai t l M s e c (600) ;
}
)
Теперь стоит поработать над точностью движения, по возможности
не теряя скорости.
В зависимости от конструкции робота при резкой смене направле
ния он может потерять равновесие или просто «встать на дыбы» на пе
редние колеса. Поэтому последние несколько сантиметров можно
проехать на торможении по инерции, т.е. полностью освободив моторы.
И второе. Точность поворота будет зависеть от того, какие ком ан
ды подаются на моторы и по какому принципу рассчиты вается дли
тельность поворота. К сожалению , таймер ненадежны й помощ ник. По
инерции на малых промеж утках времени робот м ож ет поворачиваться
па различные углы.
М ы можем пожертвовать реверсом в последней команде управле
ния мотором В, для того чтобы достичь неторопливого движ ения обои
ми моторами. Д лительность поворота при этом немного возрастет (рис.
7).
Пересечь черную пинию [Отъезд нззад| [Медленный поворот]
и плавно затормозить
tesk m a i n ()
(
int white=SensorValue[SI];
while (true){
motor[motorB] = motor[motorC] = 100;
while(SensorValue[SI]>white-10);
bFloatDuringlnactiveMotorPWM = true;
motor[motorB] = motor[motorC] = 0;
while(SensorValue[SI]<white-5);
bFloatDuringlnactiveMotorPWM = false;
motor[motorB] = motor[motorC] = -100;
wai tlMsec(500);
motor[motorB] = -50;
motor[motorC] = 50;
wai tlMsec(600);
)
I
Есть еще одна тонкость. На разных поверхностях соотнош ение
примени вращения колес и реального перемещ ения тележки будет раз
личным. П оэтому для надеж ности при возврате назад и повороте можно
ввести ожидание оборотов моторов.
Для точности управления моторами необходимо использовать дру
гой тип команд: с контролируемым вращением. Эти команды находят
ся в разделе «A dvanced Output Control» и позволяю т задавать мощность
моторов от -1 0 0 до 100. В новом примере для компактности разместим
все числовые параметры сверху, а модификаторы портов снизу (рис.
8.20).
Пересечь черную пинию Отъезд назад Медленный поворот
и плавно затормозить на полоборота на треть оборота
мотора С мотора С_______
task m a i n ()
{
int white=SensorValue[SI];
while (true){
motor[motorB] = motor[motorC] = 100;
while(SensorValue[SI]>white-10);
bFloatDuringlnactiveMotorPWM = true;
motor[motorB] = motor[motorC] = 0;
while(SensorValue[SI]<white-5);
bFloatDuringlnactiveMotorPWM = false;
nMotorEncoder[motorC]=0; // Инициализация энкодера
motor[motorB] = motor[motorC] = -100;
while(nMotorEncoder[motorC]>-180);
nMotorEncoder[motorC]=0;
motor[motorB] = -50;
motor[motorC] = 50;
while(nMotorEncoder[motorC]<120);
}
}
Четвертый недостаток, связанный с избыточны ми движениями, бу
дет устранен далее.
ЕЕ
I
Рис. 8.21. Алгоритм «Танец в круге» с возвратом по времени,
task m a i n ()
<
int white=SensorValue[SI];
while (true){
ClearTimer[Tl]; // Сбросить таймер
motor[motorB] = motor[motorC] = 100;
while(SensorValue[SI]>white-5);
int t = timel[Tl]; // Запомнить прошедшее время
ClearTimer[Tl];
motor[motorB] = motor[motorC] = -100;
while(timel[Tl]<t); // Двигаться назад то же время
}
task m a i n ()
{
int white=SensorValue[SI] ;
while (true){
nMotorEncoder[motorC]=0;
motor[motorB] = motor[motorC] = 100;
while(SensorValue[SI]>white-5);
bFloatDuringlnactiveMotorPWM = true;
motor[motorB] = motor[motorC] = 0;
while(SensorValue[Sl]<white-5);
bFloatDuringlnactiveMotorPWM = false;
motor[motorB] = motor[motorC] = -100;
while(nMotorEncoder[motorC]>0);
nMotorEncoder[motorC]=0;
motor[motorB] = -50;
motor[motorC] = 50;
while(nMotorEncoder[motorC]<60);
}
}
Результат уже значительно лучш е, но робот все равно иногда про
м ахивается мимо кеглей. Конечно, ведь он поворачивает вслепую. Надо
бы оснастить его зрением. Для этого подойдет датчик расстояния. П ре
жде чем начать использовать его, попробуем разобраться, как «сонар»
работает.
Два глазка, которые делаю т робот похожим на живое существо,
служ ат для разны х целей. Один из них передает ультразвуковой сигнал,
другой принимает. По наблю дениям автора, передаю щ им является пра
вый, если смотреть на датчик со стороны разъема подклю чения, т.е.
сзади. У читывая то, что скорость ультразвука в воздухе относительно
невелика (330-350 м/с), располож им датчик горизонтально так, чтобы
передаю щ ий глазок был первы м по ходу вращ ения робота. Тогда в про
цессе вращ ения больш е вероятность, что отраженный сигнал будет
уловлен принимаю щ им глазком, идущим следом. В обратном случае
часть стаканчиков робот будет пропускать.
Кроме того, датчик можно располож ить вертикально, лю бой сто
роной, и он будет работать вполне сносно. Заодно усоверш енствуем
конструкцию, спрятав датчик освещ енности за бампером (рис. 8.23).
Итак, вращ ение осущ ествляется до тех пор, пока на датчик рас-
' I1,1ояния не поступит сигнал, например «ближе 45». Т.е. обнаружен объ-
) скт на расстоянии ближе 45 см. Надо иметь ввиду, что на стаканчики,
которые робот уже вытолкнул за линию, он не должен обращ ать вни
мания. Поэтому указанное расстояние не следует делать больш е радиу
са круга (рис. 8.24, 8.25).
I « и к m a i n ()
(
int white=SensorValue[SI];
while (true)(
motor[motorB] = 50;
motor[motorC] = -50;
while(SensorValue[S4]>45); // Ждем появление объекта
nMotorEncoder[motorB]=0;
motor[motorB] = motor[motorC] = 100;
while(SensorValue[SI]>white-5);
bFloatDuringlnactiveMotorPWM = true;
motor[motorB] = motor[motorC] = 0;
while(SensorValue[Sl]<white-5);
bFloatDuringlnactiveMotorPWM = false;
motor[motorB] = motor[motorC] = -100;
while(nMotorEncoder[motorB]>0);
}
}
О дин д атч и к
( Возможные проблемы
Рис. 8.32. А лгоритм движ ения но линии с одним датчиком освещ енности:
пониж ена ск орость, увели чен а разность меж ду черны м и белы м.
Более устойчиво алгоритм работает, если использовать моторы с
управлением мощ ностью -1 0 0 .. 100. В этом случае есть возможность
отрегулировать плавность поворота в соответствии с кривизной линии
(рис. 8.33).
Рис. 8.33. А лгоритм дви ж ени я по линии с одним датчи к ом освещ енности:
улучш ен о уп равл ени е м оторам и.
П-регулятор
Рис. 8.34. А лгоритм движ ени я по линии с одним датчи к ом освещ енности на
пропорциональном регуляторе.
Рис. 8.35. А лгоритм движ ени я по линии с одним датчи к ом освещ енности на
пропорциональном регуляторе с предварительной калибровкой (оп ределен и
ем значения серого).
Рис. 8.37. А лгоритм движ ени я но линии с одним датчи к ом освещ енности на
пропорциональном регуляторе с расчетом значения серого.
Предложенный алгоритм обладает некоторым неудобством: при
запуске потребуется быть внимательным и не пропустить звукового
сигнала, после которого робота надо переместить так, чтобы датчик ос
вещенности оказался над белым полем. Понятно, что в начале следова
ло поместить робот точно над черной линией. В контейнере с номером
4 (обозначается с4) будет сохранено значение черного, в контейнере с
номером 5 (с5) - значение белого. В переменную grey помещ ается зна
чение серого, которое используется в регуляторе. Сразу после второго
звукового сигнала робот начнет движение.
П роцесс калибровки можно сделать более управляемым. Для этого
после каждого считывания данных необходимо вставить ожидание ка
кого-либо внешнего события, например нажатия на датчик касания,
уменьш ения расстояния на ультразвуковом датчике или просто нажатия
на кнопку NXT.
8
|
Поле
ноля не менее 20 см, чтобы колеса робота не съезж али с трассы во вре
мя движения.
Имея определенный навык, можно наклеить изоленту так, что по
мучится замкнутая кривая. Если не выходит одним куском, смело поль-
lyiirecb ножницами, чтобы изгибы с малым радиусом кривизны
i оставить из нескольких кусочков. Д ля начала не стоит рисовать слиш
ком резких поворотов. Вот пример траектории (рис. 8.40).
Рис. 8.40. П рим ер траектории для состязаний «Д виж ение по линии».
Д ва датчика
Ш \Ш
|p r2 c a l| |left=S1 j |righl=S2|
ВеерВеер (nowait) Я
Рис. 8.47. Задерж ка при увеличени и счетчика: а - с пом ощ ью блок а врем ени,
б - с пом ощ ью звукового сигнала.
Путешествие по комнате
М аленький исследователь
Рис. 8.52. А лгори тм п утеш ествия по ком нате с поворотом задним ходом .
Ш И
Контроль
сторожевого г=--------------------------------------1
т а й и е ра I |Вы езд из застрев ан ия! вперед!
Рис. 8.53. Если на сторож евом тайм ере натикает 10 с, вклю чается защ и та от
застреваний.
[П о д п р о гр ам м а : О ть е з д н а з а д с разворотом ]
Дополнительны й датчик
С брос
В п е р е д до сторож евого Вызов
препятствия тай м ера по д п р о гр ам м ы !
[П о д п р о гр ам м а : О тъ езд н а з а д с разв о р о то м !
|5 0 | |6 0 |
и
Рис. 8.56. А лгоритм путеш ествия по ком нате со сторож евы м тайм ером .
В предлож енном алгоритме (рис. 8.56) поводом для отъезда назад с
разворотом является появление числа 1 в контейнере-семафоре, которое
может произойти вследствие одного из трех событий: нажатия на дат
чик касания, появления препятствия в зоне обзора датчика расстояния и
критического значения сторожевого таймера. Все три процесса контро
лирую тся из параллельных задач, а моторами управляет только главная
задача.
А налогичную программу можно было бы сделать, используя м они
торинг событий Robolab. Оставляем читателю это в качестве домаш него
задания.
Рассмотрим простую и эффективную конструкцию для датчика ка
сания, которая обеспечит срабатывание практически в лю бом полож е
нии (рис. 8.57-8.58).
Н овая конструкция
Рис. 8.62. У в ели чен н ое за счет корпуса робота расстоян и е до стены сп особст
вует р асш ирению области обзора.
Поворот за угол
— — , vL + х L - vd - xd = vL + \>d - x L - xd , 2 xL = 2 v d ,
v -x L -d
vd d. vd ..
Vj = v + — = v (l + —) , v2 = v - — = v (l
Z 1 Z L L L
Линейная скорость v пропорциональна угловой скорости колеса со,
которая в свою очередь пропорциональна мощности, подаваемой на мо
торы (в режиме торможения). Мы привели закон управления к стан
дартному виду, что позволяет задать управляю щ ее воздействие на
время поворота за угол. Таким образом, получаем расчет для управле
ния моторами нашего робота.
u=50*8/L;
motor[motorB]=50+u;
motor[motorC]=50-u;
|1—2 1 |u=2*(s1-L)+10*(s1-Sold)
Sold=Sl
1*ис. 8.64. О бъезд предм етов на заданном расстоянии по правилу правой руки.
task m a i n ()
{
float u, k l = 2 , k2=10;
int v=50, d=8, Sold, L, Snew ;
Sold=L=SensorValue[SI]; // Запомнили начальное состояние
while(true)
{
Snew=SensorValue[SI] // Получили показания датчика
if (Snew>L*2) {
u=v*d/L;
Sold=L*2;
)
else {
u = kl*(Snew-L) + k2*(Snew-Sold);
Sold=Snew;
}
motor[motorB]=v+u;
motor[motorC]=v-u;
wa i t l M s e c (1);
}
}
Надо заметить, что мы слегка обманываем робота, подставляя ему
ограниченные сверху значения. Такой алгоритм будет стабильно рабо
тать на расстоянии L от 25 до 125 см.
Ф ильтрация данны х
t a s k m a i n ()
(
float u, k l = 2 , k2=10, a=0.2, Snew;
int v=50, d = 8 , Sold, L;
Snew=Sold=L=SensorValue[SI];
while(true)
{
Snew=(l-a)*Snew+a*SensorValue[SI];
if (Snew>L*2) {
u=v*d/L;
Sold=L*2;
}
else {
u = kl*(Snew-L) + k2*(Snew-Sold);
Sold=Snew;
}
motor[motorB]=v+u;
motor[motorC]=v-u;
wa i t l M s e c (1);
}
}
Ф ильтрация данны х становится особенно актуальной, если на их
основе требуется принимать реш ение о дальнейш их действиях в долго
срочной перспективе. Н апример, увидев проем, остановиться или по
вернуть назад. Достаточно одной помехи, чтобы робот остановился не в
том месте. П оэтому фильтры, хоть и затормаж иваю т реакцию робота,
но делаю т ее более стабильной и предсказуемой.
Роботы-барабанщики
П реды стория
Калибровка и удар
С о зд а е м с в о й р и т м
Я Ш Е
Rsl IF3S1risingsweep •
|Процедура удара свозвратом висходное положение!
£AJ
aV э ш
0§
ш в в и \ ш
{ф f А'
'; i i E ®
|F a s t rising s w e e p
У д ар ы с возвратом
в исхож д но е п о л о ж е н и е
Удаленное управление
Передача данны х
щВ щ Щ Е И
ш
Рис. 8.80. П ередача числа 5 по наж атию датчи к а и ответны й звуковой сигнал.
rising sweep Ч
Рис. 8.81. П ередача чисел 4 или 5 по наж атию соответствую щ его датчи к а и
ответн ы е звуковы е сигналы .
иск дши
Рис. 8.82. П ередача значения энкодера и управление м ощ ностью удален н ого
м отора.
Рис. 8.83. П рием ник вращ ает колесо со скоростью , заданной на п ередатчике
поворотом балки.
Рис. 8.84. О тображ ение приним аем ого значения А - в виде числа, В - в виде
ди аграм м ы .
В примере А одновременно с управлением мощ ностью мотора на
экране приемника отображается принимаемое значение. Задерж ка от
сутствует, поскольку вывод на экран сам по себе является довольно су
щ ественной задержкой.
В примере В принимаемое значение в нижней части экрана ото
бражается в виде изменяю щ егося прямоугольника, а в центральной - в
виде числа. Поскольку максимальная ш ирина прямоугольника на экра
не 100 точек, что в 2 раза меньше диапазона мощ ности мотора
-100.. 100, то полученное по почте значение т смещ ается в неотрица
тельный диапазон и сокращ ается вдвое. К оордината X одной пары вер
шин отображаемого прямоугольника находится в позиции 50
(визуальная точка отсчета), а координата противоположной пары (зна
чение красного контейнера) колеблется в диапазоне от 0 до 100.
-5 5 6 4
щ$ в м т4
|2*(т-еЛ | И
Рис. 8.90. Р асш иф ровка зак одированного сигнала и п одача его на дви гатели .
А.
Motor2=c2|
|M o to i2 = 3
V
0011010010010011 J
-------------------------- V --------------------------
V J
-------------------------- V --------------------------
Рис. 8.94. Б итовая структура зак оди р ован ного сообщ ения.
|ПРИЕМНИК]
и
Рис. 8.95. У п равлени е м оторам и через B luetooth с пом ощ ью сам одельного
дж ойсти ка (к онструкция на рис. 8.91 А).
sendMessageWithParm(nMessageID, n P a r m l , nParm2);
task m a i n ()
{
bFloatDuringInactiveMotorPWM=true;
nMotorEncoder[mA]=0;
nMotorEncoder[шВ]=0;
if (nBTCurrentStreamlndex >= 0)
w h i l e (1)
{
while(bBTBusy)
wa i t l M s e c (5);
sendMessageWithParm(SensorValue[Sl]+1,
nMotorEncoder[motorA], nMotorEncoder[motorB]);
}
}
П рограмма приема будет управлять двумя моторами и выводить
все полученные сообщ ения на экран NXT. Перед приемом каждого но
вого сообщ ения происходит очистка очереди сообщений.
task m a i n ()
{
long v,u,k;
w h i l e (1)
{
while (bQueuedMsgAvailable()) // Очистка очереди
{
word t e m p ;
ClearMessage();
temp = message;
}
if (message!=0)
{
k=message-l; // Сообщение приходит на 1 больше
v=messageParm[l];
u=messageParm[2];
motor[motorA]=v+u;
motor[motorB]=v-u; (
nxtDisplayTextLine(0, "k=%d", k ) ;
nxtDisplayTextLine(1, "v=%d", v ) ;
nxtDisplayTextLine(2, "u=%d", u ) ;
w a i t l M s e c (10);
}
>
)
В среде RobotC реализованы команды подклю чения к другому уст
ройству в программном реж им е, а такж е ряд других возможностей ра
боты с Bluetooth. П римеры находятся в папке Sample
IYogramsYNXTYBluetooth Com m unication.
Управление роботом в пошаговом режиме
ФФ вЦ
I '
Портам А, 8
Порт; I
Порты: », в
МОЩНОСТЬ* JQQ
Мощность* 100
Пластины:
Балки:
Изогнутые балки:
Балки
с выступами:
Штифты: £5^
Оси:
Втулки:
Фиксаторы:
Зубчатые колеса:
(шестеренки)
П.2. Правила состязаний
I. Условия состязания
- В наиболее короткое время робот, не выходя за пределы круга,
очерчивающего ринг, должен вытолкнуть расположенные в нем кегли.
- На очистку ринга от кеглей дается максимум две минуты.
- Если робот полностью выйдет за линию круга более чем на 5 се
кунд, попытка не засчитывается.
- Во время проведения состязания участники команд не должны ка
саться роботов, кеглей или ринга.
50 мм
2. Ринг
- Цвет ринга - светлый.
- Цвет ограничительной линии - черный.
- Диаметр ринга 1 м (белый круг).
- Ширина ограничительной линии 50 мм.
3. Кегли
Кегли - жестяные цилиндры, изготовленью из пустых стандартных
жестяных банок, использующихся для напитков.
- RobotC: http://www.robotc.net
- NBC/NXC: (Next Byte Codes & Not eXactly C)
a. Компилятор и документация к NBC
http://bricxec.sourceforge.net/nbc/
b. Интегрированная среда разработки
http ://bricxcc.sourceforge.net/
LEJOS: Java for Lego Mindstorms (http://lejos.sourceforge.net/)
Среда LabVIEW для Lego Mindstorms NXT: www.ni.com/mindstorms
Обновление для Robolab 2.9 до версии 2.9.4
lit t p://w w w. legoengineering.com/patches/RL294PowerPatch_PC .zip
- Обновление для Robolab 2.9.4 с поддержкой новых датчиков сторо-
н их производителей http ://legoengineering. com/1 ibrary/catview /41 -
a pp Iicati ons-patches-a-firmware/43 -robolab .html
Общие ресурсы
Tcchnica (http://isodomos.com/technica/technica.html)
Blackbird's Technicopedia (http://www.ericalbrecht.com/technic)
NXT-Блоги
Образовательные ресурсы
Персональные вебсайты
События Lego
ISBN 978-5-02-025-479-4
9 785020 254794
В серии «Ш аги в кибернетику» в 2011 году вы ходят следую щ ие книги: