Рулонные шторы на ардуино.

IVoxelI
Offline
Зарегистрирован: 11.11.2018

Пытаюсь сделать руллоные шторы своими руками, но застрял на одном месте, когда на датчик попадает свет мотор делает 1 оборот, а когда нет крутится туда сюда. Помогите пожалуйста.

IVoxelI
Offline
Зарегистрирован: 11.11.2018
#include <CustomStepper.h>
CustomStepper stepper(8, 9, 10, 11);
boolean x = false;
boolean y = false;
const int pinPhoto = A0;
const int led = 13;
int raw = 0;

void setup() {
  stepper.setRPM(12);                 // Устанавливаем кол-во оборотов в минуту
  stepper.setSPR(4075.7728395);
  pinMode( pinPhoto, INPUT );
  pinMode( led, OUTPUT );
}

void loop() {
  raw = analogRead( pinPhoto );                             // raw > 400, следовательно света нет
// Если света нет и штора не опущена, то штора опускается
  if (stepper.isDone() && x == false && raw>400){
    stepper.setDirection(CW);                                //Направление
    stepper.rotate(1);                                       //Кол-во оборотов
    x=true;
    y=false;
  }
//Если выполнилось Х оборотов, то стоп
  if (stepper.isDone() && x==true){
    stepper.setDirection(STOP);
  }
// Если есть свет и штора не поднята, то штора поднимается
  if (stepper.isDone() && y==false && raw<400){
    stepper.setDirection(CCW);
    stepper.rotate(1);
    y=true;
    x=false;
  }
// Если двигатель прокрутился на Х оборотов, то стоп
  if (stepper.isDone() && y==true){
    stepper.setDirection(STOP);
  }
stepper.run();
}

 

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

Здравствуй жопа новый год http://arduino.ru/forum/programmirovanie/vypolnenie-tsikla-1-raz-do-izmeneniya-parametrov. Я же сказал, пока вы не освоите программирование через цифровой автомат, у вас будут косяки лететь стаями.

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

Вы бы вставили перед каждым if комментарий, где словами было бы написано что именно делается. Только в терминах задачи (типа "если попал свет, то включаем на подъём") а не пересказом того же if.

И сам может поймёте проблему, и нам легче будет.

IVoxelI
Offline
Зарегистрирован: 11.11.2018

Хорошо, попробую освоить.

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

Тем более CustomStepper Это тоже цифровой автомат

/**/
const int pinPhoto = A0;
/*состояние светло/темно*/
enum state_t {LIGTH, DARK} state;

void setup() {
  Serial.begin(9600);
  pinMode( pinPhoto, INPUT );
  state = DARK;
  Serial.println("DARK");
}
void loop() {
  int raw = analogRead( pinPhoto );
  // raw > 400, следовательно света нет
  if (raw > 400 && state == LIGTH) {
    state = DARK;
    Serial.println("DARK");
  }
  if (raw <= 400 && state == DARK) {
    state = LIGTH;
    Serial.println("LIGTH");
  }
}

 

IVoxelI
Offline
Зарегистрирован: 11.11.2018

При использовании этого кода, выдаёт последовательно LIGHT DARK LIGHT DARK.

Это нормально?

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

IVoxelI пишет:

При использовании этого кода, выдаёт последовательно LIGHT DARK LIGHT DARK.

Это нормально?

А это у вас с датчиком скорее всего. Свет видно быстро мигает, а глаз не видит.

IVoxelI
Offline
Зарегистрирован: 11.11.2018

qwone пишет:

IVoxelI пишет:

При использовании этого кода, выдаёт последовательно LIGHT DARK LIGHT DARK.

Это нормально?

А это у вас с датчиком скорее всего. Свет видно быстро мигает, а глаз не видит.

Так происходит даже если отключить датчик.

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

/**/
const int pinPhoto = A0;
/*состояние светло/темно*/
enum state_t {LIGTH, DARK} state;

void setup() {
  Serial.begin(9600);
  pinMode( pinPhoto, INPUT );
  state = DARK;
  Serial.println("DARK");
}
void loop() {
  int raw = 200;//< а вот так отключать не пробовал?
  // raw > 400, следовательно света нет
  if (raw > 400 && state == LIGTH) {
    state = DARK;
    Serial.println("DARK");
  }
  if (raw <= 400 && state == DARK) {
    state = LIGTH;
    Serial.println("LIGTH");
  }
sadman41
Offline
Зарегистрирован: 19.10.2016

Выведите значения raw в Serial, проверьте, что датчик подключен именно к A0.

Квон еще до гистеререзиса не доучил, хотя попытку сделал. Так что если raw болтается около 400ед, то так и будет флапать.

IVoxelI
Offline
Зарегистрирован: 11.11.2018

sadman41 пишет:

Выведите значения raw в Serial, проверьте, что датчик подключен именно к A0.

Квон еще до гистеререзиса не доучил, хотя попытку сделал. Так что если raw болтается около 400ед, то так и будет флапать.

Да, подключен к A0. Если вывести в serial с этим скетчем, то просто пишет 14 14 14 и т.д, а с другими всё ок.

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

IVoxelI, ну, вставьте же Вы наконец комментарии и выложите код с ними! Вас что, умолять надо? Ну, вот непонятно что Вы там имели в виду, а объяснять Вы отказываетесь!

IVoxelI
Offline
Зарегистрирован: 11.11.2018

ЕвгенийП пишет:

IVoxelI, ну, вставьте же Вы наконец комментарии и выложите код с ними! Вас что, умолять надо? Ну, вот непонятно что Вы там имели в виду, а объяснять Вы отказываетесь!

Так лучше?

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

IVoxelI пишет:

Так лучше?

Честно говоря не совсем, но хоть догадываться можно.

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

IVoxelI пишет:

когда на датчик попадает свет мотор делает 1 оборот, а когда нет крутится туда сюда. 

Я пока не могу понять причину такого поведения и потому предлагаю Вам оттрассировать программу. И кстати, всегда так поступайте, когда поведение программы непонятно. Это можно сделать примерно вот так.

#include <CustomStepper.h>
CustomStepper stepper(8, 9, 10, 11);
boolean x = false;
boolean y = false;
const int pinPhoto = A0;
const int led = 13;
int raw = 0;

void setup() {
  Serial.begin(115200);
  stepper.setRPM(12);                 // Устанавливаем кол-во оборотов в минуту
  stepper.setSPR(4075.7728395);
  pinMode( pinPhoto, INPUT );
  pinMode( led, OUTPUT );
}

void loop() {
  raw = analogRead( pinPhoto );  // raw > 400, следовательно света нет
  
  Serial.print("millis()="); Serial.print(millis());
  Serial.print("; raw="); Serial.print(raw);
  Serial.print("; x="); Serial.print(x);
  Serial.print("; y="); Serial.print(y);
  Serial.print("; stepper.isDone()="); Serial.println(stepper.isDone());

  // Если света нет и штора не опущена, то штора опускается
  if (stepper.isDone() && x == false && raw > 400) {
    Serial.println("Point #1");
    stepper.setDirection(CW);   //Направление
    stepper.rotate(1);          //Кол-во оборотов
    x = true;
    y = false;
  }
  //Если выполнилось Х оборотов, то стоп
  if (stepper.isDone() && x == true) {
    Serial.println("Point #2");
    stepper.setDirection(STOP);
  }
  // Если есть свет и штора не поднята, то штора поднимается
  if (stepper.isDone() && y == false && raw < 400) {
    Serial.println("Point #3");
    stepper.setDirection(CCW);
    stepper.rotate(1);
    y = true;
    x = false;
  }
  // Если двигатель прокрутился на Х оборотов, то стоп
  if (stepper.isDone() && y == true) {
    Serial.println("Point #4");
    stepper.setDirection(STOP);
  }
  stepper.run();
  Serial.println("--------------------");
}

Только делайте всё быстро, поскольку трасса будет печататься с огромной скоростью.

Если после изучения трассы Вам не станет легче, то выложите трассу сюда.

И да, кстати, к Вашей текущей проблеме это не относится, но имейте в виду, что эту библиотеку лучше не изсользовать. Она написана достаточно безграмотно.

IVoxelI
Offline
Зарегистрирован: 11.11.2018

ЕвгенийП пишет:

IVoxelI пишет:

когда на датчик попадает свет мотор делает 1 оборот, а когда нет крутится туда сюда. 

Я пока не могу понять причину такого поведения и потому предлагаю Вам оттрассировать программу. И кстати, всегда так поступайте, когда поведение программы непонятно. Это можно сделать примерно вот так.

#include <CustomStepper.h>
CustomStepper stepper(8, 9, 10, 11);
boolean x = false;
boolean y = false;
const int pinPhoto = A0;
const int led = 13;
int raw = 0;

void setup() {
  Serial.begin(115200);
  stepper.setRPM(12);                 // Устанавливаем кол-во оборотов в минуту
  stepper.setSPR(4075.7728395);
  pinMode( pinPhoto, INPUT );
  pinMode( led, OUTPUT );
}

void loop() {
  raw = analogRead( pinPhoto );  // raw > 400, следовательно света нет
  
  Serial.print("millis()="); Serial.print(millis());
  Serial.print("; raw="); Serial.print(raw);
  Serial.print("; x="); Serial.print(x);
  Serial.print("; y="); Serial.print(y);
  Serial.print("; stepper.isDone()="); Serial.println(stepper.isDone());

  // Если света нет и штора не опущена, то штора опускается
  if (stepper.isDone() && x == false && raw > 400) {
    Serial.println("Point #1");
    stepper.setDirection(CW);   //Направление
    stepper.rotate(1);          //Кол-во оборотов
    x = true;
    y = false;
  }
  //Если выполнилось Х оборотов, то стоп
  if (stepper.isDone() && x == true) {
    Serial.println("Point #2");
    stepper.setDirection(STOP);
  }
  // Если есть свет и штора не поднята, то штора поднимается
  if (stepper.isDone() && y == false && raw < 400) {
    Serial.println("Point #3");
    stepper.setDirection(CCW);
    stepper.rotate(1);
    y = true;
    x = false;
  }
  // Если двигатель прокрутился на Х оборотов, то стоп
  if (stepper.isDone() && y == true) {
    Serial.println("Point #4");
    stepper.setDirection(STOP);
  }
  stepper.run();
  Serial.println("--------------------");
}

Только делайте всё быстро, поскольку трасса будет печататься с огромной скоростью.

Если после изучения трассы Вам не станет легче, то выложите трассу сюда.

И да, кстати, к Вашей текущей проблеме это не относится, но имейте в виду, что эту библиотеку лучше не изсользовать. Она написана достаточно безграмотно.

⸮⸮⸮⸮⸮⸮⸮'⸮|⸮⸮<⸮5|⸮⸮⸮t,y!?|⸮%%⸮t⸮R-p|⸮⸮lp⸮.⸮yr>'⸮0⸮0ќpl⸮.⸮i⸮:?<rTU4a<<L⸮.⸮p⸮T=⸮1'dr⸮⸮⸮⸮p<7⸮0⸮0⸮%pT⸮WP⸮⸮⸮dSp⸮z4ip⸮⸮n4l⸮Q=g0l⸮1't⸮#yr>.⸮i⸮:%1.⸮t⸮1>⸮p⸮Q0⸮0⸮⸮⸮⸮p⸮⸮a⸮|⸮-\⸮p⸮Qa⸮t,⸮⸮⸮vt⸮57⸮p⸮57⸮p⸮57⸮p⸮57dr⸮1't⸮⸮!i⸮:%1>⸮⸮⸮Q0tT⸮WP=⸮⸮⸮l,⸮9=g0lѱ#yr>d⸮rt⸮qMp4⸮S-p|⸮/<pT⸮WX⸮p⸮%?lR-\⸮`r⸮Ya3l⸮)F⸮pl⸮U4a<,⸮J⸮⸮t⸮5'dr⸮1't⸮⸮#yr>⸮⸮rt⸮q>⸮p⸮qmp<⸮S-p|⸮/V<pT⸮UX⸮t⸮⸮⸮⸮p⸮٣⸮⸮⸮d⸮|⸮-F⸮`⸮Ya⸮|⸮⸮J⸮⸮t⸮5't⸮#yr>ٱy⸮>&⸮i⸮:l⸮al8l⸮>⸮p⸮q r4⸮R-pt⸮٣⸮⸮⸮d⸮t⸮z4ip⸮⸮n<⸮]=g0l⸮1'd⸮ѱ#y⸮:l⸮.rt⸮q/44⸮⸮-t|⸮/<rTvWP⸮⸮⸮dSt⸮=q<⸮⸮=g0l⸮1'tlѡaL:"⸮>⸮r⸮Q ⸮4⸮R%rt⸮⸮⸮⸮p⸮ѣ⸮p⸮⸮!⸮l⸮-\⸮p⸮Qq<⸮Q%⸮tl⸮⸮a|⸮n⸮0⸮0⸮]⸮⸮⸮⸮dSp⸮Q⸮g0l⸮⸮#i⸮⸮⸮0⸮2⸮و=⸮⸮l,⸮]⸮g0|⸮al⸮⸮⸮ ⸮0⸮U⸮⸮⸮⸮⸮l⸮⸮⸮g0|⸮⸮#y⸮:&⸮.rt⸮qmp4⸮R-p|⸮/%⸮rT%T=⸮⸮d⸮|⸮a4iNp⸮⸮n<⸮⸮5'⸮t,⸮!i⸮:%1>⸮p⸮Q ⸮0⸮R-pt⸮]⸮⸮r⸮⸮d⸮t⸮⸮4a<<9=g⸮|⸮!i⸮8%qmp4⸮%⸮rT%T=l⸮⸮l,⸮]⸮g0lб#y⸮:%1>⸮r⸮%⸮rt⸮]⸮=⸮⸮⸮dSp⸮E4a4<⸮%⸮t|<ѡal⸮-qmp4⸮R-pt⸮]⸮⸮t⸮I!1|ӱو=⸮/<rP%⸮-t|⸮⸮⸮>l⸮1.⸮p⸮5⸮p|⸮W5'⸮t⸮⸮n<l⸮⸮<⸮1t⸮٣⸮⸮7⸮0⸮0ѡa|⸮%%⸮tl⸮5n4l⸮c4iNp⸮⸮a⸮|⸮zUX⸮r⸮⸮-t|⸮&⸮>l⸮1⸮⸮p⸮5⸮t|⸮W5'⸮t⸮⸮n<⸮z<⸮=|⸮/<rTk⸮-⸮r<.⸮al8%J⸮t⸮⸮l<⸮~,V=l⸮'V<pTtqMp4⸮#i⸮:%⸮7⸮r⸮⸮l,⸮a,⸮5t⸮٣⸮⸮7⸮0⸮24⸮⸮a|⸮%5⸮tl⸮5n0|⸮⸮<iNt⸮ѣ⸮r⸮⸮-t|⸮⸮⸮.⸮p⸮5⸮tl⸮5n4l⸮z<⸮5|⸮+%⸮⸮P-⸮-tl⸮⸮⸮.rt⸮J⸮t⸮⸮⸮n<⸮{,⸮5|⸮/%⸮⸮P%⸮-⸮p<⸮⸮al⸮%%⸮tl⸮5n4|⸮{<iNp⸮و⸮t⸮N⸮ ⸮0<ѡa⸮:%(⸮⸮p⸮⸮dSp⸮⸮WT=⸮⸮'⸮0⸮0ѡa|⸮%5⸮t|⸮⸮n<⸮⸮T=l⸮'V8pTuqmp<⸮⸮#i⸮:%⸮⸮d⸮⸮⸮l,⸮a,⸮=|⸮+%/⸮ (трассировка)
ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

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

Скорость порта в строке 10 и в нижнем правом углу монитора порта одинаковую выставьте. Жолжен выводиться нормальный текст.

IVoxelI
Offline
Зарегистрирован: 11.11.2018

ЕвгенийП пишет:

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

Скорость порта в строке 10 и в нижнем правом углу монитора порта одинаковую выставьте. Жолжен выводиться нормальный текст.

Нет, не шутил. Теперь выводится так :

millis()=216946; raw=207; x=1; y=0; stepper.isDone()=0

--------------------
millis()=216953; raw=209; x=1; y=0; stepper.isDone()=0
--------------------
millis()=216960; raw=208; x=1; y=0; stepper.isDone()=0
--------------------
millis()=216966; raw=200; x=1; y=0; stepper.isDone()=0
--------------------
millis()=216973; raw=193; x=1; y=0; stepper.isDone()=0
при этом Х всегда 1, а У и stepper всегда 0.
Я полагаю что двигатель всегда занят, но чем?
b707
Онлайн
Зарегистрирован: 26.05.2017

IVoxelI пишет:

[

Нет, не шутил. Теперь выводится так :

millis()=216946; raw=207; x=1; y=0; stepper.isDone()=0

--------------------
millis()=216953; raw=209; x=1; y=0; stepper.isDone()=0
--------------------
millis()=216960; raw=208; x=1; y=0; stepper.isDone()=0
--------------------
millis()=216966; raw=200; x=1; y=0; stepper.isDone()=0
--------------------
millis()=216973; raw=193; x=1; y=0; stepper.isDone()=0
при этом Х всегда 1, а У и stepper всегда 0.
Я полагаю что двигатель всегда занят, но чем?

а по-моему все-таки шутите. Причем злобно.

Зачем вы выкладываете трассу спустя почти 4 минуты после рестарта системы? (после 216 сек) . По коду и так очевидно, что если система попала в состояние raw=200; x=1; y=0; stepper.isDone()=0 - то система в нем застрянет навечно. Вам-то важно знать, как она в это состояние попала! Интересными являются разве что первый десяток проходов loop() , в вы выложили примерно 40тысячный оборот... смеетесь7

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

Трасса нужна сначала.

IVoxelI
Offline
Зарегистрирован: 11.11.2018

ЕвгенийП пишет:

Трасса нужна сначала.

millis()=0; raw=261; x=0; y=0; stepper.isDone()=1
Point #1
--------------------
millis()=2; raw=263; x=1; y=0; stepper.isDone()=0
--------------------
millis()=8; raw=260; x=1; y=0; stepper.isDone()=0
--------------------
millis()=14; raw=259; x=1; y=0; stepper.isDone()=0
--------------------
millis()=20; raw=257; x=1; y=0; stepper.isDone()=0
--------------------
millis()=27; raw=248; x=1; y=0; stepper.isDone()=0
--------------------
millis()=33; raw=255; x=1; y=0; stepper.isDone()=0
 
ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

Ну, Вы место на сервере экономите? Побольше нельзя?

Ладно, скажите хоть stepper.isDone()=0 - всегда 0? Она должна иногда становиться 1 и я должен видеть это. Если уж сильно много, ну зипните и положите на файлообменник

IVoxelI
Offline
Зарегистрирован: 11.11.2018

ЕвгенийП пишет:

Ну, Вы место на сервере экономите? Побольше нельзя?

Ладно, скажите хоть stepper.isDone()=0 - всегда 0? Она должна иногда становиться 1 и я должен видеть это. Если уж сильно много, ну зипните и положите на файлообменник

Просто нет смысла, т.к. дальше строчки одинаковые

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

Это ответ на мой вопрос? stepper.isDone()=0 больше никогда не становится 1 - проверьте внимательно! Это очень странно

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

Ага, понятно. Вы библиотеку отсюда скачивали? https://playground.arduino.cc/Main/CustomStepper ?

Если отсюда, isDone у Вас никогда не станет истинной. Он там становится истинной только после создания объекта и в методе disable.

Потому у Вас ничего и не делается. что все условия в if'ах всегда ложны.

Если не оттуда скачивали, что скажите откуда.

IVoxelI
Offline
Зарегистрирован: 11.11.2018

ЕвгенийП пишет:

Ага, понятно. Вы библиотеку отсюда скачивали? https://playground.arduino.cc/Main/CustomStepper ?

Если отсюда, isDone у Вас никогда не станет истинной. Он там становится истинной только после создания объекта и в методе disable.

Потому у Вас ничего и не делается. что все условия в if'ах всегда ложны.

Если не оттуда скачивали, что скажите откуда.

Да, отсюда. Мне поменять библиотеку?

ЕвгенийП
ЕвгенийП аватар
Онлайн
Зарегистрирован: 25.05.2015

Не знаю, это Ваше дело.

Вы проверяете isDone(), я посмотрел в текст (можете и Вы посмотреть) и увидел, что истиной она бывает только в двух случаях: сразу в самом начале и после исполнения метода disable(). Если Вы выполнили хоть одну операцию rotate или rotateDegrees, она будет ложью пока не исполните disable.

Сами думайте, менять Вам библиотеку или disable вызывать. Это Ваше решение.