Ошибка no match for call to '(AF_DCMotor) (int)'. Подскажите ответ на нее

rick777
Offline
Зарегистрирован: 11.03.2016

Доброго дня! Извиняюсь если это уже было на форуме, но я не нашел ответа ни здесь, ни где либо еще в сети. За сутки голову уже сломал... В общем суть такая:

При компиляции ошибка "no match for call to '(AF_DCMotor) (int)'"

C:\Users\rick777\Desktop\Arduino\Скетчи\sketch_mar11a_for_uno\sketch_mar11a_for_uno.ino: In function 'void set_speed(int)':

sketch_mar11a_for_uno:33: error: no match for call to '(AF_DCMotor) (int)'

sketch_mar11a_for_uno:34: error: no match for call to '(AF_DCMotor) (int)'

exit status 1
no match for call to '(AF_DCMotor) (int)'

Код привожу ниже. Что здесь не так и как быть? Я новичок, но очень хочу научиться сам. И продвинуть в эту затею сына.

// Подключаем нужные библиотеки
#include <Servo.h> // для работы с сервоприводом
#include <AFMotor.h>

// задаем пины, к которым мы подключили ультразвуковой дальномер
// на шилде Motor Drive Shield dual L239D оставались пустыми только аналоговые пины
// их можно свободно использовать, как цифровые
// пин A0 соответсвует 14-му цифровому пину, A1 - 15-му
#define trigPin 14 // через этот пин будем отправлять сигнал
#define echoPin 15 // здесь будем считывать ответ

// даем Arduino знать, что подключено 2 моторчика

// это левый и правый мотор
AF_DCMotor motor_left(1); // мотор подключен к порту M1 на шилде
AF_DCMotor motor_right(2); // порт M2

// объект для управления сервоприводом
Servo neck;

// вспомогательные переменные, за что они отвечают написано ниже...
int d1, d2;

// для упрощения программы, устранения повторения кода и просто для удобства, будем использовать функции...
// ниже описаны функции, которые нужны для реализации того алгоритма, который мы написали в начале статьи
// с помощью данной функции мы сможем задать скорость, с которой будет двигаться наш робот
// у нее всего один параметр - speed - он должен быть в диапазоне 0-255
// соотвественно 0 - робот никуда не едет, 255 - едет на максимальной скорости (максимально сжирая батарейки :))
// для прямолинейной езды скорость всем моторам нужно установить одинаковую
void set_speed(int speed) {
  motor_left(1).setSpeed(200);
  motor_right(2).setSpeed(200);
}

// библиотека AFMotor позволяет установить моторы в 3 режима:
// 1. FORWARD - моторы будут крутиться "вперед", если можно так выразиться :)
// 2. BACKWARD - моторы будут крутиться "назад"
// 3. RELEASE - остановка, моторы крутиться не будут
// и после переключения режима, желательно дать время на переход из одного состояния в другое

// Ниже реализованы 3 функции, которые позволят переключаться между этими режимами.

// едем вперед
void robot_forward() {
  motor_left.run(FORWARD);
  motor_right.run(FORWARD);
  delay(1000);
}

// едем назад
void robot_backward() {
  motor_left.run(BACKWARD);
  motor_right.run(BACKWARD);
  delay(1000);
}

// останавливаемся
void robot_release() {
  motor_left.run(RELEASE);
  motor_right.run(RELEASE);
  delay(1000);
}

// конструкция платформы не позволяет поворачивать передние колеса для изменения направления движения
// это легко обойти, если вспомнить как поворачивает танк :)
// колеса на одной стороне мы вращаем в одну сторону, на другой стороне - в противоположную
// следующие функции это делают...

// поворот направо
void turning_to_the_right() {
  motor_left.run(FORWARD);
  motor_right.run(BACKWARD);
  delay(1000);
}

// поворот налево
void turning_to_the_left() {
  motor_right.run(FORWARD);
  motor_left.run(BACKWARD);
  delay(1000);
}

// такой алгоритм разворота разумеется не идеальный - этот метод я использовал для простоты
// для плавного поворота на ходу, нужно просто задавать моторам разную скорость

// и последняя функция
// она нужна для определения расстояния до препятствия
// для обеспечения большей точности, показания считываются дважды
int get_distance() {
  // вспомогательные переменные
  long duration;
  int d_1, d_2, average = -1;

  // это стандартный способ определения расстояния для дальномера
  // описывать его не буду, в интернете есть куча информации по этому поводу - нам важен результат
  // результат будет записан в переменную d_1, а именно будет записано количество сантиметров до препятствия
  // -------------------
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  d_1 = (int) duration / 58.2;
  // -------------------


  // как я уже писал, повторяем процедуру для более точных показаний
  // и записываем значение в переменную d_2
  // -------------------
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  d_2 = (int) duration / 58.2;
  // -------------------

  // подсчитываем среднее арифметическое для d_1 и d_2
  // это и будет считаться окончательным ответом
  average = (int) (d_1 + d_2) / 2;
  Serial.print("distance: ");
  Serial.println(average);
  return average;
}


void setup() {
  Serial.begin(19200);
  // устанавливаем пин A0 на вывод, A1 - на ввод
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  // сервопривод подключен к 10-му пину, даем знать Arduino, что он там есть
  neck.attach(10);
  // и поворачиваем на нужный угол (угол подбирайте сами, нужно чтобы дальномер смотрел вперед)
  neck.write(120);
  // устанавливаем скорость двигателей. я выбрал значение 200, при 150 он еле тащился :)
  set_speed(200);
  // режим FORWARD, робот будет ехать вперед
  robot_forward();
}

void loop() {
  // вот мы и дошли до реализации самого алгоритма
  // в функции setup() мы уже установили необходимые значения для движения вперед по прямой

  // следующее условие будет проверять не наткнулся ли робот на препятствие
  // если наткнулся - совершить маневр, и после его завершения опять ехать вперед

  if (get_distance() < 20) {
    // сюда попадем, если мы оказались впритык к препятствию (до него меньше 20 сантиметров)
    // нам не хватает места для разворота
    Serial.println("backward");
    // сдаем немного назад
    robot_backward();
    delay(1000);
    Serial.println("forward");
    // потом мы опять едем вперед с надеждой, что сдалека мы обнаружим помеху :)
    robot_forward();
    // если ее обнаружим - то выполнится нижний участок кода
    // если не обнаружим - либо опять сдадим назад, либо врежимся :)
  } else if (get_distance() < 50) {
    // если до препятствия остается 50 сантиметров, совершаем поворот
    // останавливаем робота
    robot_release();
    // поворачиваем "голову" направо на 50 градусов
    neck.write(70);
    delay(500);
    // считываем расстояние до препятствия справа от робота
    d1 = get_distance();
    // поворачиваем "голову" налево
    neck.write(170);
    delay(500);
    // считываем расстояние до препятствия слева от робота
    d2 = get_distance();
    // выбираем оптимальный маршрут
    if (d1 > d2) {
      // сюда попадем, если справа от робота больше свободного места для езды
      Serial.println("turning to the right");
      // начинаем поворот направо
      turning_to_the_right();
    } else {
      // сюда попадем, если слева от робота больше свободного места для езды
      Serial.println("turning to the left");
      // начинаем поворот налево
      turning_to_the_left();
    }
    // вернем "голову" в исходную позицию
    neck.write(120);
    delay(500);
    // поворачиваем до тех пор, пока препятствие не выйдет из поля зрения
    while (get_distance() < 50) {
      delay(500);
    }
    // поедем вперед, когда поворот завершится
    robot_forward();
  }
  // небольшая задержка, чтобы дать время роботу поменять свое положение
  delay(500);
}

 

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Ошибка в строках 31, 32

motor_left(1).setSpeed(200);
motor_right(2).setSpeed(200);

Надо так:

  motor_left.setSpeed(200);
  motor_right.setSpeed(200);

 

rick777
Offline
Зарегистрирован: 11.03.2016

СПАСИБО!!!!!!!! Все срослось наконец-то!!!

Скетч использует 6 380 байт (19%) памяти устройства. Всего доступно 32 256 байт.
Глобальные переменные используют 323 байт (15%) динамической памяти, оставляя 1 725 байт для локальных переменных. Максимум: 2 048 байт.

Буду пробовать дальше ;)