2 Motor Driver shield+arduino mega

Тема в разделе "Arduino & Shields", создана пользователем Samand, 13 мар 2014.

  1. Samand

    Samand Нуб

    Надо запустить 4 шаговых биполярных двигателя со звуковым сопровождением, есть Motor Driver shield 2 шт. , Music shield V2 и arduino mega. Как подключить? Отдельно Motor Driver shield и arduino mega работают нормально, вставляешь вторую плату и обе платы гаснут. На верхней плате отогнул пины к которым подключены движки нижней платы, двигатели нижней платы завелись, подключил движки к верхней плате, движки не крутятся а только свистят. Есть тут решение, или это тупик?
     

    Вложения:

  2. acos

    acos Официальный гик Администратор

    Не очень понял в чём проблема из вашего описания. У вас не получается запустить сразу оба Motor Driver shield? Или не получается запустить Motor Driver shield вместе с Music shield V2?
    2 Motor Driver shield бутербродом завести не получится, они ж используют одни и те же пины.
    Поэтому нужно подключать их к разным пинам.
     
  3. Samand

    Samand Нуб

    С пинами я уже понял, а музыкалка, если ее прописать в оном и том же скетче все берет на себя, т.е. музыка идет а движки стоят.
     
  4. Megakoteyka

    Megakoteyka Оракул Модератор

    Покажите код.
     
    acos нравится это.
  5. Samand

    Samand Нуб

    Звуковая карта не работает имеено с двигателями. Остальное все работает. Как только включаешь звуковую - ШД не включаются и даже не стопаряться.

    Код (Text):
    //===========================================
    #include <SD.h>
    #include <SPI.h>
    #include <MusicPlayer.h>
    MusicPlayer myplayer;
    //=============================================
    int Kn_1 = 22; //Кнопка 1 - 2-я ножка
    int Kn_2 = 23; //Кнопка 1 - 3-я ножка
    int Kn_3 = 24; //Кнопка 3 - 4-я ножка
    int val_Kn_1 = 0; //переменная для кнопки 1
    int val_Kn_2 = 0; //переменная для кнопки 2
    int val_Kn_3 = 0; //переменная для кнопки 3
    int Rele_1 = 25; //Реле1 1 - 5-я ножка
    int x = 0; //Локальная переменная
    //=============================================
    //Инициализация шаговых двигателей
    //int dirPin1 = 3; //1-й
    //int stepperPin1 = 2;
    int dirPin2 = 7; //2-й
    int stepperPin2 = 6;
    int dirPin3 = 45; //3-й
    int stepperPin3 = 11;
    int dirPin4 = 12; //4-й
    int stepperPin4 = 13;
    //=============================================
    void setup()
    {
    //=============================================
    pinMode(Kn_1, OUTPUT); //Кнопка 2 ножка
    pinMode(Kn_2, OUTPUT); //Кнопка 3 ножка
    pinMode(Rele_1, OUTPUT); //Реле 4 ножка
    //=============================================
    // Иницилизация шаговых двигателей
    //pinMode(dirPin1, OUTPUT);
    //pinMode(stepperPin1, OUTPUT);
    pinMode(dirPin2, OUTPUT);
    pinMode(stepperPin2, OUTPUT);
    pinMode(dirPin3, OUTPUT);
    pinMode(stepperPin3, OUTPUT);
    pinMode(dirPin4, OUTPUT);
    pinMode(stepperPin4, OUTPUT);
    Serial.begin(9600);
    myplayer.begin();
    }
    /*void step1(boolean dir,int steps)
    {
    digitalWrite(dirPin1,dir);
    delay(50);
    for(int i=0;i<steps;i++)
    {
    digitalWrite(stepperPin1, HIGH);
    delayMicroseconds(125);
    digitalWrite(stepperPin1, LOW);
    delayMicroseconds(125);
    }
    }*/
    void step2(boolean dir,int steps)
    {
    digitalWrite(dirPin2,dir);
    delay(50);
    for(int i=0;i<steps;i++)
    {
    digitalWrite(stepperPin2, HIGH);
    delayMicroseconds(100);
    digitalWrite(stepperPin2, LOW);
    delayMicroseconds(100);
    }
    }
    void step3(boolean dir,int steps)
    {
    digitalWrite(dirPin3,dir);
    delay(50);
    for(int i=0;i<steps;i++)
    {
    digitalWrite(stepperPin3, HIGH);
    delayMicroseconds(100);
    digitalWrite(stepperPin3, LOW);
    delayMicroseconds(100);
    }
    }

    void step4(boolean dir,int steps)
    {
    digitalWrite(dirPin4,dir);
    delay(50);
    for(int i=0;i<steps;i++)
    {
    digitalWrite(stepperPin4, HIGH);
    delayMicroseconds(150);
    digitalWrite(stepperPin4, LOW);
    delayMicroseconds(150);
    }
    }
    void loop()
    {
    //=============================================
    digitalWrite(Kn_1,LOW); //Имитация включения кнопки 1
    digitalWrite(Kn_2,HIGH); //Имитация включения кнопки 2
    digitalWrite(Kn_3,LOW); //Имитация включения кнопки 3

    val_Kn_1 = digitalRead(Kn_1); //Читаем кнопку 1
    if (val_Kn_1 == 1)
    {
    // Кнопка 1 включена
    digitalWrite(Rele_1,HIGH); //Включаем реле 1

    // Двигатель 1
    //step1(true,64*256*30.3); //30.3
    //delay(1000);
    //step1(false,64*256*12.5); //-12.5
    //delay(1000);
    //step1(true,64*256*4.5); //4.5
    //delay(1000);

    // Двигатель 2
    step2(true,1600*32.7); //32.7
    delay(1000);
    step2(false,1600*65.4); //-65.4
    delay(1000);
    step2(true,1600*32.7); //32.7
    delay(1000);

    // Двигатель 3
    step3(false,1600*3.7); //-3.7
    delay(1000);
    step3(true,1600*18.8); //18.8
    delay(1000);
    step3(false,1600*15.1); //-15.1
    delay(1000);

    // Двигатель 4
    step4(true,1600*27.6); //27.6
    delay(1000);
    step4(false,1600*52.2); //-52.2
    delay(1000);
    step4(true,1600*27.6); //27.6
    delay(1000);

    // Двигатель 1
    //step1(false,64*256*22.3); //-22.3

    digitalWrite(Rele_1,LOW); //Отключаем реле 1
    }
    else
    {
    //Кнопка 1 выключена
    val_Kn_2 = digitalRead(Kn_2); //Читаем кнопку 2
    if (val_Kn_2 == 1)
    {
    //Кнопка 1 выключена
    digitalWrite(Rele_1,HIGH); //Включаем реле 1
    do
    {
    //step1(true,1600*16.9); //16.9
    step4(false,1600*8.3); //-8.3
    step3(true,1600*0.92); //0.92
    step4(true,1600*2.8); //2.8
    //delay(5000); // пуск
    myplayer.setPlayMode(PM_REPEAT_ONE);
    myplayer.playOne("zup.wav");
    myplayer.setVolume(0);
    myplayer.play();
    //delay(5000); // пуск
    step4(true,1600*12); //12
    //step1(true,1600*5.3); //5.3
    step3(true,1600*5.5); //5.5
    step4(true,1600*1.8); //1.8
    //delay(5000); // пуск
    myplayer.setPlayMode(PM_REPEAT_ONE);
    myplayer.playOne("gun.wav");
    myplayer.setVolume(0);
    myplayer.play();
    //delay(5000); // пуск
    //step1(false,1600*22.2); //-22.2
    step3(false,1600*6.42); //-6.42
    step4(false,1600*6.5); //-6.5

    val_Kn_3 = digitalRead(Kn_3); //Читаем кнопку 3

    if (val_Kn_3 == 1)
    {
    x = 0;
    digitalWrite(Rele_1,LOW); //Отключаем реле 1
    }
    else
    {
    delay(30000);
    x = x + 1;
    }
    } while (0 < x <= 30);
    }
    //=============================================
    }
    if (x >= 30)
    {
    delay(900000); // ждём 15 мин
    x = 0;
    }
    }
     
    Последнее редактирование: 18 мар 2014
  6. Megakoteyka

    Megakoteyka Оракул Модератор

    В Arduino IDE нажмите Ctrl+T, затем вставьте код, используя тэг CODE.
    Тогда его можно будет читать и пытаться понять.

    Чтобы одновременно работали независимые задачи, необходимо избавляться от использования функции delay(), которая вешает контроллер на время своего выполнения.
     
  7. Samand

    Samand Нуб

    Код подправил. У нас все задачи зависимые(последоватедьное выполнение) и без этой функции нам, к сожалению, не обойтись.
     
  8. Megakoteyka

    Megakoteyka Оракул Модератор

    В Arduino IDE нажмите Ctrl+T, затем вставьте код, используя тэг CODE.

    Не существует такой ситуации, в которой нельзя обойтись без завешивания контроллера :)
    Попробуйте использовать машину состояний для последовательного перебора моторов.
     
  9. Samand

    Samand Нуб

    Убрали все delay() из исходного текста. ШД опять блокируются. Звуковая не играет.
     
  10. Megakoteyka

    Megakoteyka Оракул Модератор

    Нужно же не просто убрать, а переписать таким образом, чтобы задержка работала, но выполнение кода при этом не блокировалось. О том, как это делается, тут уже куча тем исписана была, поищите.

    И давайте уточним задачу. Напишите подробно, какого поведения хотите добиться, а то из фразы "запустить 4 шаговых биполярных двигателя со звуковым сопровождением" мало понятно.
     
  11. Samand

    Samand Нуб

    Значит так: Изготавливается что-то вроде робота, в котором стоят 4 двигателя ( подъем, опускание и поворот головы, подъем о опускание рук и поворот корпуса). Задача: поднялась голова, поднялись руки, повернулось тело на n-ый угол, остановилось, проиграла музыка. Затем все хояйство поворачивается на n-ый угол назад, останавливается и проигрывает другая мелодия, после этого все возвращается в исходное состояние и перекур 30 сек. После выполнения 30 циклов перекур на 15 минут.
     
  12. Megakoteyka

    Megakoteyka Оракул Модератор

    Т.е. одновременно музыка и моторы работать не должны? Ну тогда действительно можно не заморачиваться и просто вызывать по очереди нужные функции и между ними делать паузы.

    Попробуйте двигаться постепенно. Напишите болванку программы и начинайте наполнять ее функционалом. После написания каждого кусочка кода проверяйте работу. Так будет проще отследить момент, когда полезут проблемы.

    Еще хороший вариант - писать сперва "скелет" программы, который вместо вращения моторов и проигрывания музыки будет просто выдавать в порт строки типа "работает мотор 1", "звучит мелодия 4" и т.п. После того, как логика заработает правильно (строки начнут выдаваться в нужной последовательности), можно начинать заменять выдачу этих строк реальным функционалом, опять же по шагам, каждый раз проверяя работу программы.

    И не забывайте нажимать почаще Ctrl+T в Arduino IDE для автоматического форматирования кода - так программу будет проще читать (и Вам, и другим) и будет лучше видна ее структура.
     
  13. Samand

    Samand Нуб

    Спасибо, завтра попробуем.