Шаговый двигатель и Serial.print
- Войдите на сайт для отправки комментариев
Пнд, 24/05/2021 - 18:31
У меня почему-то шаговый двигатель и Serial.print, работать вместе не хотят, а точнее когда есть Serial.print то двигатель не работает. Как это пофиксить?
Двигатель: 28BYJ-48.
Драйвер: ULN2003.
Библиотека: #include <CustomStepper.h>.
#include <math.h> #include <CustomStepper.h> #include "microDS3231.h" CustomStepper stepper(8, 9, 10, 11); MicroDS3231 rtc; DateTime NowDateTime; #define M_PI 3.14159265358979323846 int Day = 1, Date = 1, Month = 1, Year = 2021, Hour = 0, Minute = 0; float timezone = 3, dolgota = 23.89; float HRA = 1, HRA_old = 0, LST = 0, time_correction = 0, LSTM = 0, EoT = 0, B = 0; void setup() { Serial.begin(9600); stepper.setRPM(10); // Устанавливаем количество оборотов в минуту stepper.setSPR(4075.7728395); // Устанавливаем колочество шагов на полный оборот. Максимальное значение 4075.7728395 // put your setup code here, to run once: } void GetDateTime(){ int i = 0; NowDateTime = rtc.getTime(); Date = NowDateTime.date; Month = NowDateTime.month; Year = NowDateTime.year; Hour = NowDateTime.hour; Minute = NowDateTime.minute; if (Year % 4==0) i = 1; //если високосный год то прибавляем 1 switch (Month) { case 1: Day = Date; break; case 2: Day = 31 + Date; break; case 3: Day = 59 + Date + i; break; case 4: Day = 90 + Date + i; break; case 5: Day = 120 + Date + i; break; case 6: Day = 151 + Date + i; break; case 7: Day = 181 + Date + i; break; case 8: Day = 212 + Date + i; break; case 9: Day = 243 + Date + i; break; case 10: Day = 273 + Date + i; break; case 11: Day = 304 + Date + i; break; case 12: Day = 334 + Date + i; break; } Serial.println(); Serial.print(Day); Serial.print(" | "); Serial.print(Date); Serial.print("."); Serial.print(Month); Serial.print("."); Serial.print(Year); Serial.print(" "); Serial.print(Hour); Serial.print(":"); Serial.println(Minute); } void Deduction(){ GetDateTime(); HRA_old = HRA; B = 360.0 / 365.0 * (Date - 81) * M_PI / 180; EoT = 9.87 * sin(2 * B) - 7.53 * cos(B) - 1.5 * sin(B); LSTM = 15 * timezone; time_correction = EoT + 4 * (dolgota - LSTM); LST = Hour + time_correction / 60 + Minute / 60; HRA = 15 * LST; HRA = abs((int)round(HRA)); Serial.print("HRA = "); Serial.println(HRA); Serial.print("HRA_old = "); Serial.println(HRA_old); } void loop() { //delay(1000); if (stepper.isDone()) { stepper.setDirection(CCW); stepper.rotateDegrees(4); } stepper.run(); Deduction(); }Скачивал тут: https://robotchip.ru/obzor-28byj-48-s-drayverom-uln2003/
Что бы нормально работал шаговый двигатель необходимо, что бы stepper.run(); вызывался через равные промежутки времени.
Поэтому одним из простых решений будет вынести обработку движения шаговика в прерывание. НО тут сама библиотека должна быть нормально спроектирована, т.к. в прерываниях millis() и прочие временные функции не работают (и ещё куча ограничений).