Шаговый двигатель Nema34 и три датчика

Прошу помощи у форумчан. Имеется горизонтальная каретка, которая движется горизонтально. Установлены датчики : 1 конечное положение, 2 начальное положение, 3 поступление (находится с верху). При включении система должна определить каретка находится в начальном положении или нет. Если не в начальном положении:

1 Условие ( ни один датчик не сработал) , то двигатель начинает движение обратно , пока не сработает Датчик2.

2 Условие (сработал Датчик1 - каретка выдвинута до упора), двигатель так же начинает движение обратно , пока не сработает Датчик2.

После, как каретка установлена в начальном положении (Датчик2 сработал), то двигатель останавливается и ждет команды от Датчика3 . Если Датчик3 сработал , то каретка движется в прямом направлении пока не сработает Датчик1, после чего останавливается. Ждет пока вновь не сработает Датчик3 , после чего каретка движется в обратном направлении до срабатывания Датчика2.

Итак получается каретка движется туда сюда по команде Датчика3.

Веше изложенные Условия 1 и 2 . Выполняются. При включении система проверяет где находится каретка и возвращает ее в начальное положение по Датчику2. Но после, по срабатыванию Датчика3 ничего не происходит. Подскажите пожалуйста куда копать и где я ошибаюсь в написании кода?

// Вход драйвера «STEP» (он же «PULSE») - предназначен для получения тактовых импульсов. За один импульс ротор двигателя поворачивается на один микрошаг. 
// Чем выше частота импульсов, тем выше скорость вращения ротора.

// Вход драйвера «DIR» - предназначен для выбора направления вращения двигателя («0» - в одну сторону, «1» - в другую сторону). 
// Смена состояния вывода «DIR» должна осуществляться при отсутствии импульсов на выводе «STEP».

// Вход драйвера «ENABLE» - разрешает работу двигателя. У большинства драйверов данный вход является инверсным, работа двигателя разрешена при отсутствии напряжения на входе. 
// Некоторые драйверы позволяют вообще не подключать этот вход. Если работа двигателя запрещена, то его обмотки электрически отключаются и вал двигателя не удерживается.

// Двигатель отключён если на входе «ENABLE» есть напряжение.
// Сигналы на входах «STEP» и «DIR» игнорируются драйвером. Вал двигателя освобождён.
// Вал поворачивается на один микрошаг с каждым импульсом на входе «STEP», при условии что на входе «ENABLE» нет напряжения.
// Направление поворота вала зависит от состояния на входе «DIR».
// Вал двигателя удерживается в неподвижном состоянии если на входе «ENABLE» нет напряжения и на вход «STEP» не подаются импульсы.




// t1: После снятия напряжения со входа «ENABLE» должно пройти не менее 5мкс до изменения уровня на входе «STEP» или «DIR».
// t2: После изменения состояния на входе «DIR» должно пройти не менее 5мкс до подачи импульса на входе «STEP»       
// t3, t4: Длительность импульса или паузы на входе «STEP» не должна быть меньше 2,5мкс.

//для управления двигателем
const uint8_t pin_ENA = 2;                // Вывод 2 Arduino подключённый к входу драйвера ENA+.
const uint8_t pin_DIR = 6;                // Вывод 3 Arduino подключённый к входу драйвера DIR+.
const uint8_t pin_PUL = 4;                // Вывод 4 Arduino подключённый к входу драйвера PUL+.
                                          // Вывод GND Arduino соединён с входами драйвера ENA-, DIR-, PUL-.

const uint8_t pin_EDatchik_1 = 8;         // Вывод 9 Arduino подключённый к переключателю (емкостному датчику1) - прямой ход
const uint8_t pin_EDatchik_2 = 10;        // Вывод 10 Arduino подключённый к переключателю (емкостному датчику2) - обратный ход
const uint8_t pin_ODatchik = 12;          // Вывод 8 Arduino подключённый к переключателю (оптическому датчику).

//для световой индакации состояния датчика
const uint8_t pin_SDiod = 13;             // Вывод 13 Arduino подключённый к светодиоду.

//int spd = A0;                             // потенциометр - регулирует скорость вращения двигателя
                                        // Чем выше частота, тем выше скорость вращения вала.
// LOW  - низкое
// HIGH - высокое 
                                         
boolean Pologenie = HIGH;                  // Для определения первоначального положения каретки 
                                          // Если каретка не в начале , то состояние HIGH  , если в начале то состояние LOW

boolean Dwijenie = LOW;                   // Для движения каретки в прямом или обратном направлении
                                          // LOW - прямое , HIGH - обратное

boolean ODatchikState;               // создаем глобальную переменную состояния оптического датчика ODatchikState
boolean OD_p = LOW;                       // Переменная для сохранения предыщущего состояния оптического датчика
//boolean OD_t = LOW;                       // Переменная для сохранения текущего состояния оптического датчика

boolean EDatchikState_1;            // создаем глобальную переменную состояния емкостного датчика EDatchikState
boolean ED_1_p = LOW;                     // Переменная для сохранения предыщущего состояния емкостного датчика
//boolean ED_1_t = LOW;                     // Переменная для сохранения текущего состояния емкостного датчика

boolean EDatchikState_2;                  // создаем глобальную переменную состояния емкостного датчика EDatchikState
boolean ED_2_p = LOW;                     // Переменная для сохранения предыщущего состояния емкостного датчика
//boolean ED_2_t = LOW;                     // Переменная для сохранения текущего состояния емкостного датчика

boolean SDiod_on = false;                 // Теукущее состояние светодиода
boolean nach = LOW;                                // Флаг для проверки начала (LOW или HIGH) 



//Функция подавления дребезга контактов
boolean debounce (boolean datchik, boolean last)
{
    boolean current = digitalRead(datchik);        // Считываем состояние датчика
    if(last != current)                            // Если состояние изменилось
    {
      delay(5);                                    // Ждем пока состояние стабилизируется  - игнорируем дребезг 
      current = digitalRead(datchik);              // Считываем стабильное значение   
    }
    return current;                                // Возвращаем результат 
}





// void setup() – функция, которая выполняется единожды, при загрузке программы                                          
void setup()
{                              
  
     pinMode( pin_ENA, OUTPUT );          // Конфигурируем вывод 2 Arduino как выход.
     pinMode( pin_DIR, OUTPUT );          // Конфигурируем вывод 3 Arduino как выход.
     pinMode( pin_PUL, OUTPUT );          // Конфигурируем вывод 4 Arduino как выход.
     
     pinMode( pin_SDiod, OUTPUT );        // Конфигурируем вывод 13 Arduino как выход (pin13 светодиод)
     pinMode( pin_ODatchik, INPUT_PULLUP );  // Конфигурируем вывод 8 Arduino как вход  (pin8 датчик)
     pinMode( pin_EDatchik_1, INPUT_PULLUP );  // Конфигурируем вывод 9 Arduino как вход  (pin9 датчик)
     pinMode( pin_EDatchik_2, INPUT_PULLUP );  // Конфигурируем вывод 9 Arduino как вход  (pin10 датчик)
     
     EDatchikState_1 = digitalRead(pin_EDatchik_1);
     EDatchikState_2 = digitalRead(pin_EDatchik_2);
     ODatchikState = digitalRead(pin_ODatchik);

    // digitalWrite(pin_SDiod, LOW); 

}    //void setup()



// void loop() – соответственно функция, которая выполняется постоянно, когда плата подключена к источнику питания 
                                          
void loop()
    {       
     
     // Функция map пропорционально переносит значение (analogRead(spd)) из текущего диапазона 
     // значений (0,1023) в новый диапазон (500,2000), заданный параметрами.
     //  int t = map((analogRead(spd)),0,1023,1,20);
     int t = 5;
     
 
// Условие1 при первом включении, 
// если каретка станка стоит не в начальном положении - датчик 1 и датчик 2  не сработали     

 
     if (EDatchikState_1 == HIGH)
        {
          ED_1_p = HIGH;     
        }
     else
        {
          ED_1_p = LOW;     
        }

     
  
     if (EDatchikState_2 == HIGH)
        {
          ED_2_p = HIGH;     
        }
     else
        {
          ED_2_p = LOW;     
        }
     
  
     if (ODatchikState == HIGH)
        {
         OD_p = HIGH;     
        }
     else
        {
         OD_p = LOW;     
        }




       
       if (ED_1_p == HIGH && ED_2_p == HIGH && OD_p == HIGH  && Pologenie == HIGH )   //Pologenie = HIGH   - каретка не в начале        
                                                                                                                      
          {   
                 // Устанавливаем движение вала в обратном направлении:  
                digitalWrite( pin_ENA, 0 );            // Разрешаем работу двигателя.
                delayMicroseconds(5);                  // Выполняем задержку t1 (5мкс)  
                digitalWrite( pin_DIR, 1 );            // Указываем валу вижение в обратном направлении
                delayMicroseconds(5);                  // Выполняем задержку t2 (5мкс)
                
                // Вал движетсяв обратную сторону пока не сработает емкостной датчик 2
                for(int i=0; i<1000 ; i++)
                   {              // Выполняем 100 проходов цикла (1 оборот = 400 тактов).
                     digitalWrite( pin_PUL, 1 );            // Устанавливаем на выводе PUL состояние логической «1».
                     delayMicroseconds(1);                  // Выполняем задержку t3.
                     digitalWrite( pin_PUL, 0 );            // Устанавливаем на выводе PUL состояние логического «0».
                     delayMicroseconds(1);                  // Выполняем задержку t4.
                     EDatchikState_2 = digitalRead(pin_EDatchik_2);  //  Считываем показания датчика 
                                            
                     if (EDatchikState_2  != EDatchikState_2)    // если показания датчика изменились
                        {
                          ED_1_p == HIGH;
                          ED_2_p = LOW;            // Фиксируем, что Датчик2 сработал
                          Pologenie = LOW ;        // Каретка находится в начале  
                          Dwijenie = LOW;           // Движение в прямом направлении
                          nach = LOW;
                          break;                    // Оператор break позволяет выйти из цикла
                          
                          
                        }
                     
                   } 
          }


// Условие2 при первом включении, 
// если каретка станка стоит в противоположном положении и датчик 1 сработал     
       
       if (ED_1_p == LOW && ED_2_p == HIGH && OD_p == HIGH  && Pologenie == HIGH  )     //Pologenie = LOW   - каретка не в начале          
         {   
                // Устанавливаем движение вала в обратном направлении:  
                digitalWrite( pin_ENA, 0 );            // Разрешаем работу двигателя.
                delayMicroseconds(5);                  // Выполняем задержку t1 (5мкс)  
                digitalWrite( pin_DIR, 1 );            // Указываем валу вижение в обратном направлении
                delayMicroseconds(5);                  // Выполняем задержку t2 (5мкс)
                
                // Вал движетсяв обратную сторону пока не сработает емкостной датчик 2
                for(int i=0; i<1000 ; i++)
                   {              // Выполняем 100 проходов цикла (1 оборот = 400 тактов).
                     digitalWrite( pin_PUL, 1 );            // Устанавливаем на выводе PUL состояние логической «1».
                     delayMicroseconds(1);                  // Выполняем задержку t3.
                     digitalWrite( pin_PUL, 0 );            // Устанавливаем на выводе PUL состояние логического «0».
                     delayMicroseconds(1);                  // Выполняем задержку t4.
                     EDatchikState_2 = digitalRead(pin_EDatchik_2);  //  Считываем показания датчика 
                                            
                     if (EDatchikState_2  != EDatchikState_2)    // если показания датчика изменились
                        {
                          ED_1_p == HIGH;
                          ED_2_p = LOW;            // Фиксируем, что Датчик2 сработал
                          Pologenie = LOW ;        // Каретка находится в начале  
                          Dwijenie = LOW;           // Движение в прямом направлении
                          nach = LOW;
                          break;                    // Оператор break позволяет выйти из цикла
                          
                        }
                   } 
                    
         }




// Если Условие1 и Условие2 не сработали и каретка находится в начале (Датчик 2 сработал) 
// Считываем состояние датчиков Датчик2
     if (ED_1_p == HIGH && ED_2_p == LOW && Pologenie == LOW && Dwijenie == LOW)     // Pologenie = LOW   - каретка в начале   Dwijenie == LOW - прямое
         {
           ODatchikState = digitalRead(pin_ODatchik);
           // Каретка ждет команды от срабатывания оптического датчика для движения вперед
           if (ODatchikState  == LOW)
              { 
                OD_p = LOW;           // Фиксируем, что датчик поступления сработал
                if (OD_p == LOW && ED_1_p == HIGH && ED_2_p == LOW && Pologenie == LOW && Dwijenie == LOW )      
                    {
                     // Начинаем движение каретки вперёд
            
                     // Устанавливаем движение вала в обратном направлении:  
                     digitalWrite( pin_ENA, 0 );            // Разрешаем работу двигателя.
                     delayMicroseconds(5);                  // Выполняем задержку t1 (5мкс).  
                     digitalWrite( pin_DIR, 0 );            // Указываем валу вижение в прямом направлении
                     delayMicroseconds(5);                  // Выполняем задержку t2 (5мкс).
                     // Вал движется в прямом направлении пока не сработает емкостной Датчик1
                     for(int i=0; i<1000 ; i++)
                        {              // Выполняем 100 проходов цикла (1 оборот = 400 тактов).
                          digitalWrite( pin_PUL, 1 );            // Устанавливаем на выводе PUL состояние логической «1».
                          delayMicroseconds(1);                  // Выполняем задержку t3.
                          digitalWrite( pin_PUL, 0 );            // Устанавливаем на выводе PUL состояние логического «0».
                          delayMicroseconds(1);                  // Выполняем задержку t4.
                          EDatchikState_1 = digitalRead(pin_EDatchik_1);  //  Считываем показания датчика 
                                            
                         if (EDatchikState_1  != EDatchikState_1)    // если показания датчика изменились
                            {
                              OD_p = HIGH;           // Сбрасываем флаг с датчика поступления
                              ED_2_p = HIGH;          // Снимаем фиксацию сработки Датчика2
                              ED_1_p = LOW;         // Фиксируем, что Датчик1 сработал
                              Dwijenie = HIGH;      // Изменяем флаг на движение в обратную сторону
                              Pologenie == HIGH ;    // Изменяем флаг каретка не в начале
                              break;     // Оператор break позволяет выйти из цикла
                            }
                        } 
                    }
              }
         }
        
   
// Если Условие1 и Условие2 не сработали и каретка находится в другом конце начале (Датчик 1 сработал) 
// Считываем состояние датчиков Датчик1
     if (ED_1_p == LOW && ED_2_p == HIGH && Pologenie == HIGH && Dwijenie == HIGH)     // Pologenie = HIGH   - каретка  не в начале   Dwijenie == HIGH - обратное
         {
           ODatchikState = digitalRead(pin_ODatchik);
           // Каретка ждет команды от срабатывания оптического датчика для движения вперед
           if (ODatchikState  != ODatchikState)
              { 
                OD_p = LOW;           // Фиксируем, что датчик поступления сработал
                if (OD_p == LOW && ED_1_p == LOW && ED_2_p == HIGH && Pologenie == HIGH && Dwijenie == HIGH)    
                   
                   {
                     // Начинаем движение каретки назад
            
                     // Устанавливаем движение вала в обратном направлении:  
                     digitalWrite( pin_ENA, 0 );            // Разрешаем работу двигателя.
                     delayMicroseconds(5);                  // Выполняем задержку t1 (5мкс).  
                     digitalWrite( pin_DIR, 1 );            // Указываем валу вижение в обратном направлении
                     delayMicroseconds(5);                  // Выполняем задержку t2 (5мкс).
                     // Вал движется в прямом направлении пока не сработает емкостной Датчик1
                     for(int i=0; i<1000 ; i++)
                        {              // Выполняем 100 проходов цикла (1 оборот = 400 тактов).
                          digitalWrite( pin_PUL, 1 );            // Устанавливаем на выводе PUL состояние логической «1».
                          delayMicroseconds(1);                  // Выполняем задержку t3.
                          digitalWrite( pin_PUL, 0 );            // Устанавливаем на выводе PUL состояние логического «0».
                          delayMicroseconds(1);                  // Выполняем задержку t4.
                          EDatchikState_2 = digitalRead(pin_EDatchik_2);  //  Считываем показания датчика 
                                            
                         if (EDatchikState_2  != EDatchikState_2)    // если показания датчика изменились
                            {
                              OD_p = HIGH;           // Сбрасываем флаг с датчика поступления
                              ED_2_p = LOW;          // Фиксируем сработку Датчика2
                              ED_1_p = HIGH;         // Снимаем фиксацию сработки Датчика1
                              Dwijenie = LOW;      // Изменяем флаг на движение в прямом направлении
                              Pologenie == LOW;     // Изменяем флаг каретка в начале
                              
                              break;     // Оператор break позволяет выйти из цикла
                              
                            }
                        } 
                    }
              }
         }
         

}       // void loop()
         

мне кажется ваша ошибка в том что вы не умеете объяснять это ии или не прошли начальный курс…)))
а какой ответ вы хотели ?

Я и пишу в песочницу (для новичков) Это не ИИ

я делал код для автоматического выдвижения чего то…
на 3 концевиках, вам найти пример, и он вам поможет чем то ?)))

@Ugluarov
Интересный код
Насколько я вижу, вы считаете что датчики достаточно считать один раз в СЕТАП - дальше значения

будут волшебно обновляться в программе сами?

И подскажите, как в коде обозначен датчик3

Это датчик ноль? ODatchikState = digitalRead(pin_ODatchik);

if (EDatchikState_2 != EDatchikState_2)  // Всегда false ???
Pologenie == HIGH;  // точно так ? может одно равно лишнее ?
но это потом все...

мдя…
Похоже что с утверждением

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

@Ugluarov , судя по всему, этим условием вы хотели проверить, изменилось ли состояние датчика2. Только получилось, что вы сравниваете переменную саму с собой. Очевидно, так это работать не будет.
Для проверки изменения состояния вам нужно завести для каждого датчика две переменных - прежнее значение и текущее и сравнивать.

Как-то так:

о как новичка оглаушило… даже слова сказать не может… а ведь вроде не ругал, пытался быть вежливым в этот раз :slight_smile:

Комментарии ушёл писать к “своему” коду и устал :slightly_smiling_face:

Извините за молчание. Всем большое спасибо за небольшие напутствия. Работа отвлекает. Дома пересмотрел свой код переписал. Часть заработало. Условия 1, 2, 3 при первом включении выполняются… Т.е. каретка если стоит не в начальном положении перемещается в начало и по срабатыванию Датчика2 останавливается. Но, что то я не могу ухватить далее . Пока код не закончен - не получается один момент.

  1. Опрашиваем Датчика3, и если он сработал каретка должна перемещаться…(шаговый двигатель должен вращаться пока не закончится цикл или пока не сработает Датчик1 - этого в коде пока нет . Получается по срабатыванию Датчика3 шаговый двигатель вращается , но стоит снять срабатывание датчика3 , то двигатель то же сразу же останавливается…и цикл прерывается, а двигатель должен вращаться далее пока не сработает Датчик1. Добрые люди подскажите , что я делаю не так?
//для управления двигателем
const uint8_t pin_ENA = 2;                // Вывод 2 Arduino подключённый к входу драйвера ENA+.
const uint8_t pin_DIR = 6;                // Вывод 3 Arduino подключённый к входу драйвера DIR+.
const uint8_t pin_PUL = 4;                // Вывод 4 Arduino подключённый к входу драйвера PUL+.
                                          // Вывод GND Arduino соединён с входами драйвера ENA-, DIR-, PUL-.

const uint8_t pin_Datchik_1 = 8;         // Вывод 8 Arduino подключённый к переключателю (емкостному датчику1) - прямой ход
const uint8_t pin_Datchik_2 = 10;        // Вывод 10 Arduino подключённый к переключателю (емкостному датчику2) - обратный ход
const uint8_t pin_Datchik_3 = 12;        // Вывод 12 Arduino подключённый к переключателю (оптическому датчику).

//int spd = A0;                          // потенциометр - регулирует скорость вращения двигателя
                                         // Чем выше частота, тем выше скорость вращения вала.
// LOW  - низкое
// HIGH - высокое 
                                         
boolean Pologenie = HIGH;                // Для определения первоначального положения каретки 
                                         // Если каретка не в начале , то состояние HIGH  , если в начале то состояние LOW


boolean Datchik_1_current;   // Текущее состояние
boolean Datchik_1_pred;      // Предыдущее состояние
boolean D_1;                 // Флаг срабатывания Датчика1 


boolean Datchik_2_current;   // Текущее состояние
boolean Datchik_2_pred;      // Предыдущее состояние
boolean D_2;                 // Флаг срабатывания Датчика2 


boolean Datchik_3_current;       // Текущее состояние
boolean Datchik_3_pred = HIGH;   // Предыдущее состояние
boolean D_3;                     // Флаг срабатывания Датчика3 

boolean prov = HIGH;    //  Флаг первичной проверки при включении
boolean dvig = HIGH;    //  Флаг движения каретки вперед
                                        
void setup()                              // void setup() – функция, которая выполняется единожды, при загрузке программы  
{                              
  
     pinMode( pin_ENA, OUTPUT );          // Конфигурируем вывод 2 Arduino как выход.
     pinMode( pin_DIR, OUTPUT );          // Конфигурируем вывод 3 Arduino как выход.
     pinMode( pin_PUL, OUTPUT );          // Конфигурируем вывод 4 Arduino как выход.
     

     pinMode( pin_Datchik_3, INPUT_PULLUP );  // Конфигурируем вывод 8 Arduino как вход  (pin8 датчик)
     pinMode( pin_Datchik_1, INPUT_PULLUP );  // Конфигурируем вывод 9 Arduino как вход  (pin9 датчик)
     pinMode( pin_Datchik_2, INPUT_PULLUP );  // Конфигурируем вывод 10 Arduino как вход  (pin10 датчик)
     

}    //void setup()



// void loop() – соответственно функция, которая выполняется постоянно, когда плата подключена к источнику питания 
                                          
void loop()
    {       

// Считываем показания датчиков

     Datchik_1_current = digitalRead(pin_Datchik_1);   //  Считываем актуальное показание Датчика1 
     if (Datchik_1_current != Datchik_1_pred)          //  Сравниваем новое и старое показания
          {
            D_1 = LOW;         // Датчик1 - сработал 
          }
     else
          {
            D_1 = HIGH;       // Датчик1 - не сработал 
          }
     
     Datchik_2_current = digitalRead(pin_Datchik_2);   //  Считываем актуальное показание Датчика2 
     if (Datchik_2_current != Datchik_2_pred)          //  Сравниваем новое и старое показания
          {
            D_2 = LOW;       // Датчик2 - не сработал
          }
     else
          {
            D_2 = HIGH;      // Датчик2 - сработал
          }
     
    Datchik_3_current = digitalRead(pin_Datchik_3);   //  Считываем актуальное показание Датчика3
    if (Datchik_3_current != Datchik_3_pred)
             {
               D_3 = LOW;       // Датчик3 - не сработал
             }
         else
             {
               D_3 = HIGH;      // Датчик3 - сработал
             }
  
  // Условие1 при первом включении  
  //       
      if ( D_1 == LOW && D_2 == LOW && prov == HIGH )            
           {   
                 // Устанавливаем движение вала в обратном направлении:  
                digitalWrite( pin_ENA, 0 );            // Разрешаем работу двигателя.
                delayMicroseconds(5);                  // Выполняем задержку t1 (5мкс)  
                digitalWrite( pin_DIR, 1 );            // Указываем валу вижение в обратном направлении
                delayMicroseconds(5);                  // Выполняем задержку t2 (5мкс)
                
                // Вал движетсяв обратную сторону пока не сработает емкостной датчик 2
                for(int i=0; i<10 ; i++)
                   {              // Выполняем 100 проходов цикла (1 оборот = 400 тактов).
                     digitalWrite( pin_PUL, 1 );            // Устанавливаем на выводе PUL состояние логической «1».
                     delayMicroseconds(1);                  // Выполняем задержку t3.
                     digitalWrite( pin_PUL, 0 );            // Устанавливаем на выводе PUL состояние логического «0».
                     delayMicroseconds(1);                  // Выполняем задержку t4.
                     Datchik_2_current = digitalRead(pin_Datchik_2);   //  Считываем актуальное показание Датчика2 
                     
                     if (Datchik_2_current == Datchik_2_pred)    //  Сравниваем новое и старое показания
                        {
                          D_2 = HIGH;            // Флаг сработки Датчика2
                          prov = LOW;             // Сбрсываем флаг первой проверки положения каретки
                          
                          break;                    // Оператор break позволяет выйти из цикла
                        }
                    } 
              }


   // Условие2 при первом включении

       if ( D_1 == HIGH && D_2 == LOW && prov == HIGH )            
           {   
                 // Устанавливаем движение вала в обратном направлении:  
                digitalWrite( pin_ENA, 0 );            // Разрешаем работу двигателя.
                delayMicroseconds(5);                  // Выполняем задержку t1 (5мкс)  
                digitalWrite( pin_DIR, 1 );            // Указываем валу вижение в обратном направлении
                delayMicroseconds(5);                  // Выполняем задержку t2 (5мкс)
                
                // Вал движетсяв обратную сторону пока не сработает емкостной датчик 2
                for(int i=0; i<10 ; i++)
                   {              // Выполняем 100 проходов цикла (1 оборот = 400 тактов).
                     digitalWrite( pin_PUL, 1 );            // Устанавливаем на выводе PUL состояние логической «1».
                     delayMicroseconds(1);                  // Выполняем задержку t3.
                     digitalWrite( pin_PUL, 0 );            // Устанавливаем на выводе PUL состояние логического «0».
                     delayMicroseconds(1);                  // Выполняем задержку t4.
                     Datchik_2_current = digitalRead(pin_Datchik_2);   //  Считываем актуальное показание Датчика2 
                     
                     if (Datchik_2_current == Datchik_2_pred)    //  Сравниваем новое и старое показания
                        {
                          D_2 = HIGH;           // Датчика2  сработал
                          prov = LOW;             // Сбрсываем флаг первой проверки положения каретки
                          D_1 = LOW; 
                          
                          break;                    // Оператор break позволяет выйти из цикла
                        }
                    } 
             }
 
 // Условие3 при первом включении
 
        if ( D_2 == HIGH && prov == HIGH )            
            {   
             prov = LOW;             // Сбрсываем флаг первой проверки положения каретки
            } 

// Если Условие1 и Условие2 не сработали и каретка находится в начале (Датчик 2 сработал)- прямое движение каретки по Датчику3

         if (D_3 == LOW && D_2 == HIGH && dvig == HIGH && prov == LOW )          //  Сравниваем новое и старое показания
                  {
                    // Начинаем движение каретки вперёд
            
                    // Устанавливаем движение вала в обратном направлении:  
                    digitalWrite( pin_ENA, 0 );            // Разрешаем работу двигателя.
                    delayMicroseconds(5);                  // Выполняем задержку t1 (5мкс).  
                    digitalWrite( pin_DIR, 0 );            // Указываем валу вижение в прямом направлении
                    delayMicroseconds(5);                  // Выполняем задержку t2 (5мкс).
                    // Вал движется в прямом направлении пока не сработает емкостной Датчик1
                    for (int i=0; i<100 ; i++)
                       {              
                         digitalWrite( pin_PUL, 1 );            // Устанавливаем на выводе PUL состояние логической «1».
                         delayMicroseconds(1);                  // Выполняем задержку t3.
                         digitalWrite( pin_PUL, 0 );            // Устанавливаем на выводе PUL состояние логического «0».
                         delayMicroseconds(1);                  // Выполняем задержку t4.

                         //Datchik_1_current = digitalRead(pin_Datchik_1);   //  Считываем актуальное показание Датчика2 
                     
                         //if (Datchik_1_current == Datchik_1_pred)    //  Сравниваем новое и старое показания
                       }
                  } 
          
 
}       // void loop()
         

Вот в первых же строчках сразу проблемы с логикой

Из того, что показания датчика изменились, совсем не следует, что он LOW. Он может быть и HIGH.

Это как из того, что вам изменили зарплату, еще не следует, что ее повысили :slight_smile: Могли и понизить…

Что касается датчика3 - смотрим самый последний блок, начиная со строки 159.
В комментарии написано. что это “движение по датчику3”, а в самом коде никакого датчика3 нет.

В целом, я наблюдая в новом коде ровно такие же проблемы, как в старом - вы оперируете показаниями датчиков, не обновляя их.
Мне кажется, в этом коде переменные D_2 D_1 D_3 скорее запутывают код, чем помогают. Вы их используете, насколько я вижу, вместо сигналов датчиков, забывая о том, что эти переменные не отражают состояние соответствующего физического датчика сами по себе..

А где вы обновляете предыдущие значения датчиков?

Да и зачем они нужны. У вас датчики активны , когда на них низки уровень.
Вот и проверяйте

if(!Datchik_1_current)
 {
            D_1 = LOW;         // Датчик1 - сработал 
          }
     else
          {
            D_1 = HIGH;       // Датчик1 - не сработал 
          }

81 строка опрашивает Датчик3, я переносли этот блок перед 159 результат тот же. Сейчас когда срабатывает Датчик3 код после 159 начинает выполняться . Датчик3 опритеский я иметирую сработку поднося руку. Как только руку поднесу двигатель вращается в прямом направлении. Стоит убрать руку двигатель сразу же останавливается… Не пойму почему цикл (170 строка) внутри не исполняется…

Слушайте, у меня такое чувство, что вы вообще код не понимаете.
Какой смысл в опросе датчика в строке 81, если потом это значение никак в блоке не используется? Не говоря уж о том, что опрашиваете вы датчик неправильно.

Или вот тут - комментарий абсолютно не соответствует коду. Написано, что цикл выполняется пока не сработает датчик, а на самом деле в цикле датчик никак не проверяется и мотор будет крутиться 100 шагов ВСЕГДА. Независимо от того, уперся он в упор или нет.
Был бы у вас мотор посильнее давно бы свернул всю установку.

Я вот смотрю @MMM посоветовал как исправить ошибку со сравнением на изменение состояния датчика. И ТС успешно провалил вполне хороший совет ))) Ему даже сейчас @Дим-мычъ намекнул, что если ты сравниваешь с предыдущим состоянием, то не плохо было бы его (это самое состояние) сохранять. Но не суть.

Мне вот что интересно - а датчики то у ТС какие? Ну вот что это? Если просто “концевики”, то незачем запутывать себе голову - у них однозначно определены состояния - либо HIGH когда не сработали и LOW когда сработал, либо наоборот - LOW когда не сработал и HIGH когда сработал (это зависит только от того куда притянуть).

А вот если “датчики” какие-то “хитрые” - тогда да, нужно уже заморачиваться с состояниями и тп, но только делать это правильно…

Так какие “датчики” то?

Да можно вообще не проверять, а сразу присваивать

 D_1 =  Datchik_1_current;

Код будет проще, может и понять его будет легче