Отслеживание принудительной остановки двигателя(на валу-неодим. магниты, на неподв.части-датчик). Голову ломаю 3 месяц О_о

mu_ssina
Offline
Зарегистрирован: 30.08.2013

Всем доброго!

 В данный момент на основе вашего кода(который ниже) пытаюсь сделать такое: при остановке- подождать немного и включить реверс.

В данный момент не особо получается. Почему-не могу пока понять.

 

 

Ваш код:

void setup()
{

pinMode (hallPin, INPUT);
Serial.begin(115200);
attachInterrupt(0, sensor_impulse, FALLING);

Motor_B (2, 1); //запуск двигателя в самом начале


} //setup



void loop()
{
detachInterrupt(0);
  if (shaft_state && millis() - lasttime > SENSOR_MIN_TIME){shaft_state = 0;}  
 attachInterrupt(0, sensor_impulse, FALLING);
static bool lastshaft_state = 1;
     
     if (lastshaft_state!=shaft_state)
     {
       if (shaft_state) Serial.println("Shaft start");
       else Serial.println ("Shaft stop");
       lastshaft_state=shaft_state;
     }
}

 

Мой код, на базе вашего:

void setup()
{

pinMode (hallPin, INPUT);
Serial.begin(115200);
attachInterrupt(0, sensor_impulse, FALLING);

Motor_B (2, 1); //запуск двигателя в самом начале


} //setup



void loop()
{
detachInterrupt(0);
  if (shaft_state && millis() - lasttime > SENSOR_MIN_TIME){shaft_state = 0;}  
 attachInterrupt(0, sensor_impulse, FALLING);
static bool lastshaft_state = 1;
     
     if (lastshaft_state!=shaft_state)
     {
       if (shaft_state) Serial.println("Shaft start");
       else
         {
          //вот такое изменение внес-----------------------------------------------------------------

           Serial.println ("Shaft stop"); 
           lastshaft_state=shaft_state; 

           Hard_stopper(3); //остановка двигателя
           delay (3000); 
           Motor_B (2, 1); //запуск двигателя 

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


           //----------------------------------------------------------------------------------------------------- 

}


}
}

 

Причем! Что удалось выяснить на данный момент:

если в вышеприведенном коде(который ваш, изначальный), я изменяю вот этот кусок:

if (shaft_state)Serial.println("Shaft start");
       else Serial.println ("Shaft stop");
       lastshaft_state=shaft_state;

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

Вот  это глючит (хотя по сути, это одно и то же что наверху):

if (shaft_state)
{
    Serial.println("Shaft start");
    //далее тут некий мой код
}

 else 
{
    Serial.println ("Shaft stop");
    lastshaft_state=shaft_state;
    //далее тут некий мой код

}

 

MaksVV
Offline
Зарегистрирован: 06.08.2015

Потому что эту строчку надо из else вынести lastshaft_state=shaft_state

в if (lastshaft_state!=shaft_state)

mu_ssina
Offline
Зарегистрирован: 30.08.2013

Все, спасибо-все получилось и работает! :-)

Но есть вот какой вопрос...дело в том, что я сам специализируюсь по java. И поэтому довольно легко понимаю конструкции C++ - которые в ардуино...Но мне непонятна вот эта строчка:

volatile bool shaft_state = 1;  (она в самом начале).

Разберем ее подробно....(т.к. именно некоторых моментов не нашел в сети):

Поправьте меня, если не прав:

volatile
 
Операции чтения/записи volatile переменной являются атомарными.
Результат операции записи значения в volatile переменную одним потоком, становится виден всем другим потокам, которые используют эту переменную для чтения из нее значения.

bool  (в сети не нашел расшифровки) . Если это boolean  -то почему пишем bool?

Далее...Почему, если это boolean, как он может быть равен 1?  Он ведь логический: TRUE или FALSE? Ну я допускаю, что под "равен 1" подразумевается "TRUE", но сама запись мне не понятна...информацию не смог найти по этой теме...

И еще...вот по этой строчке:

volatile uint32_t lasttime = 0;

Почему мы пишем uint32_t ? Я нашел информацию по теме, что это: 

uint32_t 32-битовый без знака

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

 

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

mu_ssina пишет:

Все, спасибо-все получилось и работает! :-)

Но есть вот какой вопрос...дело в том, что я сам специализируюсь по java. И поэтому довольно легко понимаю конструкции C++ - которые в ардуино...Но мне непонятна вот эта строчка:

volatile bool shaft_state = 1;  (она в самом начале).

Разберем ее подробно....(т.к. именно некоторых моментов не нашел в сети):

Поправьте меня, если не прав:

volatile
 
Операции чтения/записи volatile переменной являются атомарными.
Результат операции записи значения в volatile переменную одним потоком, становится виден всем другим потокам, которые используют эту переменную для чтения из нее значения.

bool  (в сети не нашел расшифровки) . Если это boolean  -то почему пишем bool?

Далее...Почему, если это boolean, как он может быть равен 1?  Он ведь логический: TRUE или FALSE? Ну я допускаю, что под "равен 1" подразумевается "TRUE", но сама запись мне не понятна...информацию не смог найти по этой теме...

И еще...вот по этой строчке:

volatile uint32_t lasttime = 0;

Почему мы пишем uint32_t ? Я нашел информацию по теме, что это: 

uint32_t 32-битовый без знака

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

 

многие знания многие печали )))

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

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

bool логический тип, ненастоящий, выведенный из int.  По традиции, false  это 0, true - всё, что не 0. bool и int взаимозаменяемы.  Например 

char ch;

.

if ( ch=='\0x00')  - логическое условие

if (!ch)  - то же самое, только ch берется как int. Оба условия для Си равнозначны

 

uint32_t = unsigned long  что короче написать?  И в этой записи ты сразу видишь размер переменной, не зависящий от компилятора