Помогите пожалуйста 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 блоке он стоит , а во втором за блоком?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();Попробуй убрать строку 06.