Шлюз-контроллер GATE-A8D8M2 — различия между версиями

Материал из roboforum.ru Wiki
Перейти к: навигация, поиск
м (Прошивка шлюз-контроллера)
 
(не показано 26 промежуточных версий 3 участников)
Строка 1: Строка 1:
 +
[[Category:Проекты компонентов|Проекты компонентов]]
 +
'''==========================================================================================================='''
 +
 +
'''ВНИМАНИЕ!!! Проект больше не развивается и не поддерживается, весь функционал переведен в проект [[Open Robotics]]!'''
 +
 +
'''==========================================================================================================='''
 +
 
== Шлюз-контроллер GATE-A8D8M2 версии 0.9 - Применение ==
 
== Шлюз-контроллер GATE-A8D8M2 версии 0.9 - Применение ==
  
Строка 4: Строка 11:
  
 
=== Назначение ===
 
=== Назначение ===
Взаимодействие ПК с низкоуровневыми устройствами (двигателями постоянного тока, модельными сервоприводами, ИК-дальномерами, бамперами, сонарами, компасом и т.п.). Подключение шлюз-контроллера к ПК выполняется через стандартный последовательный COM-порт (скорость 9600Кбит). Исторически этот модуль является развитием модуля [[Шлюз-контроллер GATE-A8D16]] и следствием смены приоритетов разработчика на компактных роботов.
+
Взаимодействие ПК\Ноутбука\КПК с низкоуровневыми устройствами (двигателями постоянного тока, модельными сервоприводами, ИК-дальномерами, бамперами, сонарами, компасом и т.п.). Подключение шлюз-контроллера к ПК выполняется через стандартный последовательный COM-порт (скорость 9600Кбит). Исторически этот модуль является развитием модуля [[Шлюз-контроллер GATE-A8D16]] и следствием смены приоритетов разработчика на компактных роботов. Разумеется допустимо автономное использование контроллера без какой-либо связи с ПК, в этом случае непосредственно программируем его через стандартные средства разработки и прошивки МК. Модуль изначально разрабатывался для использовании в архитектуре [[Open Robotics]].
  
 
=== Основные параметры ===
 
=== Основные параметры ===
Строка 15: Строка 22:
 
* 2 выхода для управления двигателями с обратной связью по сдвоенным энкодерам;
 
* 2 выхода для управления двигателями с обратной связью по сдвоенным энкодерам;
 
* i2c шина (взаимодействие с любыми i2c устройствами с ПК);
 
* i2c шина (взаимодействие с любыми i2c устройствами с ПК);
 +
 +
=== Распиновка разъемов ===
 +
* Программатор - стандартный IDC10 описанный в AVR910;
 +
* i2c шина - 4-пиновый стандартный Devantech (GND,SCL,SDA,VCC);
 +
* uart - 4-пиновый разъем RX (на МК), TX (из МК), GND, VCC;
 +
* enc-1, enc-2 - 4-пиновые разъемы для энкодера (GND, VCC, EN1, EN2);
  
 
=== Формат обмена данными ===
 
=== Формат обмена данными ===
При обмене данными ПК и шлюз-контроллера ПК считается управляющим, а шлюз-контроллер управляемым устройством. Единственное сообщение отсылаемое по инициативе шлюз-контроллера - сообщение "Ready!\n" о готовности выполнять команды при включении, все остальные сообщения шлюз-контроллера являются ответами на команды ПК.
+
При обмене данными ПК и шлюз-контроллера ПК считается управляющим, а шлюз-контроллер управляемым устройством. Единственное сообщение отсылаемое по инициативе шлюз-контроллера - сообщение <code>"Ready!\n"</code> о готовности выполнять команды при включении, все остальные сообщения шлюз-контроллера являются ответами на команды ПК.
  
Команды, отдаваемые ПК все имеют одну и ту же форму "Q{AA}{RR}[{WW}][{WW}][{WW}]", в которой {AA} - адрес, {RR} - сколько байт хотим получить обратно, {WW} - отсылаемые нами байты. Подробнее использование этой универсальной команды расписано ниже:
+
Команды, отдаваемые ПК все имеют одну и ту же форму <code>'''Q'''{AA}{RR}[{WW}*]</code>, в которой '''{AA}''' - адрес, '''{RR}''' - сколько байт хотим получить обратно, '''{WW}*''' - отсылаемые нами байты.
 +
 
 +
Ответ приходит в формате '''R'''[{EE}*], где '''{EE}*''' - байты ответа, которые мы запрашивали. В случае ошибки возвращается '''X'''{EE}{Description}, где '''{EE}''' - код ошибки, а '''{Description}''' - её текстовое описание.
 +
 
 +
Подробнее использование этой универсальной команды расписано ниже:
 
{| class="standard"
 
{| class="standard"
!Команда
+
! Команда
!Формат
+
! Формат
!Входные параметры
+
! Входные параметры
 
|-
 
|-
|Отправить по i2c несколько байт и получить несколько байт в ответ
+
| Отправить по i2c несколько байт и получить несколько байт в ответ
|Qaarr{w}
+
| <code>'''Q'''aarr{w}</code>
|aa - адрес 00h..7Fh устройства на шине i2c
+
|
 
+
* '''aa''' - адрес 00h..7Fh устройства на шине i2c
rr - сколько байт получить от устройства
+
* '''rr''' - сколько байт получить от устройства
 
+
* '''ww''' - байты которые нужно передать устройству
ww - байты которые нужно передать устройству
 
 
|-
 
|-
|Установить режим работы порта ввода-вывода
+
| Установить режим работы порта ввода-вывода
|QFF00ppmm
+
| <code>'''QFF00'''ppmm</code>
|pp - номер порта 00h..0Fh увеличенный на 20h (например, для порта 0Fh это будет 2Fh)
+
|  
 
+
* '''pp''' - номер порта 00h..0Fh увеличенный на 20h (например, для порта 0Fh это будет 2Fh)
mm - режим работы (0 - цифровой вход, 1 - цифровой выход, 2 - управление сервоприводом, 3 - аналоговый вход - последний режим будет работать только для портов в которых есть эта возможность)
+
* '''mm''' - режим работы (0 - цифровой вход, 1 - цифровой выход, 2 - управление сервоприводом, 3 - аналоговый вход - последний режим будет работать только для портов в которых есть эта возможность)
 
|-
 
|-
|Установить значение на выходе порта
+
| Установить значение на выходе порта
|QFF00ppvv
+
| <code>'''QFF00'''ppvv</code>
|pp - номер порта 00h..0Fh
+
|
 
+
* '''pp''' - номер порта 00h..0Fh
vv - значение (для цифровых выходов - 0/1, для управления сервоприводом - 17h..85h
+
* '''vv''' - значение (для цифровых выходов - 0/1, для управления сервоприводом - 17h..85h
 
|-
 
|-
|Получить значение со входа порта
+
| Получить значение со входа порта
|QFF01pp
+
| <code>'''QFF01'''pp</code>
|pp - номер порта 00h..0Fh увеличенный на 80h (например, для порта 0Ch это будет 8Ch)
+
|  
 +
* '''pp''' - номер порта 00h..0Fh увеличенный на 80h (например, для порта 0Ch это будет 8Ch)
  
 
обратно получим 1 байт - 0/1, если цифровой вход, либо 00h..FFh - если аналоговый (00h соответствует 0V, FFh соответствует 5V), либо если тип порта - выход - получим то, что туда отправляли.
 
обратно получим 1 байт - 0/1, если цифровой вход, либо 00h..FFh - если аналоговый (00h соответствует 0V, FFh соответствует 5V), либо если тип порта - выход - получим то, что туда отправляли.
 
|-
 
|-
|Установить направление вращения двигателя
+
| Установить направление вращения двигателя
|QFF00mmdd
+
| <code>'''QFF00'''mmdd</code>
|mm - номер двигателя 00h..01h умноженный на 2 и увеличенный на 10h (например, для двигателя 1 это будет 12h)
+
|  
 +
* '''mm''' - номер двигателя 00h..01h умноженный на 2 и увеличенный на 10h (например, для двигателя 1 это будет 12h)
 +
* '''dd''' - направление вращения 00h - СТОП, 01h - ВПЕРЕД, 02h - НАЗАД
 +
|-
 +
| Установить скорость вращения двигателя
 +
| <code>'''QFF00'''mmss</code>
 +
|
 +
* '''mm''' - номер двигателя 00h..01h умноженный на 2 и увеличенный на 11h (например, для двигателя 1 это будет 13h)
 +
* '''ss''' - скорость от 00h до FFh, в точности соответствует скважности выдаваемого на двигатели ШИМ-сигнала.
 +
|-
 +
| Управление очередью команд для шасси (одновременное управление левым и правым двигателем)
 +
| <code>'''QFF0014'''[ttaabbccdd]*</code>
 +
|
 +
* '''tt''' - время выполнения команды в 1/50 секунды
 +
* '''aa''' - начальная скорость левого колеса;
 +
* '''bb''' - начальная скорость правого колеса;
 +
* '''cc''' - конечная скорость левого колеса;
 +
* '''dd''' - конечная скорость правого колеса;
  
dd - направление вращения 00h - СТОП, 01h - ВПЕРЕД, 02h - НАЗАД
+
Способ задания скорости с направлением - 0x00 - стоим, 0x01..0x7F - малый..полный вперед, 0xFF..0x80 - малый..полный назад.
  
|-
+
Максимально можно отправить одновременно 7 команд (иначе переполнится буфер приёма UART - легко расширить до 15-20 команд).
|Установить скорость вращения двигателя
 
|QFF00mmss
 
|mm - номер двигателя 00h..01h умноженный на 2 и увеличенный на 11h (например, для двигателя 1 это будет 13h)
 
  
ss - скорость от 00h до FFh, в точности соответствует скважности выдаваемого на двигатели ШИМ-сигнала.
+
Если нужно сбросить очередь команд - отправляем просто QFF0014 без команд.
 
|}
 
|}
  
Строка 72: Строка 103:
 
* На плате не предусмотрены подтягивающие резисторы для шины i2c. Так же некритичная ошибка, в следующей версии будет исправлено.
 
* На плате не предусмотрены подтягивающие резисторы для шины i2c. Так же некритичная ошибка, в следующей версии будет исправлено.
 
* Не сделана кнопка сброса. Для планируемых целей не критично, теоретически можно вывести кнопку припаяв пару проводков в соответствующие места платы, в следующей версии будет исправлено.
 
* Не сделана кнопка сброса. Для планируемых целей не критично, теоретически можно вывести кнопку припаяв пару проводков в соответствующие места платы, в следующей версии будет исправлено.
 +
* Дырочки под диоды оказались маловаты, в следующей версии увеличим. Немного напрягающий косяк, но нас спасёт надфиль и немного терпения.
 +
* Выяснил печальные подробности про драйвер двигателей L293 - на нём падение напряжения порядка 1.5В, что довольно неприятно сказывается на его рабочей температуре при хорошем потреблении тока и на том, сколько мощности не попадает на двигатели при малом напряжении питания. Хотя особо это не мешает тем задачам, которые ставились - всё работает, шасси довольно шустро гоняет даже при напряжении питания 4.8В.
  
 
=== Принципиальная схема и печатная плата ===
 
=== Принципиальная схема и печатная плата ===
Доступны к скачке схема и разведенная печатная плата в формате EAGLE (включая подготовленные файлы Gerber и Excellon для производства печатной платы): [[http://www.roboforum.ru/download/file.php?id=4080 Скачать]].
+
Доступны к скачке схема и разведенная печатная плата в формате [[Eagle|EAGLE]] (включая подготовленные файлы Gerber и Excellon для производства печатной платы): [http://www.roboforum.ru/download/file.php?id=4080 Скачать].
  
 
{|border=0
 
{|border=0
Строка 82: Строка 115:
 
|}
 
|}
  
=== Прошивка шлюз-контроллера ===
+
=== Прошивка шлюз-контроллера (актуальная версия) ===
Файл прошивки реализующий указанные выше в протоколе функции работы с двигателями, портами ввода-вывода и шлюза i2c:  
+
Файл прошивки версии 0.60 реализующий указанные выше в протоколе функции работы с двигателями, портами ввода-вывода и шлюза i2c:
* [http://www.roboforum.ru/download/file.php?id=4284 Прошивка].
+
* [http://www.roboforum.ru/download/file.php?id=4488 Прошивка v0.60].
* [http://www.roboforum.ru/download/file.php?id=4285 Исходники] ([[WinAVR]]<ref>Статья в AvrFreaks Wiki: [[avrfreaks:Documentation:AVR_GCC/Winavr|Documentation:AVR_GCC/Winavr]]</ref>).
+
* [http://www.roboforum.ru/download/file.php?id=4489 Исходники v0.60] ([[WinAVR]]<ref>Статья в AvrFreaks Wiki: [[avrfreaks:Documentation:AVR_GCC/Winavr|Documentation:AVR_GCC/Winavr]]</ref>).
 +
 
 +
=== Старые прошивки ===
 +
Прошивка v0.50 - только базовые функции ввода-вывода и управление двигателями по отдельности и без обратной связи:  
 +
* [http://www.roboforum.ru/download/file.php?id=4284 Прошивка - v0.50].
 +
* [http://www.roboforum.ru/download/file.php?id=4285 Исходники - v0.50] ([[WinAVR]]<ref>Статья в AvrFreaks Wiki: [[avrfreaks:Documentation:AVR_GCC/Winavr|Documentation:AVR_GCC/Winavr]]</ref>).
  
 
=== Используемые компоненты ===
 
=== Используемые компоненты ===
* Контроллер ATMEGA16/32/644 в DIP-корпусе - 1 шт;
+
{| class="standard"
* Драйвер двигателей L293D в DIP-корпусе - 1 шт;
+
! Наименование
* Кварц 16МГц - 1 шт (для ATMEGA644 можно 20МГц);
+
! Кол-во
* Диоды шоттки {марка} - 16 шт;
+
|-
* ЧИП-Конденсаторы размера 1206 керамические 27пФ - 2 шт;
+
| Контроллер ATMega16/32/644 <ref>Документация: [http://www.atmel.com/dyn/resources/prod_documents/doc2466.pdf ATMega16], [http://www.atmel.com/dyn/resources/prod_documents/doc2503.pdf ATMega32], [http://www.atmel.com/dyn/resources/prod_documents/doc2593.pdf ATMega644] </ref> в [[w:ru:DIP|DIP корпусе]]
* Конденсаторы 25V, 100мкФ - 2 шт;
+
| 1
* ЧИП-Резисторы размера 1206 на 5.1кОм - 2 шт;
+
|-
* Разъемы штырьковые сдвоенные - общей длиной 20 контактов;
+
| Драйвер двигателей L293D в [[w:ru:DIP|DIP корпусе]]
* Разъемы штырьковые одинарные - общей длиной 34 контактов;
+
| 1
* Разъем IDC10 - 1шт;
+
|-
 +
| Кварц 16МГц<ref>для ATMega644 можно 20МГц</ref>
 +
| 1
 +
|-
 +
| Диоды шоттки 1N5817 или 1N5818 или 1N5819
 +
| 12
 +
|-
 +
| ЧИП-Конденсаторы размера 1206 керамические 27пФ  
 +
| 2
 +
|-
 +
| Конденсаторы 25V, 100мкФ  
 +
| 2
 +
|-
 +
| ЧИП-Резисторы размера 1206 на 5.1кОм  
 +
| 2
 +
|-
 +
| Разъемы штыревые сдвоенные, 20x2 контактов
 +
| 1
 +
|-
 +
| Разъемы штыревые одинарные, 34x2 контактов
 +
| 1
 +
|-
 +
| Разъем IDC10  
 +
| 1
 +
|}
 +
 
 +
== Ссылки ==
 +
<references />

Текущая версия на 08:55, 22 сентября 2009

===========================================================================================================

ВНИМАНИЕ!!! Проект больше не развивается и не поддерживается, весь функционал переведен в проект Open Robotics!

===========================================================================================================

Шлюз-контроллер GATE-A8D8M2 версии 0.9 - Применение

Внешний вид шлюз-контроллера

Назначение

Взаимодействие ПК\Ноутбука\КПК с низкоуровневыми устройствами (двигателями постоянного тока, модельными сервоприводами, ИК-дальномерами, бамперами, сонарами, компасом и т.п.). Подключение шлюз-контроллера к ПК выполняется через стандартный последовательный COM-порт (скорость 9600Кбит). Исторически этот модуль является развитием модуля Шлюз-контроллер GATE-A8D16 и следствием смены приоритетов разработчика на компактных роботов. Разумеется допустимо автономное использование контроллера без какой-либо связи с ПК, в этом случае непосредственно программируем его через стандартные средства разработки и прошивки МК. Модуль изначально разрабатывался для использовании в архитектуре Open Robotics.

Основные параметры

  • Габариты: 64х64мм
  • МК: ATMega16/32/644

Возможности

  • 8 цифровых входов-выходов (доступны 3 режима работы - цифровой вход, цифровой выход, управление сервоприводом);
  • 8 аналоговых входов / цифровых выходов (доступны 4 режима работы - аналоговый вход, цифровой вход, цифровой выход, управление сервоприводом);
  • 2 выхода для управления двигателями с обратной связью по сдвоенным энкодерам;
  • i2c шина (взаимодействие с любыми i2c устройствами с ПК);

Распиновка разъемов

  • Программатор - стандартный IDC10 описанный в AVR910;
  • i2c шина - 4-пиновый стандартный Devantech (GND,SCL,SDA,VCC);
  • uart - 4-пиновый разъем RX (на МК), TX (из МК), GND, VCC;
  • enc-1, enc-2 - 4-пиновые разъемы для энкодера (GND, VCC, EN1, EN2);

Формат обмена данными

При обмене данными ПК и шлюз-контроллера ПК считается управляющим, а шлюз-контроллер управляемым устройством. Единственное сообщение отсылаемое по инициативе шлюз-контроллера - сообщение "Ready!\n" о готовности выполнять команды при включении, все остальные сообщения шлюз-контроллера являются ответами на команды ПК.

Команды, отдаваемые ПК все имеют одну и ту же форму Q{AA}{RR}[{WW}*], в которой {AA} - адрес, {RR} - сколько байт хотим получить обратно, {WW}* - отсылаемые нами байты.

Ответ приходит в формате R[{EE}*], где {EE}* - байты ответа, которые мы запрашивали. В случае ошибки возвращается X{EE}{Description}, где {EE} - код ошибки, а {Description} - её текстовое описание.

Подробнее использование этой универсальной команды расписано ниже:

Команда Формат Входные параметры
Отправить по i2c несколько байт и получить несколько байт в ответ Qaarr{w}
  • aa - адрес 00h..7Fh устройства на шине i2c
  • rr - сколько байт получить от устройства
  • ww - байты которые нужно передать устройству
Установить режим работы порта ввода-вывода QFF00ppmm
  • pp - номер порта 00h..0Fh увеличенный на 20h (например, для порта 0Fh это будет 2Fh)
  • mm - режим работы (0 - цифровой вход, 1 - цифровой выход, 2 - управление сервоприводом, 3 - аналоговый вход - последний режим будет работать только для портов в которых есть эта возможность)
Установить значение на выходе порта QFF00ppvv
  • pp - номер порта 00h..0Fh
  • vv - значение (для цифровых выходов - 0/1, для управления сервоприводом - 17h..85h
Получить значение со входа порта QFF01pp
  • pp - номер порта 00h..0Fh увеличенный на 80h (например, для порта 0Ch это будет 8Ch)

обратно получим 1 байт - 0/1, если цифровой вход, либо 00h..FFh - если аналоговый (00h соответствует 0V, FFh соответствует 5V), либо если тип порта - выход - получим то, что туда отправляли.

Установить направление вращения двигателя QFF00mmdd
  • mm - номер двигателя 00h..01h умноженный на 2 и увеличенный на 10h (например, для двигателя 1 это будет 12h)
  • dd - направление вращения 00h - СТОП, 01h - ВПЕРЕД, 02h - НАЗАД
Установить скорость вращения двигателя QFF00mmss
  • mm - номер двигателя 00h..01h умноженный на 2 и увеличенный на 11h (например, для двигателя 1 это будет 13h)
  • ss - скорость от 00h до FFh, в точности соответствует скважности выдаваемого на двигатели ШИМ-сигнала.
Управление очередью команд для шасси (одновременное управление левым и правым двигателем) QFF0014[ttaabbccdd]*
  • tt - время выполнения команды в 1/50 секунды
  • aa - начальная скорость левого колеса;
  • bb - начальная скорость правого колеса;
  • cc - конечная скорость левого колеса;
  • dd - конечная скорость правого колеса;

Способ задания скорости с направлением - 0x00 - стоим, 0x01..0x7F - малый..полный вперед, 0xFF..0x80 - малый..полный назад.

Максимально можно отправить одновременно 7 команд (иначе переполнится буфер приёма UART - легко расширить до 15-20 команд).

Если нужно сбросить очередь команд - отправляем просто QFF0014 без команд.

Шлюз-контроллер GATE-A8D8M2 версии 0.9 - Внутреннее устройство

Недостатки модуля

К основным недостаткам можно отнести:

  • Допущенная ошибка при разработке печатной платы - пропущена дорожка, поэтому при пайке требуется на обратной стороне платы припаивать перемычку длиной 5мм. Абсолютно некритичная ошибка, в следующей версии будет исправлено.
  • На плате не предусмотрены подтягивающие резисторы для шины i2c. Так же некритичная ошибка, в следующей версии будет исправлено.
  • Не сделана кнопка сброса. Для планируемых целей не критично, теоретически можно вывести кнопку припаяв пару проводков в соответствующие места платы, в следующей версии будет исправлено.
  • Дырочки под диоды оказались маловаты, в следующей версии увеличим. Немного напрягающий косяк, но нас спасёт надфиль и немного терпения.
  • Выяснил печальные подробности про драйвер двигателей L293 - на нём падение напряжения порядка 1.5В, что довольно неприятно сказывается на его рабочей температуре при хорошем потреблении тока и на том, сколько мощности не попадает на двигатели при малом напряжении питания. Хотя особо это не мешает тем задачам, которые ставились - всё работает, шасси довольно шустро гоняет даже при напряжении питания 4.8В.

Принципиальная схема и печатная плата

Доступны к скачке схема и разведенная печатная плата в формате EAGLE (включая подготовленные файлы Gerber и Excellon для производства печатной платы): Скачать.

Принципиальная схема (25Кб)
Разводка печатной платы (70Кб)
Готовая печатная плата (104Кб)

Прошивка шлюз-контроллера (актуальная версия)

Файл прошивки версии 0.60 реализующий указанные выше в протоколе функции работы с двигателями, портами ввода-вывода и шлюза i2c:

Старые прошивки

Прошивка v0.50 - только базовые функции ввода-вывода и управление двигателями по отдельности и без обратной связи:

Используемые компоненты

Наименование Кол-во
Контроллер ATMega16/32/644 [3] в DIP корпусе 1
Драйвер двигателей L293D в DIP корпусе 1
Кварц 16МГц[4] 1
Диоды шоттки 1N5817 или 1N5818 или 1N5819 12
ЧИП-Конденсаторы размера 1206 керамические 27пФ 2
Конденсаторы 25V, 100мкФ 2
ЧИП-Резисторы размера 1206 на 5.1кОм 2
Разъемы штыревые сдвоенные, 20x2 контактов 1
Разъемы штыревые одинарные, 34x2 контактов 1
Разъем IDC10 1

Ссылки

  1. Статья в AvrFreaks Wiki: Documentation:AVR_GCC/Winavr
  2. Статья в AvrFreaks Wiki: Documentation:AVR_GCC/Winavr
  3. Документация: ATMega16, ATMega32, ATMega644
  4. для ATMega644 можно 20МГц