21
Использование Arduino для управления роборукой Михаил Яхъяев

R0boCamp2016 Михайло Ях'яєв: Використання Arduino для керування роборукою, або як програміст вчився працювати

Embed Size (px)

Citation preview

Page 1: R0boCamp2016 Михайло Ях'яєв: Використання Arduino для керування роборукою, або як програміст вчився працювати

Использование Arduino для управления роборукой

Михаил Яхъяев

Page 2: R0boCamp2016 Михайло Ях'яєв: Використання Arduino для керування роборукою, або як програміст вчився працювати

Demo● Небольшая

роборука

● Сделана для экспериментов с Artificial Intelligence

● Собрана из набора Lynxmotion AL5D

● Использовал Arduino; добавил сенсоры

Page 3: R0boCamp2016 Михайло Ях'яєв: Використання Arduino для керування роборукою, або як програміст вчився працювати

Цели Доклада

● Поделиться опытом● Рассказать об интересных аспектах архитектуры● Рассказать о технических проблемах и решениях● Технологии имеющие отношение к проекту● Рассказать с точки зрения software разработчика который решил

поработать с hardware

Page 4: R0boCamp2016 Михайло Ях'яєв: Використання Arduino для керування роборукою, або як програміст вчився працювати

Общая архитектура

...Сервомоторы Питание +6V

Шина I2CАкселерометры, гироскоп.

Аналоговые сенсоры

Page 5: R0boCamp2016 Михайло Ях'яєв: Використання Arduino для керування роборукою, або як програміст вчився працювати

Как передать цифровые данные?

● Шины аппаратно поддерживаемые Arduino Nano (ATmega328P)○ USART (Serial Port)○ SPI○ I2C

● Другие шины используемые для роботов○ CANBus (ISO-11898)○ RS-422, RS-485 (используется в NAO)○ USB, Ethernet, т.д.

Page 6: R0boCamp2016 Михайло Ях'яєв: Використання Arduino для керування роборукою, або як програміст вчився працювати

USART

● Используется в Arduino Nano для передачи данных через USB○ В том числе для загрузки программ○ Используется для управление роботом с компьютера

USB FTDIFT232RL

ATMEGA328P

Serial

Arduino Nano

Page 7: R0boCamp2016 Михайло Ях'яєв: Використання Arduino для керування роборукою, або як програміст вчився працювати

Шина I2C

● 2 сигнальных провода: SDA (данные) и SCL (частота). ○ 4 провода включая питание (независимо от количества устройств)

● Шина с открытым коллектором○ Устройства "подключают" SDA и SCL только к земле; если никто не

подключает -> +3.3V за счёт резистора○ Нет опасности короткого замыкания○ Можно подключить 3.3V устройство

● Частота: 100kHz, 400kHz○ 1Мhz недостижима для данной задачи○ Ограничена из-за открытого коллектора

GND+3.3VSDASCL

Page 8: R0boCamp2016 Михайло Ях'яєв: Використання Arduino для керування роборукою, або як програміст вчився працювати

Шина SPI

● Push-pull output (двухтактный выход):○ Позволяет более высокую частоту - до 4Mhz на Nano○ Сложно подключать 3.3V устройства; риск коротких замыканий

● 3 линии для данных○ 2 линии для передачи данных: full duplex

■ На практике, не улучшает скорость

○ +1 линия для slave select сигнала для каждого устройства■ Требуют дополнительные контакты микроконтроллера

● Протокол проще чем I2C.

GND+3.3VMISOMOSICLK

SS0SS1

Page 9: R0boCamp2016 Михайло Ях'яєв: Використання Arduino для керування роборукою, або як програміст вчився працювати

Проблемы с I2C и SPI

● Плохо подходят для передачи данных на расстояния○ Приспособлены для использования в пределах одной платы○ Частоту задаёт master: round trip time должно быть меньше

половины цикла.○ Восприимчивость к помехам

■ Можно использовать экранированные кабели

○ Ёмкость кабеля не должна быть слишком большой● Столкнулся с проблемой зависания

○ Идентифицировал как проблемы с I2C○ Поменял провода на экранированные

Clock

Data

Page 10: R0boCamp2016 Михайло Ях'яєв: Використання Arduino для керування роборукою, або як програміст вчився працювати

Дифференциальная передача сигнала● Использует пару проводов

○ Balanced line● Устойчивость к помехам● Большее расстояния● Не поддерживается Arduino и

многими сенсорами напрямую○ Дополнительные чипы

● Протоколы:○ CANBus, RS-422, RS-485○ USB, SATA, Ethernet, т.д.

Page 11: R0boCamp2016 Михайло Ях'яєв: Використання Arduino для керування роборукою, або як програміст вчився працювати

Считывание аналоговых сенсоров

● В Arduino Nano 5 аналоговых входов (всего 7, 2 заняты на I2C)● Больше входов: аналоговый мультиплексор

○ Требует ещё 4 контакта от микроконтроллера○ Можно получить 16 * 5 = 80 входов. Я использую 22.

● Экранированные провода на длинных отрезках

16 входов/выходов

Результат намикроконтроллер

4 контакта задают канал

...

Page 12: R0boCamp2016 Михайло Ях'яєв: Використання Arduino для керування роборукою, або як програміст вчився працювати

Стабильность питания аналоговой системы

Первая версия:

GND

+5V

GND

+5V

Подключил сенсоррасстояния

Значение величины "OUT" Значение величины "OUT"

Page 13: R0boCamp2016 Михайло Ях'яєв: Використання Arduino для керування роборукою, або як програміст вчився працювати

Особенности работы

Потребление токасенсором расстояния:

GND

+5V

GND

+5VСоединение в реальности:

Page 14: R0boCamp2016 Михайло Ях'яєв: Використання Arduino для керування роборукою, або як програміст вчився працювати

Решение №1

GND

+5V

GND

+5VКонденсатор + ограничитель тока

● Значительно уменьшило "колебания" при считывании зачений - практически до нуля

● Немного криво - "изолируем" входное напряжение от "шумного" устройства

Page 15: R0boCamp2016 Михайло Ях'яєв: Використання Arduino для керування роборукою, або як програміст вчився працювати

Решение №2

● Почему бы не получить "стабильное" напряжение самим?● В Arduino есть вход для Reference Voltage - значение аналоговых

сенсоров считаются относительно него.

GND

+5V

GND+5V

Конденсатор

Регуляторнапряжения GND

+4V

● Измеряем напряжение от 0 до 4V (вместо 5)

● Сенсор расстояния всегда выдаёт значение меньше чем 4V

● Изолируем от помех микроконтроллера

Reference Voltage

Page 16: R0boCamp2016 Михайло Ях'яєв: Використання Arduino для керування роборукою, або як програміст вчився працювати

Стабильность питания: выводы

● Отдельный регулятор напряжения для "чувствительных" аналоговых сенсоров○ Результат меньше +5V, но это не проблема○ Нужно также подключить его к Analog Reference - чем стабильнее

там величина напряжения, тем точнее результат● Другие сенсоры тоже могут быть чувствительны к колебаниям

напряжения питания○ Улучшил точность акселерометра заменив регулятор напряжения

Page 17: R0boCamp2016 Михайло Ях'яєв: Використання Arduino для керування роборукою, або як програміст вчився працювати

Считывание позиции сервомотора

● Проблема: можно задать позицию, но не знаем что сервомотор делает дальше:○ Движется ли мотор или уже стоит? Скорость?○ Упёрся-ли робот в препятствие?

● Как считать позицию:○ Приделать переменный резистор или

encoder ○ Подключиться к переменному резистору

который уже есть в сервомоторе

● Поворачивается на заданную позицию и держит её

Page 18: R0boCamp2016 Михайло Ях'яєв: Використання Arduino для керування роборукою, або як програміст вчився працювати

Считывание позиции сервомотора (2)

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

GND на сервомоторе "прыгает"!

GND

+6V

GND на сервомоторе:

Page 19: R0boCamp2016 Михайло Ях'яєв: Використання Arduino для керування роборукою, або як програміст вчився працювати

Операционный усилитель (Оperational Amplifier)

● Усилитель с большим коефициэнтом усиления

● Работает как comparator:○ out=0V когда (+) < (-)○ out=+5V когда (+) > (-)

● Схемы на основе OpAmp:○ Voltage Follower○ Differential Amplifier○ Многие другие

Page 20: R0boCamp2016 Михайло Ях'яєв: Використання Arduino для керування роборукою, або як програміст вчився працювати

Difference Amplifier

● Выдаёт разницу между V+ и V-○ V+/2 = (Vout + V-) / 2 => Vout = V+ - V-

● Резисторы должны быть большими, иначе влияние на входные данные.

GND

+6V

Diff Amp

Page 21: R0boCamp2016 Михайло Ях'яєв: Використання Arduino для керування роборукою, або як програміст вчився працювати

Заключение

● Рассмотрели различные ньюансы связанные с роборукой:○ Цифровые способы передачи данных○ Использование аналоговых мультиплексоров○ Питание для аналоговых сенсоров - стабильность напряжения○ Использование difference amplifier для считывания позиции

сервомотора