ORFA — различия между версиями

Материал из roboforum.ru Wiki
Перейти к: навигация, поиск
(Структура и взаимодействие модулей в варианте с модулем uart->i2t:)
м (wikify)
Строка 1: Строка 1:
 
[[Категория:Open Robotics]]
 
[[Категория:Open Robotics]]
  
ORFA (Open Robotics Firmware Architecture) это модульная архитектура для прошивок контроллеров семейства [[Open Robotics]]. Архитектура и первые совместимые с ней прошивки сейчас находятся в разработке.
+
ORFA (Open Robotics Firmware Architecture) — это модульная архитектура для прошивок контроллеров семейства [[Open Robotics]]. Архитектура и первые совместимые с ней прошивки сейчас находятся в разработке.
  
 
== Введение ==
 
== Введение ==
Строка 11: Строка 11:
 
На данный момент поддерживаются только микроконтроллеры семейства AVR ATMega.
 
На данный момент поддерживаются только микроконтроллеры семейства AVR ATMega.
  
Текущая версия состоит из монолитного шлюза [[w:UART|UART]]->[[w:i2c|I<sup>2</sup>C]]
+
Текущая версия состоит из монолитного шлюза [[w:UART|UART]]->[[w:i2c|I²C]]
и модульного виртуального подчиненного устройства на шине I<sup>2</sup>C.
+
и модульного виртуального подчиненного устройства на шине I²C.
  
 
При таком подходе ПК обращается к блокам МК как и к любым другим устройствам на шине i2c, что дает унификацию.
 
При таком подходе ПК обращается к блокам МК как и к любым другим устройствам на шине i2c, что дает унификацию.
 
А при незначительной модификации виртуального слейва можно сделать прошивку для второго контроллера, уже не являющегося шлюзом, управляемого через i2c.
 
А при незначительной модификации виртуального слейва можно сделать прошивку для второго контроллера, уже не являющегося шлюзом, управляемого через i2c.
  
Т.е. можно достаточно малой кровью получить хорошо расширяемую систему.
+
То есть можно достаточно малой кровью получить хорошо расширяемую систему.
  
 
[[Файл:or-ser-i2c-i2c.svg]]
 
[[Файл:or-ser-i2c-i2c.svg]]
  
Взаимодействие модулей подчиненного устройсва основано на регистровой модели,  
+
Взаимодействие модулей подчиненного устройсва основано на регистровой модели,
т.е. каждый драйвер устройства связан с определенным набором адресов ячеек.
+
то есть каждый драйвер устройства связан с определенным набором адресов ячеек.
  
====Структура и взаимодействие модулей в варианте с модулем uart->i2с:====
+
==== Структура и взаимодействие модулей в варианте с модулем uart->i2с: ====
 
[[Файл:or-gate-ser.svg]]
 
[[Файл:or-gate-ser.svg]]
  
====Структура и взаимодействие модулей в варианте только i2c slave:====
+
==== Структура и взаимодействие модулей в варианте только i2c slave: ====
 
[[Файл:or-gate-i2c.svg]]
 
[[Файл:or-gate-i2c.svg]]
  
== Команды UART->I<sup>2</sup>C ==
+
== Команды UART->I²C ==
 
Все команды текстовые, перевод строки означает окончание команды, запуск на исполнение.
 
Все команды текстовые, перевод строки означает окончание команды, запуск на исполнение.
  
Строка 55: Строка 55:
 
|<code>L<addr></code>
 
|<code>L<addr></code>
 
|
 
|
* addr — uint8
+
* addr — uint8
 
|-
 
|-
 
|Set bus speed (freq)
 
|Set bus speed (freq)
Строка 61: Строка 61:
 
|<code>C<freq></code>
 
|<code>C<freq></code>
 
|
 
|
* freq — uint16
+
* freq — uint16
 
|-
 
|-
 
|Read register
 
|Read register
Строка 67: Строка 67:
 
|<code>SWASR<rdata>P</code>
 
|<code>SWASR<rdata>P</code>
 
|
 
|
* addr — uint8
+
* addr — uint8
* reg — uint8
+
* reg — uint8
* len — uint8, default 1
+
* len — uint8, default 1
* rdata — uint8 array
+
* rdata — uint8 array
 
|-
 
|-
 
|Write register
 
|Write register
Строка 76: Строка 76:
 
|<code>SWA(A)+P</code>
 
|<code>SWA(A)+P</code>
 
|
 
|
* addr — uint8
+
* addr — uint8
* reg — uint8
+
* reg — uint8
 
A = Ack
 
A = Ack
 
|-
 
|-
Строка 94: Строка 94:
 
* <code>(\1|\2)+P</code>
 
* <code>(\1|\2)+P</code>
 
|
 
|
* adr+w — uint8, &0xfe
+
* adr+w — uint8, &0xfe
* adr+r — uint8, |0x01
+
* adr+r — uint8, |0x01
* len — uint8
+
* len — uint8
* data — uint8 array
+
* data — uint8 array
* rdata — uint8 array
+
* rdata — uint8 array
 
|}
 
|}
  
Строка 126: Строка 126:
 
  > SWAAP
 
  > SWAAP
  
Послать по шине I<sup>2</sup>C строку на I2C дисплей (адрес 0x40):
+
Послать по шине I²C строку на I2C дисплей (адрес 0x40):
  
 
  < W 40 \s\t\r\i\n\g
 
  < W 40 \s\t\r\i\n\g
Строка 136: Строка 136:
 
  > SWAAAAAAP
 
  > SWAAAAAAP
  
== Возможности подчиненного I<sup>2</sup>C устройства ==
+
== Возможности подчиненного I²C устройства ==
 
В случае использования <code>libserialgate.a</code> это внутреннее логическое устройство, его адрес задается командой <code>L<aa></code>.
 
В случае использования <code>libserialgate.a</code> это внутреннее логическое устройство, его адрес задается командой <code>L<aa></code>.
  
Строка 146: Строка 146:
 
Пример работы с драйвером можно посмотреть в модуле [http://hg.vehq.ru/pyor/file/tip/pyor/introspection.py#l1 pyor.introspection]
 
Пример работы с драйвером можно посмотреть в модуле [http://hg.vehq.ru/pyor/file/tip/pyor/introspection.py#l1 pyor.introspection]
  
Типы запросов (регистр, данные...):
+
Типы запросов (регистр, данные…):
# <code>00 00</code> запросить количество драйверов, нужно прочитать 1 байт
+
# <code>00 00</code> — запросить количество драйверов, нужно прочитать 1 байт
# <code>00 nn</code> запросить информацию о драйвере nn, нужно прочитать 6 байт
+
# <code>00 nn</code> — запросить информацию о драйвере nn, нужно прочитать 6 байт
  
 
Структура информации запроса 2:
 
Структура информации запроса 2:
Строка 160: Строка 160:
 
|Уникальный идентификатор драйвера.
 
|Уникальный идентификатор драйвера.
  
Может быть получен у команды проекта "Open Robotics". [[ORFA - Выданные идентификаторы UID|Таблица уже выданных идентификаторов]].
+
Может быть получен у команды проекта «Open Robotics». [[ORFA - Выданные идентификаторы UID|Таблица уже выданных идентификаторов]].
  
 
Для личного использования зарезервирован диапазон адресов с первым байтом 0xFF.
 
Для личного использования зарезервирован диапазон адресов с первым байтом 0xFF.
Строка 180: Строка 180:
 
|Количество регистров
 
|Количество регистров
  
Т.е. все регистры драйвера это интервал <code>(Start Register)..(Start Register + Count of registers - 1)</code>
+
То есть все регистры драйвера это интервал <code>(Start Register)..(Start Register + Count of registers - 1)</code>
 
|}
 
|}
  
Строка 194: Строка 194:
 
== План работ ==
 
== План работ ==
 
# Решение общих вопросов;
 
# Решение общих вопросов;
## Структура ядра - Y;
+
## Структура ядра — Y;
## Средства интроспекции набора драйверов - Y;
+
## Средства интроспекции набора драйверов — Y;
## Средства интроспекции набора RoboGPIO портов - ?;
+
## Средства интроспекции набора RoboGPIO портов — ?;
 
# Драйвера для OR-AVR-M32-D
 
# Драйвера для OR-AVR-M32-D
## GPIO (цифровые входы/выходы) - Y;
+
## GPIO (цифровые входы/выходы) — Y;
 
## Servo (управление модельными сервоприводами)
 
## Servo (управление модельными сервоприводами)
 
## ADC (АЦП)
 
## ADC (АЦП)
## SPI - Y;
+
## SPI — Y;
## RoboMD2 (Управление шасси на 2 моторах) - Y;
+
## RoboMD2 (Управление шасси на 2 моторах) — Y;
 
## CapSensor (Работа с ёмкостными сенсорами, типа датчика цвета поверхности)
 
## CapSensor (Работа с ёмкостными сенсорами, типа датчика цвета поверхности)
 
# Драйвера для OR-AVR-M64-S
 
# Драйвера для OR-AVR-M64-S
## GPIO (цифровые входы/выходы) - Y;
+
## GPIO (цифровые входы/выходы) — Y;
 
## Servo (управление модельными сервоприводами)
 
## Servo (управление модельными сервоприводами)
 
## ADC (АЦП)
 
## ADC (АЦП)
## SPI - Y;
+
## SPI — Y;
 
## CapSensor (Работа с ёмкостными сенсорами, типа датчика цвета поверхности)
 
## CapSensor (Работа с ёмкостными сенсорами, типа датчика цвета поверхности)
 
# Драйвера для OR-AVR-M168-DX
 
# Драйвера для OR-AVR-M168-DX

Версия 08:03, 3 июня 2009


ORFA (Open Robotics Firmware Architecture) — это модульная архитектура для прошивок контроллеров семейства Open Robotics. Архитектура и первые совместимые с ней прошивки сейчас находятся в разработке.

Введение

Зачем нужна эта архитектура, какие задачи она решает:

  1. Единый формат обращения к любым устройствам низкого уровня, использованным в составе робота. В качестве такого формата принят протокол i2c. Это сделано для того, чтобы прозрачно интегрировать в систему уже имеющиеся устройства для шины i2c (компасы, гироскопы, акселерометры, УЗ-дальномеры и другие).
  2. Возможность быстрой сборки прошивки для каждого контроллера как в варианте OR-шлюз-контроллера, так и в варианте подчиненного контроллера на шине RoboBus[I2C].

Описание

На данный момент поддерживаются только микроконтроллеры семейства AVR ATMega.

Текущая версия состоит из монолитного шлюза UART->I²C и модульного виртуального подчиненного устройства на шине I²C.

При таком подходе ПК обращается к блокам МК как и к любым другим устройствам на шине i2c, что дает унификацию. А при незначительной модификации виртуального слейва можно сделать прошивку для второго контроллера, уже не являющегося шлюзом, управляемого через i2c.

То есть можно достаточно малой кровью получить хорошо расширяемую систему.

Or-ser-i2c-i2c.svg

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

Структура и взаимодействие модулей в варианте с модулем uart->i2с:

Or-gate-ser.svg

Структура и взаимодействие модулей в варианте только i2c slave:

Or-gate-i2c.svg

Команды UART->I²C

Все команды текстовые, перевод строки означает окончание команды, запуск на исполнение.

Реализуется библиотекой libserialgate.a

Название Запрос Ответ Комментарий
Get protocol version V V1.0
Clear I2C bus X X
Set local address L<addr> L<addr>
  • addr — uint8
Set bus speed (freq) C<freq> C<freq>
  • freq — uint16
Read register R<addr><reg>[<len>] SWASR<rdata>P
  • addr — uint8
  • reg — uint8
  • len — uint8, default 1
  • rdata — uint8 array
Write register W<addr><reg> SWA(A)+P
  • addr — uint8
  • reg — uint8

A = Ack

I2C request
  1. S<adr+w>
  2. S<adr+r><len>
  • \1P
  • \2P
  • (\1|\2)+P
  1. SW(A)+
  2. SR<rdata>
  • \1P
  • \2P
  • (\1|\2)+P
  • adr+w — uint8, &0xfe
  • adr+r — uint8, |0x01
  • len — uint8
  • data — uint8 array
  • rdata — uint8 array

Примеры

Инициализировать устройство:

< V
> V1.0
< L20
> L20
< C0064
> C0064
< X
> X

Запросить кол-во драйверов (см драйвер интроспекции) и информацию о первом драйвере:

< S 20 00 00 S 21 01 P
> SWAASR04P
< S 20 00 01 S 21 06 P
> SWAASR002001000108P

Записать в ячейку PWM1 0x60 (в примере адрес регистра PWM1 равен 0x40, в реальном устройстве сначало нужно получить информацию, см пример выше):

< W 20 40 60
> SWAAP

Послать по шине I²C строку на I2C дисплей (адрес 0x40):

< W 40 \s\t\r\i\n\g
> SWAAAAAAP

или

< S 40 \s\t\r\i\n\g P
> SWAAAAAAP

Возможности подчиненного I²C устройства

В случае использования libserialgate.a это внутреннее логическое устройство, его адрес задается командой L<aa>.

Возможности зависят от конкретного набора драйверов собранных в прошивку этого контроллера, но интерфейс для простой интроспекции драйверов, есть всегда.

Интроспекция драйверов

Реализовано с помощью специального драйвера в ядре, который закреплен на регистре 0x00.

Пример работы с драйвером можно посмотреть в модуле pyor.introspection

Типы запросов (регистр, данные…):

  1. 00 00 — запросить количество драйверов, нужно прочитать 1 байт
  2. 00 nn — запросить информацию о драйвере nn, нужно прочитать 6 байт

Структура информации запроса 2:

Байт Название Комментарий
0, 1 UID Уникальный идентификатор драйвера.

Может быть получен у команды проекта «Open Robotics». Таблица уже выданных идентификаторов.

Для личного использования зарезервирован диапазон адресов с первым байтом 0xFF.

2 Major Version Старший номер версии
3 Minor Version Младший номер версии
4 Start Register Номер начального регистра
5 Count of registers Количество регистров

То есть все регистры драйвера это интервал (Start Register)..(Start Register + Count of registers - 1)

Установка

  1. Сделать клон репозитария hg clone http://hg.vehq.ru/orfa
    либо скачать архив с исходными кодами здесь: http://hg.vehq.ru/orfa
  2. make (для модуля OR-AVR-M32-D, OR-AVR-M168-DX пока не поддерживается)
  3. make program (если вы используете AVR Dragon)
  4. make orfa.hex (если на выходе нужно получить .hex-файл)

План работ

  1. Решение общих вопросов;
    1. Структура ядра — Y;
    2. Средства интроспекции набора драйверов — Y;
    3. Средства интроспекции набора RoboGPIO портов — ?;
  2. Драйвера для OR-AVR-M32-D
    1. GPIO (цифровые входы/выходы) — Y;
    2. Servo (управление модельными сервоприводами)
    3. ADC (АЦП)
    4. SPI — Y;
    5. RoboMD2 (Управление шасси на 2 моторах) — Y;
    6. CapSensor (Работа с ёмкостными сенсорами, типа датчика цвета поверхности)
  3. Драйвера для OR-AVR-M64-S
    1. GPIO (цифровые входы/выходы) — Y;
    2. Servo (управление модельными сервоприводами)
    3. ADC (АЦП)
    4. SPI — Y;
    5. CapSensor (Работа с ёмкостными сенсорами, типа датчика цвета поверхности)
  4. Драйвера для OR-AVR-M168-DX
    1. GPIO (цифровые входы/выходы)
    2. Servo (управление модельными сервоприводами)
    3. ADC (АЦП)
    4. RoboMD2 (Управление шасси на 2 моторах)
    5. CapSensor (Работа с ёмкостными сенсорами, типа датчика цвета поверхности)