Помогите объединить 2 скетча
- Войдите на сайт для отправки комментариев
Вс, 21/01/2018 - 17:38
#include <CustomStepper.h>
CustomStepper stepper(2, 3, 4, 5, (byte[]){8, B1000, B1100, B0100, B0110, B0010, B0011, B0001, B1001}, 4075.7728395, 12, CW);
boolean rotate1 = false;
boolean rotatedeg = false;
boolean crotate = false;
void setup()
{
//sets the RPM
stepper.setRPM(2);
stepper.setSPR(4075.7728395);
}
void loop()
{
if (stepper.isDone() && rotate1 == false)
{
stepper.setDirection(CCW);
stepper.rotate(2);
rotate1 = true;
}
stepper.run();
}
#include <IRremote.h>
int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup()
{
Serial.begin(9600);
irrecv.enableIRIn(); // Start the receiver
pinMode(3, OUTPUT);
}
void loop() {
if (irrecv.decode(&results)) {
Serial.println(results.value);
if (results.value==0x88877) {
digitalWrite(13,HIGH);
}
if (results.value==0xFFFFFFFF) {
digitalWrite(13,LOW);
}
irrecv.resume(); // Receive the next value
}
}
Возникла проблема объединения 2-ух скетчей в 1,постоянно возникают разные ошибки.
П.С.Простите начинающего,в ардуино ок.2 месяцев.
Вы забыли опубликовать Ваш объединённый скетч и текст "разных ошибок".
Ошибок компиляции нет,но программа не выполняет свои функции. #include <CustomStepper.h> #include <IRremote.h> CustomStepper stepper(8, 9, 10, 11, (byte[]) { 8, B1000, B1100, B0100, B0110, B0010, B0011, B0001, B1001 }, 4075.7728395, 12, CW); boolean rotate1 = false; boolean rotatedeg = false; boolean crotate = false; int RECV_PIN = 6; IRrecv irrecv(RECV_PIN); decode_results results; void setup() { Serial.begin(9600); irrecv.enableIRIn(); stepper.setRPM(2); stepper.setSPR(4075.7728395); } void loop() { if (irrecv.decode(&results)) { Serial.println(results.value); if (stepper.isDone() && rotate1 == false) { stepper.setDirection(CW); stepper.rotate(2); rotate1 = true; } if (results.value == 0x20DF00FF) { stepper.run(); } if (results.value == 0xFFFFFFFF) { if (stepper.isDone() && rotate1 == false) { stepper.setDirection(CW); stepper.rotate(2); rotate1 = true; } stepper.run(); } irrecv.resume(); // Receive the next value } }Нам самим гадать, что оно должно делать?
Как работает библиотека шагового - по прерываниям?
Извините,что не сообщил.По назатию кнопки пульта двигатель должен повернуться на 2 оборота.
Почитал про CustomStepper навскидку. Короче: метод run надо вызывать всегда в loop, а вы вызываете его только тогда, когда пришли данные по IR. Вынесите stepper.run в начало loop.
DIYMan, т.е. мне надо вынести только степпер.ран или описание вращения тоже?
void loop() { stepper.run(); } if (results.value == 0x20DF00FF) { if (irrecv.decode(&results)) { Serial.println(results.value); if (stepper.isDone() && rotate1 == false) { stepper.setDirection(CW); stepper.rotate(2); rotate1 = true; } Так или нет?Так:
#include <CustomStepper.h> #include <IRremote.h> CustomStepper stepper(8, 9, 10, 11, (byte[]) { 8, B1000, B1100, B0100, B0110, B0010, B0011, B0001, B1001 }, 4075.7728395, 12, CW); boolean rotate1 = false; boolean rotatedeg = false; boolean crotate = false; int RECV_PIN = 6; IRrecv irrecv(RECV_PIN); decode_results results; void setup() { Serial.begin(9600); irrecv.enableIRIn(); stepper.setRPM(2); stepper.setSPR(4075.7728395); } void loop() { stepper.run(); if (irrecv.decode(&results)) { Serial.println(results.value); if (stepper.isDone() && rotate1 == false) { stepper.setDirection(CW); stepper.rotate(2); rotate1 = true; } if (results.value == 0x20DF00FF) { //stepper.run(); } if (results.value == 0xFFFFFFFF) { if (stepper.isDone() && rotate1 == false) { stepper.setDirection(CW); stepper.rotate(2); rotate1 = true; } } irrecv.resume(); // Receive the next value } }И неплохо бы читать первоисточники:
run
This method is very important!!! It acts like a timer that makes the motor step when necessary, it MUST be placed inside your loop(). I used this method to leave the hardware timers free for other uses. This allows you to control multiple motors. Without this method in the loop, the motor won't move.
Спасибо за скетч,но всеравно ничего не изменилось.Должен ли скетч отправлять данные в Serial port
Когда я загружаю свой скетч с ошибкой,то он выдает данные в сериал монитор,а новый абсолютно ничего не делает. Может быть я что-то делаю не так?
В обсуждении библиотеки CustomStepper пару раз встречается жалоба, что ничего не работает если задействовать Serial. И как-то это оставлено без ответа. Попробуйте всё, что про Serial закомментировать (это всего 2 строки). Вдруг заработает.
И чего-то я с условиями не понял, всякими там rotate1 и т.п. Вот так работает чего-нибудь:
#include <CustomStepper.h> #include <IRremote.h> CustomStepper stepper(8, 9, 10, 11, (byte[]) { 8, B1000, B1100, B0100, B0110, B0010, B0011, B0001, B1001 }, 4075.7728395, 12, CW); int RECV_PIN = 6; IRrecv irrecv(RECV_PIN); decode_results results; void setup() { irrecv.enableIRIn(); stepper.setRPM(2); stepper.setSPR(4075.7728395); } void loop() { if (irrecv.decode(&results)) { if (results.value == 0x20DF00FF) { if (stepper.isDone()) { stepper.setDirection(CW); stepper.rotate(2); } } irrecv.resume(); // Receive the next value } stepper.run(); }Всем доброго времени суток. Чтобы не плодить одинаковые темы, задам аналогичный вопрос. Хотел управлять шаговым мотором 28BYJ-48 пультом от телевизора. Взял два скетча для <IRremote.h> и <CustomStepper.h>. Если поотдельности загружать скетчи, то все работает, вместе - нет. У меня такое ощущение, что проблема в <CustomStepper.h> или я неправильно объеденил скетчи? Посмотрите, пожалуйста, в итоговом скетче нет ли ошибок.
#include <IRremote.h> #include <CustomStepper.h> CustomStepper stepper(3, 4, 5, 6); int example = 0; int reciverPin = 2; IRrecv irrecv(reciverPin); decode_results results; void setup() { irrecv.enableIRIn(); pinMode(ledPin, OUTPUT); stepper.setRPM(12); stepper.setSPR(4075); //4075.7728395, 2048 } void loop() { if (irrecv.decode(&results)) { Serial.println(results.value, HEX); if(results.value == 0x20DF02FD) example = 1; if(results.value == 0x20DF827D) example = 2; irrecv.resume(); } if (stepper.isDone() and example == 1){ stepper.setDirection(CW); stepper.rotateDegrees(90); example = 0; } if (stepper.isDone() and example == 2){ stepper.setDirection(CCW); stepper.rotateDegrees(90); example = 0; } stepper.run(); }А что говорит ардуина при виде этого скетча?
Вообще, ответ очевиден - если что-то работает не так, как представляется, то несомненно - ошибки есть.
Скетч загружается без ошибок. Но при нажатии на кнопки пульта ничего не происходит.
Уважаемый, а самому посмотреть слабо? Добавить немножко Serial.print() и определится что выполняется, а что нет, какие переменные играют и т.д.?
А я вот что-то сомневаюсь, что скетч загружается.
Уважаемый, все добавлялось. Ничто не выполняется, просто как будто Ардуино выключена. Если закомментировать все, что касается сервы и добавить Serial.print, то все работает. Если в объединенном скетче добавить Serial.print, то в монитор порта ничего не выводится, даже Serial.println(millis()). Если знаете в чем проблема, то подскажите. Или слабо?!
А вам слабо сравнить свой setup() с нормальным: https://www.arduino.cc/en/serial/print ?
sadman41, почему сомневаетесь? В IDE появляется надпись "Загрузка завершена".
Да, так. В автобусе трясся - почудилось кое-что.
Наверное слабо. А вам слабо нормально ответить или помолчать?!
Да как скажете. Мне вообще не особо важно - работает там у вас что-то или нет. Ищите сами баги.
mykaida, sadman41, все равно ваши ответы для меня бесполезны.
Самый полезный вам дали здесь, только вы его полезности не осознаете. Второй, по полезности, перебраться в "Ищу исполнителя". Или сидеть здесь и ждать умеющую программировать мать Терезу, чудеса бывают, редко.
отдельно программы работают ?
Не слабо, а как и Вам лениво. Программу с Serial.print в студию. Очень хочу посмотреть, а какие процессы Вы отслеживаете.
gena321. Да, отдельно работают.
Мне не лениво, и писать скетч за меня не надо, и исполнитель мне не нужен. Мне нужно объяснить почему не работает, объяснить логику. Мне интересна ардуинка, но навыков в программировании у меня нет. Решил поуправлять шаговым мотором с пульта, так как на днях пришел ИК-датчик VS1838B с Али.
Решение своего вопроса я нашел благодаря Дмитрию Осипову. Нашел его видео на ютубе. Он шаговым мотором управляет без библиотек.
#include <IRremote.h> int reciverPin = 2; IRrecv irrecv(reciverPin); decode_results results; int motorPin1 = 3; // Blue / Синий - 28BYJ48 pin 1 int motorPin2 = 4; // Pink / Розовый - 28BYJ48 pin 2 int motorPin3 = 5; // Yellow / Желтый - 28BYJ48 pin 3 int motorPin4 = 6; // Orange / Оранжевый - 28BYJ48 pin 4 int q; int motorSpeed = 1000; // установить скорость шагового двигателя. int lookup[8] = {B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001}; int count = 0; int countsperrev = 16; // Полный оборот = 512 void setup() { pinMode(motorPin1, OUTPUT); pinMode(motorPin2, OUTPUT); pinMode(motorPin3, OUTPUT); pinMode(motorPin4, OUTPUT); Serial.begin(9600); irrecv.enableIRIn(); } void loop(){ if (irrecv.decode(&results)) { Serial.println(results.value, HEX); if(results.value == 0x20DF02FD) q = 1; if(results.value == 0x20DF827D) q = 2; if(results.value == 0x20DF22DD) q = 3; irrecv.resume(); } if ((q == 1)&(count < countsperrev)){ anticlockwise(); count++; } if ((q == 2)&(count < countsperrev)){ clockwise(); count++; } if (q == 3){ setStop(); count = 0; } if (count == countsperrev){ q = 3; } } void anticlockwise(){ // функция поворачивает мотор против часовой стрелки. for(int i = 0; i < 8; i++){ setOutput(i); delayMicroseconds(motorSpeed); } } void clockwise(){ // функция поворачивает мотор по часовой стрелке. for(int i = 7; i >= 0; i--){ setOutput(i); delayMicroseconds(motorSpeed); } } void setOutput(int out){ digitalWrite(motorPin1, bitRead(lookup[out], 0)); digitalWrite(motorPin2, bitRead(lookup[out], 1)); digitalWrite(motorPin3, bitRead(lookup[out], 2)); digitalWrite(motorPin4, bitRead(lookup[out], 3)); } void setStop(){ digitalWrite(motorPin1, LOW); digitalWrite(motorPin2, LOW); digitalWrite(motorPin3, LOW); digitalWrite(motorPin4, LOW); }Если Вас устроит это решение с косяками, то мы тут причем??
Наверное устроит, пока нет необходимости это где-то применять. А какие тут косяки? Аппаратная часть работает хорошо. Вот в первом скетче были косяки.
Вот потому что у Вас нет необходимости куда-то применить Вы эти косяки и не увидете. Это как линейка. Палка риски есть. Ура Отчиная Линейка. А вот когда начинаем мерять ей, то значения разные. :)
Выложите два скетча отдельно.
Так что за косяки? Мотор крутится, направление движения меняется сразу, программа не виснет во время движеня мотора.
gena321, через часика полтора. Пока не дома.
Вот скетч для ик-приемника:
#include <IRremote.h> // подключаем библиотеку int ledPin = 13; int reciverPin = 2; IRrecv irrecv(reciverPin); decode_results results; void setup() { Serial.begin(9600); irrecv.enableIRIn(); pinMode(ledPin, OUTPUT); } void loop() { if (irrecv.decode(&results)) { Serial.println(results.value, HEX); if(results.value == 0x20DF40BF) digitalWrite(13, HIGH); if(results.value == 0x20DFC03F) digitalWrite(13, LOW); irrecv.resume(); } }Вот для сервы:
#include <CustomStepper.h> // Подключаем библиотеку управления шаговым двигателем. По умолчанию настроена на двигатель 28BYJ-48-5V CustomStepper stepper(8, 9, 10, 11); // Указываем пины, к которым подключен драйвер шагового двигателя int example = 1; // Переменная для демонстрации работы, отвечающая за смену режимов void setup() { stepper.setRPM(12); // Устанавливаем кол-во оборотов в минуту stepper.setSPR(4075.7728395); // Устанавливаем кол-во шагов на полный оборот. Максимальное значение 4075.7728395 } void loop() { if (stepper.isDone() and example == 1) // Когда предыдущая команда выполнена (см. ниже), метод stepper.isDone() возвращает true { stepper.setDirection(CW); // Устанавливает направление вращения. Может принимать 3 значения: CW - по часовой, CCW - против часовой, STOP stepper.rotate(1); // Устанавливает вращение на заданное кол-во оборотов example = 2; } if (stepper.isDone() and example == 2) { stepper.setDirection(CCW); stepper.rotateDegrees(90); // Поворачивает вал на заданное кол-во градусов. Можно указывать десятичную точность (например 90.5), но не принимаются отрицательные значения example = 3; } if (stepper.isDone() and example == 3) { stepper.setDirection(CW); stepper.rotate(); // Будет вращать пока не получит команду о смене направления или пока не получит директиву STOP } stepper.run(); // Этот метод обязателен в блоке loop. Он инициирует работу двигателя, когда это необходимо }Сравните, #include <IRremote.h> // подключаем библиотеку #include <CustomStepper.h> // Подключаем библиотеку управления шаговым двигателем. По умолчанию настроена на двигатель 28BYJ-48-5V CustomStepper stepper(8, 9, 10, 11); // Указываем пины, к которым подключен драйвер шагового двигателя int example = 1; // Переменная для демонстрации работы, отвечающая за смену режимов int ledPin = 13; int reciverPin = 2; decode_results results; void setup() { Serial.begin(9600); irrecv.enableIRIn(); pinMode(ledPin, OUTPUT); } { stepper.setRPM(12); // Устанавливаем кол-во оборотов в минуту stepper.setSPR(4075.7728395); // Устанавливаем кол-во шагов на полный оборот. Максимальное значение 4075.7728395 } void loop() if (irrecv.decode(&results)) { Serial.println(results.value, HEX); if(results.value == 0x20DF40BF) digitalWrite(13, HIGH); if(results.value == 0x20DFC03F) digitalWrite(13, LOW); irrecv.resume(); } { if (stepper.isDone() and example == 1) // Когда предыдущая команда выполнена (см. ниже), метод stepper.isDone() возвращает true { stepper.setDirection(CW); // Устанавливает направление вращения. Может принимать 3 значения: CW - по часовой, CCW - против часовой, STOP stepper.rotate(1); // Устанавливает вращение на заданное кол-во оборотов example = 2; } if (stepper.isDone() and example == 2) { stepper.setDirection(CCW); stepper.rotateDegrees(90); // Поворачивает вал на заданное кол-во градусов. Можно указывать десятичную точность (например 90.5), но не принимаются отрицательные значения example = 3; } if (stepper.isDone() and example == 3) { stepper.setDirection(CW); stepper.rotate(); // Будет вращать пока не получит команду о смене направления или пока не получит директиву STOP } stepper.run(); // Этот метод обязателен в блоке loop. Он инициирует работу двигателя, когда это необходимо }Посмотрел. Добавили Serial.begin(9600) в Setup. Я его добавлял, чтобы смотреть меняется ли example. И заметил такую вещь: если в скетче с шаговиком добавить Serial.begin(9600) в Setup и в Loop вставить хотя бы Serial.println(millis()), то ардуинка как будто зависает, шаговик не крутится, в мониторе порта ничего не отображается. Кстати, такая же история с библиотекой AccelStepper.
#include <IRremote.h> // подключаем библиотеку #include <CustomStepper.h> // Подключаем библиотеку управления шаговым двигателем. По умолчанию настроена на двигатель 28BYJ-48-5V CustomStepper stepper(3, 4, 5, 6); // Указываем пины, к которым подключен драйвер шагового двигателя int example = 0; // Переменная для демонстрации работы, отвечающая за смену режимов int reciverPin = 2; IRrecv irrecv(reciverPin); decode_results results; void setup() { Serial.begin(9600); irrecv.enableIRIn(); stepper.setRPM(12); // Устанавливаем кол-во оборотов в минуту stepper.setSPR(4075.7728395); // Устанавливаем кол-во шагов на полный оборот. Максимальное значение 4075.7728395 } void loop() { if (irrecv.decode(&results)){ Serial.println(results.value, HEX); if(results.value == 0x20DF40BF) example = 1; if(results.value == 0x20DFC03F) example = 2; irrecv.resume(); } if (stepper.isDone() and example == 1){ // Когда предыдущая команда выполнена (см. ниже), метод stepper.isDone() возвращает true stepper.setDirection(CW); // Устанавливает направление вращения. Может принимать 3 значения: CW - по часовой, CCW - против часовой, STOP stepper.rotate(1); // Устанавливает вращение на заданное кол-во оборотов example = 3; } if (stepper.isDone() and example == 2){ stepper.setDirection(CCW); stepper.rotateDegrees(90); // Поворачивает вал на заданное кол-во градусов. Можно указывать десятичную точность (например 90.5), но не принимаются отрицательные значения example = 3; } if (stepper.isDone() and example == 3){ stepper.setDirection(CW); stepper.rotate(); // Будет вращать пока не получит команду о смене направления или пока не получит директиву STOP } stepper.run(); // Этот метод обязателен в блоке loop. Он инициирует работу двигателя, когда это необходимо Serial.print(millis()); Serial.print("; "); Serial.println(example); }Ничего не работает. В монитор порта ничего не выводится.
В сетапе выведи в порт, в начале loop тоже. После каждого if. Надо ловить, где программа виснет.
AnyPenny, зачем Вы выводите в порт millis() в строке 42?
AlexanderNO, Могу убрать, но ничего не изменится. Сначала этой строки не было, example в порт не выводился. Добавил, чтоб посмотреть будет ли выводиться millis().
mykaida, а в сетапе что вывести в порт? Там же мы запустили сериал порт, IR и установили параметры для шаговика. Или просто что-нибудь? Посмотреть проходит ли сетап?
decode_results (results); if(results.value == 0x20DF40BF) { example = 1; } if(results.value == 0x20DFC03F) { example = 2; }mykaida, вот что получилось:
#include <IRremote.h> #include <CustomStepper.h> CustomStepper stepper(3, 4, 5, 6); int example = 0; int reciverPin = 2; IRrecv irrecv(reciverPin); decode_results results; void setup() { Serial.begin(9600); irrecv.enableIRIn(); stepper.setRPM(12); stepper.setSPR(4075.7728395); Serial.println("Setup OK"); } void loop() { Serial.println("Start loop"); if (irrecv.decode(&results)){ Serial.println(results.value, HEX); if(results.value == 0x20DF40BF) example = 1; if(results.value == 0x20DFC03F) example = 2; irrecv.resume(); } Serial.println("point 1"); if (stepper.isDone() and example == 1){ stepper.setDirection(CW); stepper.rotate(1); example = 3; } Serial.println("point 2"); if (stepper.isDone() and example == 2){ stepper.setDirection(CCW); stepper.rotateDegrees(90); example = 3; } Serial.println("point 3"); if (stepper.isDone() and example == 3){ stepper.setDirection(CW); stepper.rotate(); } Serial.println("point 4"); stepper.run(); Serial.println("point 5"); }А вот что упало в монитор порта:
mykaida, а в сетапе что вывести в порт? Там же мы запустили сериал порт, IR и установили параметры для шаговика. Или просто что-нибудь? Посмотреть проходит ли сетап?
Да не стоит на него внимание обращать. Вечно какую-то пургу несет.
gena321, пробовал действие оперетора if заключать в {}, ничего не изменилось. То же сначала глаз резало.
Serial.println("point 4"); //stepper.run(); Serial.println("point 5");выключи это строку, что тогда ?
Собери все
Serial.println. в одну кучу и поставь в концеstepper.run(); - это обязательное условие, для движения мотора. Всегда должно находиться в loop(). Если ее убрать, то мотор перестает работать, даже в рабочем скетче из примеров.
При загрузке скетча в строке 5: int example = 0; а в отдельном скетче для сервы было: int example = 1;
Вопрос. Что должен сделать двигатель при команде: stepper.run();?