Помогите объединить 2 скетча

amateur
Offline
Зарегистрирован: 19.11.2017
#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 месяцев.

kalapanga
Offline
Зарегистрирован: 23.10.2016

Вы забыли опубликовать Ваш объединённый скетч и текст "разных ошибок". 

amateur
Offline
Зарегистрирован: 19.11.2017
Ошибок компиляции нет,но программа не выполняет свои функции.
#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
  }
}

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Нам самим гадать, что оно должно делать?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Как работает библиотека шагового - по прерываниям?

amateur
Offline
Зарегистрирован: 19.11.2017

Извините,что не сообщил.По назатию кнопки пульта двигатель должен повернуться на 2 оборота.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Почитал про CustomStepper навскидку. Короче: метод run надо вызывать всегда в loop, а вы вызываете его только тогда, когда пришли данные по IR. Вынесите stepper.run в начало loop.

amateur
Offline
Зарегистрирован: 19.11.2017

DIYMan, т.е. мне надо вынести только степпер.ран или описание вращения тоже?

 

amateur
Offline
Зарегистрирован: 19.11.2017
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;
    }
Так или нет?



 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Так:

#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.

amateur
Offline
Зарегистрирован: 19.11.2017

Спасибо за скетч,но всеравно ничего не изменилось.Должен ли скетч отправлять данные в Serial port

Когда я загружаю свой скетч с ошибкой,то он выдает данные в сериал монитор,а новый абсолютно ничего не делает. Может быть я что-то делаю не так?

kalapanga
Offline
Зарегистрирован: 23.10.2016

В обсуждении библиотеки 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();
}

 

AnyPenny
Offline
Зарегистрирован: 27.01.2016

Всем доброго времени суток. Чтобы не плодить одинаковые темы, задам аналогичный вопрос. Хотел управлять шаговым мотором 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();
}

 

sadman41
Онлайн
Зарегистрирован: 19.10.2016

А что говорит ардуина при виде этого скетча?

Вообще, ответ очевиден - если что-то работает не так, как представляется, то несомненно - ошибки есть.

AnyPenny
Offline
Зарегистрирован: 27.01.2016

Скетч загружается без ошибок. Но при нажатии на кнопки пульта ничего не происходит.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

AnyPenny пишет:
Скетч загружается без ошибок. Но при нажатии на кнопки пульта ничего не происходит.

Уважаемый, а самому посмотреть слабо? Добавить немножко Serial.print() и определится что выполняется, а что нет, какие переменные играют и т.д.?

sadman41
Онлайн
Зарегистрирован: 19.10.2016

А я вот что-то сомневаюсь, что скетч загружается.

AnyPenny
Offline
Зарегистрирован: 27.01.2016

Уважаемый, все добавлялось. Ничто не выполняется, просто как будто Ардуино выключена. Если закомментировать все, что касается сервы и добавить Serial.print, то все работает. Если в объединенном скетче добавить Serial.print, то в монитор порта ничего не выводится, даже Serial.println(millis()). Если знаете в чем проблема, то подскажите. Или слабо?!

sadman41
Онлайн
Зарегистрирован: 19.10.2016

А вам слабо сравнить свой setup() с нормальным: https://www.arduino.cc/en/serial/print ?

AnyPenny
Offline
Зарегистрирован: 27.01.2016

sadman41, почему сомневаетесь? В IDE появляется надпись "Загрузка завершена".

sadman41
Онлайн
Зарегистрирован: 19.10.2016

AnyPenny пишет:
sadman41, почему сомневаетесь? В IDE появляется надпись "Загрузка завершена".

Да, так. В автобусе трясся - почудилось кое-что.

AnyPenny
Offline
Зарегистрирован: 27.01.2016

Наверное слабо. А вам слабо нормально ответить или помолчать?!

sadman41
Онлайн
Зарегистрирован: 19.10.2016

Да как скажете. Мне вообще не особо важно - работает там у вас что-то или нет. Ищите сами баги.

AnyPenny
Offline
Зарегистрирован: 27.01.2016

mykaida, sadman41, все равно ваши ответы для меня бесполезны.

bwn
Offline
Зарегистрирован: 25.08.2014

AnyPenny пишет:
mykaida, sadman41, все равно ваши ответы для меня бесполезны.

Самый полезный вам дали здесь, только вы его полезности не осознаете. Второй, по полезности, перебраться в "Ищу исполнителя". Или сидеть здесь и ждать умеющую программировать мать Терезу, чудеса бывают, редко.

gena321
Offline
Зарегистрирован: 19.01.2019

отдельно программы работают ?

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

AnyPenny пишет:
Уважаемый, все добавлялось. Ничто не выполняется, просто как будто Ардуино выключена. Если закомментировать все, что касается сервы и добавить Serial.print, то все работает. Если в объединенном скетче добавить Serial.print, то в монитор порта ничего не выводится, даже Serial.println(millis()). Если знаете в чем проблема, то подскажите. Или слабо?!

Не слабо, а как и Вам лениво. Программу с Serial.print в студию. Очень хочу посмотреть, а какие процессы Вы отслеживаете.

AnyPenny
Offline
Зарегистрирован: 27.01.2016

gena321. Да, отдельно работают.

AnyPenny
Offline
Зарегистрирован: 27.01.2016

Мне не лениво, и писать скетч за меня не надо, и исполнитель мне не нужен. Мне нужно объяснить почему не работает, объяснить логику. Мне интересна ардуинка, но навыков в программировании у меня нет. Решил поуправлять шаговым мотором с пульта, так как на днях пришел ИК-датчик 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);
}

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Если Вас устроит это решение с косяками, то мы тут причем??

AnyPenny
Offline
Зарегистрирован: 27.01.2016

Наверное устроит, пока нет необходимости это где-то применять. А какие тут косяки? Аппаратная часть работает хорошо. Вот в первом скетче были косяки.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Вот потому что у Вас нет необходимости куда-то применить Вы эти косяки и не увидете. Это как линейка. Палка риски есть. Ура Отчиная Линейка. А вот когда начинаем мерять ей, то значения разные. :)

gena321
Offline
Зарегистрирован: 19.01.2019

Выложите два скетча отдельно.

AnyPenny
Offline
Зарегистрирован: 27.01.2016

Так что за косяки? Мотор крутится, направление движения меняется сразу, программа не виснет во время движеня мотора.

gena321, через часика полтора. Пока не дома.

AnyPenny
Offline
Зарегистрирован: 27.01.2016

Вот скетч для ик-приемника:

#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. Он инициирует работу двигателя, когда это необходимо
}

 

gena321
Offline
Зарегистрирован: 19.01.2019
Сравните, 

#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. Он инициирует работу двигателя, когда это необходимо
}

 

AnyPenny
Offline
Зарегистрирован: 27.01.2016

Посмотрел. Добавили Serial.begin(9600) в Setup. Я его добавлял, чтобы смотреть меняется ли example. И заметил такую вещь: если в скетче с шаговиком добавить Serial.begin(9600) в Setup и в Loop вставить хотя бы Serial.println(millis()), то ардуинка как будто зависает, шаговик не крутится, в мониторе порта ничего не отображается. Кстати, такая же история с библиотекой AccelStepper.  

gena321
Offline
Зарегистрирован: 19.01.2019
Вы добавили это в мою версию ?
Покажите программу.
AnyPenny
Offline
Зарегистрирован: 27.01.2016
#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);
}

Ничего не работает. В монитор порта ничего не выводится.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

В сетапе выведи в порт, в начале loop тоже. После каждого if. Надо ловить, где программа виснет.

AlexanderNO
Offline
Зарегистрирован: 08.11.2018

AnyPenny, зачем Вы выводите в порт millis() в строке 42? 

AnyPenny
Offline
Зарегистрирован: 27.01.2016

AlexanderNO, Могу убрать, но ничего не изменится. Сначала этой строки не было, example в порт не выводился. Добавил, чтоб посмотреть будет ли выводиться millis().

AnyPenny
Offline
Зарегистрирован: 27.01.2016

mykaida, а в сетапе что вывести в порт? Там же мы запустили сериал порт, IR и установили параметры для шаговика. Или просто что-нибудь? Посмотреть проходит ли сетап?

gena321
Offline
Зарегистрирован: 19.01.2019
  decode_results (results);


​ if(results.value == 0x20DF40BF) 
    {
    example = 1;
    }
    if(results.value == 0x20DFC03F)
    {
      example = 2;
    }

 

AnyPenny
Offline
Зарегистрирован: 27.01.2016

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");
}

А вот что упало в монитор порта:

Setup OK
Start loop
point 1
point 2
point 3
point 4
 
т.е. программа виснет на stepper.run();
А если удалить все, что касается ИК-приемника и сериала, то шаговик начнет крутиться. Такое ощущение, что библиотеки для шаговиков ни с чем нельзя использовать.

 

 

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

AnyPenny пишет:

mykaida, а в сетапе что вывести в порт? Там же мы запустили сериал порт, IR и установили параметры для шаговика. Или просто что-нибудь? Посмотреть проходит ли сетап?

Да не стоит на него внимание обращать. Вечно какую-то пургу несет.

AnyPenny
Offline
Зарегистрирован: 27.01.2016

gena321, пробовал действие оперетора if заключать в {}, ничего не изменилось. То же сначала глаз резало.

gena321
Offline
Зарегистрирован: 19.01.2019
 Serial.println("point 4");
  //stepper.run();   
  Serial.println("point 5");

выключи это строку, что тогда ?

gena321
Offline
Зарегистрирован: 19.01.2019

Собери все Serial.println.  в одну кучу и поставь в конце 

AnyPenny
Offline
Зарегистрирован: 27.01.2016

stepper.run(); - это обязательное условие, для движения мотора. Всегда должно находиться в loop(). Если ее убрать, то мотор перестает работать, даже в рабочем скетче из примеров.

AlexanderNO
Offline
Зарегистрирован: 08.11.2018

При загрузке скетча в строке 5: int example = 0; а в отдельном скетче для сервы было: int example = 1;

Вопрос. Что должен сделать двигатель при команде: stepper.run();?