помогите с ошибкой в скетче

Wolff_2020
Offline
Зарегистрирован: 04.02.2021

Скетч: шасси с дальномером (простой объезд препятствий).

#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".

Помогите установить ошибку.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Мошт, потому что 46 нога нихрена не PWM?

b707
Offline
Зарегистрирован: 26.05.2017

DetSimen пишет:

Мошт, потому что 46 нога нихрена не PWM?

на Меге вроде PWm

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Да, я невнимательный и еще и слепой.  44 и 46, точно PWM, я сослепу с 48 перепутал

b707
Offline
Зарегистрирован: 26.05.2017

Wolff_2020 пишет:

Вопрос по строкам 80 и 84:

Может это не тот код, что реально управляет мотором, ибо в этом строчки 80 и 84 не могут влиять ни на что, поскольку соответвующие процедуры в коде ни разу не вызываются.

Wolff_2020
Offline
Зарегистрирован: 04.02.2021

у меня Mega 2560, у неё 46 вывод PWM

Wolff_2020
Offline
Зарегистрирован: 04.02.2021

мои извинения, эксперементировал

это строки 164, 165

#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() {

// put your setup code here, to run once:
//configure pin modes for the drive motors

 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() {

motorAon();
motorBon(); 

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 - это не градусы, а время, которое робот будет поворачивать
// уменьшаем время - получаем меньший угол поворота
}

 

b707
Offline
Зарегистрирован: 26.05.2017

Wolff_2020 пишет:

мои извинения, эксперементировал

знаете, за такое тут канделябром по роже бьют. Какой смысл мне сейчас в новом коде выискивать ошибки, если у меня абсолютно никакой уверенности, что ошибка проявляется именно в этой части кода, а не в той, которую вы опять "сократили за ненадобностью".

вы знаете как я с клиентами работаю? - высылаю им проверочный код, который они должны залить в устройство, НЕ МЕНЯЯ НИ СТРОЧКИ, а потом выслать мне абсолютно весь вывод, что сгенерит программа. Только так я могу быть уверен. что диагностика относится именно к тому коду, что я редактирую.

А с вами такой веры уже нет.

Совет - удаляйте из кода процедуру за процедурой и следите за ошибкой. В итоге должен получится код строчек в 50, в котором проблему будет легко локализовать.

Wolff_2020
Offline
Зарегистрирован: 04.02.2021

ок