ARDUINO Не присваивается значение false у глобальной переменной

Yaffil

✩✩✩✩✩✩✩
8 Окт 2024
3
0
Добрый день,
Делаю машинку, пишу ф-ции которые едут вперед, поворачивают или откатываются (при препятствии или чтобы не упасть со стола)
Для этого в глобальных объявил
bool rast; //идет движение
bool povorot; //идет поворот
bool otkat; //идет отъезжаем


В инициализации все делаю FALSE

В теле основной вызываю свои ф-ции

Основной:
void loop()
{
    line_sensor();
    rast_prep = hcsr.distance();
    if (otkat == false)
    {
      if (line_1_Volt<2 || line_2_Volt<2 || line_3_Volt<2 ) //2 считаем пропастью
      {
        mot_stop(false);
        otkat = true;
        mot_zadn();
        mot_forward_met_shim( 100, 0.4, zader);
      }
    }
    if (otkat == false && povorot == false && rast == false)
    {
      mot_forward_stop( 100, 10, zader );
    }
}
Машинка едет вперед по mot_forward_stop - тут все ОК
Видит конец стола по датчикам line_N_Volt останавливается - тут тоже все ОК
Откатывается mot_forward_met_shim на 0.4 м - тут тоже все ОК

Проблема в том, что она снова не едет вперед по mot_forward_stop, ломал голову и пришел к выводу (через отладку, что значения переменных bool не присваивается false в вызове из ф-ции mot_stop, хотя сама ф-ция отрабатывает (машинка останавливается). Но из-за того, что переменные остаются взведенные в true второй раз mot_forward_stop не вызывается.
По логу видно что при вызове взвелась rast = true;, но по mot_stop не присвоился rast = false;
Что тут не так может быть?

Едем вперед:
void mot_forward_stop(float speed, int stop, unsigned long zdem=0) //Движение по прямой со скоросью заполнения speed шим задержка в микросекундах после остановки, остановиться за stop см
{
    float speed_corr = speed - 10; // Уводит влево без этого, уменьшим вращение правых колес
    if (povorot == true)
    {
      return;
    }
    if (rast == true )
    {
      if (rast_prep < stop )
      {
       //rast = false;
       mot_stop(false);
       delay(zdem);
      }
    }
    else
    {
      rast = true;
      mot_FL.setStopNeutral(false);
      mot_FR.setStopNeutral(false);
      mot_BL.setStopNeutral(false);
      mot_BR.setStopNeutral(false);
      mot_BR.setSpeed( speed_corr, MOT_PWM, 16000000, MOT_SEC);
      mot_FL.setSpeed( speed, MOT_PWM, 16000000, MOT_SEC);
      mot_BL.setSpeed( speed_corr, MOT_PWM, 16000000, MOT_SEC);
      mot_FR.setSpeed( speed, MOT_PWM, 16000000, MOT_SEC);
    }
}
Стоп (вот тут не присваивается):
void mot_stop(bool type_ost) //остановка моторов
{
// true Указываем освободить мотор при его остановке. Ротор остановленного мотора можно вращать. Останавливаем мотор. Обратите внимание на то, что ротор мотора останавливается плавно.
// false Указываем не освобождать мотор при его остановке. Ротор остановленного мотора будет застопорен Останавливаем мотор. Обратите внимание на то, что ротор мотора останавливается резко.
    povorot = false;
    rast = false;
    otkat = false;
    mot_FL.setStopNeutral(type_ost);
    mot_FR.setStopNeutral(type_ost);
    mot_BL.setStopNeutral(type_ost);
    mot_BR.setStopNeutral(type_ost);             
    mot_FL.setStop();
    mot_FR.setStop();
    mot_BL.setStop();
    mot_BR.setStop();
    // Восстановим движение прямо
    mot_FL.setDirection(false);
    mot_FR.setDirection(true);
    mot_BL.setDirection(false);
    mot_BR.setDirection(true);
}
 
Изменено:

Сотнег

★★★★★★★
15 Янв 2020
4,357
1,493
@Yaffil,
если у вас была идея, что все три флажка сбрасываются в значение false только в функции mot_stop,
тогда эти две строчки не должны быть друг за другом:
mot_stop(false);
otkat = true;

Если тут всё ок, тогда непонятно, в какой функции otkat всё же получает своё false обратно?
 

Yaffil

✩✩✩✩✩✩✩
8 Окт 2024
3
0
Конкретно otkat получает своё false обратно из mot_forward_met_shim который вызывает mot_stop аналогично mot_forward_stop (просто назначение разное, ниже полный код)
Дело в том что не только otkat остается в true, но и rast тоже остается в true (которая взводится при первом движении вперед и которая прям очевидно должна была сброситься перед взведением otkat = true, как вы написали )
mot_stop(false);
otkat = true;
Т.е. присваивание true работает в вот false почему то нет.

Проехать N метров:
void mot_forward_met_shim( float speed, float rast_n, unsigned long zdem) //Движение по прямой со скоросью заполнения speed шим на расстояние rast метров zdem задержка в микросекундах после остановки
{
 float speed_corr = speed - 8; // Уводит влево без этого, уменьшим вращение правых колес
 if (povorot == true)
 {
  return;
 }
 if (rast == true)
 {
  rast_last = mot_FR.getSum(MOT_MET);
  if (rast_need < rast_last)
  {
   //rast = false;
   mot_stop(false);
   delay(zdem);
  }
 }
 else
 {
  rast_last = 0;
  rast = true;
  rast_need = rast_n;
  mot_FL.setStopNeutral(false);
  mot_FR.setStopNeutral(false);
  mot_BL.setStopNeutral(false);
  mot_BR.setStopNeutral(false);
  mot_BR.setSpeed( speed_corr, MOT_PWM, rast_need, MOT_MET);
  mot_FL.setSpeed( speed, MOT_PWM, rast_need, MOT_MET);
  mot_BL.setSpeed( speed_corr, MOT_PWM, rast_need, MOT_MET);
  mot_FR.delSum();
  mot_FR.setSpeed( speed, MOT_PWM, rast_need, MOT_MET);
 
  rast_all += rast_need;
 }
}
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
464
134
@Yaffil,
По кусочкам скетча определить причину не легко. Собственно и сама проблема не ясна
Вы пишите <<По логу видно что при вызове взвелась rast = true;, но по mot_stop не присвоился rast = false; >>
Но по какому логу - неизвестно.
Если сразу после mot_stop(false); Распечатать значение, то что выводится? Если "rast = 1" то надо смотреть, что делают функции mot_

C++:
      if (line_1_Volt<2 || line_2_Volt<2 || line_3_Volt<2 ) //2 считаем пропастью
      {
        mot_stop(false);
        Serial.print("rast = "); Serial.println(rast); // Что выводится 0 или 1 ?
        otkat = true;