управление электромотором

andreichsb
Offline
Зарегистрирован: 26.11.2014

Приветствую. Гуру, посмотрите, что делаю не так?

Есть: Uno, электродвигатель от стеклоочистителя 12в, со встроенной шайбой и концевиками - для определения положения.

Надо: что бы двигатель делал по четверти оборота через определенное время по следующему алгоритму:

вкл,
1) опрашиваем датчики положения, если А не в 1 В не в 0 - включить реле до А=1, В=0.
2) включить св.диод А, выключить В
3) ждем 5 сек
4) выключаем диоды
5) включаем реле до А=1 В=1
6) включаем диод А и диод В
7) ждем 5 сек
8) выключаем диоды
9) включаем реле до А=0 В=1
10) включаем диод В
11) ждем 5 се
12) выключаем диоды
13) включаем реле до А=0 В=0
14) включаем диод А и диод В на 1 сек
15) ждем 5 сек
16) включаем реле до А=1 В=0
17 )включаем диод А
18) ждем 5 сек
19) go to 4
схема такая 

скетч следующий:

int ledPinA = 10;                 // Светодиод подключенный к вход/выходу 10
int ledPinB = 11;                 // Светодиод подключенный к вход/выходу 11
int relePin = 13;                 // Реле подключенное к вход/выходу 12
int inPinA = 8;                   // канал А на входе 8
int inPinB = 9;                   // канал В на входе 9
int valA = 0;                     // переменная для хранения значения канала А
int valB = 0;                     // переменная для хранения значения канала В
int valR = 0;                     // переменная для хранения значения выхода реле
int valP = 0;                     // переменная для хранения номера программы 
int valPt = 0;                    // переменная хранящая в себе значения були ли мы на старте
void setup()
{
  pinMode(ledPinA, OUTPUT);       // устанавливает режим работы - выход для 10го вход/выхода (pin)
  pinMode(ledPinB, OUTPUT);       // устанавливает режим работы - выход для 11го вход/выхода (pin)
  pinMode(relePin, OUTPUT);       // устанавливает режим работы - выход для 12го вход/выхода (pin)
  pinMode(inPinA, INPUT);         //  устанавливает режим работы - вход для 8го вход/выхода (pin)
  pinMode(inPinB, INPUT);         //  устанавливает режим работы - вход для 9го вход/выхода (pin)
 }
 
void loop()
{
  valA = digitalRead(inPinA);      // считываем значение с входа A
  valB = digitalRead(inPinB);      // считываем значение с входа B
 switch (valA) { case 0:
                    switch (valB) {
                             case 0:
                               valP=4;
                               break;
                             case 1:
                               valP=3;
                               break;}
                    break;
                 case 1:
                    switch (valB) {
                            case 0:
                              valP=1;
                              break;
                            case 1:
                              valP=2;
                              break;};
                break;
                }  
 
if (valP != 1) 
{ 
if (valPt != 1) 
{ 
valPt=1; // ставим значения что мы побывали на старте 
valR=1; 
digitalWrite(relePin, valR); // устанавливаем значение на rele равным значению vkl 
} 
}
delay(1000); 
if (valP==1)
{ 
  valR=0;
  digitalWrite(relePin, valR);     // устанавливаем значение на светодиоде равным значению входа кнопки
  digitalWrite(ledPinA, valA);     // устанавливаем значение на светодиоде равным значению входа кнопки
  digitalWrite(ledPinB, valB);     // устанавливаем значение на светодиоде равным значению входа кнопки
  delay(5000);
  valPt=1;                         // ставим значения что мы побывали на старте
  valR=1;
  digitalWrite(relePin, valR);     // устанавливаем значение на светодиоде равным значению входа кнопки
  }
  
  if (valP==2)
{ 
  valR=0;
  digitalWrite(relePin, valR);     // устанавливаем значение на светодиоде равным значению входа кнопки
  digitalWrite(ledPinA, valA);     // устанавливаем значение на светодиоде равным значению входа кнопки
  digitalWrite(ledPinB, valB);     // устанавливаем значение на светодиоде равным значению входа кнопки
  delay(5000);
  valR=1;
  digitalWrite(relePin, valR);     // устанавливаем значение на светодиоде равным значению входа кнопки
  }
  
  if (valP==3)
{ 
  valR=0;
  digitalWrite(relePin, valR);     // устанавливаем значение на светодиоде равным значению входа кнопки
  digitalWrite(ledPinA, valA);     // устанавливаем значение на светодиоде равным значению входа кнопки
  digitalWrite(ledPinB, valB);     // устанавливаем значение на светодиоде равным значению входа кнопки
  delay(5000);
  valR=1;
  digitalWrite(relePin, valR);     // устанавливаем значение на светодиоде равным значению входа кнопки
  }
  
  if (valP==4)
{ 
  valR=0;
  digitalWrite(relePin, valR);     // устанавливаем значение на светодиоде равным значению входа кнопки
  digitalWrite(ledPinA, valA);     // устанавливаем значение на светодиоде равным значению входа кнопки
  digitalWrite(ledPinB, valB);     // устанавливаем значение на светодиоде равным значению входа кнопки
  delay(5000);
  valR=1;
  digitalWrite(relePin, valR);     // устанавливаем значение на светодиоде равным значению входа кнопки
  }
}

на комменты сильно не смотрите, малость не правильные они.

При включении мотор начинает маслать без остановки, диоды не мигают (ни на макетке ни на 13 пине ни на реле)

что ей нужно, ума не приложу..

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

andreichsb
Offline
Зарегистрирован: 26.11.2014

извиняюсь, на схеме неправильно на дуине выводы:

8,9 входы с датчиков

10,11 выходы на св.диоды

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

andreichsb пишет:
что ей нужно, ума не приложу.
Ну разумеется Ум приложить. http://www.studfiles.ru/preview/4520454/page:11/

andreichsb
Offline
Зарегистрирован: 26.11.2014

ну и что по вашему не УМного в моей шайбе?

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

andreichsb пишет:

ну и что по вашему не УМного в моей шайбе?

По внешнему кольцу при обороте на 360 градусов должен бы один переход 0->1 и 1->0 , которые смещены относительно друг друга на 180 градусов и смещены относительно внутрених переходов на 90 градусов.

andreichsb
Offline
Зарегистрирован: 26.11.2014

Это все понятно. Но, что мешает сейчас программе остановить двигатель повернув его градусов на 15 от старта и получив сигнал 0-0, типа мы в третьей точке? И подождав положенные 5 секунд ехать дальше. Почему маслает то без остановки? Сдается мне, шайба тут ни причем…

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

andreichsb пишет:
Это все понятно. Но, что мешает сейчас программе остановить двигатель повернув его градусов на 15 от старта и получив сигнал 0-0, типа мы в третьей точке? И подождав положенные 5 секунд ехать дальше. Почему маслает то без остановки? Сдается мне, шайба тут ни причем…

Так там всего по чуть-чуть. То что программа не структурирована, мешает найти ошибку. То что там delay работает без тормозов. А если я напишу за вас, то вы не поймете как это отладить. Так что шайба это еще одна ложка дегтя в банке ***.

andreichsb
Offline
Зарегистрирован: 26.11.2014

Отличная помощь :-)
Я знаю что не так но не скажу.
Delay там установлена для пробы, без нее то же самое было. Так что тычки пальцем в небо я и сам делаю

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

andreichsb пишет:
Отличная помощь :-) Я знаю что не так но не скажу. Delay там установлена для пробы, без нее то же самое было. Так что тычки пальцем в небо я и сам делаю

Ну тогда сделайте упрощенный вариант. Поворот с остановкой 5 сек в позиции перехода 1-> 0  и в позиции 0->1(одно внутр кольцо). светодиоды зажигать не надо.

Ну это если вы уже написали программу. Не подглядывать

byte A_pin = 10;
bool A;
bool step;
byte Rele_pin = 13; // 1 вкл / 0 выкл

void setup() {
  pinMode(A_pin, INPUT);
  A = digitalRead(A_pin);
  step = ! A;
  pinMode(Rele_pin, OUTPUT);
  digitalWrite(Rele_pin, 1);
}

void loop() {
  A = digitalRead(A_pin);
  if (A == step) {
    digitalWrite(Rele_pin, 0);
    delay (5000);
    step = ! step;
    digitalWrite(Rele_pin, 1);
  }
}