помогите с ошибкой в скетче
- Войдите на сайт для отправки комментариев
Втр, 02/03/2021 - 12:02
Скетч: шасси с дальномером (простой объезд препятствий).
#include <Servo.h> Servo myservo; int servposnum = 0; int servpos = 0; #define ENA 46 //ENA #define MOTORA_1 11 //IN1 #define MOTORA_2 10 //IN2 #define MOTORB_1 7 //IN3 #define MOTORB_2 6 //IN4 #define ENB 4 //ENB bool clockwise = true; #define trigPin 44 #define echoPin 45 void setup() { pinMode(ENA, OUTPUT); pinMode(MOTORA_1, OUTPUT); pinMode(MOTORA_2, OUTPUT); pinMode(ENB, OUTPUT); pinMode(MOTORB_1, OUTPUT); pinMode(MOTORB_2, OUTPUT); // Disable both motors digitalWrite(ENA,0); digitalWrite(ENB,0); //настройка режимов вывода для датчика ultrasonci pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); //Servo pins myservo.attach(39); } void loop() { //поместим свой основной код здесь для повторного запуска: car(); } //Defining functions so it's more easy //motor functions void motorAforward() { digitalWrite (MOTORA_1, LOW); digitalWrite (MOTORA_2, HIGH); } void motorBforward() { digitalWrite (MOTORB_1, LOW); digitalWrite (MOTORB_2, HIGH); } void motorAbackward() { digitalWrite (MOTORA_1, HIGH); digitalWrite (MOTORA_2, LOW); } void motorBbackward() { digitalWrite (MOTORB_1, HIGH); digitalWrite (MOTORB_2, LOW); } void motorAstop() { digitalWrite (MOTORA_1, HIGH); digitalWrite (MOTORA_2, HIGH); } void motorBstop() { digitalWrite (MOTORB_1, HIGH); digitalWrite (MOTORB_2, HIGH); } void motorAon() { analogWrite (ENA, 100); } void motorBon() { analogWrite (ENB, 100); } void motorAoff() { analogWrite (ENA, 0); } void motorBoff() { analogWrite (ENB, 0); } // Функции движения void forward (int duration, int pause) { motorAforward(); motorBforward(); delay (duration); if(pause > 0) { breakRobot(pause); } } void backward (int duration) { motorAbackward(); motorBbackward(); delay(duration); breakRobot(duration); } void breakRobot (int duration) { motorAstop(); motorBstop(); delay (duration); } void check(int minDist) { if(distance() < minDist) { breakRobot(100); avoid(); } } int distance() { int duration, distance; digitalWrite(trigPin, HIGH); delayMicroseconds(500); digitalWrite(trigPin, LOW); duration = pulseIn(echoPin, HIGH); distance = (duration/2) / 29; return distance; } void right (int duration) { motorAbackward(); motorBforward(); delay (duration); } void left (int duration) { motorAforward(); motorBbackward(); delay (duration); } void car() { int dist = 35; // расстояние, при котором робот начнет обходить препятствие int servDelay = 20; //время поворота сервопривода на один шаг //сервопривод поворачивается не от 0 до 180, а от 45 до 135 //так сделано, чтобы успеть чаще просматривать расстояния по ходу движения робота while(distance() > 25) { if(clockwise) //движение сервопривода по часовой стрелке { myservo.write(45); // ставим угол поворота под 45 delay(servDelay); // даем время для поворота сервопривода. check(dist); // проверяем расстояние после каждого поворота сервопривода, // чтобы успеть отреагировать до столкновения с препятствием. myservo.write(68); // ставим угол поворота под 68 и т.д. delay(servDelay); check(dist); myservo.write(90); delay(servDelay); check(dist); myservo.write(113); delay(servDelay); check(dist); myservo.write(135); delay(servDelay); check(dist); } else // движение сервопривода против часовой стрелки { myservo.write(135); delay(servDelay); check(dist); myservo.write(113); delay(servDelay); check(dist); myservo.write(90); delay(servDelay); check(dist); myservo.write(68); delay(servDelay); check(dist); myservo.write(45); delay(servDelay); check(dist); } clockwise = !clockwise; //меняем направление движения сервопривода forward(300, 0); // робот едет вперед без остановок, если нужно с остановками, // меняем 0 на значение остановки в миллисекундах } breakRobot(100); avoid(); } void avoid() { backward(500); // 500 - время, которое робот будет ехать назад // можем уменьшить, тогда уменьшим расстояние отъезда назад right(300); // 300 - это не градусы, а время, которое робот будет поворачивать // уменьшаем время - получаем меньший угол поворота }
Вопрос по строкам 80 и 84: если как в скетче, то не работает мотор "А", мотор "В" работает. Если поменять analogWrite (ENA, 100); на digitalWrite (ENA, HIGH);, то мотор "А" работает, а мне нужно через "analogWrite".
Помогите установить ошибку.
Мошт, потому что 46 нога нихрена не PWM?
Мошт, потому что 46 нога нихрена не PWM?
на Меге вроде PWm
Да, я невнимательный и еще и слепой. 44 и 46, точно PWM, я сослепу с 48 перепутал
Вопрос по строкам 80 и 84:
Может это не тот код, что реально управляет мотором, ибо в этом строчки 80 и 84 не могут влиять ни на что, поскольку соответвующие процедуры в коде ни разу не вызываются.
у меня Mega 2560, у неё 46 вывод PWM
мои извинения, эксперементировал
это строки 164, 165
мои извинения, эксперементировал
знаете, за такое тут канделябром по роже бьют. Какой смысл мне сейчас в новом коде выискивать ошибки, если у меня абсолютно никакой уверенности, что ошибка проявляется именно в этой части кода, а не в той, которую вы опять "сократили за ненадобностью".
вы знаете как я с клиентами работаю? - высылаю им проверочный код, который они должны залить в устройство, НЕ МЕНЯЯ НИ СТРОЧКИ, а потом выслать мне абсолютно весь вывод, что сгенерит программа. Только так я могу быть уверен. что диагностика относится именно к тому коду, что я редактирую.
А с вами такой веры уже нет.
Совет - удаляйте из кода процедуру за процедурой и следите за ошибкой. В итоге должен получится код строчек в 50, в котором проблему будет легко локализовать.
ок