Ещё раз спрошу, какова конечная цель задачи, при включении понять положение или встать в ноль и принять нужное положение?
во втором случае холл с магнитом, дёшево и сердито.
Но как говорится хозяин…
Цель: при включении определить фактическое положение заслонок, если положение заслонки отличается от исходного, тогда встать в ноль (стартовое положение).
Не особо хочется монтировать элементы внутри короба воздуховода, т.к. эта система будет практически необслуживаемая.
Почитал, для AS5600 нужно практически идеальное центрирование, отклонение от оси не более 1 мм.
Увы, такую точность будет сложно обеспечить, жаль но вариант с применением AS5600 не подойдет.
Чем концевики то не не устроили?
У меня на тестовой конструкции магнит жутко перекашивало.
Ничего, работало. Советую поставить эксперимент.
Для AS560 нужен магнит с вертикальной полярностью, а так же идеальные условия по соосности. Это все позволяет добиться распечатка корпуса на 3D принтере.
Очень странная цель. Напоминает анекдот про кипячение чайника:
…
- А если у нас уже есть чайник полный воды?
- Тогда вылить воду и таким образом свести задачу к предыдущей.
Определение фактического положения - задача гораздо более сложная, чем установка в начальное положение. Так зачем решать более сложную задачу, если основная цель - решить намного более простую: чтобы установить шаговик в начальное положение, совершенно не обязательно узнавать исходное.
А если перед каждым вращением вычислять - в скольких шагах двигатель будет от начального положения, запоминать в EEPROM и затем вращать. В случае перезагрузки МК стать в нулевое положение и отсчитать записанное количество шагов.
Вал может быть покручен руками или заклинить, еепром - сбойнуть.
Все эти способы позиционирования без обратной связи не особо надежны
Зачем записывать? При включении отойти в нулевую позицию, считая при этом шаги, а потом вернуться назад. Попутно можно скорректировать положение, если шагов будет не верное число ))
Мы движемся от общего к частному - корректируем формулировки)
Вы абсолютно правы, нет цели определения фактического положения заслонки (например заслонка находится в положении 0, 15 или 23гр). Достаточно двух состояний:
- Заслонка в нулевом положении (концевик активирован)
- Заслонка вне нулевого положения (концевик НЕ активирован)
Делаем опрос состояний, при необходимости доводим заслонку в нулевое положение.
Как сделать возврат заслонки - в процессе решения.
Для полноты картины и понимания задачи, опишу механизм и принцип его работы (хотел создать отдельную тему, ну значит тут).
На кухне есть два типа вентиляции: естественная (приточка) и принудительная (вытяжка над плитой).
Система состоит из двух клапанов: один на естественную, другой на принудительную. По умолчанию активирована естественная, принудительная закрыта. Когда включаем вытяжку у плиты (принудительная вентиляция) клапан принудительной открывается, а клапан естественной закрывается (чтобы запахи не шли в помещении кухни).
Открытие и закрытие клапана (угол ~85 гр) происходит за счёт шаговика (допустим 35 шагов).
Конечно можно прописать в коде, что открытие и закрытие 35 туда, столько же обратно.
Но нужно предусмотреть защиту, т.к. в случае ошибки или отключения питания, заслонки будут установлены в положения, не соответствующее нулевому положению, в результате чего при выполнения кода, заслонка провернётся больше ~85 гр (допустим начнет вращение с 20 гр; 85+20=105 гр, но те же 35 шагов по коду), что приведет к поломке заслонки клапана. Поэтому перед запуском кода, необходимо выполнить калибровку (проверку положения заслонки в нулевом положении).
Ниже привожу алгоритм работы устройства, в котором прописаны базовые принципы, но но сам алгоритм в процессе доработки.
Спасибо всем огромное за помощь и отзывы, очень благодарен. Буду рад любым советам.
Проще при подаче питания сразу калибровать и выходить в позицию по умолчанию.
Учтено!
loop будет приостановлен на время вращения. Разве что задавать количество шагов перед вращением, в каждом цикле loop поворачивать на один шаг и уменьшать счетчик.
В интернете попалась хорошая статейка в которой описывается разработка привода для жалюзи с применением шаговых двигателей и концевика. Задача один в один моя, только управление шаговиком выполняется напрямую без библиотеки.
Код подредактировал на основе двух вариантов, проверил - всё работает как надо.
Код калибровки (Остановка мотора при касании концевика)
const int buttonPin0 = 14; //14 контакт он же А0 - Концевик
const int buttonPin1 = 15; //15 контакт он же А1 - Запускает вращение мотора 1 вправо
int buttonState0 = 0;
int buttonState1 = 0;
int i1 = 0;
int t1 = 4; //Настройка скорости вращения (задержка между переключениями фаз)
void setup() {
//4, 5, 6, 7 контакты для 1 двигателя
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
// контакты для кнопок
pinMode(14, INPUT_PULLUP); //А0
pinMode(15, INPUT_PULLUP); //А1
}
void StopSensor() { //функция для выхода из цикла при срабатывании Концевика
buttonState0 = digitalRead(buttonPin0);
if (buttonState0 == HIGH) {
i1--;
}
}
void vpravo1() {
digitalWrite(7, HIGH); digitalWrite(5, LOW); delay(t1);
digitalWrite(6, HIGH); digitalWrite(4, LOW); delay(t1);
digitalWrite(5, HIGH); digitalWrite(7, LOW); delay(t1);
digitalWrite(4, HIGH); digitalWrite(6, LOW); delay(t1);
}
void stopPins() {
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, LOW);
}
void loop() {
buttonState1 = digitalRead(buttonPin1);
if (buttonState1 == LOW) {
while (i1 < 1) { //цикл для вращения мотора 1 вправо
vpravo1();
i1++;
StopSensor();
} i1 = 0; stopPins();
}
}
датчик угла поворота, к примеру такой решит твою проблему
Это должно было быть в первом посте, сразу бы получили ответ про два концевика. Вам ведь нужно от заслонок или открыта, или закрыта. Промежуточные положения вас не волнуют. А программа элементарная - " вращать до концевика в ту или иную сторону в зависимости от того, вкл. или выкл. вытяжка". И даже если произошел сбой по питанию в промежуточном положении, при повторной подаче программа выполнится правильно.
Задачу оптимизировал, оставив один концевик для контроля нулевого положения.
Это не оптимизация, а глупость. Считать шаги, углы и т. д. А если подклинило, пропустило 5-10 шагов? С концевиками просто шуруй до упора, если уперлось выключай.