Как написать свою прошивку
Плата приводов Arduino Robot работает как "конечный автомат" - она принимает команды от управляющей платы робота и исполняет их в соответствии со своей программой. Помимо этого, она может принимать запросы на получение данных и возвращать необходимые значения. Как бы там ни было, стандартная прошивка платы приводов не обладает особым интеллектом, но ее вполне достаточно для выполнения большинства задач.
Однако, при необходимости, функциональность платы приводов можно расширить, добавив в ее прошивку свои режимы работы или новые команды, понимаемые роботом. Для этого необходимо изменить файлы соответствующих библиотек управляющей платы и платы приводов.
Данные инструкции предназначены для тех, кто уже достаточно хорошо владеет программированием.
Режимы
В стандартной прошивке робота уже предопределены несколько режимов работы, которые влияют на поведение платы приводов. Одним из таких режимов является режим "следования по линии". После перехода в этот режим, плата будет считывать показания инфракрасных датчиков, расположенных на днище робота, высчитывать необходимое направление движения и непосредственно управлять двигателями, согласно расчетов.
Чтобы изменить режим работы, можно воспользоваться функцией setMode() на управляющей плате.
Вы можете придумывать и свои режимы работы. Для создания нового режима необходимо объявить его в библиотеках обеих плат и описать логику поведения робота.
Объявление нового режима
- В используемой вами ОС зайдите в папку с программами Arduino
- В любимом текстовом редакторе откройте файлы "libraries/Robot_Control/ArduinoRobot.h" и "libraries/Robot_Motor/ArduinoRobotMotorBoard.h"
- В каждом файле найдите секцию, в которой перечислены уже существующие режимы работы. Она будет выглядеть примерно так:
//motor board modes #define MODE_SIMPLE 0 #define MODE_LINE_FOLLOW 1 #define MODE_ADJUST_MOTOR 2 #define MODE_IR_CONTROL 3
- после этих строк в обоих файлах пропишите новый режим, придерживаясь такой структуры: "#define MODE_MY_MODE_NAME num". Обратите внимание, что номер num должен отличаться от номеров существующих режимов.
- Сохраните изменения и закройте файлы ArduinoRobotMotorBoard.h и ArduinoRobot.h
- Откройте файл "libraries/Robot_Motor/ArduinoRobotMotorBoard.cpp"
- Отыщите объявление функции "process()". Внутри функции добавьте новую проверку на соответствие имени режима. Здесь можно писать код точно так же, как и в основной программе, поскольку он будет выполняться в основном цикле
loop()
. - Сохраните изменения и закройте файл ArduinoRobotMotorBoard.cpp
- Теперь в своих программах на управляющей плате Arduino Robot можно задать новый режим работы робота функцией "setMode(MODE_MY_MODE_NAME )"
Команды
Существует два типа команд:
- приказы (однонаправленная связь) : подобно функции motorsWrite(), управляющая плата отправляет команду плате приводов, которая ее получает и исполняет. Управляющей плате в ответ ничего не отправляется.
- запросы (двунаправленная связь) : подобно функции updateIR(), управляющая плата отправляет запрос плате приводов, которая после его обработки отправляет ответ с запрашиваемыми данными обратно.
Для создания новой команды необходимо объявить ее в файлах соответствующих библиотек и написать код, отправляющий и принимающий новую команду.
Объявление новой команды
- В используемой вами ОС зайдите в папку с программами Arduino.
- Откройте файлы "libraries/Robot_Control/ArduinoRobot.h" и "libraries/Robot_Motor/ArduinoRobotMotorBoard.h" в любом текстовом редакторе
- В каждом файле найдите секцию с объявлениями существующих команд. Она должна выглядеть примерно так:
//Command code #define COMMAND_SWITCH_MODE 0 #define COMMAND_RUN 10 #define COMMAND_MOTORS_STOP 11 .......... #define COMMAND_READ_TRIM_RE 81 #define COMMAND_PAUSE_MODE 90 #define COMMAND_LINE_FOLLOW_CONFIG 100
- после этих строк в обеих файлах добавьте новую команду, придерживаясь следующего синтаксиса: "#define COMMAND_MY_COMMAND_NAME num". Обратите внимание, что номер num должен отличаться от номеров существующих команд.
- если ваша команда представляет собой двунаправленный запрос, то здесь же необходимо объявить еще одну команду: "#define COMMAND_MY_COMMAND_NAME_RE num1", которая будет использоваться для возврата результата. Обратите внимание, что номер "num1" отличается от объявленного ранее номера "num".
- Представьте структуру вашей команды. Вместе с командой можно передавать параметр типа byte или int. При отправке/получении команды, запись/чтение соответствующих данных должны происходить в одном и том же порядке. См. примеры в комментариях после слов "A message structure will be".
- Для возможности отправки новой команды необходимо создать функцию в библиотеке RobotControl. В качестве примера можете использовать функцию "motorsWrite()" в файле motors.cpp или функцию "updateIR()" в sensors.cpp
- Далее необходимо научить плату приводов понимать новую команду. Для этого отыщите функцию "parseCommand()" в ArduinoRobotMotorBoard.cpp. Внутри нее добавьте новое условие, осуществляющее проверку на совпадение с именем созданной ранее команды. В качестве примеров используйте уже существующие условия внутри функции.
- Если ваша команда не требует возврата данных и представляет собой приказ, то достаточно написать всего одну функцию, выполняющую все запланированные действия. Если же команда представляет собой запрос, то вам необходимо будет описать две функции, одна из которых выполняет непосредственно саму команду, а другая - возвращает запрашиваемую информацию. Для примера см. функцию "_digitalRead()" в файле ArduinoRobotMotorBoard.cpp.