Постановка задачи

Сначала краткое описание объекта управления – того, чем мы будем управлять с помощью нашей функции. У нашего робота есть два мотора – левый и правый.

  • Если в оба мотора подать одинаковую мощность с положительным знаком, то робот поедет вперёд.
  • Если мощности оставить теми же, а знаки поменять на отрицательные – робот поедет назад.
  • Если мощности будут одинаковыми, а знаки противоположными, то робот будет вращаться на месте.
  • Если мощности будут одного знака, но разных величин, то робот будет двигаться вперёд, или назад, одновременно поворачивая.

Теперь переведём описание объекта управления на язык действий функции-программы. Для этого сначала напишем, какими сигналами (или контактами) платы Arduino UNO управляются величины и знаки мощностей, подаваемые в моторы.

Для управления каждым мотором с помощью платы MotorShield используются два выхода платы Arduino UNO. Один задаёт направление вращения – там всё просто – выводите на него HIGH – мотор вращается вперёд. Выводите LOW – вращается назад.

То есть можно использовать знакомый нам оператор –

digitalWrite(port_number, value); где port_number – номер контакта платы Arduino UNO, а value это либо HIGH либо LOW, в зависимости от того, куда мы хотим завертеть мотор.

 

Со скоростью вращения (или мощностью) немного сложнее. Скорость задаётся широтно-модулированным импульсом, который должен быть подан на другой вывод платы Arduino UNO.

Это делается с помощью оператора analogWrite (port_number, value); где port_number – номер контакта платы Arduino UNO, а value – целое число от 0 до 255, в зависимости от того, какую мощность мы хотим подать в этот мотор. Если мы дадим 0, то мотор остановится, если 255, то мотор будет вращаться с максимальной скоростью.

ВНИМАНИЕ – передача оператору числа большего, чем 250 может вывести из строя мотор или плату MotorShield. То же самое произойдёт, если оператору подать отрицательное число.

Это ОЧЕНЬ ВАЖНО – наша функция должна содержать ограничитель. Ни при каких обстоятельствах в оператор analogWrite (port_number, value); нельзя подавать отрицательное value или value больше, чем 250.

И ещё одно – наша функция должна быть универсальной.  То есть такой, чтобы Вы могли один раз её написать, отладить и затем пользоваться в любой другой программе, вызывая по мере надобности и задавая в моторы любые варианты их вращения. Это означает, что при вызове функции ей нужно передавать входные параметры:

  • Направление и скорость вращения левого мотора
  • Направление и скорость вращения правого мотора

Давайте придумаем названия для наших входных параметров.  Например:

  • _left_power – мощность в левый мотор
  • _right_power – мощность в правый мотор

Теперь самое время придумать имя нашей функции.  Давайте назовём её –

DRIVER_Motor_Shield_Control ()

Ну и припишем к имени тип функции, и её входные параметры –

void DRIVER_Motor_Shield_Control (int _left_power,  int _right_power)

void – это тип нашей функции – (так как функция ничего не возвращает, то тип – void)

int – это тип входных переменных – (int это сокращение от английского integer – целый)

Сейчас самое время объяснить, что такое – Драйвер (DRIVER_). Чуть позже мы будем изучать структуру больших программ и там мы встретимся с разными функциями – Драйвер, Утилита, Макрос и другими.

Драйвер – это функция, которая имеет дело с какой-то частью аппаратуры робота (в нашем случае с тяговыми моторами). Драйвер вызывается функциями более высокого ранга, когда надо что-то изменить в аппаратуре или получить от неё какую-то величину.

Таким образом, постановка задачи для нашего драйвера будет звучать так:

  1. Драйвер void DRIVER_Motor_Shield_Control (int _left_power, int _right_power) должен обеспечить вывод на плату MotorShield сигналов управления двумя двигателями – Левым и Правым в соответствии с правилами платы MotorShield.
  2. Входными параметрами драйвера являются два целых числа int _left_power, int _right_power. Знак числа определяет направление вращения двигателя (плюс – ВПЕРЁД, минус – НАЗАД). Модуль числа определяет мощность, подаваемую в двигатель.
  3. Драйвер должен обеспечить ограничение чисел, передаваемых оператору языка для управления мощностью в пределах от 0 до 250, независимо от значений входных переменных _left_power и _right_power.
  4. Адреса портов управления двигателями определяются электрическими схемами плат ARDUINO UNO и MotorShield и являются следующими:
    1. int Port_POWER_LEFT_MOTOR = 6; // Порт мощности на левый двигатель
    2. int Port_ POWER _RIGHT_MOTOR = 5; // Порт мощности на правый двигатель
    3. int Port_DIR_LEFT_MOTOR = 7; // Порт направления вращения левого
    4. int Port_DIR_RIGHT_MOTOR = 4; // Порт направления вращения правого
  5. Для вращения двигателя вперёд драйвер должен задавать на вывод направления вращения – HIGH, для вращения назад – LOW.
  6. Переменные, заданные выше являются для драйвера локальными.
  7. Установка режимов портов вывода должна производиться внутри драйвера каждый раз при его вызове.