Надо запустить 4 шаговых биполярных двигателя со звуковым сопровождением, есть Motor Driver shield 2 шт. , Music shield V2 и arduino mega. Как подключить? Отдельно Motor Driver shield и arduino mega работают нормально, вставляешь вторую плату и обе платы гаснут. На верхней плате отогнул пины к которым подключены движки нижней платы, двигатели нижней платы завелись, подключил движки к верхней плате, движки не крутятся а только свистят. Есть тут решение, или это тупик?
Не очень понял в чём проблема из вашего описания. У вас не получается запустить сразу оба Motor Driver shield? Или не получается запустить Motor Driver shield вместе с Music shield V2? 2 Motor Driver shield бутербродом завести не получится, они ж используют одни и те же пины. Поэтому нужно подключать их к разным пинам.
С пинами я уже понял, а музыкалка, если ее прописать в оном и том же скетче все берет на себя, т.е. музыка идет а движки стоят.
Звуковая карта не работает имеено с двигателями. Остальное все работает. Как только включаешь звуковую - ШД не включаются и даже не стопаряться. Код (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; } }
В Arduino IDE нажмите Ctrl+T, затем вставьте код, используя тэг CODE. Тогда его можно будет читать и пытаться понять. Чтобы одновременно работали независимые задачи, необходимо избавляться от использования функции delay(), которая вешает контроллер на время своего выполнения.
Код подправил. У нас все задачи зависимые(последоватедьное выполнение) и без этой функции нам, к сожалению, не обойтись.
В Arduino IDE нажмите Ctrl+T, затем вставьте код, используя тэг CODE. Не существует такой ситуации, в которой нельзя обойтись без завешивания контроллера Попробуйте использовать машину состояний для последовательного перебора моторов.
Нужно же не просто убрать, а переписать таким образом, чтобы задержка работала, но выполнение кода при этом не блокировалось. О том, как это делается, тут уже куча тем исписана была, поищите. И давайте уточним задачу. Напишите подробно, какого поведения хотите добиться, а то из фразы "запустить 4 шаговых биполярных двигателя со звуковым сопровождением" мало понятно.
Значит так: Изготавливается что-то вроде робота, в котором стоят 4 двигателя ( подъем, опускание и поворот головы, подъем о опускание рук и поворот корпуса). Задача: поднялась голова, поднялись руки, повернулось тело на n-ый угол, остановилось, проиграла музыка. Затем все хояйство поворачивается на n-ый угол назад, останавливается и проигрывает другая мелодия, после этого все возвращается в исходное состояние и перекур 30 сек. После выполнения 30 циклов перекур на 15 минут.
Т.е. одновременно музыка и моторы работать не должны? Ну тогда действительно можно не заморачиваться и просто вызывать по очереди нужные функции и между ними делать паузы. Попробуйте двигаться постепенно. Напишите болванку программы и начинайте наполнять ее функционалом. После написания каждого кусочка кода проверяйте работу. Так будет проще отследить момент, когда полезут проблемы. Еще хороший вариант - писать сперва "скелет" программы, который вместо вращения моторов и проигрывания музыки будет просто выдавать в порт строки типа "работает мотор 1", "звучит мелодия 4" и т.п. После того, как логика заработает правильно (строки начнут выдаваться в нужной последовательности), можно начинать заменять выдачу этих строк реальным функционалом, опять же по шагам, каждый раз проверяя работу программы. И не забывайте нажимать почаще Ctrl+T в Arduino IDE для автоматического форматирования кода - так программу будет проще читать (и Вам, и другим) и будет лучше видна ее структура.