TB6612 запускается мотор сам по себе

LenyGj

✩✩✩✩✩✩✩
14 Авг 2019
8
0
Запара пришла, не могу решить вопрос, а может баг в библиотеке для моторов от алексгайвера.
Собрал макет из 4 серво, драйвера TB6612, 2 моторов, PCF8554 и nrf.
Суть такова: при запуске контроллера начинает вращаться левый мотор (GMotor motorL(DRIVER3WIRE, A2, A3, 6) , с пина (A2) почему то идет сигнал на драйвер для запуска, хотя не должно. Менял ардуино нано 328, 168, менял драйвер, тоже самое. Менял распиновку, и все равно так же. Питание 12 вольт, конденсатор припаен к входу ардуино.
NRF отключен вовсе, а значит связи нет, и помех для блудного влючения сигнала не должно быть


C++:
#include "GyverMotor.h"
#include "RF24.h"
#include "nRF24L01.h"
#include <SPI.h>
#include <Servo.h>
#include "PCF8574.h"    // Подключение библиотеки PCF8574 (входы A4,A5)
PCF8574 pcf8574(0x20);  // Создаем объект и указываем адрес устройства 0x20
GMotor motorR(DRIVER3WIRE, A7, A6, 3);
GMotor motorL(DRIVER3WIRE, A2, A3, 6);
RF24 radio(9, 10);                                                             // "создать" модуль на пинах 9 и 10 Для Уно
byte address[][6] = { "1Node", "2Node", "3Node", "4Node", "5Node", "6Node" };  //возможные номера труб
int recieved_data[13];                                                         // массив принятых данных
int valX;                                                                      // скорость мотора
int valY;                                                                      // поворот колес
int valB;                                                                      // сервопривод1 180
int valJ;                                                                      // сервопривод2 180
int valN;                                                                      // сервопровод3 180

int Dv = P3;  // движение вперед мотор через драйвер
int Dn = P4;  // движение назад мотор через драйвер

bool butt_flagled1 = 0;
bool butt_flagled2 = 0;
bool butt_flagled3 = 0;
bool butt_flagled4 = 0;

bool butt_flagled7 = 0;
bool butt_flagled8 = 0;
int led = A0;  // индикатор работы системы запуска контроллера  A0
int valZ;      // для индикатора связи
int sig = A1;
boolean butt_flag = 0;
boolean butt;
boolean led_flag = 0;
unsigned long last_press;

Servo servo;
Servo servo1;
Servo servo2;
Servo servo3;

void setup() {
  // Пины D5 и D6 - 7.8 кГц
  TCCR0B = 0b00000010;  // x8
  TCCR0A = 0b00000011;  // fast pwm
  // Пины D3 и D11 - 62.5 кГц
  TCCR2B = 0b00000001;  // x1
  TCCR2A = 0b00000011;  // fast pwm
  Serial.begin(9600);   //открываем порт для связи с ПК

  servo.attach(5);
  servo1.attach(4);
  servo2.attach(2);
  servo3.attach(7);

  pinMode(Dv, OUTPUT);
  pinMode(Dn, OUTPUT);

  pcf8574.pinMode(P0, OUTPUT);  // Устанавливаем выход P, как выход
  pcf8574.pinMode(P1, OUTPUT);  // Устанавливаем выход P, как выход
  pcf8574.pinMode(P2, OUTPUT);  // Устанавливаем выход P, как выход

  pcf8574.pinMode(P3, OUTPUT);  // Устанавливаем выход P, для мотора двигател
  pcf8574.pinMode(P4, OUTPUT);  // Устанавливаем выход P, как мотора двигателя

  pcf8574.pinMode(P5, OUTPUT);  // Устанавливаем выход P, как выход
  pcf8574.pinMode(P6, OUTPUT);  // Устанавливаем выход P, как выход
  pcf8574.pinMode(P7, OUTPUT);  // Устанавливаем выход P, как выход
  pinMode(led, OUTPUT);         // овещение
  pinMode(sig, OUTPUT);         // настроить пин реле как выход
  // Проверка инициализация библиотеки pcf8574
  Serial.print("Init pcf8574...");
  if (pcf8574.begin()) {
    Serial.println("OK");
  } else {
    Serial.println("ERROR");
  }
  delay(50);
  motorR.setDirection(REVERSE);
  motorL.setDirection(REVERSE);
  motorR.setMode(AUTO);
  motorL.setMode(AUTO);
  motorR.setSpeed(0);
  motorL.setSpeed(0);
  motorL.setMinDuty(1);
  motorR.setSmoothSpeed(30);
  motorL.setSmoothSpeed(30);
  radio.begin();                         //активировать модуль
  radio.setAutoAck(1);                   //режим подтверждения приёма, 1 вкл 0 выкл
  radio.setRetries(0, 15);               //(время между попыткой достучаться, число попыток)
  radio.enableAckPayload();              //разрешить отсылку данных в ответ на входящий сигнал
  radio.setPayloadSize(32);              //размер пакета, в байтах
  radio.openReadingPipe(1, address[0]);  //хотим слушать трубу 0
  radio.setChannel(0x60);                //выбираем канал (в котором нет шумов!)
  radio.setPALevel(RF24_PA_MAX);         //уровень мощности передатчика. На выбор RF24_PA_MIN,
  radio.setDataRate(RF24_250KBPS);       //скорость обмена. На выбор RF24_2MBPS,
  radio.powerUp();                       //начать работу
  radio.startListening();                //начинаем слушать эфир, мы приёмный модуль
  servo.write(90);                       // начало  угла сервопривода при включение
  servo1.write(0);
  servo2.write(0);
  servo3.write(0);
}
void loop() {
  byte pipeNo;
  while (radio.available(&pipeNo)) {                    // слушаем эфир со всех труб
    radio.read(&recieved_data, sizeof(recieved_data));  // чиатем входящий сигнал
    valX = recieved_data[0];                            // назначить массив мотора
    int signalX = 255 - valX / 2;

    motorL.smoothTick(signalX);
    motorR.smoothTick(signalX);

    valY = recieved_data[1];  // поворот колес
    valY = map(valY, 1023, 0, 0, 40);
    servo.write(valY);
    valZ = recieved_data[3];  // назначить массив сигнал для передачи лампочки

    valB = recieved_data[6];  //   сервопривод 1
    valB = map(valB, 0, 1023, 0, 180);
    servo1.write(valB);

    valJ = recieved_data[7];  //   сервопривод 2
    valJ = map(valJ, 0, 1023, 0, 180);
    servo2.write(valJ);

    valN = recieved_data[8];  //   сервопривод 3
    valN = map(valN, 0, 1023, 0, 180);
    servo3.write(valN);

    Dv = recieved_data[9];   // двигатель вперед
    Dn = recieved_data[10];  // двигатель назад
    butt_flagled1 = recieved_data[2];
    pcf8574.digitalWrite(P0, !butt_flagled1);  //фик  джойстик кнопка         !

    butt_flagled2 = recieved_data[4];
    pcf8574.digitalWrite(P1, !butt_flagled2);  //фик джойстик кнопка          !

    butt_flagled3 = recieved_data[5];
    pcf8574.digitalWrite(P2, !butt_flagled3);  // фик кнопка                  !

    butt_flagled4 = recieved_data[11];
    pcf8574.digitalWrite(P5, !butt_flagled4);  //не фикс кнопка               !


    butt_flagled7 = recieved_data[12];
    pcf8574.digitalWrite(P6, !butt_flagled7);  //не фикс                      !

    butt_flagled8 = recieved_data[13];
    pcf8574.digitalWrite(P7, butt_flagled8);  //нее фик                      !


    if (valZ == 1 && butt_flag == 0 && millis() - last_press > 5000) {
      butt_flag = 1;
      Serial.println("Button press");
      led_flag = !led_flag;
      digitalWrite(sig, led_flag);
      last_press = millis();
    }
    if (butt == 0 && butt_flag == 1) {
      butt_flag = 0;
      Serial.println("Button No");
    }
  }
}
 
Изменено:

Геннадий П

★★★★★★✩
14 Апр 2021
1,847
595
44
Если не знаете в чем проблема: программная или аппаратная. Ну, возьмите пустую программу. Сначала один драйвер проинициализируйте, подергайте его, потом другой, и т.д.
 

LenyGj

✩✩✩✩✩✩✩
14 Авг 2019
8
0
Если не знаете в чем проблема: программная или аппаратная. Ну, возьмите пустую программу. Сначала один драйвер проинициализируйте, подергайте его, потом другой, и т.д.
Пробовал пустую, только чисто библиотеку заюзать, так же. Вот и говорю, что может быть дело в библиотеке:unsure:

Идет постоянный сигнал именно с А3, минуя кнопки. У других пин все хорошо, менял в скетче от А0-A2, А4-А7.В распиновке нет отличия, кроме как А6 и А7, у них цифры нет, а тот чем отличается?
 
Изменено:

Bruzzer

★★★✩✩✩✩
23 Май 2020
334
104
Покажите скетч, где только драйвер мотора и есть проблема.
 

LenyGj

✩✩✩✩✩✩✩
14 Авг 2019
8
0
Грешу на библиотеку. Если писать скетч без библиотеки по классике не внедряя "GyverMotor.h" то работает спокойно, а через библотеку с пин А3 сразу идет питание

Покажите скетч, где только драйвер мотора и есть проблема.
GMotor motorL(DRIVER3WIRE, A2, A3, 6);

Ещё один момент, как отрегулировать диапазон джойстика в библиотеке моторов? А то при моторы пищат, вращаются тихонько, хотя джойстик не трогаю

  • setDeadtime(us)
    - установка программного deadtime на переключение направления,
    us
    в микросекундах. По умолчанию стоит 0: deadtime отключен
  • setDirection(dir)
    - ГЛОБАЛЬНАЯ смена направления вращения мотора например чтобы FORWARDсовпадал с направлением движения "вперёд" у машинки.
    dir
    - REVERSE или NORMAL (умолч.)
  • setLevel(level)
    - смена уровня драйвера (аналогично при инициализации). Если при увеличении скорости мотор наоборот тормозит - смени уровень.
    level
    - LOW или HIGH
  • setMinDuty(duty)
    - минимальный сигнал (по модулю), который будет подан на мотор. Автоматически сжимает диапазон регулирования мотора: например minDuty поставили 50, и при сигнале 1 будет на мотор будет подано ~51, максимум останется прежним (диапазон сигнала переведётся в 50.. 255 внутри библиотеки).

Все команды попробовал, не могу отрегулировать покой моторов, где этот диапазон ручки (

Ставил переменные резисторы, помогает успокоить моторы, но теряет скорость движения вперёд при полном сдвиге стика
 

LenyGj

✩✩✩✩✩✩✩
14 Авг 2019
8
0
Пробовал в int signalX = 255 - valX / 2 изменить данные на классический код map, не помогает тоже.
Кто знает как сделать, чтобы моторы в покое были?
 

viktor1703

★★★✩✩✩✩
9 Дек 2021
546
134
начинает вращаться левый мотор (GMotor motorL(DRIVER3WIRE, A2, A3, 6) , с пина (A2) почему то идет сигнал
не внедряя "GyverMotor.h" то работает спокойно, а через библотеку с пин А3 сразу идет питание
Так А2 или А3?
Представлен на обозрение лишь код "приемника", а где код обработки ДЖОЙСТИКА МОТОРА в "передатчике" (только его, не нужно писать всю портянку, никому не интересно выискивать пару строк из сотен). Может там изначально нет "мертвой" зоны.
 
Изменено: