Доброго времени. Потребовалось сделать следующую конструкцию: шаговки получает по блютуз с телефона команду и, в зависимости от этой команды, делает определенное количеств шагов в одну или другую сторону. Вот скеч, где по блютуз в зависимости от команды загорается один или второй диод. Вроде просто. Код (C++): //Объявляем переменные char incomingbyte; // переменная для приема данных //Инициализация переменных void setup() { Serial.begin(9600); pinMode(6,OUTPUT); pinMode(7,OUTPUT); } //Основной цикл программы void loop() { if (Serial.available() > 0){ incomingbyte = Serial.read(); if (incomingbyte == '1'){ digitalWrite(6,HIGH); Serial.println("up"); } if (incomingbyte=='2'){ digitalWrite(7,HIGH); Serial.println("down"); } } } Работает, да. Далее потестил шаговик. (8 10 9 11 - правильная его распиновка. Шаговик 28byj-48). Хорошо крутит туда сюда. Окей, совмещаем. Код (C++): #include <Stepper.h> const int IN1 = 8; const int IN2 = 10; const int IN3 = 9; const int IN4 = 11; const int stepsPerRevolution = 320; // шагов за один оборот Stepper myStepper(stepsPerRevolution, IN1, IN2, IN3, IN4); void setup() { myStepper.setSpeed(50); // скорость 5 об/минуту } void loop() { myStepper.step(stepsPerRevolution); // шаг в одном направлении delay(500); Serial.println("counterclockwise"); myStepper.step(-stepsPerRevolution); // шаг в обратную сторону delay(500); } Основной код: Код (C++): //Объявляем переменные char incomingbyte; // переменная для приема данных #include <Stepper.h> const int IN1 = 8; const int IN2 = 10; const int IN3 = 9; const int IN4 = 11; const int stepsPerRevolution = 420; // шагов за один оборот Stepper myStepper(stepsPerRevolution, IN1, IN2, IN3, IN4); //Инициализация переменных void setup() { Serial.begin(9600); myStepper.setSpeed(100); // скорость 50 об/минуту } //Основной цикл программы void loop() { if (Serial.available() > 0){ incomingbyte = Serial.read(); if (incomingbyte == '1'){ myStepper.step(stepsPerRevolution); Serial.println("uup"); delay(500); } if (incomingbyte=='2'){ myStepper.step(-stepsPerRevolution); Serial.println("ddown"); delay(500); } } } Вот, собственно, и трудность. При получении команды шаговик жужжит, но никуда не вращается, будто его клинит. В чем я не прав?
У Вас в одном месте: Код (C++): const int stepsPerRevolution = 320; // шагов за один оборот а в другом: Код (C++): const int stepsPerRevolution = 420; // шагов за один оборот Так и должно?
Да и скорость в одном месте myStepper.setSpeed(100); в другом myStepper.setSpeed(50); Вы двигатель то протестируйте сначала в этих режимах. Может он и не будет крутится при stepsPerRevolution =420; myStepper.setSpeed(100);
Ох, знал что будет такой вопрос. Эти то не имеет значения. С одинаковыми то же самое. Я изменял просто, пытался найти отличия, но разницы никакой.
Если у Вас 28byj-48, то вы его неправильно инициализируете. У него другая последовательность управления Нужно так: Код (C++): Stepper myStepper(stepsPerRevolution, IN1, IN3, IN2, IN4); При вашей схеме он все силы израсходует на противодействие самому себе. Крутить может и будет, но через раз
Разницы никакой. Зато, если приминить Ваше решение для скетча, где двигатель сам по себе вращаться, то схема перестает работать. При constint IN1 =8; constint IN2 =10; constint IN3 =9; constint IN4 =11; Stepper myStepper(stepsPerRevolution, IN1, IN2, IN3, IN4); Сам по себе отлично крутит. Через блютуз, повторюсь, отличий нет.
Проверил. Благо под рукой есть 28byj-48 с контроллером ULN 2003 Попробовал подключить так: Код (C++): #include <Stepper.h> const int IN1 = 30; const int IN2 = 32; const int IN3 = 34; const int IN4 = 36; const int stepsPerRevolution = 2048; // шагов за один оборот Stepper myStepper(stepsPerRevolution, IN1, IN3, IN2, IN4); void setup() { myStepper.setSpeed(16); } void loop() { myStepper.step(stepsPerRevolution); // шаг в одном направлении delay(500); Serial.println("counterclockwise"); myStepper.step(-stepsPerRevolution); // шаг в обратную сторону delay(500); } Крутит прекрасно А если по Вашей схеме: Код (C++): #include <Stepper.h> const int IN1 = 30; const int IN2 = 32; const int IN3 = 34; const int IN4 = 36; const int stepsPerRevolution = 2048; // шагов за один оборот Stepper myStepper(stepsPerRevolution, IN1, IN2, IN3, IN4); void setup() { myStepper.setSpeed(16); } void loop() { myStepper.step(stepsPerRevolution); // шаг в одном направлении delay(500); Serial.println("counterclockwise"); myStepper.step(-stepsPerRevolution); // шаг в обратную сторону delay(500); } То 16 оборотов в минуту ну никак. Максимум 7, потом дрожит и не крутит.
Такой же шилд для управления ULN2003, но все наоборот. Могу снять видео. Проблема не в том, что в этом скетче не крутит, в этом то все хорошо. Проблема в том, что получая команду через блютуз, он его не крутит. Там хоть как INы меняй.
Ваш скетч у меня тоже не работает. Ведет себя точно так же как Вы описываете. Но после корректировок, которые я писал выше все прекрасно работает Вот ваш скетч с моими исправлениями Код (C++): //Объявляем переменные char incomingbyte; // переменная для приема данных #include <Stepper.h> const int IN1 = 30; const int IN2 = 32; const int IN3 = 34; const int IN4 = 36; const int stepsPerRevolution = 2048; // шагов за один оборот Stepper myStepper(stepsPerRevolution, IN1, IN3, IN2, IN4); //Инициализация переменных void setup() { Serial.begin(9600); myStepper.setSpeed(10); // скорость 10 об/минуту } //Основной цикл программы void loop() { if (Serial.available() > 0){ incomingbyte = Serial.read(); if (incomingbyte == '1'){ myStepper.step(stepsPerRevolution); Serial.println("uup"); delay(500); } if (incomingbyte=='2'){ myStepper.step(-stepsPerRevolution); Serial.println("ddown"); delay(500); } } } Посылаю в серийный порт 1 крутит в одну сторону, посылаю 2 крутит в другую. Номера PIN только с моих на свои заменить не забудьте
Хм, скопировал, изменил пины не 8 10 9 11, а 8 9 10 11, но с измененным Вами In. Так работает, спасибо. Но почему тогда точно такой же код не работает в автоматическом режиме?) Там только 10 и 9 местами менять приходилось, чтобы двигатель на месте не крутил, а ины трогать не помогало?) Писал выше. Собственно, проблема решена, огромное спасибо.
Не должно быть никакой разницы. Скорее всего Вы что-то другое упустили. Я конечно могу проверить, но и так понятно, что будет работать и так: Код (C++): const int IN1 = 8; const int IN2 = 9; const int IN3 = 10; const int IN4 = 11; Stepper myStepper(stepsPerRevolution, IN1, IN3, IN2, IN4); и так: Код (C++): const int IN1 = 8; const int IN2 = 10; const int IN3 = 9; const int IN4 = 11; Stepper myStepper(stepsPerRevolution, IN1, IN2, IN3, IN4); и так: Код (C++): Stepper myStepper(stepsPerRevolution, 8, 10, 9, 11); Но второй вариант я бы использовать не стал. Если конечно не хотите никого запутать. IN1, IN2... это же так пины на плате подписаны. Получается распиновка на плате не будет совпадать со скетчем. Программный код это же не только машинная логика, это еще и документация.
Подскажите начинающему что добавить в последний скетч чтобы проверялась последняя команда. Для ясности: шаговик управляет жалюзи, после завершения команды "1" повторно не принимало "1", а только "2" и наоборот. Заранее спасибо
Код (C++): //Объявляем переменные char incomingbyte; // переменная для приема данных #include <Stepper.h> const int IN1 = 30; const int IN2 = 32; const int IN3 = 34; const int IN4 = 36; const int stepsPerRevolution = 2048; // шагов за один оборот Stepper myStepper(stepsPerRevolution, IN1, IN3, IN2, IN4); //Инициализация переменных void setup() { Serial.begin(9600); myStepper.setSpeed(10); // скорость 10 об/минуту } // Последняя исполненная команда int LastCommand = 0; //Основной цикл программы void loop() { if (Serial.available() > 0){ incomingbyte = Serial.read(); if (incomingbyte == '1' && LastCommand != 1){ myStepper.step(stepsPerRevolution); Serial.println("uup"); delay(500); LastCommand = 1; } if (incomingbyte=='2' && LastCommand != 2){ myStepper.step(-stepsPerRevolution); Serial.println("ddown"); delay(500); LastCommand = 2; } } }
Поигравшись с мотором выяснил, что при подключении к HC-06 с телефона (перестает моргать светодиод и постоянно горит) мотор в состоянии покоя нагревается примерно до 40 гр.С. При сбросе подключения BT такого не наблюдается. Есть смысл искать причину или добавить реле на включение питания двигателя при подаче сигнала с телефона на время подъема/опускания жалюзи? Заранее спасибо!!!
Шаговый двигатель в состоянии покоя находится в режиме удержания, потребляет ток и соответственно нагревается. Если режим удержания не нужен, то необходимо отключать удержание. Реле для этого не нужно. Достаточно установить все порты в LOW состояние. Шаговики нормально переносят температуру до 80 градусов. Некоторые годами работают при 80-100. Код (C++): // Отключение удержания digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); digitalWrite(IN3, LOW); digitalWrite(IN4, LOW);