ORFA — различия между версиями
=DeaD= (обсуждение | вклад) (→Структура и взаимодействие модулей в варианте с модулем uart->i2t:) |
Vooon (обсуждение | вклад) м (wikify) |
||
Строка 1: | Строка 1: | ||
[[Категория:Open Robotics]] | [[Категория:Open Robotics]] | ||
− | ORFA (Open Robotics Firmware Architecture) | + | ORFA (Open Robotics Firmware Architecture) — это модульная архитектура для прошивок контроллеров семейства [[Open Robotics]]. Архитектура и первые совместимые с ней прошивки сейчас находятся в разработке. |
== Введение == | == Введение == | ||
Строка 11: | Строка 11: | ||
На данный момент поддерживаются только микроконтроллеры семейства AVR ATMega. | На данный момент поддерживаются только микроконтроллеры семейства AVR ATMega. | ||
− | Текущая версия состоит из монолитного шлюза [[w:UART|UART]]->[[w:i2c| | + | Текущая версия состоит из монолитного шлюза [[w:UART|UART]]->[[w:i2c|I²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-> | + | == Команды UART->I²C == |
Все команды текстовые, перевод строки означает окончание команды, запуск на исполнение. | Все команды текстовые, перевод строки означает окончание команды, запуск на исполнение. | ||
Строка 55: | Строка 55: | ||
|<code>L<addr></code> | |<code>L<addr></code> | ||
| | | | ||
− | * | + | * addr — uint8 |
|- | |- | ||
|Set bus speed (freq) | |Set bus speed (freq) | ||
Строка 61: | Строка 61: | ||
|<code>C<freq></code> | |<code>C<freq></code> | ||
| | | | ||
− | * | + | * freq — uint16 |
|- | |- | ||
|Read register | |Read register | ||
Строка 67: | Строка 67: | ||
|<code>SWASR<rdata>P</code> | |<code>SWASR<rdata>P</code> | ||
| | | | ||
− | * | + | * addr — uint8 |
− | * | + | * reg — uint8 |
− | * | + | * len — uint8, default 1 |
− | * | + | * rdata — uint8 array |
|- | |- | ||
|Write register | |Write register | ||
Строка 76: | Строка 76: | ||
|<code>SWA(A)+P</code> | |<code>SWA(A)+P</code> | ||
| | | | ||
− | * | + | * addr — uint8 |
− | * | + | * reg — uint8 |
A = Ack | A = Ack | ||
|- | |- | ||
Строка 94: | Строка 94: | ||
* <code>(\1|\2)+P</code> | * <code>(\1|\2)+P</code> | ||
| | | | ||
− | * adr+ | + | * adr+w — uint8, &0xfe |
− | * adr+ | + | * adr+r — uint8, |0x01 |
− | * | + | * len — uint8 |
− | * | + | * data — uint8 array |
− | * | + | * rdata — uint8 array |
|} | |} | ||
Строка 126: | Строка 126: | ||
> SWAAP | > SWAAP | ||
− | Послать по шине | + | Послать по шине 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²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> | + | # <code>00 00</code> — запросить количество драйверов, нужно прочитать 1 байт |
− | # <code>00 nn</code> | + | # <code>00 nn</code> — запросить информацию о драйвере nn, нужно прочитать 6 байт |
Структура информации запроса 2: | Структура информации запроса 2: | ||
Строка 160: | Строка 160: | ||
|Уникальный идентификатор драйвера. | |Уникальный идентификатор драйвера. | ||
− | Может быть получен у команды проекта | + | Может быть получен у команды проекта «Open Robotics». [[ORFA - Выданные идентификаторы UID|Таблица уже выданных идентификаторов]]. |
Для личного использования зарезервирован диапазон адресов с первым байтом 0xFF. | Для личного использования зарезервирован диапазон адресов с первым байтом 0xFF. | ||
Строка 180: | Строка 180: | ||
|Количество регистров | |Количество регистров | ||
− | + | То есть все регистры драйвера это интервал <code>(Start Register)..(Start Register + Count of registers - 1)</code> | |
|} | |} | ||
Строка 194: | Строка 194: | ||
== План работ == | == План работ == | ||
# Решение общих вопросов; | # Решение общих вопросов; | ||
− | ## Структура | + | ## Структура ядра — Y; |
− | ## Средства интроспекции набора | + | ## Средства интроспекции набора драйверов — Y; |
− | ## Средства интроспекции набора RoboGPIO | + | ## Средства интроспекции набора RoboGPIO портов — ?; |
# Драйвера для OR-AVR-M32-D | # Драйвера для OR-AVR-M32-D | ||
− | ## GPIO (цифровые входы/выходы) | + | ## GPIO (цифровые входы/выходы) — Y; |
## Servo (управление модельными сервоприводами) | ## Servo (управление модельными сервоприводами) | ||
## ADC (АЦП) | ## ADC (АЦП) | ||
− | ## | + | ## SPI — Y; |
− | ## RoboMD2 (Управление шасси на 2 моторах) | + | ## RoboMD2 (Управление шасси на 2 моторах) — Y; |
## CapSensor (Работа с ёмкостными сенсорами, типа датчика цвета поверхности) | ## CapSensor (Работа с ёмкостными сенсорами, типа датчика цвета поверхности) | ||
# Драйвера для OR-AVR-M64-S | # Драйвера для OR-AVR-M64-S | ||
− | ## GPIO (цифровые входы/выходы) | + | ## GPIO (цифровые входы/выходы) — Y; |
## Servo (управление модельными сервоприводами) | ## Servo (управление модельными сервоприводами) | ||
## ADC (АЦП) | ## ADC (АЦП) | ||
− | ## | + | ## SPI — Y; |
## CapSensor (Работа с ёмкостными сенсорами, типа датчика цвета поверхности) | ## CapSensor (Работа с ёмкостными сенсорами, типа датчика цвета поверхности) | ||
# Драйвера для OR-AVR-M168-DX | # Драйвера для OR-AVR-M168-DX |
Версия 08:03, 3 июня 2009
ORFA (Open Robotics Firmware Architecture) — это модульная архитектура для прошивок контроллеров семейства Open Robotics. Архитектура и первые совместимые с ней прошивки сейчас находятся в разработке.
Содержание
Введение
Зачем нужна эта архитектура, какие задачи она решает:
- Единый формат обращения к любым устройствам низкого уровня, использованным в составе робота. В качестве такого формата принят протокол i2c. Это сделано для того, чтобы прозрачно интегрировать в систему уже имеющиеся устройства для шины i2c (компасы, гироскопы, акселерометры, УЗ-дальномеры и другие).
- Возможность быстрой сборки прошивки для каждого контроллера как в варианте OR-шлюз-контроллера, так и в варианте подчиненного контроллера на шине RoboBus[I2C].
Описание
На данный момент поддерживаются только микроконтроллеры семейства AVR ATMega.
Текущая версия состоит из монолитного шлюза UART->I²C и модульного виртуального подчиненного устройства на шине I²C.
При таком подходе ПК обращается к блокам МК как и к любым другим устройствам на шине i2c, что дает унификацию. А при незначительной модификации виртуального слейва можно сделать прошивку для второго контроллера, уже не являющегося шлюзом, управляемого через i2c.
То есть можно достаточно малой кровью получить хорошо расширяемую систему.
Взаимодействие модулей подчиненного устройсва основано на регистровой модели, то есть каждый драйвер устройства связан с определенным набором адресов ячеек.
Структура и взаимодействие модулей в варианте с модулем uart->i2с:
Структура и взаимодействие модулей в варианте только i2c slave:
Команды UART->I²C
Все команды текстовые, перевод строки означает окончание команды, запуск на исполнение.
Реализуется библиотекой libserialgate.a
Название | Запрос | Ответ | Комментарий |
---|---|---|---|
Get protocol version | V
|
V1.0
|
|
Clear I2C bus | X
|
X
|
|
Set local address | L<addr>
|
L<addr>
|
|
Set bus speed (freq) | C<freq>
|
C<freq>
|
|
Read register | R<addr><reg>[<len>]
|
SWASR<rdata>P
|
|
Write register | W<addr><reg>
|
SWA(A)+P
|
A = Ack |
I2C request |
|
|
|
Примеры
Инициализировать устройство:
< 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
Типы запросов (регистр, данные…):
00 00
— запросить количество драйверов, нужно прочитать 1 байт00 nn
— запросить информацию о драйвере nn, нужно прочитать 6 байт
Структура информации запроса 2:
Байт | Название | Комментарий |
---|---|---|
0, 1 | UID | Уникальный идентификатор драйвера.
Может быть получен у команды проекта «Open Robotics». Таблица уже выданных идентификаторов. Для личного использования зарезервирован диапазон адресов с первым байтом 0xFF. |
2 | Major Version | Старший номер версии |
3 | Minor Version | Младший номер версии |
4 | Start Register | Номер начального регистра |
5 | Count of registers | Количество регистров
То есть все регистры драйвера это интервал |
Установка
- Репозиторий исходных кодов: http://hg.vehq.ru/orfa
- Лицензия: MIT
- Сделать клон репозитария
hg clone http://hg.vehq.ru/orfa
либо скачать архив с исходными кодами здесь: http://hg.vehq.ru/orfa - make (для модуля OR-AVR-M32-D, OR-AVR-M168-DX пока не поддерживается)
- make program (если вы используете AVR Dragon)
- make orfa.hex (если на выходе нужно получить .hex-файл)
План работ
- Решение общих вопросов;
- Структура ядра — Y;
- Средства интроспекции набора драйверов — Y;
- Средства интроспекции набора RoboGPIO портов — ?;
- Драйвера для OR-AVR-M32-D
- GPIO (цифровые входы/выходы) — Y;
- Servo (управление модельными сервоприводами)
- ADC (АЦП)
- SPI — Y;
- RoboMD2 (Управление шасси на 2 моторах) — Y;
- CapSensor (Работа с ёмкостными сенсорами, типа датчика цвета поверхности)
- Драйвера для OR-AVR-M64-S
- GPIO (цифровые входы/выходы) — Y;
- Servo (управление модельными сервоприводами)
- ADC (АЦП)
- SPI — Y;
- CapSensor (Работа с ёмкостными сенсорами, типа датчика цвета поверхности)
- Драйвера для OR-AVR-M168-DX
- GPIO (цифровые входы/выходы)
- Servo (управление модельными сервоприводами)
- ADC (АЦП)
- RoboMD2 (Управление шасси на 2 моторах)
- CapSensor (Работа с ёмкостными сенсорами, типа датчика цвета поверхности)