Ошибка no match for call to '(AF_DCMotor) (int)'. Подскажите ответ на нее
- Войдите на сайт для отправки комментариев
Пт, 11/03/2016 - 11:10
Доброго дня! Извиняюсь если это уже было на форуме, но я не нашел ответа ни здесь, ни где либо еще в сети. За сутки голову уже сломал... В общем суть такая:
При компиляции ошибка "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);
}
Ошибка в строках 31, 32
Надо так:
СПАСИБО!!!!!!!! Все срослось наконец-то!!!
Скетч использует 6 380 байт (19%) памяти устройства. Всего доступно 32 256 байт.
Глобальные переменные используют 323 байт (15%) динамической памяти, оставляя 1 725 байт для локальных переменных. Максимум: 2 048 байт.
Буду пробовать дальше ;)