Не работают сонары с двигателями

Artyom9000
Offline
Зарегистрирован: 08.01.2016

Есть скетч:

#include "AFMotor.h"
#include "Wire.h"
// #include "Ultrasonic.h"

int ADDR = 30;
bool autonom = false;
int val;
int LED = 13;
//int d_3 = 20;
AF_DCMotor motor1(1); //канал М1 на Motor Shield — задний левый
AF_DCMotor motor2(2); //канал М2 на Motor Shield — задний правый
AF_DCMotor motor3(3); //канал М3 на Motor Shield — передний левый
AF_DCMotor motor4(4);
//Ultrasonic us_1(14, 15);
//Ultrasonic us_2(16, 17);
//Ultrasonic us_3(3, 4);
void setup()
{
  pinMode(14, OUTPUT);
  digitalWrite(14, HIGH);
  pinMode(15, INPUT);
  // pinMode(16, OUTPUT);
  // digitalWrite(16, HIGH);
  // pinMode(17, INPUT);
  Serial.begin(9600);
  pinMode(LED, OUTPUT);
  Wire.begin();
}
void loop()
{
  //int d_1 = us_1.Ranging(CM);     // get distance
  // int d_2 = us_2.Ranging(CM);

  Wire.requestFrom(ADDR, 1);
  digitalWrite(LED, HIGH);
  motor1.setSpeed(200);
  motor2.setSpeed(200);
  motor3.setSpeed(200);
  motor4.setSpeed(200);

  if (Serial.available())
  {
    val = Serial.read();
  //  if (!autonom) {
      // При символе "W"
      if (val == 'W') {
        Wire.beginTransmission(ADDR); // передача для устройства #30
        Wire.write("W");        // отправка байта val
        Wire.endTransmission();
      /*  if (d_1 <= 1)   {
          motor3.run(BACKWARD);
          motor4.run(BACKWARD);
        } else {
          motor3.run(RELEASE);
          motor4.run(RELEASE);
        }*/

      }
      if (val == 'C') {
        motor1.run(RELEASE);
        motor2.run(RELEASE);
        motor3.run(RELEASE);
        motor4.run(RELEASE);
        Wire.beginTransmission(ADDR); // передача для устройства #30
        Wire.write("C");             // отправка байта val
        Wire.endTransmission();
      }
      // При символе "S"
      if ( val == 'S')
      {
        Wire.beginTransmission(ADDR); // передача для устройства #30
        Wire.write("S");             // отправка байта val
        Wire.endTransmission();
      /*  if (d_1 <= 1)  {
          motor3.run(FORWARD);
          motor4.run(FORWARD);
        } else {
          motor3.run(RELEASE);
          motor4.run(RELEASE);
        }*/
      }
      if (val == 'A') {
        Wire.beginTransmission(ADDR); // передача для устройства #30
        Wire.write("A");             // отправка байта val
        Wire.endTransmission();
      }
      if (val == 'D') {
        Wire.beginTransmission(ADDR); // передача для устройства #30
        Wire.write("D");             // отправка байта val
        Wire.endTransmission();
      }
      if (val == '1') {
        motor1.run(FORWARD);
      }
      if (val == '2') {
        motor1.run(BACKWARD);
      }
      if (val == '3') {
        motor2.run(FORWARD);
      }
      if (val == '4') {
        motor2.run(BACKWARD);
      }
      if (val == '5')
      {
        motor1.run(RELEASE);
        motor2.run(RELEASE);
        motor3.run(RELEASE);
        motor4.run(RELEASE);
      }
  // } 
   /*  if (val == 'V') {
      autonom = !autonom;
    }

   if (autonom) {
      if (d_3 >= 19) {
        Wire.beginTransmission(ADDR); // передача для устройства #30
        Wire.write("W");        // отправка байта val
        Wire.endTransmission();
      }
      if (d_3 <= 19) {
        Wire.beginTransmission(ADDR); // передача для устройства #30
        Wire.write("D");        // отправка байта val
        Wire.endTransmission();
      }
    }
    d_3 = us_3.Ranging(CM);*/
  }
}

При раскомментировании закомментированных строк :), отвечающих за подключение сонаров, двигатели перестают работать. (В общем, работают отдельно, либо сонары, либо двигатели.) В чем проблема и как можно исправить? Заранее спасибо за ответы. P.S. Если Вам нужна какая-то дополнительная информация, то допишу.

std
Offline
Зарегистрирован: 05.01.2012

Сходу тупое решение: взять вторую ардуину и запрограммить там одно, здесь другое, между ними передавать нужную инфу, по i2c там или uart. Мб это у меня от пересмотра Full metall alchemist - Шу Такер, химеры... Изврат.. но работает.

Artyom9000
Offline
Зарегистрирован: 08.01.2016

У меня их уже и так две:) И на обеих работа с двигателями. Просто это вообще странно, что не работает

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Они у Вас подрались за пины.

Первое, что очевидно - Вы используете в строке 16 пин 4 для Unltrasonic, а библиотека AFMotor использует его же для MOTORCLKОстальное смотреть не стал, но Вы проверьте всё внимательно.

Artyom9000
Offline
Зарегистрирован: 08.01.2016

Не работает даже если просто подключить библиотеку ultrasonic. То есть у меня рабочий код (без сонаров), но как только я прописываю 

#include "Ultrasonic.h"

, то моторы сразу перестают работать.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Artyom9000 пишет:

Не работает даже если просто подключить библиотеку ultrasonic. То есть у меня рабочий код (без сонаров), но как только я прописываю 

#include "Ultrasonic.h"

, то моторы сразу перестают работать.

Т.е., вот в том скетче, что у Вас приведёт, если раскомментировать только одну строку - всё перестаёт работать?

Мне стало интересно.

Давайте так. Это действительно точно тот скетч с единственной раскоменитрованной строкой? Если нет (важна ЛЮБАЯ мелочь), то выложите ТОТ скетч.

И ещё, выложите Вашу версию файлов Ultrasonic.h и Ultrasonic.cpp - именно ту, что используется, а то может у меня другая. Я на всё это посмотрю. Чудес не бывает, найдём причину.

Artyom9000
Offline
Зарегистрирован: 08.01.2016

Странно, теперь и с этой строчкой работает. Оо

Поправил замечание насчет 4 пина, теперь скетч такой(с раскомментированными строчками):

#include "AFMotor.h"
#include "Wire.h"
#include "Ultrasonic.h"

int ADDR = 30;
bool autonom = false;
int val;
int LED = 13;
AF_DCMotor motor1(1); //канал М1 на Motor Shield — задний левый
AF_DCMotor motor2(2); //канал М2 на Motor Shield — задний правый
AF_DCMotor motor3(3); //канал М3 на Motor Shield — передний левый
AF_DCMotor motor4(4);
Ultrasonic us_1(14, 15);
//Ultrasonic us_2(16, 17);
Ultrasonic us_3(3, 16);
void setup()
{
  pinMode(14, OUTPUT);
  digitalWrite(14, HIGH);
  pinMode(15, INPUT);
  // pinMode(16, OUTPUT);
  // digitalWrite(16, HIGH);
   pinMode(17, INPUT);
  Serial.begin(9600);
  pinMode(LED, OUTPUT);
  Wire.begin();
}
void loop()
{
  int d_1 = us_1.Ranging(CM);     // get distance
   int d_3 = us_3.Ranging(CM);

  Wire.requestFrom(ADDR, 1);
  digitalWrite(LED, HIGH);
  motor1.setSpeed(200);
  motor2.setSpeed(200);
  motor3.setSpeed(200);
  motor4.setSpeed(200);

  if (Serial.available())
  {
    val = Serial.read();
    if (!autonom) {
      // При символе "W"
      if (val == 'W') {
        Wire.beginTransmission(ADDR); // передача для устройства #30
        Wire.write("W");        // отправка байта val
        Wire.endTransmission();
        if (d_1 <= 1)   {
          motor3.run(BACKWARD);
          motor4.run(BACKWARD);
        } else {
          motor3.run(RELEASE);
          motor4.run(RELEASE);
        }

      }
      if (val == 'C') {
        motor1.run(RELEASE);
        motor2.run(RELEASE);
        motor3.run(RELEASE);
        motor4.run(RELEASE);
        Wire.beginTransmission(ADDR); // передача для устройства #30
        Wire.write("C");             // отправка байта val
        Wire.endTransmission();
      }
      // При символе "S"
      if ( val == 'S')
      {
        Wire.beginTransmission(ADDR); // передача для устройства #30
        Wire.write("S");             // отправка байта val
        Wire.endTransmission();
        if (d_1 <= 1)  {
          motor3.run(FORWARD);
          motor4.run(FORWARD);
        } else {
          motor3.run(RELEASE);
          motor4.run(RELEASE);
        }
      }
      if (val == 'A') {
        Wire.beginTransmission(ADDR); // передача для устройства #30
        Wire.write("A");             // отправка байта val
        Wire.endTransmission();
      }
      if (val == 'D') {
        Wire.beginTransmission(ADDR); // передача для устройства #30
        Wire.write("D");             // отправка байта val
        Wire.endTransmission();
      }
      if (val == '1') {
        motor1.run(FORWARD);
      }
      if (val == '2') {
        motor1.run(BACKWARD);
      }
      if (val == '3') {
        motor2.run(FORWARD);
      }
      if (val == '4') {
        motor2.run(BACKWARD);
      }
      if (val == '5')
      {
        motor1.run(RELEASE);
        motor2.run(RELEASE);
        motor3.run(RELEASE);
        motor4.run(RELEASE);
      }
   } 
     if (val == 'V') {
      autonom = !autonom;
    }

   if (autonom) {
      if (d_3 >= 19) {
        Wire.beginTransmission(ADDR); // передача для устройства #30
        Wire.write("W");        // отправка байта val
        Wire.endTransmission();
      }
      if (d_3 <= 19) {
        Wire.beginTransmission(ADDR); // передача для устройства #30
        Wire.write("D");        // отправка байта val
        Wire.endTransmission();
      }
    }
  }
}

Но двигатели все же не работают.

На второй ардуинке этот код:

#include "Wire.h"
#include "AFMotor.h"
int val;
int ADDR = 30;

AF_DCMotor motor1(1); //канал М1 на Motor Shield — задний левый
AF_DCMotor motor2(2); //канал М2 на Motor Shield — задний правый
AF_DCMotor motor3(3); //канал М3 на Motor Shield — передний левый
AF_DCMotor motor4(4);
void setup() {
  Wire.begin(30);                // join i2c bus with address #8
  Serial.begin(9600);
  Wire.onReceive(receiveEvent); // register event
}

void loop() {

}

// function that executes whenever data is requested by master
// this function is registered as an event, see setup()
void receiveEvent(int howMany) {
  while (Wire.available()) // loop through all but the last
  {
    char cmd = Wire.read(); // receive byte as a character
    motor1.setSpeed(200);
    motor2.setSpeed(200);
    motor3.setSpeed(200);
    motor4.setSpeed(200);
    if (cmd == 'W')
    {
      motor1.run(BACKWARD);
      motor2.run(FORWARD);
      motor3.run(FORWARD);
      motor4.run(BACKWARD);
              Serial.print("W2");
    }
    if (cmd == 'S')
    {
      motor1.run(FORWARD);
      motor2.run(BACKWARD);
      motor3.run(BACKWARD);
      motor4.run(FORWARD);
              Serial.print("S2");
    }
    if (cmd == 'C')
    {
      motor1.run(RELEASE);
      motor2.run(RELEASE);
      motor3.run(RELEASE);
      motor4.run(RELEASE);
              Serial.print("C2");
    }
    if (cmd == 'A')
    {
      motor1.run(FORWARD);
      motor2.run(FORWARD);
      motor3.run(FORWARD);
      motor4.run(FORWARD);
      Serial.print("A2");
    }
    if (cmd == 'D')
    {
      motor1.run(BACKWARD);
      motor2.run(BACKWARD);
      motor3.run(BACKWARD);
      motor4.run(BACKWARD);
      Serial.print("D2");
    }
  }
}

(на всякий случай).

Artyom9000
Offline
Зарегистрирован: 08.01.2016

Ultrasonic.cpp

/*
  Ultrasonic.cpp - Library for HC-SR04 Ultrasonic Ranging Module.library

  Created by ITead studio. Apr 20, 2010.
  iteadstudio.com
  
  updated by noonv. Feb, 2011
  http://robocraft.ru
*/

#include "Ultrasonic.h"

Ultrasonic::Ultrasonic(int TP, int EP)
{
   pinMode(TP, OUTPUT);
   pinMode(EP, INPUT);
   Trig_pin=TP;
   Echo_pin=EP;
}

long Ultrasonic::Timing()
{
  digitalWrite(Trig_pin, LOW);
  delayMicroseconds(2);
  digitalWrite(Trig_pin, HIGH);
  delayMicroseconds(10);
  digitalWrite(Trig_pin, LOW);
  duration = pulseIn(Echo_pin, HIGH);
  return duration;
}

long Ultrasonic::Ranging(int sys)
{
  Timing();
  distacne_cm = duration /29 / 2 ;
  distance_inc = duration / 74 / 2;
  if (sys)
    return distacne_cm;
  else
    return distance_inc;
}

Ultrasonic.h

/*
  Ultrasonic.h - Library for HR-SC04 Ultrasonic Ranging Module.
  Created by ITead studio. Alex, Apr 20, 2010.
  iteadstudio.com
  
  updated by noonv. Feb, 2011
  http://robocraft.ru
*/

#ifndef Ultrasonic_h
#define Ultrasonic_h

#if defined(ARDUINO) && ARDUINO >= 100
  #include "Arduino.h"
#else
  #include "WProgram.h"
#endif 

#define CM 1
#define INC 0

class Ultrasonic
{
  public:
    Ultrasonic(int TP, int EP);
    long Timing();
    long Ranging(int sys);

    private:
    int Trig_pin;
    int Echo_pin;
    long  duration,distacne_cm,distance_inc;
    
};

#endif //#ifndef Ultrasonic_h

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Тот пин, что Вы выложили (первый) работает или нет? И что нужно закомментирровать / раскомментировать. чтобы он перестал (начал) работать. А то я уже запутался.

Artyom9000
Offline
Зарегистрирован: 08.01.2016

Если заккоментировать работу с ультрасоником, то всё начинает работать
Даже если не закомментировано #include "Ultrasonic.h"

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Номера строк, пожалуйста. точно. Что закомментировать. По минимуму!. Т.е. поэкспериментируйте и оставьте как можно больше строк в покое. Что по минимуму надо закомментировать, чтобы заработало. Номера.

Artyom9000
Offline
Зарегистрирован: 08.01.2016

Как только закомментировал вычисление расстояния( строки 30-31), то всё заработало. До этого он не реагировал, но секунд через 10 увидел команду, проехал сантиметров пять и снова затих. Такое чувство, что вычисление расстояния "перебивает" выполнение других процессов.  P.S. Также закомментировал строки: 43, 49-55, 73-79, 110-126.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Артём, ну так нельзя, ну, говорите Вы чётко, ну я же не могу ничего видеть и всё только через Ваши слова воспринимаю. А Вы что мне пишете: "Как только закомментировал вычисление расстояния( строки 30-31), то всё заработало. ...  Также закомментировал строки: 43, 49-55, 73-79, 110-126". Так, блин, надо комментировать 43, 459-55 ... чтобы заработало? Или чтобы заработало достаточно только 30-31? Ну, пожалуйста, скажите Вы наконец, чётко и понятно!

 

Artyom9000
Offline
Зарегистрирован: 08.01.2016

Конечно и  30-31 и 49-55, 73-79. Всё вместе. Там ведь в if-ах проверка расстояния, а она без строк 30-31(в которых расстояние вычисляется) не работает.  Извините за неточности:)