РУКОДЕЛКИ Проблема с работой драйвера

PIrozhOk

✩✩✩✩✩✩✩
14 Май 2021
6
0
Добрый вечер(утро/день/ночь), уважаемые участники форума. Столкнулся с такой проблей, суть которой заключается в отказе работы драйвера tb6612f в одном скетче, но с полной его отдачей в другом. Если проще, то задумал сделать машинку с псевдо "искусственным интелектом", которая будет останавливаться перед препятствиями, "смотреть" по сторонам с помощью сервопривода и выбирать наиболее доступную по данным ультразвукового датчика расстояния. Сначала написал код под сервопривод и выбор наибольшей стороны. Все работает отлично. После написал код с обычной ездой самой машинки. Все работает отлично. Но совместив код и создав некоторые условия работы драйвера, он отказался сотрудничать и ушел в свободное плавание. Прошу ткнуть пальцем на ошибку и дать подзатыльник, если она глупая. Код:


Мотор:
#define LD1 6

#define LD2 7

#define STBY 5

#define PWMA 10

#define PD1 4

#define PD2 3

#define PWMB 9

int mt = 150;

int a = 5;

void setup() {

Serial.begin(9600);

pinMode(PD1, OUTPUT);

pinMode(PD2, OUTPUT);

pinMode(STBY, OUTPUT);

pinMode(PWMA, OUTPUT);



digitalWrite(STBY, HIGH);



pinMode(LD1, OUTPUT);

pinMode(LD2, OUTPUT);

pinMode(PWMB, OUTPUT);



}



void loop() {

analogWrite(PWMA, 75);

digitalWrite (LD1, LOW);

digitalWrite (LD2, HIGH);

analogWrite(PWMB, 75);

digitalWrite (PD1, HIGH);

digitalWrite (PD2, LOW);


delay(4000);

digitalWrite (LD1, LOW);

digitalWrite (LD2, LOW);

digitalWrite (PD1, LOW);

digitalWrite (PD2, LOW);

delay(1500);

}

Сервопривод с датчиком:
#include <Servo.h>

Servo sv;

#define echo = 12;

#define trig = 13;

int duration, cm, l, r, pos;

void setup() {

  sv.attach(11);

  sv.write(90);

pinMode(echo, INPUT);

pinMode(trig, OUTPUT);

Serial.begin(9600);

}



void loop() {

  scan();

  if(cm<50){

  eyes();

 

  if (l>r) {

  Serial.println("big is l:");

  }

  if (l<r) {

  Serial.println("big is r:");

  }

  delay(3000);

}

}



void eyes () {

  for(pos = 90; pos <= 180; pos ++){

  sv.write(pos);

  delay(10);

  }

scan();

l = cm;

Serial.println(l);

delay(1000);

  for(pos <= 180; pos >= 0; pos -=1){

    sv.write(pos);

    delay(10);

    }

scan();

r = cm;

Serial.println(r);

delay(1000);

for(pos >= 0; pos <= 90; pos ++){

  sv.write(pos);

  delay(10);

  }

 

}





void scan (){

 

digitalWrite(trig, LOW);

delayMicroseconds(5);

digitalWrite(trig, HIGH);



delayMicroseconds(10);

digitalWrite(trig, LOW);



duration = pulseIn(echo, HIGH);

cm = (duration / 2) / 29.1;



Serial.print("Расстояние до объекта: ");

Serial.print(cm);

Serial.println(" см.");



delay(250);



}


Совмещенный код:
#include <Servo.h>

Servo sv;

#define echo 12

#define trig  13

int duration, cm, l, r, pos;

#define LD1 6

#define LD2 7

#define STBY 5

#define PWMA 10

#define PD1 4

#define PD2 3

#define PWMB 9

int mt = 75;



void setup() {

    sv.attach(11);

  sv.write(90);

pinMode(echo, INPUT);

pinMode(trig, OUTPUT);

Serial.begin(9600);

pinMode(PD1, OUTPUT);

pinMode(PD2, OUTPUT);

pinMode(STBY, OUTPUT);

pinMode(PWMA, OUTPUT);



digitalWrite(STBY, HIGH);



pinMode(LD1, OUTPUT);

pinMode(LD2, OUTPUT);

pinMode(PWMB, OUTPUT);



}



void loop() {

scan();

  if(cm<50){

  eyes();

 

  if (l>r) {

//  Serial.println("big is l:");

  analogWrite(PWMA, 75);

digitalWrite (LD1, LOW);

digitalWrite (LD2, HIGH);

analogWrite(PWMB, 75);

digitalWrite (PD1, HIGH);

digitalWrite (PD2, LOW);

delay(2000);

digitalWrite (LD1, LOW);

digitalWrite (LD2, LOW);

digitalWrite (PD1, LOW);

digitalWrite (PD2, LOW);



delay(1500);

  }

  if (l<r) {

//  Serial.println("big is r:");

  digitalWrite (LD1, HIGH);

digitalWrite (LD2, LOW);

digitalWrite (PD1, LOW);

digitalWrite (PD2, HIGH);

analogWrite(PWMA, mt);

analogWrite(PWMB, mt);

delay(2000);

digitalWrite (LD1, LOW);

digitalWrite (LD2, LOW);

digitalWrite (PD1, LOW);

digitalWrite (PD2, LOW);

delay(1500);

  }

  delay(3000);

}



}



void scan (){

 

digitalWrite(trig, LOW);

delayMicroseconds(5);

digitalWrite(trig, HIGH);



delayMicroseconds(10);

digitalWrite(trig, LOW);



duration = pulseIn(echo, HIGH);

cm = (duration / 2) / 29.1;



Serial.print("Расстояние до объекта: ");

Serial.print(cm);

Serial.println(" см.");



delay(250);



}



void eyes () {

  for(pos = 90; pos <= 180; pos ++){

  sv.write(pos);

  delayMicroseconds(100);

  }

scan();

l = cm;

Serial.println(l);

delay(1000);

  for(pos <= 180; pos >= 0; pos -=1){

    sv.write(pos);

    delayMicroseconds(100);

    }

scan();

r = cm;

Serial.println(r);

delay(1000);

for(pos >= 0; pos <= 90; pos ++){

  sv.write(pos);

  delayMicroseconds(100);

  }

 

}
 
Изменено:

PIrozhOk

✩✩✩✩✩✩✩
14 Май 2021
6
0
@PIrozhOk, ничё, бывает... А совмещённый код компилится без матюков или как?
Да, все проходит отлично, однако на моменте, где машинка должна повернуть - стоит на месте, а после возвращается к началу цикла. Это меня и удивило.
 

PiratFox

★★★★★✩✩
13 Фев 2020
1,724
481
@PIrozhOk, Вы бы каменты писали в коде, а то потом и сами не разберётесь что и где... Ну да ладно. По-моему, ошибка во времени
и
не одно и то же, слишком велика разница, аж на 2 порядка. Стерва, похоже, просто не успевает отработать. Это первое, что в глаза бросается. Я бы попробовал увеличить время.
 
Изменено:

PIrozhOk

✩✩✩✩✩✩✩
14 Май 2021
6
0
@PIrozhOk, Вы бы каменты писали в коде, а то потом и сами не разберётесь что и где... Ну да ладно. По-моему, ошибка во времени

и

не одно и то же, слишком велика разница, аж на 2 порядка. Стерва, похоже, просто не успевает отработать. Это первое, что в глаза бросается. Я бы попробовал увеличить время.
DelayMicroseconds изменил на delay, а после и убрал вовсе, но монстр по прежнему стоит на месте. Еще раз перепроверил подсоединение и питание, однако ошибок не обнаружил. Отправился бороздить просторы интернета, но и там ничего путного не нашел. Очень странно...
 

PiratFox

★★★★★✩✩
13 Фев 2020
1,724
481
@PIrozhOk, а если попробовать залить какую - либо из предыдущих рабочих прошивок? Ну, это чтоб убедится, что в сборке ничего не накосячили, мало ли.
 

PIrozhOk

✩✩✩✩✩✩✩
14 Май 2021
6
0
@PIrozhOk, а если попробовать залить какую - либо из предыдущих рабочих прошивок? Ну, это чтоб убедится, что в сборке ничего не накосячили, мало ли.
Это тоже пробовал и не один раз. По факту код для сервы просто скопирован из одного скетча (указывал в самом начале) и вставлен в скетч с мотором. Из всех нововведений только условие работы драйвера по данным датчика расстояния.
 

PiratFox

★★★★★✩✩
13 Фев 2020
1,724
481
@PIrozhOk, ку тогда, скорее всего, где-то логическая ошибка в коде. Может, и не одна. Немного позже посмотрю, щас башка не варит, целый день код писал. :cry:
 

Wan-Derer

★★★★★✩✩
Команда форума
31 Июл 2018
2,038
406
Москва
wan-derer.ru
@PIrozhOk,Здесь можно редактировать свои сообщения. Первое своё сообщение отредактируй, а второе - удали.