Помогите пожалуйста 28BYJ-48 + UNL2003 + arduino uno
- Войдите на сайт для отправки комментариев
Пт, 29/06/2018 - 00:58
Здравствуйте, при программировании столкнулся с такой проблемой: На драйвере лампочка загорается если температура больше 30, а шаговик нивкакую не поворачивает. Если можете, то исправьте код, и да я полный нуб в этом деле
#include <OneWire.h> #include <CustomStepper.h> // Подключаем библиотеку CustomStepper CustomStepper stepper(2, 3, 4, 5); // Указываем пины, к которым подключен драйвер шагового двигателя boolean rotate1 = false; // Переменная для смены режимов boolean rotatedeg = false; // Переменная для смены режимов boolean crotate = false; // Переменная для смены режимов OneWire ds(10); // на пине 10 (нужен резистор 4.7 КОм) const uint8_t pinSensor = 8; // Определяем № вывода Arduino, к которому подключён датчик расхода воды uint32_t varPulse; // Объявляем переменную для хранения длительности импульсов с датчика uint8_t varResult; void setup(void) { stepper.setRPM(12); // Устанавливаем количество оборотов в минуту stepper.setSPR(4075); // Устанавливаем колочество шагов на полный оборот. Максимальное значение 4075.7728395 Serial.begin(9600); // Инициируем передачу данных в монитор последовательного порта pinMode(pinSensor, INPUT); pinMode (A0, INPUT); pinMode (A1, INPUT); } void loop(void) { int tmp; float celsius, fahrenheit, r, temperature; byte i; byte present = 0; byte type_s; byte data[12]; byte addr[8]; ds.reset(); // Начинаем взаимодействие со сброса всех предыдущих команд и параметров ds.write(0xCC); // Даем датчику DS18b20 команду пропустить поиск по адресу. В нашем случае только одно устрйоство ds.write(0x44); // Даем датчику DS18b20 команду измерить температуру. Само значение температуры мы еще не получаем - датчик его положит во внутреннюю память delay(1000); // Микросхема измеряет температуру, а мы ждем. ds.reset(); // Теперь готовимся получить значение измеренной температуры ds.write(0xCC); ds.write(0xBE); // Просим передать нам значение регистров со значением температуры // Получаем и считываем ответ data[0] = ds.read(); // Читаем младший байт значения температуры data[1] = ds.read(); // А теперь старший // Формируем итоговое значение: // - сперва "склеиваем" значение, // - затем умножаем его на коэффициент, соответсвующий разрешающей способности (для 12 бит по умолчанию - это 0,0625) float temp = ((data[1] << 8) | data[0]) * 0.0625; // Выводим полученное значение температуры в монитор порта Serial.println((String) "Температура прибора = "+temp+" градусов по Цельсию "); if (temp>30){ Serial.println((String) "Температура предельно высока: "+temp+" градусов по Цельсию "); // ========================================================================================= if (stepper.isDone() && rotate1 == false) { stepper.setDirection(CCW); // Устанавливает направление вращения (по часовой) stepper.rotateDegrees(290); // Устанавливает вращение на заданное количество оборотов rotate1 = true; stepper.run(); } if (stepper.isDone() && rotate1 == true && rotatedeg == false && temp>30) { stepper.setDirection(CW); // Устанавливает направление вращения (против часовой) stepper.rotateDegrees(290); // Поворачивает вал на заданное кол-во градусов rotatedeg = true; } stepper.run(); // Этот метод обязателен в блоке loop. Он инициирует работу двигателя, когда это необходимо } rotate1 = false; rotatedeg = false; crotate = false; #define R0 ((float)10000) #define B ((float)3435) tmp = analogRead (A0); Serial.print ("Входная температура = "); Serial.println (tmp); r = ((1023.0*R0)/(float)tmp)-R0; temperature = B/log(r/0.09919) - 273.15; // log is ln in this case Serial.print ("T = "); Serial.print (temperature); Serial.println (", C"); delay (1000); tmp = analogRead (A1); Serial.print ("Выходная температура = "); Serial.println (tmp); r = ((1023.0*R0)/(float)tmp)-R0; temperature = B/log(r/0.09919) - 273.15; // log is ln in this case Serial.print ("T 2 = "); Serial.print (temperature); Serial.println (", C"); delay (1000); // ========================================================================================= Serial.println( ); Serial.println(); varPulse=pulseIn(pinSensor, HIGH, 200000); // Считываем длительность импульса, но не дольше 0,2 сек if(varPulse){varResult=uint8_t(1000000/(15*varPulse));} // Если длительность импульса считана, то рассчитываем скорость потока воды: Q = 1000000/(15L) л/мин else {varResult=0;Serial.println ("Danger, the chip is not connect or water don't go");} // Если длительность импульса не считана, то считаем что скорость потока воды = 0 л/мин Serial.println((String) "CKOPOCTb = "+varResult+" L/MIN"); // ========================================================================================= }
Идея в том, чтобы заставить двигатель крутануться на несколько шагов при температуре большей 30
Я бы на Вашем месте, переписал вопрос. А то сейчас народ налетит, будет жарко.
Откуда все полезли именно с этим комплектом, однотипными задачами и одинаковыми переменными в скетче?
То есть при >30 градусов на драйвер команда идет, значит что то с драйвером или двигателем.
Спасибо за то, что отозвались.
Случилось такое, что двигатель отказывается крутиться вообще и лишь одна из 4-х лампочек горит. Пробовал вырезать код двигателя и запустить его отдельно - всё работает
Если постоянно горит светодиод - это означает, что драйвер не степает. Скорее всего run() вызвался только один раз. Стало быть ошибка в алгоритме.
Посмотрите внимательно код
stepper.run(); , в 1 блоке он стоит , а во втором за блоком?
Попробуй убрать строку 06.