Помогите,пожалуйста,со скетчем ИК пульт+шаговый двигатель 28BYJ-48

Cosmos888
Offline
Зарегистрирован: 26.08.2018

Здравствуйте,уважаемые Форумчане!

Задача соит такая: необходимо,чтобы шаговый двигатель вращался с разной скоростью при нажатии различных кнопок на ИК-пульте. На практике получил следущее,а именно при нажатии одной из  заданных кнопок двигатель начинает вращаться с требуемой скоростью и далее никак на команды с ИК-пульта не реагирует. Какую кнопку первой нажмешь,с такой и будет вращаться не реагируя на другие команды.Буду вам очень благодарен за помощь!

Прикрепляю скетч программы

#include "IRremote.h"
 
IRrecv irrecv(2); // указываем вывод, к которому подключен приемник
 
decode_results results;
int IN1 = 7;
int IN2 = 6;
int IN3 = 5;
int IN4 = 4;
int time_del = 16385;
 
void setup() {
  pinMode(IN1, OUTPUT); 
  pinMode(IN2, OUTPUT); 
  pinMode(IN3, OUTPUT); 
  pinMode(IN4, OUTPUT);
  Serial.begin(9600); // выставляем скорость COM порта
  irrecv.enableIRIn(); // запускаем прием
}
void loop() {
  if ( irrecv.decode( &results )) { // если данные пришли
    switch ( results.value ) {
    case 0xFFA25D:
 
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, LOW);
  delayMicroseconds(time_del);
 
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, HIGH);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, LOW);
  delayMicroseconds(time_del);
 
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, HIGH);
  digitalWrite(IN4, LOW);
  delayMicroseconds(time_del);
 
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, HIGH);
  delayMicroseconds(time_del);
  case 0xFF629D:
  int time_del2 = 3000;
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, LOW);
  delayMicroseconds(time_del2);
 
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, HIGH);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, LOW);
  delayMicroseconds(time_del2);
 
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, HIGH);
  digitalWrite(IN4, LOW);
  delayMicroseconds(time_del2);
 
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, HIGH);
  delayMicroseconds(time_del);
 
}  
}
}
 
 
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вставьте код как положено. Только после этого будет предметный разговор.

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

оно даже компилироваться не должно

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

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

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

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

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


Код надо поправить и вставить правильно, а там переменная time_del2 не объявлена или я не вижу чего-то, странно, компилируется и в оригинале и с добавленной объявленной переменной, век живи век учись...
PS пишу аналогичный скетч )))

 

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

ua6em пишет:

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

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


Код надо поправить и вставить правильно, а там переменная time_del2 не объявлена или я не вижу чего-то, странно, компилируется и в оригинале и с добавленной объявленной переменной, век живи век учись...
PS пишу аналогичный скетч )))

 

Там оно есть:

Цитата:

case 0xFF629D:
  int time_del2 = 3000;

Другое дело, что после case нет break, оно там наисполняет :)

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

DIYMan пишет:
после case нет break,
Ну, там не только этого нет, но на компиляцию это не влияет.

Cosmos888
Offline
Зарегистрирован: 26.08.2018
Другой пример скетча
 
#include "IRremote.h"
 
IRrecv irrecv(2); // указываем вывод, к которому подключен приемник
 
decode_results results;
int IN1 = 7;
int IN2 = 6;
int IN3 = 5;
int IN4 = 4;
int time_del = 16385;
 
void setup() {
  pinMode(IN1, OUTPUT); 
  pinMode(IN2, OUTPUT); 
  pinMode(IN3, OUTPUT); 
  pinMode(IN4, OUTPUT);
  Serial.begin(9600); // выставляем скорость COM порта
  irrecv.enableIRIn(); // запускаем прием
}
void loop() {
  if ( irrecv.decode( &results )) { // если данные пришли
    switch ( results.value ) {
    case 0xFFA25D:
 
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, LOW);
  delayMicroseconds(time_del);
 
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, HIGH);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, LOW);
  delayMicroseconds(time_del);
 
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, HIGH);
  digitalWrite(IN4, LOW);
  delayMicroseconds(time_del);
 
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, HIGH);
  delayMicroseconds(time_del);
  break;
  case 0xFF629D:
  int time_del2 = 3000;
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, LOW);
  delayMicroseconds(time_del2);
 
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, HIGH);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, LOW);
  delayMicroseconds(time_del2);
 
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, HIGH);
  digitalWrite(IN4, LOW);
  delayMicroseconds(time_del2);
 
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, HIGH);
  delayMicroseconds(time_del2);
  break;
 
}
irrecv.resume(); // принимаем следующую команду  
}
}
 
Все компилируется. При таком варианте программы при нажатии заданной кнопки двигатель поворачивается ,но не вращается постоянно.При этом светодиоды на драйвере двигателя A, B, C, D промаргивают один раз и все.При нажатии кнопок на ИК-пульте, в зависимости от переменной time_del, светодиоды моргают с соответсвующей частотой и двигатель проворачивается на определенный угол.
andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Cosmos888, Вы не читатель, а писатель?

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

Cosmos888 пишет:
Другой пример скетча

Т.е. Вы принципиально не хотите выкладывать коды по правилам этого форума?

Ну, тогда, извините, решайте свои проблемы самостоятельно.

Cosmos888
Offline
Зарегистрирован: 26.08.2018

Добрый день!Извиняюсь за свое невежество!Сначала не понял,что именно надо сделать.Никого ни в коем случае не хотел обидеть!Прочитал тему про вставку программного кода.Теперь прикрепляю как положено и все-таки надеюсь на предметный разговор. 

#include "IRremote.h"

IRrecv irrecv(2); // указываем вывод, к которому подключен приемник

decode_results results;
int IN1 = 7;
int IN2 = 6;
int IN3 = 5;
int IN4 = 4;
int time_del = 16385;

void setup() {
  pinMode(IN1, OUTPUT); 
  pinMode(IN2, OUTPUT); 
  pinMode(IN3, OUTPUT); 
  pinMode(IN4, OUTPUT);
  Serial.begin(9600); // выставляем скорость COM порта
  irrecv.enableIRIn(); // запускаем прием
}
void loop() {
  if ( irrecv.decode( &results )) { // если данные пришли
    switch ( results.value ) {
    case 0xFFA25D:

  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, LOW);
  delayMicroseconds(time_del);

  digitalWrite(IN1, LOW);
  digitalWrite(IN2, HIGH);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, LOW);
  delayMicroseconds(time_del);

  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, HIGH);
  digitalWrite(IN4, LOW);
  delayMicroseconds(time_del);

  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, HIGH);
  delayMicroseconds(time_del);
  break;
  case 0xFF629D:
  int time_del2 = 3000;
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, LOW);
  delayMicroseconds(time_del2);

  digitalWrite(IN1, LOW);
  digitalWrite(IN2, HIGH);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, LOW);
  delayMicroseconds(time_del2);

  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, HIGH);
  digitalWrite(IN4, LOW);
  delayMicroseconds(time_del2);

  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, HIGH);
  delayMicroseconds(time_del2);
  break;

}
irrecv.resume(); // принимаем следующую команду  
}
}

 

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

Другой разговор.

Не знаю, кто Вам писал этот код, но для начала обратите внимание на конструкцию switch. Там где-то наверняка пропущен break (и не один). Если Вы не знаете, что это такое – изучайте - http://arduino.ru/Reference/SwitchCase

Потом посмотрите на то, как Вы используете библиотеку IRremote. Там явно не хватает операции resume. Без неё она ничего читать не будет после первого чтения (одноразовая) Если Вы не знаете, что это такое – изучайте - https://www.pjrc.com/teensy/td_libs_IRremote.html  

Дальше не смотрел, думаю, что ещё есть, но для начала это исправьте.

Cosmos888
Offline
Зарегистрирован: 26.08.2018

Большое спасибо!Буду изучать.