Исходный текст

Алгоритм драйвера управления моторами
Алгоритм драйвера управления моторами

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

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

Отметим, что в начале текста есть группа объявления (или как говорят программисты – декларирования) локальных переменных. Эта группа алгоритмом не отражается. Входные параметры _left_power, _right_power декларируются в заголовке драйвера, а не в его тексте.

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

Обратите внимание, что вначале исходного текста идут строчки декларирования и определения портов связи с аппаратурой. Потом – локальные переменные.  И за ними – исполняемые операторы исходного текста. В Ваших будущих программах лучше придерживаться именно такого порядка.

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

Здесь для некоторого упрощения мы принимаем, что скорость эквивалентна мощности.  Это возможно, так как условия движения нашего робота практически не меняются. Он всегда двигается по жёсткой и ровной поверхности.

//******************************************************

void DRIVER_Motor_Shield_Control (int _left_power,  int _right_power)

{

// Декларирование и назначение портов вывода

int Port_POWER_LEFT_MOTOR = 6;// Порт мощности на левый двигатель

int Port_POWER_RIGHT_MOTOR = 5;// Порт мощности на правый двигатель

int Port_DIRECTION_LEFT_MOTOR = 7;// Порт направления вращения левого

int Port_DIRECTION_RIGHT_MOTOR = 4;// Порт направления вращения правого

Номер блока в алгоритме
// Декларирование и первоначальное назначение внутренних переменных управления двигателем

int  _right_power_modul = 0;// мощность в правый двигатель

 

// Декларирование и назначение ограничителей

int _motor_power_minimum = 0;

 Не отражены в алгоритме
// НАЧАЛО ИСПОЛНЯЕМЫХ ОПЕРАТОРОВ

// Настройка режимов портов вывода

  pinMode (Port_POWER_LEFT_MOTOR, OUTPUT); 

  pinMode (Port_POWER_RIGHT_MOTOR, OUTPUT);

  pinMode (Port_DIRECTION_LEFT_MOTOR, OUTPUT);   

  pinMode (Port_DIRECTION_RIGHT_MOTOR, OUTPUT);  

 

// Вычисление модулей int _left_power,  int _right_power

if (_left_power < 0) {_left_power_modul =  0 - _left_power;}

else {_left_power_modul =  left_power;}

if (_right_power < 0) {_right_power_modul =  0 - _right_power;}

else {_right_power_modul =  _right_power;}

Номер блока в алгоритме
  // Вычисление направления вращения двигателей

if (_left_power >= 0) {_left_direction = HIGH;} else {_left_direction = LOW;}

if (_right_power >= 0) { _right_direction = HIGH;} else { _right_direction = LOW;}

Номер блока алгоритма
// Учёт ограничений на значение, подаваемое в моторы

if (_left_power_modul >= _motor_speed_maximum) {_left_power_modul  =_motor_power_maximum ;}

if (_right_power_modul >= _motor_speed_maximum) {_right_power_modul  =_motor_power_maximum ;}

Номер блока алгоритма
analogWrite (Port_POWER_LEFT_MOTOR, _left_power_modul);

analogWrite (Port_POWER_RIGHT_MOTOR, _right_power_modul);

digitalWrite (Port_DIRECTION_LEFT_MOTOR, _left_direction);

Номер блока алгоритма
}

//******************************************************

Теперь мы понимаем, как блоки алгоритма связаны с группами операторов в исходном тексте.

Декларирование внутренних переменных и ограничителей не упомянуты явно в алгоритме. Они выделены штриховой рамкой в исходном тексте.

Так же не упомянуты явно два оператора if (условие) {действие_1;} else {действие_2;} в начале программы (// Вычисление модулей int _left_power,  int _right_power). Они входят в первый блок алгоритма, в котором настраиваются порты и вычисляются модули мощностей, полученных от вызвавшей программы.

Если Вы ещё не проходили раздел “Модуль числа” по математике, то скажу, что модуль положительного числа равен самому этому числу, а модуль отрицательного числа равен этому числу с противоположным знаком. То есть ноль минус это число.

Именно эти действия делают операторы if (условие) {действие_1;} else {действие_2;} в блоке

// Вычисление модулей int _left_power,  int _right_power.

Так что в нашей программе есть –

  • две пары операторов if (условие) {действие_1;} else {действие_2;}
  • одна пара –  if (условие) {действие;}.