Проблема с последовательностью воздушных поршней
Я новичок, пытаюсь последовательно активировать 2 комплекта из 3 воздушных поршней, просматривая руководства на YouTube... Помогите, пожалуйста, очень, пожалуйста?? :-)
Имеется 3 комплекта по 2 поршня, каждый из которых работает в противоположном направлении. Итак, у меня есть P1/P2, P3/P4 и P5/P6, каждый набор работает в оппозиции, последовательно сжимая центр – Начальное состояние при включении/сбросе должно быть:
// Шаг 1. Выполнить один раз:
P1 Down/P2 Up // Движение одновременно (соединение в центре) и УДЕРЖИВАНИЕ в положении -
P2 Up/P3 Down // Двигайтесь одновременно и УДЕРЖИВАЙТЕ -
P5 Up/P6 Down // Двигайтесь одновременно и УДЕРЖИВАЙТЕ -
// Дождаться кнопки Пуск -
Мне нужно запустить/остановить последовательность с помощью кнопки-переключателя - У меня есть герконовые датчики, которые дадут мне набор из двух ПЕРЕХОДНЫХ замыканий контактов для каждого поршня, перемещающегося в верхнее и нижнее положения -
После запуска последовательность должна быть следующей:
// Цикл, пока не будет нажата кнопка сброса -
// ШАГ 2: -
P1 Down/P2 Up (HOLD) // Старое начальное состояние, без изменений -
P3 Down/P4 Up (MOVE) // Поршень 3 перемещается вниз/Поршень 4 перемещается вверх и УДЕРЖИВАЕТ -
P5 Up/P6 Down (HOLD) // Все еще старое начальное состояние, без изменений -
// ПРОБЛЕМА: Датчики P3 Down И P4 дают мне только ПЕРЕХОДНОЕ замыкание: эти два переходных процесса ДОЛЖНЫ произойти, чтобы инициировать Шаг 3, но они не всегда точно синхронизированы вместе, поэтому моя первоначальная попытка последовательного соединения их не удалась.. .- // Мне нужно использовать этот набор замыканий контактов, чтобы запустить следующую команду: -
// Шаг 3: -
// Кратковременное замыкание датчиков P3 Down/P4 Up является триггером, необходимым для -
P5 Down/P6 Up (MOVE) // P5 перемещается Вниз/P6 перемещается Вверх и УДЕРЖИВАТЬ -
P1 Up/P2 Down (MOVE) // P1 перемещается вверх/P2 перемещается вниз и УДЕРЖИВАТЬ -
P3 Down/P4 Up (HOLD) // P3/P4 УДЕРЖИВАТЬ -
// Возврат к шагу 2, пока не будет нажата кнопка сброса -
Я могу прислать вам свою попытку кодирования для этого, но она не работает, если два датчика не закрываются одновременно, что происходит только в симуляции... АРХ.. :-(
Может кто-нибудь прислать мне кусок кода, который будет работать для этого, пожалуйста? Я был бы очень, очень признателен за это... Очень расстроен прямо сейчас! Вы можете написать мне по адресу [email protected] или написать/позвонить по номеру (XXX)XXX-XXXX. Спасибо в любом случае. Искренне, Майкл
PS: Я пытался подключить отдельный тумблер для каждого датчика, но у меня кончились контакты на моем Arduino UNO R3... Посмотрел на YouTube https://www.youtube.com/watch?v=cAT07gy4DII "Увеличьте количество цифровых выходов на Arduino (ЧАСТЬ 1 и 2)" но это намного сложнее... Пытаюсь сейчас разобраться с этим...
@Michael Buet, 👍1
Обсуждение1 ответ
это не работает, если два датчика не закрываются одновременно
Если я правильно понимаю, проблема в том, что когда ваш Arduino определяет второй переходный сигнал, первый больше не активен, и ваша программа не помнит, что она уже видела этот первый сигнал.
У вашего Arduino есть память. Тысячи битов памяти! Так что он может помнить
довольно много вещей. Решение вашей проблемы состоит в том, чтобы просто использовать
этой памяти. Когда вы обнаруживаете сигнал, который должен быть полезен для
будущее решение, примите к сведению, сохраните его в переменной. Для того, чтобы
переменная, которая будет запоминаться при вызовах функции, в которой вы ее установили,
он должен быть глобальным. Или, что еще лучше, static
local.
Вот как это могло бы выглядеть в коде:
// "Статическая" переменная — это переменная, которая запоминает свое состояние через
// вызовы функции. Глобальная переменная сделает то же самое, но
// код обычно понятнее, когда переменные определены близко к тому месту, где
// Они используются. "bool" (от "boolean") - это переменная, которая может только
// быть либо `true', либо `false'.
static bool P5_is_up, P6_is_down;
// Если датчик говорит нам, что поршень Р5 прошел до упора вверх, принимаем
// обратите внимание на факт и запомните его.
if (digitalRead(P5_up_sensor) == LOW)
P5_is_up = true;
// То же самое для опускания P6.
if (digitalRead(P6_down_sensor) == LOW)
P6_is_down = true;
// Если оба поршня закончили свой ход, мы можем перейти к следующему
// шаг. `&&' означает «и».
if (P5_is_up && P6_is_down)
goto_step_3();
Вам нужно будет сбросить эти переменные на false
в соответствующий момент.
время. Приведенный выше пример кода этого не показывает, поскольку он имеет дело только с
логика для принятия решения о том, когда пора начинать шаг 3.
Возможно, в конечном итоге вам придется использовать многие из этих переменных и множество повторяющийся код. Таким образом, вам нужно будет структурировать свою программу, чтобы избегать чрезмерного повторения. Но это не ваша непосредственная проблема. За Теперь попробуйте заставить логику работать для одношагового перехода. Как только вы правильно понять логику, вы можете беспокоиться об обобщении логики на любой переход.
- Несколько неблокирующих таймеров обратного отсчета?
- Использование значения MAX30100 SpO2 для включения светодиода
- (Код ультразвукового датчика: такого файла или каталога нет)
- Датчик HC-SR505 PIR выдает только HIGH уровень
- Отправка данных из ESP8266 в PHP
- Определение уровня заряда с помощью датчика тока (ACS758) с arduino uno
- Использование YS-IRTM с Arduino Uno
- Как объединить два разных скетча датчика в один полный скетч?
не ожидайте, что два датчика закроются одновременно... в реальной жизни этого не происходит... также, пожалуйста, просмотрите шаг 1... это не имеет смысла, @jsotola
Когда вы говорите «одновременно», что это означает в точности? до микросекунд? или миллисекунда? Без кода и диаграммы трудно комментировать, как его улучшить или решить вашу проблему. Все, о чем я мог думать прямо сейчас, это то, что 1) вам нужен конечный автомат для управления всеми состояниями и переходами, 2) чтобы убедиться, что все приводы работают вместе, вам, вероятно, потребуется прямой доступ к регистрам MCU для активации каждого pin, чем с помощью команд Arduino, таких как
digitalWrite()
., @hcheungпочему у вас есть отдельные сигналы для противоположных поршней?, @jsotola
Написание вашего адреса электронной почты и номера телефона открытым текстом на онлайн-сайте приводит к получению тонны спама и звонков роботов. При использовании этого сайта, пожалуйста, также используйте этот сайт для общения. Простые вопросы и ответы, @chrisl
Пожалуйста, включите свой код в вопрос., @chrisl