Как контролировать состояние 50 цифровых входов
Добрый день.
У меня есть конкретный проект, и последние пару дней я провел в поисках на форуме, в блогах и т. д., но до сих пор не понимаю, возможно ли это сделать с Arduino или нет.
Мне нужно отслеживать состояние примерно 50 цифровых входов и запускать действие, когда любой из контактов изменяется с 0 на 1 или с 1 на 0, почти так же, как работает прерывание состояния контакта, с той лишь разницей, что я нужно «прослушать» ~50 контактов, а не пару. Я должен быть в состоянии определить, какой контакт вызвал действие и каково было изменение (0->1 или 1->0).
Моя первоначальная идея — использовать MEGA 2560 и иметь группу из 50 операторов «if» в основном цикле, сравнивающих предыдущее состояние или каждый вывод (хранящийся в отдельных переменных) с текущим и запуская соответствующее действие в случае чего. изменилось.
Мне хотелось бы услышать мнения экспертов, какой способ добиться этой цели будет более элегантным, умным/быстрым.
Я буду рад получить ваши отзывы.
Спасибо.
@Sergio, 👍0
Обсуждение3 ответа
Похоже, что Mega 2560 имеет 24 прерывания смены контактов (я не проверял, все ли они выведены на плату Mega Arduino).
Сочетание такого количества прерываний по смене контактов и «ручного» сканирования может быть быстрее, чем сканирование их всех по отдельности.
Другой вариант — сгруппировать как можно больше портов по одним и тем же портам и использовать прямой доступ к оборудованию для поиска изменений — при этом вы сможете выполнять 8 входов одновременно. При наличии 8 входов на каждом порту вам просто нужно провести семь основных проверок того, изменилось ли значение порта, а затем перейти к обработчику, который определяет, какой конкретный вывод изменился и какое действие необходимо.
См. ответы в Хорошее решение для большего количества прерываний на Arduino. . Например:
Ответ lhballoti:
Вы можете использовать расширитель ввода-вывода, например MCP23008 и MCP23017. Они доступны в SPI и I2c. Прерывания могут быть настроены (чувствительные к фронту, чувствительные к уровню) для каждого входа.
Ответ Embedded.kyle:
Вы можете использовать программируемый контроллер прерываний (PIC), например 82C59A. Он будет каскадным, если вам понадобится больше восьми прерываний, которые он предоставляет. Это немного старомодно, но я думаю, что оно удовлетворит все ваши требования.
У меня был проект, в котором использовалось 16 поворотных энкодеров, и я использовал MUX Shield, который использует аналоговые мультиплексоры 74HC4067. Они портируются на A0–A3 на щите, и это нормально, поскольку вы можете настроить эти контакты на цифровые входы, иначе вы можете получить версию коммутационного модуля и подключиться к любым входным контактам. Я также использовал Due, поскольку ВСЕ контакты могут быть разрешены по прерыванию. Чтение было немного муторным, но сработало вот так... Метод заключается в следующем. Постоянно обращайтесь к каждому входу по очереди в цикле, иначе прерывание не будет обнаружено. Когда срабатывает прерывание, снова обратитесь к каждому входу по очереди, чтобы выяснить, какой вывод изменил состояние. Надеюсь, это поможет.
- Несколько кнопок на одном прерывании, как устранить дребезг?
- Как использовать attachInterrupt() в ATtiny85 с Arduino IDE?
- Невозможно установить низкий уровень на выводе MOSI даже после завершения SPI
- Почему мои прерывания mcp23s17 больше не работают?
- Проверить возможности PIN во время компиляции
- NodeMCU - Vin контакт как выход 5V?
- Использовать все контакты как цифровые входы/выходы
- Что такое ICSP pin (разъём)?
50 если? определите постоянный массив номеров контактов и цикл for над ним. и определите массив состояний, чтобы запомнить последнее состояние., @Juraj
Одной из альтернатив является использование сдвиговых регистров с параллельным входом и последовательным выходом, таких как 74HC165. Эти детали можно купить менее чем за 30 центов каждая на eBay или AliExpress., @ex-punctis
Расширители ввода-вывода, например pcf8574, имеют прерывание. Вам нужно будет только дождаться прерывания, а затем запросить через i2c, какой вывод изменился., @Jot