пятница, 20 мая 2016 г.

Датчик для LEGO Mindstorms EV3 своими руками

Если вам также как и нам не хватает возможностей стандартных датчиков EV3, не достаточно 4-х портов для датчиков в ваших роботах или вы хотите подключить к своему роботу какую-нибудь экзотическую периферию - эта статья для вас. Поверьте, самодельный датчик для EV3 - это проще чем кажется. "Крутилка громкости" из старого радиоприемника или пара гвоздей, воткнутых в землю в цветочном горшке в качестве датчика влажности почвы - отлично подойдут для эксперимента.

Удивительно, но каждый порт датчика EV3 скрывает в себе целый ряд различных протоколов, в основном это сделано для совместимости с датчиками NXT и датчиками сторонних производителей. Давайте рассмотрим как устроен кабель  EV3


Странно, но красный провод - это земля (GND), зеленый - плюс питания 4,3В. Синий провод - одновременно SDA для шины I2C и TX для протокола UART. Кроме этого синий провод - вход аналогово-цифрового преобразователя для EV3. Желтый провод - одновременно SCL для шины I2C и RX для протокола UART. Белый провод - вход аналогово-цифрового преобразователя для датчиков NXT. Черный - цифровой вход, для датчиков, совместимых с NXT - он дублирует GND. Непросто, не так ли? Давайте по порядку.

Аналоговый вход EV3


В каждом порту датчика есть канал аналогово-цифрового преобразователя. Он используется для таких датчиков, как Touch Sensor (кнопка), датчиков NXT Light Sensor и Color Sensor в режиме измерения отраженного света и внешней освещенности, NXT датчика звука и NXT-термометра.

Сопротивление в 910 Ом, подключенное согласно схеме сообщает контроллеру, что данный порт необходимо переключить в режим аналогового входа. В таком режиме к EV3 можно подключить любой аналоговый датчик, например от Arduino. Скорость обмена с таким датчикаом при этом может достигать нескольких тысяч опросов в секунду, это самый быстродействующий тип датчиков.

Датчик освещенности
Термометр

Датчик влажности почвы

Также можно подключить: микрофон, кнопку, ИК дальномер и многие другие распространенные сенсоры. Если для датчика не достаточно питания в 4,3В, можно запитать его от 5В от разъема USB-порта, расположенного на боковой стороне контроллера EV3.

Упомянутая выше "крутилка громкости" (она же переменный резистор или потенциометр) является отличным примером аналогового датчика - ее можно подключить вот так:



Для чтения значений с такого датчика в стандартной среде программирования LEGO необходимо использовать синий блок RAW

Протокол I2C


Это цифровой протокол, по нему работает например ультразвуковой датчик NXT, многие датчики Hitechnic, такие как IR Seeker или Color Sensor V2. Для иных платформ, например для Arduino, есть масса i2c-датчиков их вы тоже сможете подключить. Схема следующая:



Сопротивление 82 Ом рекомендованы LEGO Group, однако в разных источниках встречаются упоминания о 43 Ом и менее. На самом деле мы попробовли вообще отказаться от этих сопротивлений и все работает, по крайней мере "на столе". В реальном роботе, работающем в условиях различного рода помех, линии SCL и SDA стоит все же притянуть к питанию через сопротивления, как это указано на схеме выше. Скорость работы i2c в EV3 довольно невелика, примерно 10000 кбит/с, именно поэтому всеми любимый Hitechnic Color Sensor V2 такой тормозной :)

К сожалению для стандартного EV3-G от LEGO не существует полноценного блока для двухсторонней связи с i2c датчиком, но используя сторонние среды программирования, такие как RobotC, LeJOS или EV3 Basic можно взаимодействовать практически с любыми i2c датчиками.

Способность EV3 работать по i2c протоколу открывает интересную возможность для подключения нескольких датчиков к одному порту. I2C протокол позволяет поключить к одной шине до 127 подчиненных устройств. Представляете? По 127 датчиков к каждому из портов EV3 :) Более того, часто кучу i2c датчиков совмещают в одном устройстве, например на фото ниже датчик 10 в 1 (содержит компас, гироскоп, акселерометр, барометр и т.д.)


В очень любопытной статье от Dexter рассматривается способ превратить вашу Arduino в i2c датчик для EV3. Зачем это нужно? К плате Arduino могут быть подключены с десяток датчиков разных типов, даже таких, которые напрямую к EV3 подключить не удастся (например ультразвуковой дальномер HC-SR04 или RFID-сканер) и она будет отправлять данные с них на EV3, выступая в роли своеобразного конвертера в i2c. Как это сделать - читайте в статье по ссылке выше, там есть и исходные коды для Arduino и EV3-G блоки для чтения и даже записи данных (да-да, вы сможете щелкать своей 220В релюшкой прямо из EV3-программы). Мы проверили, это все отлично работает.


Как работать с i2c в среде EV3 Basic мы рассказывали в одной из предыдущих статей

UART


Почти все стандартыне EV3-датчики, за исключением Touch Sensor, работают по протоколу UART и именно поэтому они не совместимы с контроллером NXT, который хоть и имеет такие же разъемы, но на портах датчиков у него UART не реализован. Взгляните на схему, она немного проще, чем в предыдущих случаях:



UART-датчики автоматически согласовывают с EV3 скорость своей работы. Первоначально соединившись на скорости 2400 кбит/с они договариваются о режимах работы и скорости обмена, переходя затем на повышенную скорость. Типичные скорости обмена для разных датчиков 38400 и 115200 кбит/с.
LEGO реализовала в своих UART-датчиках довольно замысловатый протокол, поэтому сторонних датчиков, предназначенных изначально не для этой платформы, но совместимых с ней, не существует. Тем не менее этот протокол очень удобен для подключения "самодельных"
датчиков, на базе микроконтроллеров.
Для Arduino существует замечательная библиотека EV3UARTEmulation, написанная известным LeJOS-разработчиком Lawrie Griffiths, которая позволяет этой плате притвориться UART-LEGO-совместимым датчиком. В его блоге LeJOS News есть масса примеров подключения датчиков газа, IMU-сенсора и цифрового компаса с использованием данной библиотеки.

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


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

14 комментариев:

  1. Отличная статья! Стимулирует поработать в этом направлении... :-)

    ОтветитьУдалить
  2. Размерность кбит/с нужно поправить на бит/с

    ОтветитьУдалить
  3. Резисторы 82 кОм а не Ом для I2C интерфейса.

    ОтветитьУдалить
    Ответы
    1. Вероятно это не особо важно, у нас I2C работает даже совсем без резисторов.

      Удалить
    2. То что работает в данном случае без резисторов, так это из-за того, что у i2c у лего медленная, на большой скорости будут сплошные ошибки в переданных данных. Что касается минимального значения подтягивающих резисторов, то для i2c, если мне не изменяет память, это 1.5 кОм. Влияние значения резисторов на фронты передаваемых импульсов можно глянуть здесь http://student-proger.ru/2014/08/vliyanie-nominala-podtyagivayushhih-rezistorov-na-signal-shiny-i2c/

      Удалить
    3. У меня проблема вот такого характера: мне необходимо передать некоторые данные с Ардуино на EV3 (двузначное число) через шину i2c. Я настроил Еву как мастера, а Ардуино как слейв с адресом 4 (как в статье от Dexterа). И эта система у меня работает крайне нестабильно. Бывает так, что Ева принимает не отправленное число, а адрес слейва (то есть Ева бесконечно принимает цифру 4). Так вот, может ли быть проблема в том, что я не использовал резисторы при подключении шины? И какое сопротивление всё-таки выбрать? 10 кОм подойдёт? Буду благодарен за помощь.

      Удалить
    4. 82 Ом, как указано на схеме выше. Без них будут ошибки при передаче.

      Удалить
  4. а в первой схеме обязательно 910? Я подцепил 2 резистора и в сумме получилось 940 Ом. Не работает. На датчике освещенности светодиодики загорелись, в LegoEV3 говорит что девайс Unknown

    ОтветитьУдалить
    Ответы
    1. Тем не менее если с него считывать - работает. У нас было именно так.

      Удалить
  5. командой Sensor.CommunicateI2C( 1,78,1,1,a) пытаюсь вывести через порт 1 по i2c данные на pcf8574 соединенную с дисплеем 1602, в массив а[] записаны коды инициализации экрана. Данные не поступают, зациклил команду, на scl синхроимпульсы 0-5в на sda видны пакеты импульсов но амплитуда от 5 до 2,5в естественно 8574 их не воспринимает,на остальных портах аналогично. Подключал вместо ev3 шину i2c stm8 все работает нормально. Насколько я понял из схемы матери ev3 сигналы на i2c идут напрямую с портов процессора, что за странный режим работы пота? Зациклил команду вывода на uart на TX чисто , ничего не понимаю, стандартных датчиков для проверки нет.

    ОтветитьУдалить
  6. командой Sensor.CommunicateI2C(1,78,1,1,а) пытаюсь инициализировать дисплей с i2c шиной, а[] массив кодов инициализации, команда не проходит, на шине scl импульсы 0-5в а на sda пакеты от 5 до 2.5 в , естественно дисплей их игнорирует , на остальных портах ситуация та же. На шине i2c stm8 дисплей работает нормально. Судя по схеме сигналы идут напрямую от МК, что может влиять на такое поведение этих пинов порта. Попробовал вывод на uart на TX то же пусто. Какие соображения о данной ситуации.

    ОтветитьУдалить
    Ответы
    1. Есть такая проблема у EV3. Дело в том, что блок работает с подтягивающими резисторами около 80К,в то время как основная масса девайсов I2C имеет встроенные резисторы около 10K. Если на внешнем девайсе стоят свои подтягивающие, то легоблок не в состоянии просадить линию до логического 0. Выход - выпаять подтягивающие резисторы на девайсе. По поводу 82 ом на схеме еще раз повторю - ошибка. Для лего 82K будет правильней )

      Удалить
  7. Не хватает описания: как подключить свой мотор.

    ОтветитьУдалить
  8. Здравствуйте! Купили недавно датчик пульса для ардуино. Решили связать его с EV3. Есть ли у вас опыт подключения данного датчика, если есть то поделитьесь им с нами , а если же нету то посоветуйте нам источник информации о этом датчике. Заранее спасибо. Почта для связи korenevmaks4@gmail.com

    ОтветитьУдалить

Самое популярное