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

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

т.е. программа виснет на stepper.run();

А если убрать тоже  виснет ?

 

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

AlexanderNO Так после нажатия кнопки пульта, example должна присвоится 1.

int example = 0;

loop()

if(results.value == 0x20DF40BF) example = 1;

Или я что-то не понимаю?

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

До нажатия кнопки надо, чтобы программа загрузилась. А сразу после загрузки начинается loop и упирается в stepper.run(); еще до Вашего нажатия.

 

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

Не помню что, но иногда в последней строке что то вставляют чтобы лооп не останавлялся, возможно что этот

stepper.run();

перенести туда хватит.

https://forum.arduino.cc/index.php?topic=464583.0

 

Rename your loop() function to something else, for instance: drive_the_car()



Write a new loop() function whose job it is to invoke driive_the_car() when conditions are such that it ought to be invoked.

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

AnyPenny пишет:

т.е. программа виснет на stepper.run();

А если удалить все, что касается ИК-приемника и сериала, то шаговик начнет крутиться. Такое ощущение, что библиотеки для шаговиков ни с чем нельзя использовать.

Ну слава богу - локализовали проблему! А теперь берем другую библиотеку для шаговых двигателей (ну не верю я, что это единственная) и проверяем ее.

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

mykaida, штатная библиотека <Stepper.h> работает с библиотекой <IRremote.h>, но криво. Пока мотор крутится ничего нельзя сделать. Библиотеки <CustomStepper.h> и <AccelStepper.h> я не понял как подружить с <IRremote.h> и даже с Serial.

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

AlexanderNOВы правы. Присвоил 1 переменной example и loop закрутился, а мотор нет.

#include <IRremote.h>                
#include <CustomStepper.h>           
CustomStepper stepper(3, 4, 5, 6);  
int example = 1;     
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");
  Serial.println(example);
  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
1
point 1
point 2
point 3
point 4
point 5
Start loop
3
point 1
point 2
point 3
point 4
point 5
Start loop
3
...
 
и после нажатий на кнопки пульта переменная example не меняется, остаетсе 3.
mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

AnyPenny пишет:

mykaida, штатная библиотека <Stepper.h> работает с библиотекой <IRremote.h>, но криво. Пока мотор крутится ничего нельзя сделать. Библиотеки <CustomStepper.h> и <AccelStepper.h> я не понял как подружить с <IRremote.h> и даже с Serial.

Вы извините, конечно, но в ШТАТНОЙ библиотеке stepper я не нашел stepper.run(). Что и не удивительно.

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

Попробуйте вместо 21-49:

if ( irrecv.decode( &results )) {
  switch ( results.value ) {
    case 0x20DF40BF:
      if (stepper.isDone() )
      {
        stepper.setDirection(CW);
        stepper.rotate(1);
      }
      break;
    case 0x20DFC03F:
        if (stepper.isDone() == false )
        {
          stepper.setDirection(STOP);
          rotateend = true;
        }
      break;
  }
  irrecv.resume();
}

Исправил 11.

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

такие конструкции в коде просто бесют сутра

       if (stepper.isDone() == false )

isDone и так возвращает bool, нахрена bool в bool преобразовывать? 

       if (!stepper.isDone())

и сё. 

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

DetSimen, спасибо! Пора значит заканчивать ночные бдения)

 

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

Рабочий код для AnyPenny

#include <IRremote.h>
#include <CustomStepper.h>
CustomStepper stepper(3, 4, 5, 6);
byte example = 0;
byte reciverPin = 2;
boolean rotate1 = false;
IRrecv irrecv(reciverPin);
decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn();
  stepper.setRPM(12);
  stepper.setSPR(4075.7728395);
  stepper.rotate();
  stepper.setDirection(STOP);
}

void loop()
{
  if ( irrecv.decode( &results )) {
    switch ( results.value ) {
      case 0x20DF40BF:
        example = 1;
        rotate1 = false;
        break;
      case 0x20DFC03F:
        example = 2;
        rotate1 = false;
        break;
      case 0x20DFXXXXX: // Ввел еще одну кнопку для внезапной 
      // ручной остановки - код кнопки ввести самому
        example = 3;
        rotate1 = false;
        break;
    }
    irrecv.resume();
  }
  if (!rotate1) {
    switch (example) {
      case 1:
        stepper.setDirection(CW);
        stepper.rotate(1);
        rotate1 = true;
        break;
      case 2:
        stepper.setDirection(CCW);
        stepper.rotateDegrees(90);
        rotate1 = true;
        break;
      case 3:
        stepper.setDirection(STOP);
        break;
    }
  }
  stepper.run();
}

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

DetSimen пишет:

такие конструкции в коде просто бесют сутра

       if (stepper.isDone() == false )

isDone и так возвращает bool, нахрена bool в bool преобразовывать? 

       if (!stepper.isDone())

и сё. 

Ну так новичков постоянно тыкают носом в blink without delаy, вот они и перенимают оттуда стиль:

    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;

 

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

AlexanderNO, к сожалению скетч не работает. Извиняюсь за долгий ответ.

Спасибо большое за помощь.

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

Скетч рабочий. Вы видимо что-то неправильно подключаете. Проверьте работоспособность пинов и/или поменяйте их. Проверьте коды пульта. Я уже давно разобрал схему, иначе выложил бы видео, а собирать заново неохота. 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

andriano пишет:

DetSimen пишет:

такие конструкции в коде просто бесют сутра

       if (stepper.isDone() == false )

isDone и так возвращает bool, нахрена bool в bool преобразовывать? 

       if (!stepper.isDone())

и сё. 

Ну так новичков постоянно тыкают носом в blink without delаy, вот они и перенимают оттуда стиль:

    if (ledState == LOW)
      ledState = HIGH;
    else
      ledState = LOW;

 

Зато в коде сия конструкция меньше места занимает, ежели читать состояние пина напрямую и инвертировать )))

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

ua6em пишет:

Зато в коде сия конструкция меньше места занимает, ежели читать состояние пина напрямую и инвертировать )))

меньше чем эта ?

ledState =  !ledState;