Upload
lviv-startup-club
View
69
Download
1
Embed Size (px)
Citation preview
Использование Arduino для управления роборукой
Михаил Яхъяев
Demo● Небольшая
роборука
● Сделана для экспериментов с Artificial Intelligence
● Собрана из набора Lynxmotion AL5D
● Использовал Arduino; добавил сенсоры
Цели Доклада
● Поделиться опытом● Рассказать об интересных аспектах архитектуры● Рассказать о технических проблемах и решениях● Технологии имеющие отношение к проекту● Рассказать с точки зрения software разработчика который решил
поработать с hardware
Общая архитектура
...Сервомоторы Питание +6V
Шина I2CАкселерометры, гироскоп.
Аналоговые сенсоры
Как передать цифровые данные?
● Шины аппаратно поддерживаемые Arduino Nano (ATmega328P)○ USART (Serial Port)○ SPI○ I2C
● Другие шины используемые для роботов○ CANBus (ISO-11898)○ RS-422, RS-485 (используется в NAO)○ USB, Ethernet, т.д.
USART
● Используется в Arduino Nano для передачи данных через USB○ В том числе для загрузки программ○ Используется для управление роботом с компьютера
USB FTDIFT232RL
ATMEGA328P
Serial
Arduino Nano
Шина I2C
● 2 сигнальных провода: SDA (данные) и SCL (частота). ○ 4 провода включая питание (независимо от количества устройств)
● Шина с открытым коллектором○ Устройства "подключают" SDA и SCL только к земле; если никто не
подключает -> +3.3V за счёт резистора○ Нет опасности короткого замыкания○ Можно подключить 3.3V устройство
● Частота: 100kHz, 400kHz○ 1Мhz недостижима для данной задачи○ Ограничена из-за открытого коллектора
GND+3.3VSDASCL
Шина SPI
● Push-pull output (двухтактный выход):○ Позволяет более высокую частоту - до 4Mhz на Nano○ Сложно подключать 3.3V устройства; риск коротких замыканий
● 3 линии для данных○ 2 линии для передачи данных: full duplex
■ На практике, не улучшает скорость
○ +1 линия для slave select сигнала для каждого устройства■ Требуют дополнительные контакты микроконтроллера
● Протокол проще чем I2C.
GND+3.3VMISOMOSICLK
SS0SS1
Проблемы с I2C и SPI
● Плохо подходят для передачи данных на расстояния○ Приспособлены для использования в пределах одной платы○ Частоту задаёт master: round trip time должно быть меньше
половины цикла.○ Восприимчивость к помехам
■ Можно использовать экранированные кабели
○ Ёмкость кабеля не должна быть слишком большой● Столкнулся с проблемой зависания
○ Идентифицировал как проблемы с I2C○ Поменял провода на экранированные
Clock
Data
Дифференциальная передача сигнала● Использует пару проводов
○ Balanced line● Устойчивость к помехам● Большее расстояния● Не поддерживается Arduino и
многими сенсорами напрямую○ Дополнительные чипы
● Протоколы:○ CANBus, RS-422, RS-485○ USB, SATA, Ethernet, т.д.
Считывание аналоговых сенсоров
● В Arduino Nano 5 аналоговых входов (всего 7, 2 заняты на I2C)● Больше входов: аналоговый мультиплексор
○ Требует ещё 4 контакта от микроконтроллера○ Можно получить 16 * 5 = 80 входов. Я использую 22.
● Экранированные провода на длинных отрезках
16 входов/выходов
Результат намикроконтроллер
4 контакта задают канал
...
Стабильность питания аналоговой системы
Первая версия:
GND
+5V
GND
+5V
Подключил сенсоррасстояния
Значение величины "OUT" Значение величины "OUT"
Особенности работы
Потребление токасенсором расстояния:
GND
+5V
GND
+5VСоединение в реальности:
Решение №1
GND
+5V
GND
+5VКонденсатор + ограничитель тока
● Значительно уменьшило "колебания" при считывании зачений - практически до нуля
● Немного криво - "изолируем" входное напряжение от "шумного" устройства
Решение №2
● Почему бы не получить "стабильное" напряжение самим?● В Arduino есть вход для Reference Voltage - значение аналоговых
сенсоров считаются относительно него.
GND
+5V
GND+5V
Конденсатор
Регуляторнапряжения GND
+4V
● Измеряем напряжение от 0 до 4V (вместо 5)
● Сенсор расстояния всегда выдаёт значение меньше чем 4V
● Изолируем от помех микроконтроллера
Reference Voltage
Стабильность питания: выводы
● Отдельный регулятор напряжения для "чувствительных" аналоговых сенсоров○ Результат меньше +5V, но это не проблема○ Нужно также подключить его к Analog Reference - чем стабильнее
там величина напряжения, тем точнее результат● Другие сенсоры тоже могут быть чувствительны к колебаниям
напряжения питания○ Улучшил точность акселерометра заменив регулятор напряжения
Считывание позиции сервомотора
● Проблема: можно задать позицию, но не знаем что сервомотор делает дальше:○ Движется ли мотор или уже стоит? Скорость?○ Упёрся-ли робот в препятствие?
● Как считать позицию:○ Приделать переменный резистор или
encoder ○ Подключиться к переменному резистору
который уже есть в сервомоторе
● Поворачивается на заданную позицию и держит её
Считывание позиции сервомотора (2)
Подключаем резистор к аналоговому входу: позиция считывается, но ...
GND на сервомоторе "прыгает"!
GND
+6V
GND на сервомоторе:
Операционный усилитель (Оperational Amplifier)
● Усилитель с большим коефициэнтом усиления
● Работает как comparator:○ out=0V когда (+) < (-)○ out=+5V когда (+) > (-)
● Схемы на основе OpAmp:○ Voltage Follower○ Differential Amplifier○ Многие другие
Difference Amplifier
● Выдаёт разницу между V+ и V-○ V+/2 = (Vout + V-) / 2 => Vout = V+ - V-
● Резисторы должны быть большими, иначе влияние на входные данные.
GND
+6V
Diff Amp
Заключение
● Рассмотрели различные ньюансы связанные с роборукой:○ Цифровые способы передачи данных○ Использование аналоговых мультиплексоров○ Питание для аналоговых сенсоров - стабильность напряжения○ Использование difference amplifier для считывания позиции
сервомотора