Управление шаговым двигателем с помощью дисплея 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(шаги);
}
@dinotom, 👍-1
Обсуждение0
- Что выбрать между датчиками температуры и влажности: AM230x или DHT22?
- Взаимодействие с датчиком SSI?
- ArduinoMEGA: 64 цифровых входа вызывают случайные значения digitalRead
- Изменение ШИМ на Arduino Mega, контакты 9 и 10 на 20–25 кГц
- Как запустить шаговый двигатель через последовательную связь
- Объединение кода для нескольких датчиков в одной программе
- Датчик PIR и сон (прерывание) на Mega2560
- Как подключить 2 датчика FSR к Arduino Mega?
напишите простой скетч, который получает сообщения Nexion и выводит их на консоль... убедитесь, что сообщения соответствуют вашим ожиданиям, @jsotola
почему вы не используете отладочный код? ... использовать отладочные сообщения, чтобы определить, как выполняется программа, @jsotola
пожалуйста, добавьте вопрос к своему сообщению ... сейчас мы не знаем, почему вы разместили это, @jsotola
Вопрос в посте и в заголовке: дисплей Nextion ПОЛУЧАЕТ ввод, потому что значения дисплея меняются, НО двигатели вообще не работают. Код отладки также показывает, что функции сенсорного экрана выполняются. Проблема заключается в том, что двигатели не получают сигнала для запуска или есть какая-то другая проблема, из-за которой они не работают. Я опубликую изображение вывода отладки. Единственная ошибка — recvRetCommandFinished, которая является ошибкой Nextion, но дисплей Nextion работает правильно., @dinotom
пожалуйста, не выкладывайте скриншоты текста... выкладывайте реальный текст, @jsotola
Ну, это не позволило мне скопировать и вставить его из окна вывода последовательного монитора., @dinotom
Вы тестировали двигатели, используя простейший код?, @jsotola
Да, моторы работают в простом скетче, @dinotom