Шаговый двигатель 28BYJ-48 (точка отсчёта)

Ещё раз спрошу, какова конечная цель задачи, при включении понять положение или встать в ноль и принять нужное положение?
во втором случае холл с магнитом, дёшево и сердито.
Но как говорится хозяин…

Цель: при включении определить фактическое положение заслонок, если положение заслонки отличается от исходного, тогда встать в ноль (стартовое положение).

Не особо хочется монтировать элементы внутри короба воздуховода, т.к. эта система будет практически необслуживаемая.

Почитал, для AS5600 нужно практически идеальное центрирование, отклонение от оси не более 1 мм.
Увы, такую точность будет сложно обеспечить, жаль но вариант с применением AS5600 не подойдет.

Чем концевики то не не устроили?

Сейчас уже устроило, потому что на данный момент это самый актуальный и надежный вариант.

Спойлер

У меня на тестовой конструкции магнит жутко перекашивало.
Ничего, работало. Советую поставить эксперимент.

Для AS560 нужен магнит с вертикальной полярностью, а так же идеальные условия по соосности. Это все позволяет добиться распечатка корпуса на 3D принтере.

Очень странная цель. Напоминает анекдот про кипячение чайника:

  • А если у нас уже есть чайник полный воды?
  • Тогда вылить воду и таким образом свести задачу к предыдущей.

Определение фактического положения - задача гораздо более сложная, чем установка в начальное положение. Так зачем решать более сложную задачу, если основная цель - решить намного более простую: чтобы установить шаговик в начальное положение, совершенно не обязательно узнавать исходное.

2 лайка

А если перед каждым вращением вычислять - в скольких шагах двигатель будет от начального положения, запоминать в EEPROM и затем вращать. В случае перезагрузки МК стать в нулевое положение и отсчитать записанное количество шагов.

1 лайк

Вал может быть покручен руками или заклинить, еепром - сбойнуть.

Все эти способы позиционирования без обратной связи не особо надежны

1 лайк

Зачем записывать? При включении отойти в нулевую позицию, считая при этом шаги, а потом вернуться назад. Попутно можно скорректировать положение, если шагов будет не верное число ))

2 лайка

Мы движемся от общего к частному - корректируем формулировки)

Вы абсолютно правы, нет цели определения фактического положения заслонки (например заслонка находится в положении 0, 15 или 23гр). Достаточно двух состояний:

  1. Заслонка в нулевом положении (концевик активирован)
  2. Заслонка вне нулевого положения (концевик НЕ активирован)

Делаем опрос состояний, при необходимости доводим заслонку в нулевое положение.

Спойлер

Как сделать возврат заслонки - в процессе решения.

Для полноты картины и понимания задачи, опишу механизм и принцип его работы (хотел создать отдельную тему, ну значит тут).

На кухне есть два типа вентиляции: естественная (приточка) и принудительная (вытяжка над плитой).
Система состоит из двух клапанов: один на естественную, другой на принудительную. По умолчанию активирована естественная, принудительная закрыта. Когда включаем вытяжку у плиты (принудительная вентиляция) клапан принудительной открывается, а клапан естественной закрывается (чтобы запахи не шли в помещении кухни).
Открытие и закрытие клапана (угол ~85 гр) происходит за счёт шаговика (допустим 35 шагов).
Конечно можно прописать в коде, что открытие и закрытие 35 туда, столько же обратно.
Но нужно предусмотреть защиту, т.к. в случае ошибки или отключения питания, заслонки будут установлены в положения, не соответствующее нулевому положению, в результате чего при выполнения кода, заслонка провернётся больше ~85 гр (допустим начнет вращение с 20 гр; 85+20=105 гр, но те же 35 шагов по коду), что приведет к поломке заслонки клапана. Поэтому перед запуском кода, необходимо выполнить калибровку (проверку положения заслонки в нулевом положении).

Ниже привожу алгоритм работы устройства, в котором прописаны базовые принципы, но но сам алгоритм в процессе доработки.

Наброски алгоритма

Спасибо всем огромное за помощь и отзывы, очень благодарен. Буду рад любым советам.

Проще при подаче питания сразу калибровать и выходить в позицию по умолчанию.

1 лайк

Учтено!

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();
  }
}

датчик угла поворота, к примеру такой решит твою проблему

1 лайк

Это должно было быть в первом посте, сразу бы получили ответ про два концевика. Вам ведь нужно от заслонок или открыта, или закрыта. Промежуточные положения вас не волнуют. А программа элементарная - " вращать до концевика в ту или иную сторону в зависимости от того, вкл. или выкл. вытяжка". И даже если произошел сбой по питанию в промежуточном положении, при повторной подаче программа выполнится правильно.

1 лайк

Задачу оптимизировал, оставив один концевик для контроля нулевого положения.

Это не оптимизация, а глупость. Считать шаги, углы и т. д. А если подклинило, пропустило 5-10 шагов? С концевиками просто шуруй до упора, если уперлось выключай.