Добавить в избранное

Внутреннее устройство портов и кабелей LEGO Mindstorms

Информация о внутреннем устройстве портов и кабелей
картинка к записи Внутреннее устройство портов и кабелей LEGO Mindstorms

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

Представленная здесь информация справедлива, в первую очередь, для набора Mindstorms NXT. Для набора EV3 могут быть отличия (назначение сигналов кабелей такое же, а вот возможности драйверов двигателей могут отличаться). Для более детального изучения советую почитать NXT Hardware Developer Kit и EV3 Hardware Developer Kit. Это официальное описание аппаратной части (схемы контроллера, датчиков, моторов и т.д.) конструкторов Mindstorms от компании LEGO.

Как уже было отмечено ранее входные и выходные порты имеют 6-контактные разъёмы. Входные порты контроллера NXT расположены с нижней стороны и пронумерованы от 1 до 4, а выходные порты расположены с верхней стороны и обозначены латинскими буквами A, B, C.

Внешний вид портов датчиков Внешний вид портов моторов
Плата контроллера, вид с двух сторон
Плата Bluetooth-модуля крупным планом

При внимательном рассмотрении прозрачных разъёмов стандартных соединительных кабелей из комплекта, можно увидеть 6 проводов различных цветов: белый, черный, красный, зелёный, желтый и синий. Разъёмы портов контролера NXT и стандартных кабелей визуально напоминают стандартные телефонные разъёмы типа RJ-12 (на самом деле под обозначением RJ-12 имеются в виду разъёмы типа RJ-25 или 6p6c). Однако при внимательном рассмотрении можно заметить, что замок разъёмов соединительных кабелей из набора «LEGO MINDSTORMS» смещен вправо (если держать разъём замком к себе), а у разъёма типа RJ-12 замок находится ровно посередине. Таким образом, компания «LEGO» принуждает пользователей к использованию оригинальных кабелей во избежание поломок контроллера или других элементов конструктора. В интернете можно найти подробные инструкции по изготовлению разъёмов аналогичных разъёмам оригинальных кабелей из набора, либо сразу купить готовые разъёмы.

Порты датчиков: назначение контактов и описание сигналов

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

Номер контакта Цвет провода Имя Назначение
1
 
AN Аналоговый вход/ Питание 9 В
2
 
GND Общий (земля)
3
 
GND Общий (земля)
4
 
4.3 V Power Питание 4,3 В
5
 
DIGAI0 Цифровой вход 0. I2C Clock (SCL), RS-485 B
6
 
DIGIA1 Цифровой вход 1. I2C Data (SDA), RS-485 A

Контакт 1 – Белый провод – AN – может использоваться для двух целей: как аналоговый вход или как выход питания 9 В. Контроллер подает напряжение питания на этот контакт в течение 3-х миллисекунд, а затем считывает аналоговое значение в течение 0,1 мс. В режиме аналогового входа данный контакт подключается к аналого-цифровому преобразователю (АЦП). Для исключения повреждения АЦП входной сигнал должен находиться в пределах от 0 до 5 В. АЦП преобразует входной сигнал в цифровое значение от 0 до 1023. Согласно документации частота дискретизации составляет 333 Гц (у EV3 частота уже 1 кГц). На время считывания сигнала контакт «подтягивается» к линии 5 В через резистор номиналом 10 кОм находящийся внутри блока. Наличие данного резистора значительно упрощает схемотехнику большинства датчиков.

При использовании первого контакта в качестве 9-вольтового источника питания для датчиков, необходимо учитывать, что напряжение питания на этом контакте будет равно напряжению источника питания контроллера NXT. Поэтому при использовании никель-металлогидридных (NiMH) аккумуляторов с этого контакта можно получить напряжение около 7,2 В или меньше. Это напряжение используется для питания стандартных и самодельных датчиков, которым недостаточно 5 вольт, в частности, ультразвуковой датчик NXT использует его для увеличения мощности своего передатчика. Все датчики RCX, подключаемые через адаптер (переходник), используют для своей работы именно эту линию.

Поскольку питание на этот контакт подаётся с перерывами, датчику обычно требуется конденсатор, чтобы поддерживать напряжение питания на время чтения данных. Ограничение по току нагрузки на этом контакте составляет примерно 14 мА на каждый порт. Если ток нагрузки превышает это значение, напряжение значительно падает, что может привести к некорректной работе датчика.

Контакты 2 и 3 – Чёрный и красный провода – GND – общая земля. Эти два контакта соединены вместе внутри блока NXT и внутри стандартных сенсоров LEGO. Все сигналы измеряются и формируются относительно этих общих контактов.

Контакт 4 – Зелёный провод – Питание 4.3 В – основная линия питания для стандартных датчиков NXT. Новые цифровые микросхемы, рассчитанные на 5-вольтовую логику, вполне могут быть запитаны от него, но бывают случаи, когда этого напряжения оказывается недостаточно для стабильной работы. В отличие от 9-вольтовой линии питания, этот выход обеспечивает суммарный ток 180 мА для всех входных и выходных портов. Каждый порт может использовать в среднем 25 мА (180 / 7 = 28,71 мА), но вполне допустимо увеличить потребление одного или нескольких портов, если остальные порты потребляют меньше или не задействованы. Стандартные датчики из набора, а также датчики оборотов сервомоторов потребляют в среднем около 20 мА.

Контакты 5 и 6 – Жёлтый и синий провода – DIGAI0 и DIGAI1 – данные линии используются для передачи данных. Контакты используют цифровые сигналы уровня 3,3 В и непосредственно подключены к микропроцессору контроллера NXT. В основном они используются для связи по протоколу I2C (DIGAI0 как SCL и DIGAI1 как SDA), но также могут использоваться как обычные сигнальные линии. При использовании линий как входов контроллер NXT ограничивает ток для защиты линий микропроцессора от повреждений. Защита реализована через последовательно включенные ограничительные резисторы номиналом 4,7 кОм. В режиме выхода уровень напряжения на контактах не должен превышать 3,3 В. При работе с данными контактами необходимо соблюдать осторожность, поскольку ошибка может привести к повреждению линий микропроцессора внутри контроллера NXT.

Помимо протокола I2C, контакт DIG0 используется датчиком освещённости для переключения состояния встроенного светодиода подсветки (включен или выключен) и датчиком звука для переключения между режимами DB (абсолютная громкость звука) и DBA (уровень звука, приравненный к чувствительности человеческого уха).

Порты моторов: назначение контактов и описание сигналов

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

Номер контакта Цвет провода Имя Назначение
1
 
MA0 Аналоговый вход/ Питание 9 В
2
 
MA1 Общий (земля)
3
 
GND Общий (земля)
4
 
4.3 V Power Питание 4,3 В
5
 
TACHOA0 Цифровой вход 0
6
 
TACHOA1 Цифровой вход 1

Контакты 1 и 2 – Белый и чёрный провода – MA1 и MA2 – линии питания сервомотора. Максимальное напряжение равно напряжению источника питания контроллера. Для управления питанием двигателей робота необходимо устройство, которое бы преобразовывало управляющие сигналы малой мощности в токи, достаточные для управления моторами. Такие устройства называют драйверами двигателей, они изготавливаются в виде микросхем разной мощности.

Схемотехнически драйвер, управляющий питанием двигателей, представляет собой H-мост – это электронная схема, которая позволяющая приложить напряжение к нагрузке в разных направлениях. Термин Н-мост появился благодаря графическому изображению этой схемы, напоминающей букву Н.

Н-мост собирается из 4 транзисторов (реле, переключателей). В зависимости от управляющих сигналов открывается та или иная пара транзисторов, при этом два других транзистора закрыты. На рисунке ниже показана электрическая схема H-моста, а также указано направление вращения двигателя для двух различных состояний управляющих сигналов. Схема имеет два управляющих входа, обозначенных буквами A и B. Исходя из того, что H-мост управляется цифровыми сигналами (ноль или единица), возможны 4 состояния входных сигналов.

При значениях A = 1 и B = 0 (левая схема на рисунке выше) транзисторы VT1 и VT3 открываются, по двигателю начинает протекать ток, что приводит к вращению двигателя вперёд (forward). Если поменять значения входных сигналов на противоположные и подать на схему значения A = 0 и B = 1 (правая схема на рисунке выше)), то это приведет к закрытию транзисторов VT1, VT3 и открытию транзисторов VT2, VT4. Направления протекания электрического тока поменяется, следовательно, изменится и направление вращения двигателя – он станет вращаться в обратном (reverse) направлении.

Также Н-мост позволяет электрически тормозить двигатель, накоротко замыкая его выводы (brake). Для этого необходимо подать сигнал высокого уровня на оба входа (A = 1 и B = 1). А если на оба входа подать сигнал низкого уровня (A = 0 и B = 0), то двигатель можно будет свободно вращать (coasting), как и при отключенном питании.

При использовании H-моста с двигателями постоянного тока в схему включают защитные (ограничительные) диоды (VD-VD4 на рисунке выше). Необходимость в диодах вызвана наличием токов при остановке двигателя, вследствие уменьшения электромагнитного поля внутри его обмоток.

В контроллере NXT используются две различных микросхемы H-моста. Для управления портом A задействована микросхема одноканального H-моста LB1930M, а порты B и C управляются микросхемой двухканального H-моста LB1836M. Допустимый выходной ток составляет примерно 800 мА для порта A и 500 мА для портов B и C. Пиковый ток может достигать тока в 1 А. Микросхемы имеет тепловую защиту, которая ограничивает ток при перегрузках или перегреве. Поскольку порт A допускает больший выходной ток, по сравнению с портами B и C, то зачастую он используется для управления манипулятором робота, а порты B и C – для управления движением робота.

В таблице ниже приведены уровни напряжений на выходе драйверов двигателей контроллера NXT для различных состояний входных сигналов, для входных сигналов за единицу принят сигнал высокого уровня, за ноль – низкого.

Режим работы Вход A Вход B Выход 1 порта А Выход 2 порта А Выход 1 портов B и C Выход 2 портов B и C
Свободное вращение (coasting mode) 0 0 Отключен Отключен Отключен Отключен
Вращение назад (reverse mode) 0 1 Низкий Высокий Низкий Высокий
Вращение вперёд (forward mode) 1 0 Высокий Низкий Высокий Низкий
Торможение (brake mode) 1 1 Высокий Высокий Низкий Низкий

Проанализировав представленную таблицу можно сделать следующий вывод об особенности порта A: если к двигателю приложено напряжение и при этом двигатель в режиме торможения, то на линиях 1 и 2 будет сохраняться высокий уровень напряжения (9 В или 7,2 В в зависимости от типа источника питания).

Зависимость между скоростью вращения мотора и приложенным напряжением линейна. Поэтому для регулирования скорости вращения двигателя используется способ широтно-импульсной модуляции (PWM – pulse width modulation). Идея данного способа заключается в получении изменяющегося аналогового значения напряжения посредством особого алгоритма управления транзисторными ключами. ШИМ-сигнал моделирует напряжение между максимальным и минимальным значениями напряжения. Частота импульсов при этом остается постоянной, изменяется только коэффициент заполнения D – величина, отражающая процентное соотношение длительности времени включения максимального напряжения τ к длительности периода сигнала T. На рисунке ниже показаны графики ШИМ-сигнала для различных коэффициентов заполнения.

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

Длительность периода ШИМ для стандартной прошивки составляет 128 нс, что соответствует частоте 7,8 кГц, которая находится в слышимом диапазоне. Поэтому иногда можно услышать писк, исходящий от мотора. Это происходит, когда к двигателю приложено напряжение, а его вал не может провернуться. Например, если манипулятор робота достиг крайнего положения, а питание все еще подается.

Контакт 3 – Красный провод – GND – общий «земляной» контакт. Контакты 2 и 3 соединены между собой в датчиках, но не в моторах. Если датчик будет случайно подключен к порту мотора, питание мотора будет закорочено на землю. К счастью, в блоке есть защита на этот случай, но лучше лишний раз не ошибаться.

Контакт 4 – Зелёный провод – Питание 4.3 В – данный контакт подключен к линии питания 4,3 В, общей для всех портов блока. Питание с этого контакта используется тахометром сервомотора.

Контакты 5 и 6 – Жёлтый и синий провода – DIGAI0 и DIGAI1 – данные линии используются для получения сигналов от встроенного в сервомотор NXT оптического тахометра. Датчик оборотов генерирует прямоугольные импульсы, которые позволяют контроллеру NXT определить скорость и направление вращения мотора. Два импульса сдвинуты относительно друг друга на четверть периода сигнала. На рисунках ниже показаны графики сигналов, генерируемых датчиком оборотов при вращении мотора вперёд и назад соответственно. Частота импульсов зависит от скорости вращения мотора. Один полупериод сигнала соответствует одному градусу поворота мотора.

Импульсы при вращении мотора вперёд Импульсы при вращении мотора назад

Схема подключения датчиков

Подключение своих устройств по I2C

К контроллеру NXT можно подключить различные устройства, работающие по протоколу I2C. Данная опция позволяет расширить функциональные возможности конструктора. Одним из простых примеров, описанных в книге Extreme NXT, является подключение I2C расширителя портов PCF8574 (документация). Данная микросхема имеет 8 линий и позволяет как вводить, так и выводить данные. То есть можно подключить к одному из портов плату с PCF8574, а к ней светодиоды или кнопки, общим количеством до 8 штук. Ниже показан пример подключения платы со светодиодами.

Для экспериментов были спроектированы два типа плат : первая только со светодиодами, вторая включала и кнопки. Ниже представлены схемы и внешний вид плат. Платы проектировались в САПР Diptrace.

Схема платы со светодиодами Внешний вид платы со светодиодами
Схема платы со светодиодами и кнопками Внешний вид платы со светодиодами и кнопками

Скачать файлы

Ниже показана уже готовая для экспериментов плата. Для подключения платы необходимо разрезать один кабель, напаять на каждый провод ответную часть (BLS) штыревого контакта (PLS) и натянуть термоусадку. Получается довольно удобно. Термоусадку лучше брать по цвету провода. Разрезать лучше самые длинные кабели. По опыту использования они реже пригождаются. Из одного кабеля можно изготовить два новых кабеля для экспериментов.

Внешний вид платы и переделанного кабеля NXT Плата с PCF8574 крупным планом

Программная часть писалась в RobotC. Описание функций для работы с I2C из RobotC приведено в вики на сайте разработчика. Также советую почитать материалы от Storming Robots (раз и два). Ниже представлены два примера программ.

Первая программа реализует поочередное мигание светодиодов. Сначала загораются светодиоды одного цвета (нечётные по порядку), а затем другого цвета (чётные по порядку).

#pragma config(Sensor, S1, , sensorI2CCustom)

const tSensors kPort = S1;
ubyte i2cconfg[3];
ubyte kResults[4];

task main
()
{
    SensorType[kPort] = sensorI2CCustom;
    i2cconfg[0] = 2;        // количество передаваемых байт
    i2cconfg[1] = 0x40;     // байт с адресом
    ubyte t = 0b01011110;
    while (true)
    {
        i2cconfg[2] = t;    // байт с данными
        t = ~t;     // инвертирование
        sendI2CMsg(kPort, &i2cconfg;[0], sizeof(kResults));
        while (nI2CStatus[kPort] == STAT_COMM_PENDING);
        wait1Msec(500);
    }
}

При старте программы указывается тип датчика, подключённого к порту (значение sensorI2CCustom указывает, что используется I2C), размер массива передаваемых данных и адрес устройства. В нашем случае адрес равен 0x40. Общий вид адреса в двоичном виде 0b0100-A2-A1-A0-0, линии А0, А1 и А2 (пины 1, 2 и 3 микросхемы) определяют значение соответствующих битов адреса. На приведённой выше схеме все три линии подтянуты к земле (нулю), поэтому адрес равен 0b01000000 = 0x40. Одновременно можно подключить до 8 устройств.

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

Вторая программа реализует постоянный опрос кнопок на плате. На экран выводится значение, прочитанное из PCF8574.

#pragma config(Sensor, S1, , sensorI2CCustom)

const tSensors kPort = S1;
ubyte i2cconfg[3];
ubyte kResults[4];

task main
()
{
    SensorType[kPort] = sensorI2CCustom;
    i2cconfg[0] = 2;        // количество передаваемых байт
    i2cconfg[1] = 0x40;     // байт с адресом
    while (true)
    {
        i2cconfg[2] = 0b11110011;   // байт с данными
        sendI2CMsg(kPort, &i2cconfg;[0], sizeof(kResults));
        while (nI2CStatus[kPort] == STAT_COMM_PENDING);
        readI2CReply(kPort, &kResults;[0], sizeof(kResults));
        eraseDisplay();
        if (nI2CStatus[kPort] == NO_ERR)
        {
            displayTextLine(0, "message sent");
            displayTextLine(1, "1 byte = %d", kResults[0]);
            displayTextLine(2, "2 byte = %d", kResults[1]);
            displayTextLine(3, "3 byte = %d", kResults[2]);
            displayTextLine(4, "4 byte = %d", kResults[3]);
        } else
            displayTextLine(0, "message error");
        wait1Msec(500);
    }
}

При старте программы также указывается тип датчика, подключенного к порту(значение sensorI2CCustom указывает,что используется I2C), размер массива передаваемых данных и адрес устройства (0x40 для PCF8574). Затем в бесконечном цикле сначала в массив добавляются данные (полезные данные, которые необходимо переслать) и с помощью функции sendI2CMsg выполняется отправка массива. Для отправки надо указать порт, адрес массива в памяти (указатель на массив) и размер передаваемых данных (в байтах, в нашем случае это 1 байт). Пересылаемый байт равен 0b11110011 (какие биты обнулены зависит от того, к каким линиям PCF8574 подключены кнопки), что означает следующее: светодиоды выключены, линии с кнопками работают на ввод. Далее ожидается завершение передачи данных и стартует чтение данных из PCF8574. Если при чтении ошибок не возникло, то принятые данные выводятся на экран. В примере читается массив размером 4 байта, хотя в нашем случае достаточно читать 1 байт (остальные три байта равны первому). При возникновении ошибки чтения данных на экран выводится соответствующее сообщение.

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

  • 243 – нет нажатых кнопок
  • 247 – нажата только первая кнопка (SB1, подключена к 6-ому выводу PCF8574)
  • 251 – нажата только вторая кнопка (SB2, подключена к 7-ому выводу PCF8574)
  • 255 – нажаты обе кнопки

Таким образом, на базе миксросхемы PCF8574 можно собрать простой расширитель портов, способный работать как на вывод, так и на ввод данных. Например, можно к контроллеру подключить Arduino и передавать данные размером более 1 байта (показания датчиков, различные команды и так далее).

Кроме описанной микросхемы PCF8574, можно использовать и другие микросхемы с интерфейсом I2C. Например, PCF8591 – универсальный аналогово-цифровой и цифро-аналоговый преобразователь (документация). Микросхема PCF8591 обладает следующими возможностями:

  • один источник питающего напряжения;
  • сохранение работоспособности в диапазоне питающих напря­жений от 2,5 до 6 В;
  • низкий ток потребления;
  • три вывода задания slave-адреса (как и у PCF8574);
  • четыре аналоговых входа с возможностью программирования включения (прямое и дифференциальное);
  • 8-разрядный аналогово-цифровой (A/D) преобразователь с последовательным приближением;
  • цифро-аналоговый (D/A) преобразователь.

В составе PCF8591 имеется только один A/D преобразователь, однако встроенный мультиплексор на 4 канала расширяет возможности микросхемы. Вход АЦП последовательно подключается к каждому из 4-х сигнальным входов, а затем происходит считывание информации. К сожалению, встроенный мультиплексор нельзя использовать для D/A преобразования, поэтому аналоговый выход только один. Максимальная скорость преобразования данных ограничена максимальным быстродействием шины I2C.

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

Внешний вид модуля Схема модуля
Поделиться
Понравился материал?

Комментарии

Добавить комментарий
Спасибо Вам

Спасибо за столь полезную информацию

Нравится: 0Не нравится: 0

Ответить