Всем привет. Новенький, прошу помочь с ШД и фоторезистором. Задача такая: при условии меньше 50 у фоторезистора, ШД должен сделать 5 оборотов один раз. Если значение больше у фоторезистора чем 50, ШД должен сделать 5 оборотов в обратном направлении (тоже один раз). Все работает, но не корректно. ШД делает N * 5 оборотов в любом направлении, без остановки он все время крутит. Что не правильно в цикле? Перепробовал разные не варианты, но увы (( Код (Text): /* Фоторезистор */ #include <Stepper.h> // include library #define STEPS_PER_MOTOR_REVOLUTION 40 //---( Steps per OUTPUT SHAFT of gear reduction )--- #define STEPS_PER_OUTPUT_REVOLUTION 32 * 64 //2048 Stepper small_stepper(STEPS_PER_MOTOR_REVOLUTION, 8, 10, 9, 11); int Steps2Take; byte Pin2 = 0; int SensorPin = A0; // unsigned int SensorValue = 0; boolean flag = false; byte way = 0; void setup() { pinMode(13,OUTPUT); Serial.begin(9600); // start serial output data; } void loop() { SensorValue = analogRead(SensorPin); // Schityvaem znachenie s fotoresistora Serial.print(SensorValue, DEC); Serial.println(""); if (SensorValue<50) { way = 1; flag = true; } else { way = 2; flag = false; } if ((way == 1) && (flag == true)) { Steps2Take = STEPS_PER_OUTPUT_REVOLUTION ; // Rotate CW 1 turn small_stepper.setSpeed(500); small_stepper.step(Steps2Take); delay(2000); flag = false; } if ((way == 2) && (flag == false)) { Steps2Take = - STEPS_PER_OUTPUT_REVOLUTION; // Rotate CCW 1 turn small_stepper.setSpeed(500); // 700 a good max speed?? small_stepper.step( Steps2Take); delay(2000); flag = true; } }
Так оно и должно работать описанным образом. На каждом вызове loop происходит следующее: проверяется сенсор, по значению сенсора осуществляется пять оборотов в соответствующую сторону. И так без конца. И непонятно зачем flag и way дублируют свои функции. Устанавливаются одновременно и проверяются после этого одновременно. Изменение flag в ветках if вообще не имеет смысла. Это значение просто не будет нигде использовано. Чтобы работало только один раз, надо, во-первых, завести переменную для старого значения сенсора (по особому начальному значению этой переменной (например, отрицательному) можно в частности проверить, что это первый запуск loop и обработать особым образом). В начале цикла считать сенсор и сравнить со старым значением. Если положение значения относительно границы 50 не изменилось (было меньше и осталось меньше, или было больше и осталось больше), не делать ничего. Если изменилось, выполнить вращение ШД в нужную сторону и сохранить новое значение сенсора в переменной для сохранения старого значения, чтобы уже с ним сравнивать показания на следующем запуске loop. И неплохо бы использовать какой-никакой гистерезис (например, крутить в одну сторону по >55, а в другую по <45, точные значения надо подобрать по уровню шума в показаниях сенсора и требованиям к порогу страбатывания). А то установится значение сенсора около 50 и будет немного плясать вокруг то чуть больше, то чуть меньше. А ШД будет в результате крутиться туда-сюда, пока значение не отойдет от пограничного достаточно, чтобы шумы не перебрасывали через границу.
Все получилось, спасибо Вам) Но появилась одна проблемка. ШД перегревается, к чему это? Даже когда он просто стоит, он греется. Как быть?
Если греется, значит, через обмотки течет слишком большой ток. По-моему так. Причем про ШД пишут, что эта зараза потребляет даже если стоит на месте (удерживает позицию?). Т.е. если греется от большого тока, то будет греться и при простое. Как быть, не знаю. Возможно, поможет снижение напряжения питания двигателя.