Управление ШД через Ардуину подключенную к другой ардуине

Тема в разделе "Моторы, сервоприводы, робототехника", создана пользователем Kamikadze, 15 ноя 2017.

  1. Kamikadze

    Kamikadze Гик

    День добрый. Мега управляет двумя ШД посылая сигналы на УНО. Те в свою очередь принимая полученый сигнал передают сигнал на драйвера. Эмулятор в протусе 7 версии работает корректно, на практике, моторы вообще не реагируют на получаемый сигнал. Подскажите пожалуйста в какую сторону рыть. Скетч Меги и одной из уно ниже.

    Скетч для меги
    Код (C++):
    /*Схема подачи сигнала для управления моторами
    * На МЕГЕ  Pin4/7  Pin5/8  Pin6/9 ==> В УНО Pin2 / Pin3 / Pin4
        СТОП    0     0     0
        ВПЕРЕД  1     0     0    
        НАЗАД   0     1     0
        Right90 0     0     1
        Left90  1     1     1
    */


    int motor1Pin4 = 4, motor1Pin5 = 5, motor1Pin6 = 6; //Ардуино-мотор 1 (правый)
    int motor2Pin7 = 7, motor2Pin8 = 8, motor2Pin9 = 9; //Ардуино-мотор 2 (левый)
    int CLKuno1Pin10 = 10;                                  //Разрешить/Запретить запись в УНО
    int CLKuno2Pin11 = 11;

    int Direct = 0;   //Номер элемента Массива
    int MassGoToMotors[5] = {           //Массив хранящий поведение моторов
                             B0000000,   //Стоп Моторы
                             B0100100,   //Вперед
                             B0010010,   //Назад
                             B0001000,   //Поворот на 90гр направо
                             B0000001    //Поворот на 90гр налево
                            };

    void setup()
    {
      Serial.begin(9600);
      pinMode(motor1Pin4, OUTPUT);
      pinMode(motor1Pin5, OUTPUT);
      pinMode(motor1Pin6, OUTPUT);
      pinMode(motor2Pin7, OUTPUT);
      pinMode(motor2Pin8, OUTPUT);
      pinMode(motor2Pin9, OUTPUT);
      pinMode(CLKuno1Pin10, OUTPUT);
      pinMode(CLKuno2Pin11, OUTPUT);
      digitalWrite(CLKuno1Pin10, LOW);
      digitalWrite(CLKuno2Pin11, LOW);
    }

    //****************************************************************************************************************************ППОСЛЕ СЕТАП***********************************************************************************************************

    void loop()
    {
      while(Serial.available() == 0);     //ждем ввод данных  9МаксСкорость)

      int SelectDirect = Serial.parseInt();
      switch (SelectDirect)
      {
        case 0:                           //Стоп мотор
          digitalWrite(CLKuno1Pin10, HIGH);
          digitalWrite(CLKuno2Pin11, HIGH);
          SlDirect(0);

          Serial.println("Motor Stop");
         
          delay(20);
          digitalWrite(CLKuno1Pin10, LOW);
          digitalWrite(CLKuno2Pin11, LOW);
          break;
        case 1:                           //Вперед
          digitalWrite(CLKuno1Pin10, HIGH);
          digitalWrite(CLKuno2Pin11, HIGH);
          SlDirect(1);

          Serial.println("Motor FORWARD");
         
          delay(20);
          digitalWrite(CLKuno1Pin10, LOW);
          digitalWrite(CLKuno2Pin11, LOW);
          break;
        case 2:                           //Назад
          digitalWrite(CLKuno1Pin10, HIGH);
          digitalWrite(CLKuno2Pin11, HIGH);
          SlDirect(2);
         
          Serial.println("Motor BACKWARD");
         
          delay(20);
          digitalWrite(CLKuno1Pin10, LOW);
          digitalWrite(CLKuno2Pin11, LOW);
          break;
        case 3:                           //Поворот на 90гр [хз куда
          digitalWrite(CLKuno1Pin10, HIGH);
          digitalWrite(CLKuno2Pin11, HIGH);
          SlDirect(3);
         
          Serial.println("Turn 90");
         
          delay(20);
          digitalWrite(CLKuno1Pin10, LOW);
          digitalWrite(CLKuno2Pin11, LOW);  
          break;
        case 4:                           //Поворот на 90гр [хз куда
          digitalWrite(CLKuno1Pin10, HIGH);
          digitalWrite(CLKuno2Pin11, HIGH);
          SlDirect(4);
          delay(20);
               
          Serial.println("Turn 90");
          digitalWrite(CLKuno1Pin10, LOW);
          digitalWrite(CLKuno2Pin11, LOW);  
          break;      
      }
    End Loop
    }


    //*****************************************************************************************************************************ПОСЕ ЛООП***********************************************************************************************************

    void SlDirect (int Direct)      //Процедура для направления движения
    {
      digitalWrite(motor1Pin4, bitRead(MassGoToMotors[Direct], 5));
      digitalWrite(motor1Pin5, bitRead(MassGoToMotors[Direct], 4));
      digitalWrite(motor1Pin6, bitRead(MassGoToMotors[Direct], 3));
      digitalWrite(motor2Pin7, bitRead(MassGoToMotors[Direct], 2));
      digitalWrite(motor2Pin8, bitRead(MassGoToMotors[Direct], 1));
      digitalWrite(motor2Pin9, bitRead(MassGoToMotors[Direct], 0));
    }
     
    Скетч для Уно
    Код (C++):
    int dir_pin = 5, step_pin = 6;    //Пин на драйвер
    const int MaxSpeed = 1500;
    const int Acceleration = 6666;
    const long moveToGo = 160000;

    int Pin2 = 2, Pin3 = 3, Pin4 = 4;   //Входящие пины от Меги
    int CLKPin10 = 10;              //Разрешить/Запретить запись в УНО


    void setup()
    {
      pinMode(Pin2, INPUT);
      pinMode(Pin3, INPUT);
      pinMode(Pin4, INPUT);
      pinMode(CLKPin10, INPUT);

      pinMode(dir_pin, OUTPUT);
      pinMode(step_pin, OUTPUT);
      stepperq.setMaxSpeed(MaxSpeed);
      stepperq.setAcceleration(Acceleration);
      stepperq.moveTo(moveToGo);
    }

    void loop()
    {
      if (digitalRead(CLKPin10) == HIGH)
      {
        if (digitalRead(Pin2) == 0 && digitalRead(Pin3) == 0 && digitalRead(Pin4) == 0)   //стоп мотор
        {
          stepperq.stop();
        }
        else if (digitalRead(Pin2) == 1 && digitalRead(Pin3) == 0 && digitalRead(Pin4) == 0)  //Вперед для второй уны нужно сменить знак для MoveTo
        {
          stepperq.start();
        }
        else if (digitalRead(Pin2) == 0 && digitalRead(Pin3) == 1 && digitalRead(Pin4) == 0)  //Назад для второй уны нужно сменить знак для MoveTo
        {
          stepperq.moveTo(moveToGo * -1);    //для второй уны знак меняется на противоположный
          stepperq.start();
        }
        else
        {
          stepperq.stop();    //нужно дописать поворот на 90 градусов, но это потом  
        }
      }
    }
     
  2. rkit

    rkit Гуру

    В сторону схемы
     
  3. Kamikadze

    Kamikadze Гик

    Вот схема, пины от Меги к Уно к земле не подтянуты (от меги управляющие пины подключены к соответствующим пинам на Уно 1 и 2), т.е. дребезг может быть... Подскажите пожалуйста нужно ли ставить дополнительно защитные конденсаторы и диоды, перед драйверами от моторов, (диод последовательно конденсатор параллельно). И перед драйверами от питания конденсатор, для защиты от дребезга?
     

    Вложения:

    • Схема.jpg
      Схема.jpg
      Размер файла:
      69,3 КБ
      Просмотров:
      1.222
  4. vvr

    vvr Инженерище

    не совсем понятно как вы собираетесь организовать связь между дунями, но для подобных вещей существует RS485.
    в сети тыщщщщи примеров.
    ну и начинайте с простых примеров.
    когда разберётесь - усложняйте.
     
  5. Kamikadze

    Kamikadze Гик

    Добрый вечер, проблема решена, а точнее ее и не было. В Скетчах для Уно, по не внимательности в сетап не были объявлены пины отвечающие за Дир И Степ, что касается управления, Мега посылает HIGH на 10 и 11 пин, которую в свою очередь идут на пин 10 Уно 1 и Уно 2, А в Уно Если вы посмотрите на скетч, обработка события, Если 10 Пин HIGH то Считывать другие пины (Инфу с пина 2 , 3 и 4). Собственно, что и описано в массиве) Типо вперед назад и т.д.
    Необходима именно прямая коммутация.