0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Соединяем EV3 и Arduino

Соединяем EV3 и Arduino

Автор: Alex. Опубликовано в Копилка 06 Сентябрь 2016 . просмотров: 16911

Иногда, при создании роботов возникает необходимость использования нескольких различных платформ в одном проекте, например, EV3 и Arduino. Так вы сможете использовать сильные стороны каждой из платформ и распараллелить выполняемые задачи. Я предлагаю вам ознакомиться с переводом статьи, в которой описано, как соединить EV3 и Arduino и как использовать Arduino совместно с EV3.

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

В этом руководстве для чтения и записи данных мы используем Arduino Uno и LEGO Mindstorms EV3. Также мы продемонстрируем, как использовать Arduino для чтения аналоговых значений и отправки их на EV3. Вы можете легко изменить наш пример для отправки и получения любых данных на EV3, начиная от показаний акселерометра и закачивая значениями снятых со счётчика Гейгера. Это, пожалуй, самый быстрый способ, чтобы добавить свои собственные датчики и девайсы: когда вы соедините EV3 и Arduino – весь мир будет ваш!

Общение EV3 и Arduino может быть организовано через I2C. В этом руководстве мы настроим Arduino как I2C-слейв (т.е. подчинённое устройство), а EV3 – как I2C-мастер (т.е. главное устройство).

В примере мы покажем вам, как отправлять команды на Arduino из EV3, и как написать программу, которая будет запрашивать данные из Arduino.

Подготовка

Шину I2C называют «интерфейсом двух проводов», потому что она использует для связи два провода. Один провод передаёт такты: это гарантирует, что оба устройства посылают информацию с одинаковой скоростью. Линию тактов обычно называют «SCL» (сокращённо от Serial CLock). Второй провод служит для передачи данных (данные отправляются и принимаются обоими устройствами одновременно), и обычно называется «SDA» (сокращённо от Serial DAta). Мастер (всегда EV3) всегда контролирует соединение, и всегда устанавливает такты для обоих устройств. Контролируемое устройство обычно называется слейв (Slave – раб или подчинённый по англ.). Когда мастер посылает команды, слейв бросает всё и слушает. Когда мастер требует информацию, слейв отдаёт эту информацию.

В примере мы не используем резисторы подтяжки на I2C линиях. Однако, если I2C совсем не работает, вы можете использовать 47кОм резисторы подтяжки на SDA и SCL линиях, чтобы подтянуть I2C до 4,7В на линии VCC.

Настройка оборудования

Во-первых, вот схема, к которой мы стремимся. На левой стороне схемы показана вилка EV3, а на правой стороне – Arduino. Мы должны соединить GND, VCC, SDA и SCL.

Соединённые провода будут выглядеть так: EV3 -> макетная плата -> Arduino. Внизу на картинке показано как выглядит это соединение.

В примере мы подключим только линии SDA и SCL (для обмена данными), VCC для питания Arduino от EV3 и линию земли (GND) для выравнивания напряжения.

Подключение к Arduino

Сперва подключите провод к порту GND Arduino. Затем подключите один провод к A5 (SCL, линия тактов) и один к порту A4 (SDA, линия данных). На картинке вы можете видеть, что мы подключили красный провод к VCC, чёрный – к GND, жёлтый – к SDA (A4) и зелёный — к SCL (A5).

Подключение к EV3

Наиболее простой способ подключить EV3 – это использовать адаптер. Все цвета идут в соответствующие пины: жёлтый провод в примере подключен к SDA на макетной плате. Тоже для SCL, GND и VCC.

Для наглядности: SDA –> SDA, SCL –> SCL.

Вы можете изготовить свой собственный адаптер очень легко (правда вы испортите провод): отрежьте один конец стандартного чёрного провода EV3 и снимите изоляцию. SDA и SCL – это жёлтый и синий провода, земля – чёрный и красный, VCC – зелёный.

На этой картинке цвета соответствуют следующим линиям:

      • Чёрный: земля
      • Красный: VCC
      • Зелёный: SCL
      • Жёлтый: SDA

На стороне Arduino мы подключим SDA, SCL, VCC и землю в разъёмы Arduino.

Программное обеспечение

Программное обеспечение для сопряжения EV3 и Arduino состоит из двух частей. Первая часть – это скетч, выполняемый на Arduino, вторая часть – программа для среды LEGO MINDSTORMS EV3 с установленными блоками, которые отправляют и принимают данные на/от Arduino. Весь код можно скачать и использовать с Github EV3 repository.

Настройка Arduino для работы с I2C: Присвоение адреса

В примере нам нужно настроить несколько вещей, чтобы идти дальше. Нам нужно выбрать адрес слейва. В примере мы установили адрес слейва 0x04 (в шестнадцатеричной системе счисления).

Arduino как слейв получатель/отправитель

В нашем примере, Arduino будет получать данные от мастера. EV3 просто говорит «вот некоторые данные», а Arduino говорит «спасибо за данные». Настройка очень простая и большинство датчиков работают как слейв получатели и отправители. Этот пример может быть очень полезен, если вы настраиваете свой Arduino для управления мотором или LED.

Читать еще:  Простой метод борьбы с кротами, сурками

EV3 отправляет некоторые данные на Arduino, который получает их и выводит их в Serial Monitor. Если EV3 запрашивает некоторые данные, Arduino отправляет в ответ один байт. Вы можете легко изменить этот код, чтобы отправлять или получать любое количество байт. А вот пример для получения и отправки 8 байт.

Здесь функция setup() инициализирует серийный порт и указывает, какие функции будут вызываться при отправке и получении данных от EV3.

Функция receiveData() используется для получения данных от EV3, а sendData() – для отправки данных на EV3. Загрузите этот скетч на Arduino, для использования с программным обеспечением EV3.

EV3 как мастер

Настройка EV3 как мастера очень простая. Скачайте блоки Dexter Industries EV3 (Dexter.ev3b) и импортируйте их в ПО Lego Mindstorms EV3 (Инструменты -> Мастер импорта блоков). Используйте блок Dexter Industries I2C для взаимодействия с Arduino.

Для чтения одного байта, просто создайте следующую последовательность блоков с включенным режимом «Read 1 Byte». Пропишите в поле «Addr» адрес слейва, такой же, как в скетче для Arduino (в нашем случае 0x04) и запустите программу, чтобы посмотреть данные пришедшие от Arduino на экране EV3.

Для отправки одного байта, поменяйте режим блока на «Write 1 Byte» и введите байт, который вы хотите отправить на Arduino. Когда вы запустите программу, EV3 пошлёт данные на Arduino и Arduino отобразит их в терминале серийного порта.

Аналогично вы можете загрузить в Arduino скетч для чтения/записи 8-ми байт и использовать в блоке Dexter Industries I2C режим «8 byte Read/Write».

Иногда очень полезно снимать аналоговые данные на Arduino и отправлять их на EV3. Если вы хотите делать так, то загрузите этот скетч на Arduino, а в EV3-программе выберите в блоке режим «Analog Read Block». Затем укажите номер пина, с которого вы хотите считывать данные и запустите программу. После этого на EV3 будут приходить аналоговые данные.

Вот и всё про соединение EV3 и Arduino.

Перевод: Алексей Валуев
Оригинал статьи здесь.

2 Работа с цифровым акселерометром ADXL345 по интерфейсу SPI

Акселерометр ADXL345 поддерживает 3- и 4-проводные варианты интерфейса SPI. Мы рассмотрим только 4-проводное подключение. Кроме того, акселерометр работает в режиме 3 интерфейса SPI (помните, мы уже обсуждали: CPOL =1, CPHA =1). Диаграмма, показывающая обмен с акселерометром ADXL345 по 4-проводному интерфейсу SPI:

Работа с ADXL345 по SPI

Здесь бит MB – это признак того, что мы собираемся читать много байтов за раз (если бит установлен в 1). Для тестирования работы с SPI устройствами и быстрого освоения порядка обмена с ними я обычно использую отладочную плату с микросхемой FT2232H. Эта микросхема поддерживает множество режимов, в том числе I2C и SPI. Управление работой микросхемы FT2232H – с помощью программы SPI via FTDI, о которой я уже неоднократно рассказывал.

Подключим акселерометр к отладочной плате и прочитаем регистр DEVID, в котором хранится постоянное значение-идентификатор акселерометра ADXL345. Значение идентификатора должно быть 0xE5.

ADXL345 соединён с отладочной платой на FT2232H

Не забудем перед чтением записать команду 0x80, которая укажет акселерометру, что мы собираемся читать, начиная с регистра по адресу 0x0 (см. диаграмму выше, рисунок 38 – SPI 4-Wire Read):

Чтение регистра ID акселерометра ADXL345 по SPI

Видно, что в регистре содержится число 0xE5, которое и является значением идентификатора акселерометра ADXL345, согласно техническому описанию (datasheet). Вот как это выглядит на временной диаграмме:

Временная диаграмма чтения регистра ID акселерометра ADXL345 по SPI

Устройство отвечает, всё нормально. Теперь нам нужно перевести акселерометр в режим измерений. Для этого необходимо записать в регистр POWER_CTL (адрес регистра 0x2D) число 0x08 (установить бит Measure в HIGH). После этого можно начинать читать регистры с 0x32 по 0x37, в которых хранятся данные об ускорениях по трём осям. Сделаем это с помощью Arduino. Напишем такой скетч:

Скетч для чтения данных ADXL345 по SPI (разворачивается)

Вот так выглядит временная диаграмма работы этого скетча:

Временная диаграмма чтения значений по осям X, Y, Z акселерометра ADXL345

Ясно, почему первый байт передачи от Arduino при чтении значений ускорений по осям – число 0xF2? Это адрес первого регистра, с которого начинаем чтение (0x32), объединённый по ИЛИ с 0x80 – маркером чтения READ – и с 0x40 – маркером многобайтовой передачи MB: 0x32 OR 0x80 OR 0x40 = 0011_0010 OR 1000_0000 OR 0100_0000 = 1110_1101 = 0xF2

Что означают считанные значения? Этот вопрос рассматривается в последнем разделе статьи. Кроме того, существует ряд библиотек для Arduino, которые упрощают настройку и чтение данных с акселерометра, позволяя не думать о таких низкоуровневых вещах как регистры, биты и байты. Ссылки на библиотеки также приведены в конце статьи.

Программа для получения сырых данных с акселерометра MPU6050

Составим программу, которая будет каждые 20 миллисекунд получать данные из MPU6050 и выводить их в последовательный порт.

Для работы программы потребуются библиотеки: MPU6050 и I2Cdev, ссылки на которые можно найти в конце урока.

Загружаем программу на Ардуино и открываем окно графика. Поворачиваем датчик вокруг оси X на 90 градусов в одну сторону, потом на 90 в другую. Получится примерно такая картина.

На графике хорошо видно, что при наклоне оси Y вертикально, акселерометр выдает значения близкие к четырём тысячам. Откуда берется это число?

Читать еще:  Делаем рыболовный зимний ящик из морозильной камеры

Интерфейс SensorEventListener — отслеживаем показания

Также вам понадобится интерфейс android.hardware.SensorListener. Интерфейс реализован с помощью класса, который используется для ввода значений датчиков по мере их изменения в режиме реального времени. Приложение реализует этот интерфейс для мониторинга одного или нескольких имеющихся аппаратных датчиков.

Интерфейс включает в себя два необходимых метода:

  • Метод onSensorChanged(int sensor, float values[]) вызывается всякий раз, когда изменяется значение датчика. Этот метод вызывается только для датчиков, контролируемых данным приложением. В число аргументов метода входит целое, которое указывает, что значение датчика изменилось, и массив значений с плавающей запятой, отражающих собственно значение датчика. Некоторые датчики выдают только одно значение данных, тогда как другие предоставляют три значения с плавающей запятой. Датчики ориентации и акселерометр дают по три значения данных каждый.
  • Метод onAccuracyChanged(int sensor,int accuracy) вызывается при изменении точности показаний датчика. Аргументами служат два целых числа: одно указывает датчик, а другое соответствует новому значению точности этого датчика.

Служба датчиков вызывает onSensorChanged() каждый раз при изменении значений. Все датчики возвращают массив значений с плавающей точкой. Размер массива зависит от особенностей датчика. Датчик TYPE_TEMPERATURE возвращает одно значение — температуру в градусах Цельсия, другие могут возвращать несколько значений. Вы можете использовать только нужные значения. Например, для получения сведений только о магнитном азимуте достаточно использовать первое числов, возвращаемое датчиком TYPE_ORIENTATION.

Параметр accuracy, используемый в методах для представления степени точности датчика, использует одну из констант

  • SensorManager.SENSOR_STATUS_ACCURACY_LOW. Говорит о том, что данные, предоставляемые датчиком, имеют низкую точность и нуждаются в калибровке.
  • SensorManager.SENSOR_STATUS_ACCURACY_MEDIUM. Говорит о средней степени точности датчика и том, что калибровка может улучшить результат.
  • SensorManager.SENSOR_STATUS_ACCURACY_HIGH. Показатели датчика точны настолько, насколько это возможно.
  • SensorManager.SENSOR_STATUS_UNRELIABLE. Данные, предоставляемые датчиком, недостоверны. Это значит, что датчик необходимо откалибровать, иначе невозможно считывать результаты.

Чтобы получать события, генерируемые датчиками, зарегистрируйте свою реализацию интерфейса SensorEventListener с помощью SensorManager. Укажите объект Sensor, за которым вы хотите наблюдать, и частоту, с которой вам необходимо получать обновления.

После получения объекта вы вызываете метод registerListener() в методе onResume(), чтобы начать получать обновлённые данные, и вызываете unregisteredListener() в методе onPause(), чтобы остановить получение данных. В этом случае датчики будут использоваться только тогда, когда активность видна на экране.

В следующем примере показан процесс регистрации SensorEventListener для датчика приближенности по умолчанию с указанием стандартной частоты обновления:

Класс SensorManager содержит следующие константы для выбора подходящей частоты обновлений (в порядке убывания):

  • SensorManager.SENSOR_DELAY_FASTEST — самая высокая возможная частота обновления показаний датчиков;
  • SensorManager.SENSOR_DELAY_GAME — частота, используемая для управления играми;
  • SensorManager.SENSOR_DELAY_NORMAL — частота обновлений по умолчанию;
  • SensorManager.SENSOR_DELAY_UI — частота для обновления пользовательского интерфейса.

Выбранная вами частота необязательно будет соблюдаться. SensorManager может возвращать результаты быстрее или медленней, чем вы указали (хотя, как правило, это происходит быстрее). Чтобы минимизировать расход ресурсов при использовании датчиков в приложении, необходимо пытаться подбирать наиболее низкую частоту.

Соединяем EV3 и Arduino

Автор: Alex. Опубликовано в Копилка 06 Сентябрь 2016 . просмотров: 16912

Иногда, при создании роботов возникает необходимость использования нескольких различных платформ в одном проекте, например, EV3 и Arduino. Так вы сможете использовать сильные стороны каждой из платформ и распараллелить выполняемые задачи. Я предлагаю вам ознакомиться с переводом статьи, в которой описано, как соединить EV3 и Arduino и как использовать Arduino совместно с EV3.

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

В этом руководстве для чтения и записи данных мы используем Arduino Uno и LEGO Mindstorms EV3. Также мы продемонстрируем, как использовать Arduino для чтения аналоговых значений и отправки их на EV3. Вы можете легко изменить наш пример для отправки и получения любых данных на EV3, начиная от показаний акселерометра и закачивая значениями снятых со счётчика Гейгера. Это, пожалуй, самый быстрый способ, чтобы добавить свои собственные датчики и девайсы: когда вы соедините EV3 и Arduino – весь мир будет ваш!

Общение EV3 и Arduino может быть организовано через I2C. В этом руководстве мы настроим Arduino как I2C-слейв (т.е. подчинённое устройство), а EV3 – как I2C-мастер (т.е. главное устройство).

В примере мы покажем вам, как отправлять команды на Arduino из EV3, и как написать программу, которая будет запрашивать данные из Arduino.

Подготовка

Шину I2C называют «интерфейсом двух проводов», потому что она использует для связи два провода. Один провод передаёт такты: это гарантирует, что оба устройства посылают информацию с одинаковой скоростью. Линию тактов обычно называют «SCL» (сокращённо от Serial CLock). Второй провод служит для передачи данных (данные отправляются и принимаются обоими устройствами одновременно), и обычно называется «SDA» (сокращённо от Serial DAta). Мастер (всегда EV3) всегда контролирует соединение, и всегда устанавливает такты для обоих устройств. Контролируемое устройство обычно называется слейв (Slave – раб или подчинённый по англ.). Когда мастер посылает команды, слейв бросает всё и слушает. Когда мастер требует информацию, слейв отдаёт эту информацию.

В примере мы не используем резисторы подтяжки на I2C линиях. Однако, если I2C совсем не работает, вы можете использовать 47кОм резисторы подтяжки на SDA и SCL линиях, чтобы подтянуть I2C до 4,7В на линии VCC.

Настройка оборудования

Во-первых, вот схема, к которой мы стремимся. На левой стороне схемы показана вилка EV3, а на правой стороне – Arduino. Мы должны соединить GND, VCC, SDA и SCL.

Соединённые провода будут выглядеть так: EV3 -> макетная плата -> Arduino. Внизу на картинке показано как выглядит это соединение.

Читать еще:  Мраморная штукатурка Байрамикс — это просто

В примере мы подключим только линии SDA и SCL (для обмена данными), VCC для питания Arduino от EV3 и линию земли (GND) для выравнивания напряжения.

Подключение к Arduino

Сперва подключите провод к порту GND Arduino. Затем подключите один провод к A5 (SCL, линия тактов) и один к порту A4 (SDA, линия данных). На картинке вы можете видеть, что мы подключили красный провод к VCC, чёрный – к GND, жёлтый – к SDA (A4) и зелёный — к SCL (A5).

Подключение к EV3

Наиболее простой способ подключить EV3 – это использовать адаптер. Все цвета идут в соответствующие пины: жёлтый провод в примере подключен к SDA на макетной плате. Тоже для SCL, GND и VCC.

Для наглядности: SDA –> SDA, SCL –> SCL.

Вы можете изготовить свой собственный адаптер очень легко (правда вы испортите провод): отрежьте один конец стандартного чёрного провода EV3 и снимите изоляцию. SDA и SCL – это жёлтый и синий провода, земля – чёрный и красный, VCC – зелёный.

На этой картинке цвета соответствуют следующим линиям:

      • Чёрный: земля
      • Красный: VCC
      • Зелёный: SCL
      • Жёлтый: SDA

На стороне Arduino мы подключим SDA, SCL, VCC и землю в разъёмы Arduino.

Программное обеспечение

Программное обеспечение для сопряжения EV3 и Arduino состоит из двух частей. Первая часть – это скетч, выполняемый на Arduino, вторая часть – программа для среды LEGO MINDSTORMS EV3 с установленными блоками, которые отправляют и принимают данные на/от Arduino. Весь код можно скачать и использовать с Github EV3 repository.

Настройка Arduino для работы с I2C: Присвоение адреса

В примере нам нужно настроить несколько вещей, чтобы идти дальше. Нам нужно выбрать адрес слейва. В примере мы установили адрес слейва 0x04 (в шестнадцатеричной системе счисления).

Arduino как слейв получатель/отправитель

В нашем примере, Arduino будет получать данные от мастера. EV3 просто говорит «вот некоторые данные», а Arduino говорит «спасибо за данные». Настройка очень простая и большинство датчиков работают как слейв получатели и отправители. Этот пример может быть очень полезен, если вы настраиваете свой Arduino для управления мотором или LED.

EV3 отправляет некоторые данные на Arduino, который получает их и выводит их в Serial Monitor. Если EV3 запрашивает некоторые данные, Arduino отправляет в ответ один байт. Вы можете легко изменить этот код, чтобы отправлять или получать любое количество байт. А вот пример для получения и отправки 8 байт.

Здесь функция setup() инициализирует серийный порт и указывает, какие функции будут вызываться при отправке и получении данных от EV3.

Функция receiveData() используется для получения данных от EV3, а sendData() – для отправки данных на EV3. Загрузите этот скетч на Arduino, для использования с программным обеспечением EV3.

EV3 как мастер

Настройка EV3 как мастера очень простая. Скачайте блоки Dexter Industries EV3 (Dexter.ev3b) и импортируйте их в ПО Lego Mindstorms EV3 (Инструменты -> Мастер импорта блоков). Используйте блок Dexter Industries I2C для взаимодействия с Arduino.

Для чтения одного байта, просто создайте следующую последовательность блоков с включенным режимом «Read 1 Byte». Пропишите в поле «Addr» адрес слейва, такой же, как в скетче для Arduino (в нашем случае 0x04) и запустите программу, чтобы посмотреть данные пришедшие от Arduino на экране EV3.

Для отправки одного байта, поменяйте режим блока на «Write 1 Byte» и введите байт, который вы хотите отправить на Arduino. Когда вы запустите программу, EV3 пошлёт данные на Arduino и Arduino отобразит их в терминале серийного порта.

Аналогично вы можете загрузить в Arduino скетч для чтения/записи 8-ми байт и использовать в блоке Dexter Industries I2C режим «8 byte Read/Write».

Иногда очень полезно снимать аналоговые данные на Arduino и отправлять их на EV3. Если вы хотите делать так, то загрузите этот скетч на Arduino, а в EV3-программе выберите в блоке режим «Analog Read Block». Затем укажите номер пина, с которого вы хотите считывать данные и запустите программу. После этого на EV3 будут приходить аналоговые данные.

Вот и всё про соединение EV3 и Arduino.

Перевод: Алексей Валуев
Оригинал статьи здесь.

3 Работа с цифровым акселерометром ADXL345 по интерфейсу I2C

Временная диаграмма информационного обмена с ADXL345 по интерфейсу I2C выглядит так:

Диаграмма обмена с ADXL345 по I2C

Давайте перепишем скетч для Arduino, который будет делать всё то же самое, только с обменом по интерфейсу I2C:

Скетч для чтения данных ADXL345 по I2C (разворачивается)

Диаграмма чтения регистра DEVID цифрового акселерометра ADXL345 при обмене по последовательному интерфейсу I2C будет в этом случае такой:

Диаграмма чтения регистра DEVID акселерометра ADXL345 по I2C

Как видно, ADXL345 возвращает нам ожидаемое значение 0xE5. А вот так будет выглядеть диаграмма чтения регистров, в которых хранятся данные по осям XYZ:

Диаграмма чтения регистров данных X, Y, Z акселерометра ADXL345 по I2C

Тут всё ещё проще, чем при работе с интерфейсом SPI.

Программа для вычисления угла наклона акселерометра MPU6050

Добавим в предыдущую программу вычисление угла поворота датчика вокруг оси X:

Загружаем программу в Ардуино и снова пробуем вращать датчик. Теперь на графике отображается угол наклона в градусах!

Ну вот, мы получили уже что-то пригодное для дальнейшего использования. Видно, что датчик поворачивался сначала на 30 с лишним градусов в одну сторону, потом примерно на 60 в другую. Работает!

Ссылка на основную публикацию
Статьи c упоминанием слов:
Adblock
detector