Доброго времени суток! Ребят помогите пожалуйста, собрал робота всем известного 4WD используя Arduino UNO и драйвер шагового двигателя L298N. Собрать было не сложно но вот с написанием программы возникла проблема=( вот мой скетч Код (C++): #include <Servo.h> Servo myservo; int servposnum = 0; int servpos = 0; int enableA = 1; int pinA1 = 3; int pinA2 = 2; int enableB = 6; int pinB1 = 5; int pinB2 = 4; #define trigPin 8 #define echoPin 9 void setup() { pinMode (enableA, OUTPUT); pinMode (pinA1, OUTPUT); pinMode (pinA2, OUTPUT); pinMode (enableB, OUTPUT); pinMode (pinB1, OUTPUT); pinMode (pinB2, OUTPUT); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); myservo.attach(7); } void loop() { car(); avoid(); } void motorAforward() { digitalWrite (pinA1, HIGH); digitalWrite (pinA2, LOW); } void motorBforward() { digitalWrite (pinB1, LOW); digitalWrite (pinB2, HIGH); } void motorAbackward() { digitalWrite (pinA1, LOW); digitalWrite (pinA2, HIGH); } void motorBbackward() { digitalWrite (pinB1, HIGH); digitalWrite (pinB2, LOW); } void motorAstop() { digitalWrite (pinA1, HIGH); digitalWrite (pinA2, HIGH); } void motorBstop() { digitalWrite (pinB1, HIGH); digitalWrite (pinB2, HIGH); } void motorAcoast() { digitalWrite (pinA1, LOW); digitalWrite (pinA2, LOW); } void motorBcoast() { digitalWrite (pinB1, LOW); digitalWrite (pinB2, LOW); } void motorAon() { digitalWrite (enableA, HIGH); } void motorBon() { digitalWrite (enableB, HIGH); } void motorAoff() { digitalWrite (enableA, LOW); } void motorBoff() { digitalWrite (enableB, LOW); } void forward (int duration) { motorAforward(); motorBforward(); delay (duration); } void backward (int duration) { motorAbackward(); motorBbackward(); delay (duration); } void right (int duration) { motorAbackward(); motorBforward(); delay (duration); } void left (int duration) { motorAforward(); motorBbackward(); delay (duration); } void coast (int duration) { motorAcoast(); motorBcoast(); delay (duration); } void breakRobot (int duration) { motorAstop(); motorBstop(); delay (duration); } void disableMotors() { motorAoff(); motorBoff(); } void enableMotors() { motorAon(); motorBon(); } int distance() { int duration, distance; digitalWrite(trigPin, HIGH); delayMicroseconds(1000); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distance = (duration/2) / 29.1; return distance; } void car() { int distance_0; distance_0 = distance(); while(distance_0 > 15) { if(servposnum == 0) { myservo.writeMicroseconds (1900); servposnum = 1; delay(100); } else if(servposnum == 1) { myservo.writeMicroseconds (2200); servposnum = 2; delay(100); } else if(servposnum == 2) { myservo.writeMicroseconds (1900); servposnum = 3; delay(100); } else if(servposnum == 3) { myservo.writeMicroseconds (1600); servposnum = 1; delay(100); } motorAon(); motorBon(); forward(1); distance_0 = distance(); } breakRobot(0); } void avoid() { backward(500); right(360); } Где в нем может быть ошибка и как ее исправить? что дописать нужно? или что исправить? заранее огромное спасибо!
вот сообщение об ошибке Arduino: 1.6.11 (Windows Store 1.6.11.0) (Windows 10), Плата:"Arduino/Genuino Uno" C:\Users\Денис\Desktop\robot1\robot1.ino: In function 'void loop()': robot1:27: error: 'car' was not declared in this scope robot1:28: error: 'avoid' was not declared in this scope exit status 1 'car' was not declared in this scope Этот отчёт будет иметь больше информации с включенной опцией Файл -> Настройки -> "Показать подробный вывод во время компиляции"
попробуй это перенести в самый конец скетча, после всех скобок. Код (C++): void loop() { car(); avoid(); }
все спасибо решил проблему=) все заработало....но есть вопрос как можно увеличить угол поворота сервы а то что то радиус ультразвукового датчика мал(
Экспериментируйте с функцией writeMicroseconds() Передает на сервомотор значение в микросекундах, тем самым осуществляя управление валом. Если это стандартный сервомотор, то переданное значение устанавливает угол, на который должен повернуться вал. То есть значение «1000» – это полный поворот против часовой стрелки, «2000» – полный поворот по часовой стрелке, а «1500» – это полная остановка. Обратите внимание, что производители далеко не всегда строго следуют этому стандарту, поэтому сервомоторы часто реагируют на значение от «700» до «2300». Поэтому, чтобы узнать реальный диапазон, имеет смысл поэкспериментировать с конечными значениями. Также имейте в виду, что поворот вала за пределы этих конечных точек (зачастую сопровождаемый рычащим звуком) – это ситуация, когда на сервомотор подается ток высокого напряжения, и ее следует избегать. Сервомоторы непрерывного вращения реагируют на эту функцию так же, как и на функцию write(). Синтаксис servo.writeMicroseconds(uS) Параметры servo – переменная типа Servo uS – значение, которое нужно передать сервомотору, в микросекундах. Тип данных – int Пример: Код (C++): #include <Servo.h> Servo myservo; void setup() { myservo.attach(7); myservo.writeMicroseconds(1500); // задаем среднюю точку, тем самым останавливая вал сервомотора } void loop() {} У меня с китайским сервоприводом неизвестной маркировки крутит вал от середины на 45 градусов в обе стороны вот с таким кодом: Код (C++): /* Code to use with a servo motor. Код для использования с сервомотором. AVG 08-01-2017. */ // Setup the servo motor #include <Servo.h> // библиотека Servo Servo myservo; // инициализировать объект сервопривода // для подключенного серводвигателя int servposnum = 0; int servpos = 0; // Setup Motor A (front and rear) pins int enableA = 1; int pinA1 = 3; int pinA2 = 2; // Setup Motor B (front and rear) pins int enableB = 6; int pinB1 = 5; int pinB2 = 4; // Setup Ultrasonic Sensor pins #define trigPin 8 #define echoPin 9 void setup() { // The setup code goes here and runs once only // Configure the pin modes for each drive motor pinMode (enableA, OUTPUT); pinMode (pinA1, OUTPUT); pinMode (pinA2, OUTPUT); pinMode (enableB, OUTPUT); pinMode (pinB1, OUTPUT); pinMode (pinB2, OUTPUT); // Configure the pin modes for the Ultrasonic Sensor pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); // Turn pin into servo driver. Calls pinMode. Returns 0 on failure. myservo.attach(7); } void loop() { // Main code goes here and will run repeatedly: car(); // function keeps moving car forward while distance > 15cm avoid(); // function makes car go back, turn slightly right to move forward in new direction } // Create motor functions void motorAforward() { digitalWrite (pinA1, HIGH); digitalWrite (pinA2, LOW); } void motorBforward() { digitalWrite (pinB1, LOW); digitalWrite (pinB2, HIGH); } void motorAbackward() { digitalWrite (pinA1, LOW); digitalWrite (pinA2, HIGH); } void motorBbackward() { digitalWrite (pinB1, HIGH); digitalWrite (pinB2, LOW); } void motorAstop() { digitalWrite (pinA1, HIGH); digitalWrite (pinA2, HIGH); } void motorBstop() { digitalWrite (pinB1, HIGH); digitalWrite (pinB2, HIGH); } void motorAcoast() { digitalWrite (pinA1, LOW); digitalWrite (pinA2, LOW); } void motorBcoast() { digitalWrite (pinB1, LOW); digitalWrite (pinB2, LOW); } void motorAon() { digitalWrite (enableA, HIGH); } void motorBon() { digitalWrite (enableB, HIGH); } void motorAoff() { digitalWrite (enableA, LOW); } void motorBoff() { digitalWrite (enableB, LOW); } // Setup movement functions void forward (int duration) { motorAforward(); motorBforward(); delay (duration); } void backward (int duration) { motorAbackward(); motorBbackward(); delay (duration); } void right (int duration) { motorAbackward(); motorBforward(); delay (duration); } void left (int duration) { motorAforward(); motorBbackward(); delay (duration); } void coast (int duration) { motorAcoast(); motorBcoast(); delay (duration); } void breakRobot (int duration) { motorAstop(); motorBstop(); delay (duration); } void disableMotors() { motorAoff(); motorBoff(); } void enableMotors() { motorAon(); motorBon(); } // Setup Ultrasonic Sensor distance measuring int distance() { int duration, distance; digitalWrite(trigPin, HIGH); delayMicroseconds(1000); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distance = (duration/2) / 29.1; return distance; } // Setup the main car function void car() { int distance_0; distance_0 = distance(); // Keep moving forward in a straight line while distance of objects > 15cm while(distance_0 > 15) { // Keep moving servo motor back and forth to scan surroundings // This allows the ultrasonic sensor to see more to its left and right if(servposnum == 0) { myservo.writeMicroseconds (1500); // задаем среднюю точку, тем самым останавливая вал сервомотора если задать 1480 для моего сервопривода. Было myservo.writeMicroseconds (1900); servposnum = 1; delay(100); } else if(servposnum == 1) { myservo.writeMicroseconds (1800); // задаем поворот сервопривода по ходу движения на лево "+300" от средней точки 1500 Было myservo.writeMicroseconds (2200); servposnum = 2; delay(100); } else if(servposnum == 2) { myservo.writeMicroseconds (1500); // задаем среднюю точку, тем самым останавливая вал сервомотора если задать 1480 для моего сервопривода. Было myservo.writeMicroseconds (1900); servposnum = 3; delay(100); } else if(servposnum == 3) { myservo.writeMicroseconds (1200); // задаем поворот сервопривода по ходу движения на право "-300" от средней точки 1500 Было myservo.writeMicroseconds (1600); servposnum = 1; delay(100); } motorAon(); motorBon(); forward(1); distance_0 = distance(); } breakRobot(0); } void avoid() { // Go back and turn slightly right to move car in new direction if object detected < 15cm away backward(500); right(360); }