Управление шаговым двигателем с помощью дисплея Nextion, работает на дисплее, но не запускает двигатели

Я использую 2 шаговых двигателя StepperOnline NEMA 23, которые должны двигаться одновременно. Я использую драйвер StepperOnline DM542 и оптические датчики Arduino Mega rev3 и 4 в качестве конечных/домашних остановок. Драйверы двигателей имеют собственную сеть 24 В постоянного тока. Питание 5 В для двигателей и оптических датчиков является общим. Arduino и Nextion питаются и заземляются от одного и того же источника питания 5 В

Дип-переключатели драйвера находятся в положении ON<ON<OFF для 2,84A ON для полного тока, последние 4 все OFF для 200 шагов

В первом наброске кода (корректировки и уточнения позже, после того, как он станет функциональным), показанный ниже, функции работают просто отлично, по крайней мере, в том, что касается дисплея Nextion. Кнопки делают то, что должны, но

  • Либо нажатия кнопок на дисплее Nextion не посылают сигнал драйверам двигателей, что, как мне кажется, не так, поскольку значения на дисплее обновляются, либо
  • Он подключен неправильно, я не думаю, что это так, все контакты Arduino подключены правильно, все питание и заземление в порядке. Драйверы, дисплей и Arduino получают правильное питание. или
  • Скорее всего, код неверный

Схема Arduino устроена следующим образом

ArduinoPin        Component        
2  ------->  end  stops 1 optical sensor for motor 1    
3  ------->  end  stops 2 optical sensor for motor 2
4  ------->  home stops 1 optical sensor for motor 1     
5  ------->  home stops 2 optical sensor for motor 2
8  ------->  Dir- motor 1
9  ------->  Pul- motor 1
10 ------->  Dir- motor 2
11  -------> Pul- motor 2
Dir+ and Pul+ are all connected to 5V
16-TX2  -------> RX Nextion display
17-RX2  -------> TX Nextion display

Вот результат отладки;

Вот скетч и мои извинения, он длинный. Приветствуется любой вклад.

//Библиотеки
#include "Nextion.h"   //используя версию библиотеки 0.9.0, пробовал также самую стабильную версию 0.7, не помогло
                      //работает либо
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#include <SoftwareSerial.h>

// раскомментируйте, чтобы включить отладку
#define DEBUG           // базовая отладка

#if defined DEBUG 
    #define DBG_PRINT(x)      Serial.print(x)
    #define DBG_PRINTDEC(x)   Serial.print(x, DEC)
    #define DBG_PRINTLN(x)    Serial.println(x)
#endif
    

//Определения контактов
#define endStop1Pin 2
#define endStop2Pin 3
#define homeStop1Pin 4
#define homeStop2Pin 5

//Объявление переменных
bool stateMotor=0;  //0: ВЫКЛ. / 1: ВКЛ.
bool dir=0;         //0: по часовой стрелке /1: против часовой стрелки
unsigned long speedM=1000;  //текущая скорость (импульс времени)
unsigned long speedFast=500; //быстрая скорость (время пульсирует)
unsigned long speedMed=1000; //средняя скорость (временной пульс нас)
unsigned long speedSlow=2000; //медленная скорость (время пульсирует нас)
float rpm=75;            //текущие обороты
uint16_t rpmMin=75;     //rmp для медленной скорости
uint16_t rpmMax=300;   //rmp для быстрой скорости

long steps=0;        //сколько шагов сделал мотор
long distance=0;     //пройденное расстояние в мм
long distanceStep=1; //расстояние, пройденное за каждый шаг в мм

bool stateSensor1=0;  //состояние оптического датчика 1--> 0: нет обнаружения / 1: обнаружение
bool stateSensor2=0;  //состояние оптического датчика 2
bool stateSensor3=0;  //состояние оптического датчика 3
bool stateSensor4=0;  //состояние оптического датчика 4

unsigned long timeSend=0; //время отправки данных на тачскрин

// Шаги двигателя за оборот. Большинство степперов имеют 200 шагов или 1,8 градуса на шаг.
#define MOTOR_STEPS_REV 200
// Двигатель 1
#define DIR_M1 8   
#define STEP_M1 9
// Двигатель 2
#define DIR_M2 10   
#define STEP_M2 11

//====Следующий дисплей=====
// Объявить числовой объект [идентификатор страницы: 0, идентификатор компонента: 1, имя компонента: "n0"]
NexButton b0 = NexButton(0,1, "b0"); 
NexButton b1 = NexButton(0,2, "b1"); 
NexButton b2 = NexButton(0,3, "b2");
NexButton b3 = NexButton(0,4, "b3");
NexButton b4 = NexButton(0,5, "b4");
NexButton b5 = NexButton(0,6, "b5");
NexButton b6 = NexButton(0,7, "b6");
NexButton b7 = NexButton(0,8, "b7");
NexButton b8 = NexButton(0,9, "b8");
NexNumber n0 = NexNumber(0,10, "n0");
NexNumber n1 = NexNumber(0,11, "n1");

NexPage page0 = NexPage(0, 0, "page0");


NexTouch *nex_listen_list[] = 
{
    &b0,
    &b1,
    &b2,
    &b3,
    &b4,
    &b5,
    &b6,
    &b7,
    &b8,
    &n0,
    &n1,
    &page0,
    NULL
};

void sendCommand2(){
    nexSerial.write(0xff);
    nexSerial.write(0xff);
    nexSerial.write(0xff);
    
}

void b0PopCallback(void *ptr)  
{
    
    DBG_PRINTLN("Zero");

    steps=0;
    rpm=75;
    speedM=speedSlow;

    n0.setValue(steps);
    n1.setValue(0);


}

void b1PopCallback(void *ptr)  
{
   
  DBG_PRINTLN("Fwd release"); 

  stateMotor=0; 
  DBG_PRINT("StateMotor="); DBG_PRINTLN(stateMotor);

  calculatingDistance();

  
}


void b1PushCallback(void *ptr)  
{
   
  DBG_PRINTLN("Fwd Push"); 

  stateMotor=1; 
  DBG_PRINT("StateMotor="); DBG_PRINTLN(stateMotor);
  dir=1;

  digitalWrite(DIR_M1, HIGH);
  digitalWrite(DIR_M2, HIGH);

  n1.setValue(rpm);


}

void b2PopCallback(void *ptr)  
{
   
  DBG_PRINTLN("Rev release");   

  stateMotor=0;

  calculatingDistance();

}

void b2PushCallback(void *ptr)  
{
   
  DBG_PRINTLN("Rev push");   

  stateMotor=1;
  dir=0;

  digitalWrite(DIR_M1, LOW);
  digitalWrite(DIR_M2, LOW);

  n1.setValue(rpm);


}

void b3PopCallback(void *ptr)  
{
   
  DBG_PRINTLN("Slow"); 

  speedM=speedSlow;

  calculatingRPM(); 

}

void b4PopCallback(void *ptr)  
{
   
  DBG_PRINTLN("Med");  

  speedM=speedMed; 

  calculatingRPM();

}

void b5PopCallback(void *ptr)  
{
   
  DBG_PRINTLN("Fast"); 

  speedM=speedFast;  

  calculatingRPM();

}

void b6PopCallback(void *ptr)  
{
   
  DBG_PRINTLN("Park");   

  goHome();

}

void b7PopCallback(void *ptr)  
{
   
  DBG_PRINTLN("Up arrow");  

  if(rpm<rpmMax) rpm+=10;

  calculatingSpeedM(); 

}

void b8PopCallback(void *ptr)  
{
   
  DBG_PRINTLN("Down arrow");   

  if(rpm>rpmMin) rpm-=10;

  calculatingSpeedM();

}

void setup() {
    Serial.begin(9600); //инициализируем последовательную передачу на скорости 9600 бод

  //пины как вход
  pinMode(endStop1Pin,INPUT);
  pinMode(endStop2Pin,INPUT);
  pinMode(homeStop1Pin,INPUT);
  pinMode(homeStop2Pin,INPUT);
 
  //пины на выходе
  pinMode(DIR_M1, OUTPUT);
  pinMode(DIR_M2, OUTPUT);
  pinMode(STEP_M1, OUTPUT);
  pinMode(STEP_M2, OUTPUT);

// инициализируем экран Nextion
      Serial2.begin(9600); //инициализируем передачу по последовательному порту 2 на скорости 9600 бод
      nexSerial.begin(9600);
      nexInit();

      b0.attachPop(b0PopCallback);
      b1.attachPop(b1PopCallback);
      b2.attachPop(b2PopCallback);
      b3.attachPop(b3PopCallback);
      b4.attachPop(b4PopCallback);
      b5.attachPop(b5PopCallback);
      b6.attachPop(b6PopCallback);
      b7.attachPop(b7PopCallback);
      b8.attachPop(b8PopCallback);
     
      b1.attachPush(b1PushCallback);
      b2.attachPush(b2PushCallback);

      page0.show();

//Инициализируем двигатели драйвера
      digitalWrite(DIR_M1,LOW);
      digitalWrite(DIR_M2,LOW);
      digitalWrite(STEP_M1,LOW);
      digitalWrite(STEP_M2,LOW);
  

}

void loop() {
  
   nexLoop(nex_listen_list);

   if(stateMotor==1){
       controlMotor();
   }

   readSensors();
}

void readSensors(){
    stateSensor1=digitalRead(endStop1Pin);
    stateSensor2=digitalRead(endStop2Pin);
    stateSensor3=digitalRead(homeStop1Pin);
    stateSensor4=digitalRead(homeStop2Pin);
  
  if(stateMotor==1){
    if(stateSensor1==1 || stateSensor2==1 || stateSensor3==1 || stateSensor4==1){
      stateMotor=0;  //отключаем моторы
      DBG_PRINTLN("cut off the motors");
    }
  }
}

void controlMotor(){
   digitalWrite(STEP_M1,HIGH);
   digitalWrite(STEP_M2,HIGH);

   delayMicroseconds(speedM);

   digitalWrite(STEP_M1,LOW);
   digitalWrite(STEP_M2,LOW);

   delayMicroseconds(speedM);

   if(dir==1){  //CW
     steps++;
   }
   else if(dir==0 && steps>0){  // против часовой стрелки
     steps--;
   }

 /* if(millis()-timeSend>100){ 
     calculatingDistance();
     timeSend=millis();
  }*/

}

void goHome(){
   dir=0;
   digitalWrite(DIR_M1, LOW);
   digitalWrite(DIR_M2, LOW);

   while(steps>0){
      controlMotor();
      readSensors();

      if(stateSensor3==1 || stateSensor4==1) steps=0;
   }


      n0.setValue(steps);

}

void calculatingRPM(){
  
   float timeRevMin=MOTOR_STEPS_REV*2.0*speedM/(1000000.0*60.0);

   rpm=1.0/timeRevMin;

  // DBG_PRINT("timeRevMin="); DBG_PRINTLN (времяRevMin);

   DBG_PRINT("RPM="); DBG_PRINTLN(rpm);

   n1.setValue(rpm);


}

void calculatingSpeedM(){

  float timeRevMin=1.0/rpm;

  speedM=(timeRevMin*1000000.0*60.0) / (MOTOR_STEPS_REV*2.0);

  DBG_PRINT("speedM="); DBG_PRINTLN(speedM);

  n1.setValue(rpm);

}

void calculatingDistance(){
   
   distanceStep=steps;
  
    n0.setValue(distanceStep);

  // DBG_PRINT("Шаги="); DBG_PRINTLN(шаги);
}

, 👍-1

Обсуждение

напишите простой скетч, который получает сообщения Nexion и выводит их на консоль... убедитесь, что сообщения соответствуют вашим ожиданиям, @jsotola

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

пожалуйста, добавьте вопрос к своему сообщению ... сейчас мы не знаем, почему вы разместили это, @jsotola

Вопрос в посте и в заголовке: дисплей Nextion ПОЛУЧАЕТ ввод, потому что значения дисплея меняются, НО двигатели вообще не работают. Код отладки также показывает, что функции сенсорного экрана выполняются. Проблема заключается в том, что двигатели не получают сигнала для запуска или есть какая-то другая проблема, из-за которой они не работают. Я опубликую изображение вывода отладки. Единственная ошибка — recvRetCommandFinished, которая является ошибкой Nextion, но дисплей Nextion работает правильно., @dinotom

пожалуйста, не выкладывайте скриншоты текста... выкладывайте реальный текст, @jsotola

Ну, это не позволило мне скопировать и вставить его из окна вывода последовательного монитора., @dinotom

Вы тестировали двигатели, используя простейший код?, @jsotola

Да, моторы работают в простом скетче, @dinotom