​Аппаратное обеспечение NXT: как им пользоваться

29.05.2013 / 11:06
4696
0
Рейтинг: + 0 - 0
Добавить в закладки
У кого в закладках
Содержание:
  1. Введение
  2. Шаг 1. Провода NXT
  3. Шаг 2. Сенсорный датчик
  4. Шаг 3. Двигатель
  5. Шаг 4. Датчик звука
  6. Шаг 5. Датчик света
  7. Шаг 6. Ультразвуковой датчик


Введение:

Эта инструкция является руководством по использованию двигателей и датчиков из комплекта LEGO NXT с установкой Parallax Basic Stamp II или BS2. Вместо предоставления схемы и примеров кода для BS2, мы вам предоставим немного теории о том, как должны работать датчики должным образом. Так что, тот, кто использует Arduino или другой микроконтроллер, должны найти эту инструкцию, по крайней мере, полезной для себя.

nxt, lego-робот - Схемы роботов из конструкторов - Robotics

Основные источники информации следующие:
Комплект аппаратного обеспечения LEGO Hardware Developer Kit
Разобрать NXT можно здесь. Этот источник представляет собой достойное руководство, если вы используете Arduino. Но обратите внимание, что его схема часто показывает контакты 2 и 3, подключены к +5 В, а не к земле. Контакты 2 и 3 являются основанием для всех датчиков, кроме кнопки, которая находится в переключателе.
Надеемся, вы найдете всё, что вам нужно!

Шаг 1. Провода NXT:

В первую очередь вы должны подключить ваше NXT оборудование к микроконтроллеру. Есть несколько способов сделать это.
Нужно разделить провода, спаять короткие твердые ядра на каждом проводе, термосклеивая каждые паяные соединения, а также целый пучок проводов, создавая разъем.
  • можно купить один длинный провод и сделать два сращивания проводов, разрезав их посредине
  • кроме того, убедитесь, что вы содержите ваши провода в порядке. NXT провода имеют цветовую маркировку.
  • некоторые люди внесли изменения в RJ-12 кабелях и просто работали с оригиналами.
Другой вариант, это купить разъем «мамка» от mindsensors, который практически не требует возни с паяльником и выглядит намного чище.
Провода пронумерованы от стороны защелки справа-налево; провод от ближайшей защелки 1 и провода дальние от защелки 6.

Цветные контакты LEGO расположены следующим образом (слева на право):

1 - белый
2 - черный
3 - красный
4 - зеленый
5 - желтый
6 - синий

nxt, lego-робот - Схемы роботов из конструкторов - Robotics

Шаг 2. Сенсорный датчик:

nxt, lego-робот - Схемы роботов из конструкторов - Robotics

Давайте начнем с сенсорного датчика, так как это самая простая часть проекта. Вы также можете использовать это руководство, чтобы расположить ваши провода в правильном порядке. Использовать сенсорный датчик очень просто: это нормально открытый однополюсный переключатель, который в основном "включен", когда вы нажимаете на кнопку, и "выключен", когда вы отпустите ее. Контакт 1 является одним концом и контакты 2 и 3 другими (использовать один или оба). Если это не работает, вы можете поменять ваши провода в обратном направлении. Попробуйте использовать Контакт 6 для одного конца и контакты 4 и 5 для других.


Шаг 3. Двигатель:

nxt, lego-робот - Схемы роботов из конструкторов - Robotics

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

Контакты 1 и 2 подключаются к проводам для постоянного тока. Включение контактов приводит к тому, что двигатель вращается. Переключение контактов – двигатель вращается в другую сторону. Это очень просто. Для этого используется мост.

Датчик такой же простой. Контакт 3 является заземленным к контакту 4 и Vcc (5V). Это источники питания к датчику. Контакты 5 и 6 являются двумя выходами датчика. В случае, если кто не знаком с двойными датчиками, вот как они работают:
  • подключаясь к коробке передач, вы найдете колесо датчика, которое имеет массу радиальных отверстий. Оно вращается с остальной коробкой передач. Два инфракрасных датчика размещены таким образом, что радиальные отверстия и спицы альтернативно сломать и восстановить ИК-луч, в результате чего чередуются 1 и 0. Таким образом, когда двигатель вращается, линия будет читать 101010101010 со скоростью, определяемой скорость двигателя. Это полезно для скорости и перевода управления. Чем быстрее происходит переключение, тем быстрее вращается двигатель.
Зачем нам нужны два датчика? Для определения направления. Поскольку два ИК-датчика смещаются, они выводят изображения, относящиеся к направлению вращения. Если двигатель вращается в одну сторону, они будут выходами (Контакт 5 и 6) 11, 10, 00, 01 и повтора. Если двигатель вращается в другую сторону, картина обратная: 11, 01, 00, 10 + повтор. Наблюдая этот процесс, можно определить направление вращения. Можно получить конкретную информацию о движении по часовой стрелке и против часовой стрелки, но это зависит от того, как вы держите двигатель, и это действительно легко выяснить собственным экспериментальным путем.

Кодирование основной операции для использования датчика:
Для определения скорости двигателя, используйте количественную функцию. Просто посчитайте количество импульсов от любого из датчиков контакта в течение определенного периода времени, и вы получите число, пропорционально скорости двигателя.
Посчитайте Контакт 5, 100, скорость
Для определенного количества циклов, используйте PULSIN команды внутри цикла. PULSIN делает BS2 для следующего импульса от датчика, прежде чем переходить к следующему шагу цикла. Этот код будет ждать импульс с меню "variable", но также может быть использован для определения скорости в теории.

FOR i = 1 к n
PULSIN Контакт 5, 1, variable
NEXT

Определение направления немного сложнее. Там придется подождать, пока датчик достигнет определенного шага в цикле, такого как 11, используя, положение в цикле. После проделанного шага, проверьте, какой шаг дальше (в данном случае, либо 10, либо 01), используя пару, есть ли позиция в другом цикле. В зависимости от шага дальше, вы можете определить, в какую сторону вращается двигатель.

Кроме того, можно использовать этот метод, чтобы пассивно измерить абсолютное смещение двигателя. Вращение в одном направлении добавит смещение, при повороте в другом направлении – будет вычитать. Таким образом, если вы начинаете с 0, включите двигатель под определенным углом, и включите его снова, вы должны вернуться к 0, а не к пройденному расстоянию. Этот код проверяет направление один раз за цикл, а затем добавляет или вычитает 1 из смещения соответственно. Он работает при умеренных скоростях вращения, но не на высоких скоростях в связи с тактовой частотой.

контакт 5 PIN 1
контакт 6 PIN 0
disp VAR Word

loop1:
IF контакт 5=1 AND контакт 6=1 THEN направление подождите 11 шаг датчика
GOTO loop1

направление:
IF контакт 5=0 THEN cw                                     
Смотрите, какой контакт идет для определения направления
IF контакт 6=0 THEN ccw
GOTO направление

cw:
disp=disp+1              
В этом примере используется положительное и отрицательное движение по часовой стрелке
DEBUG ?disp
GOTO loop1

ccw:
disp=disp-1
DEBUG ?disp
GOTO loop1

Вместо того, чтобы ждать в течение 11 секунд, проверьте направление на каждом шагу с большой точностью. К сожалению, штамп не работает достаточно быстро для этого. Микроконтроллер сможет справиться с этим быстро. Вот код, но опять же работает только на очень низких скоростях.

Во-первых, код устанавливает, с какого шага нужно начинать работу датчика и направляет соответствующие подпрограммы.
Объем начинается с 1 из-за ошибки.
Каждая подпрограмма смотрит на то, что было предыдущим шагом. Если на предыдущем шаге был CCW, то двигатель тоже CW и добавляется 1. В противном случае по умолчанию вычитается 1.
Далее функция ожидает следующего шага, а затем переходит к подпрограмме, соответствующей этому шагу.

Она работает очень хорошо в теории, но есть слишком много команд для каждого шага, так BS2 не может с этим справиться достаточно быстро.

a Контакт 0
b Контакт 1
lasta VAR Bit
lastb VAR Bit
disp VAR Word
disp=1

INPUT a
INPUT b

lasta=a
lastb=b

IF a=1 THEN a1
IF b=1 THEN S01
GOTO S00

a1:
IF b=1 THEN S11
GOTO S10

S01:
disp=disp-1
IF lasta=1 AND lastb=1 THEN disp=disp+2
DEBUG ?disp
lasta=0
lastb=1
S01Loop:
IF a=1 AND b=1 THEN S11
IF a=0 AND b=0 THEN S00
GOTO S01Loop

S11:
disp=disp-1
IF lasta=1 AND lastb=0 THEN disp=disp+2
DEBUG ?disp
lasta=1
lastb=1
S11Loop:
IF a=1 AND b=0 THEN S10
IF a=0 AND b=1 THEN S01
GOTO S11Loop

S10:
disp=disp-1
IF lasta=0 AND lastb=0 THEN disp=disp+2
DEBUG ?disp
lasta=1
lastb=0
S10Loop:
IF a=1 AND b=1 THEN S11
IF a=0 AND b=0 THEN S00
GOTO S10Loop

S00:
disp=disp-1
IF lasta=0 AND lastb=1 THEN disp=disp+2
DEBUG ?disp
lasta=0
lastb=0
S00Loop:
IF a=1 AND b=0 THEN S10
IF a=0 AND b=1 THEN S01
GOTO S00Loop

Шаг 4. Датчик звука:

nxt, lego-робот - Схемы роботов из конструкторов - Robotics

nxt, lego-робот - Схемы роботов из конструкторов - Robotics

Звуковой датчик является немного более интересным, чем сенсорный. Следует отметить, что это звуковой датчик, а не микрофон: он хорош в обнаружении громких звуков, но не в выводе аналогового аудио сигнала.

Подключение звукового датчика выглядит следующим образом:
Вывод 1 - аналоговый выход по току
- Подключите контакт 1 к земле с помощью резистора 10k
Вывод 2 - земля
Вывод 3 - земля
Вывод 4 - Vcc (+5 V)
Вывод 5 - не используется
Вывод 6 - не используется.

Вы можете читать аналоговый выход интенсивности звука от контакта 1. Увеличение объема интенсивности приводит к увеличению напряжения. К сожалению, BS2 не очень хорошо выполняет аналоговые функции. Если вы хотите фактическое вычисление выхода, вам нужен аналого-цифровой преобразователь или ADC. Если вам просто нужно обнаружить громкие звуки, это гораздо проще. Вам нужно добавить потенциометр с высоким сопротивлением (например, 1MegaOhm) для настройки. Подключите POT терминал к контакту 1 и терминал B к +5 В (см. схему). Поворот потенциометра будет масштабировать выходное напряжение от 0 до 5В. Если выход меньше, чем 1,5, штамп будет регистрировать LOW (низко) и, если выход выше 1,5, штамп будет регистрировать HIGH (высоко). Отрегулируйте потенциометр для достижения порогового объема по своему желанию.

Вы также можете подключить резистор 10 k к 5 потенциометру, так что вы получите более низкое напряжение для больших объемов, а более высокое напряжение для меньших объемов.

Шаг 5. Датчик света:

nxt, lego-робот - Схемы роботов из конструкторов - Robotics

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

Шаг 6. Ультразвуковой датчик:

nxt, lego-робот - Схемы роботов из конструкторов - Robotics

Это большой и сложный датчик. Тем не менее, не все так плохо. Ультразвуковой датчик использует протокол I Squared C or I2C. Этот протокол позволяет LEGO RCX управлять несколькими ведомыми устройствами (датчиками), используя только два провода (плюсовые провода питания). Это очень удобно, когда вы начинаете смотреть на мультиплексоры и использовать более, чем один датчика на один порт. Он также позволяет дополнительные функциональные возможности для ультразвукового датчика. I2C представляет собой цифровой протокол, но он не поддерживает BS2. К счастью, мы можем сделать нечто, известное как "bit-banging" (бит-стук). Протокол будет использовать собственный код для этого. Это выгодно, потому что ультразвуковой датчик не следует точно I2C в любом случае. Итак, без дальнейших церемоний, вот ускоренный курс I2C с акцентом на ультразвуковой датчик.

Общая процедура:
  1. Мастер посылает сигнал запуска
  2. Мастер посылает адрес байта (определяет, какие устройства осуществляют доступ, и будет ли осуществляться чтение или запись)
  3. Подчиненный механизм распознает
  4. Передача данных (от главного к подчиненному или от подчиненного к главному)
  5. Приемник распознает после каждого байта
  6. Мастер посылает команду остановки.

Загрузить аппаратные средства LEGO Hardware Developer Kit можно здесь.
Если вы посмотрите на приложение 7, вы увидите все возможные команды для ультразвукового датчика, а также ожидаемые результаты.
Байты записываются в вид 16 ричного кода базы (обозначается как "0x").
Чтобы дать пример команды, попробуйте прочитать код продукта, который должен повернуть "LEGO".
Чтобы сделать это, мы будем посылать команду на запуск, а затем писать адрес датчика (2), который распознается. Команда Product ID (8), которая признается последующей перезагрузкой ("R" в приложении), считывает адрес датчиков (3), которые должны быть распознаны. После того, как прочитанный адрес будет отправлен, датчик вернет 5 байт (L, E, G, O, и нулевой 0x00). Каждый байт должен быть признан штампом.
Команда Restart состоит из Stop, цикла времени и Start. Эта дополнительная настройка, часто упоминаемая как "покачивание", не является частью стандартного протокола I2C. Если вы используете микроконтроллер, который поддерживает I2C, вы должны убедиться, что вы отправляете эти дополнительные настройки.

Теперь нам нужно запрограммировать I2C протокол. Начнем с выводов датчика.

Вывод 1 - 9 В (Vcc)
Вывод 2 - земля
Вывод 3 - земля
Вывод 4 - 5В (Vcc)
Вывод 5 - SCL
Вывод 6 - SDA

SCL – это ваша линия времени, которая используется для синхронизации передачи данных, а SDA является линией фактической передачи данных.
Есть резисторы, подключаемые оба SCL и SDA к 5В источнику, так что если что-то не будет сделано, они по умолчанию имеют 5 вольт. Связь осуществляется путем изъятия этих линий 0, а затем освобождения их. Обратите внимание, что вам не придется тянуть линии, так как они по умолчанию высокие. Поэтому, когда вы использовали команду, то лучше установить как на входе. Если вы не отпустите линии, вы можете вызвать часть высокую на конец BS2 и низкую на датчике.

I2C сами команды на самом деле довольно просты.
Старт:
Начните с обеих линий высоких, протяните SDA до низов и часы до низов. Эффект в том, что SDA переходит от высот к низам, в то время как часы остаются высокими.
Стоп:
Начните с обеих линиях низких, пусть часы идут высокими и SDA также будут высокими. Эффект SDA идет от низкого до высокого, в то время как часы остаются высокие.
Видите, как стоп является противоположностью старту.
Для цикла часов просто потяните их на низком уровне на мгновение и затем отпустите.

Передача данных:
Данные передаются в байтах и каждый байт следует распознанием получателя.
Во-первых, часы установлены низко, то SDA устанавливается на следующий бит, чтобы быть направленным передатчиком, а часы будут высокими и SDA читают приемник. Это повторяется для всех 8 битов. Данные действительны только когда часы высоко и данные могут быть изменены только когда часы низко. Изменение SDA происходит в то время, как часы показывают высокие результаты в любом запуске или остановке команды. После того, как 8 бит было отправлено, получатель имеет SDA низко, в то время как мастер-релиз снижает часы еще раз. Байты отправляют первый бит MSB. Например, байт "2" 00000010 будет направлен, начиная с битом слева и заканчивая немного справа.

Адрес байтов:
Каждый датчик имеет 7-разрядный адрес, который направляется в сочетании с направленным битом.
7 бит адрес ультразвукового датчика является "1" или "0000001"
Направленный бит или "0" для записи или "1" для чтения.
В результате отправки адреса 00000010 или 2, прочитается адрес 00000011 или 3.
Датчик работает на оптимальной скорости в 9600 Гц, а штамп не приблизиться к этому при выполнении строки за строкой. Запуск, остановка и перезапуск по-прежнему осуществляется вручную при помощи высоких и низких команд. Результат выглядит так:
byt0, byt1, и byt2 находятся в Hardware Developer Kit Приложение 7.
bytes_receive – это количество байт, которые будут получены от датчика
альфа-1, если ASCII-строка, как ожидается, и 0, если численного ответа, как ожидается.

Будьте уверены в своих действиях и наблюдайте ошибки функции.

'start
INPUT sda
INPUT clk
LOW sda
'send0
SHIFTOUT sda, clk, MSBFIRST, [byte0]     'адрес байта
SHIFTIN sda, clk, MSBPRE,[ack\1]             'получить подтверждение
IF ack=1 THEN error                               'если подтверждение не получено, проверьте ошибку.
'send1
SHIFTOUT sda, clk, MSBFIRST, [byt1]        'отправить команду байт
SHIFTIN sda, clk, MSBPRE,[ack\1]              'получить подтверждение
IF ack=1 THEN error                                'если подтверждение не получено, проверить ошибку
'restart                                                  'перезапустить команду (Stop, clock, Start)
LOW clk
LOW sda
HIGH clk
HIGH sda
LOW clk
HIGH clk
LOW sda
'send2
SHIFTOUT sda, clk, MSBFIRST, [byt2]        'отправить адрес для возврата
SHIFTIN sda, clk, MSBPRE,[ack\1]              'получить подтверждение
IF ack=1 THEN error                                'если подтверждение не получено, проверить ошибку
'receive
FOR i=0 TO bytes_receive-1
SHIFTIN sda, clk, MSBPRE,[bytr(i)\8]          'получить байт
SHIFTOUT sda, clk, MSBFIRST, [0\1]          'отправить подтверждение
IF alpha=0 THEN DEBUG DEC bytr(i)           'если число, отложите десятичное значение каждого байта
NEXT                                                     'повторите в зависимости от числа, необходимого для байтов
IF alpha=1 THEN DEBUG STR bytr             'если строка, отладить все байты как буквенно-цифровую строку
DEBUG CR
'Stop
LOW clk
LOW sda
INPUT clk
INPUT sda

Если команды из третьего байта (byte 2) – это что-то другое, чем "R+0x03", отправьте третий байт без перезапуска последовательности и не ждите ответа.

Ольга Славинская
4696
0 отзывов
0
Рейтинг: + 0 - 0

Другие инструкции

...