Как контролировать состояние 50 цифровых входов

interrupt pins digital-in

Добрый день.

У меня есть конкретный проект, и последние пару дней я провел в поисках на форуме, в блогах и т. д., но до сих пор не понимаю, возможно ли это сделать с Arduino или нет.

Мне нужно отслеживать состояние примерно 50 цифровых входов и запускать действие, когда любой из контактов изменяется с 0 на 1 или с 1 на 0, почти так же, как работает прерывание состояния контакта, с той лишь разницей, что я нужно «прослушать» ~50 контактов, а не пару. Я должен быть в состоянии определить, какой контакт вызвал действие и каково было изменение (0->1 или 1->0).

Моя первоначальная идея — использовать MEGA 2560 и иметь группу из 50 операторов «if» в основном цикле, сравнивающих предыдущее состояние или каждый вывод (хранящийся в отдельных переменных) с текущим и запуская соответствующее действие в случае чего. изменилось.

Мне хотелось бы услышать мнения экспертов, какой способ добиться этой цели будет более элегантным, умным/быстрым.

Я буду рад получить ваши отзывы.

Спасибо.

, 👍0

Обсуждение

50 если? определите постоянный массив номеров контактов и цикл for над ним. и определите массив состояний, чтобы запомнить последнее состояние., @Juraj

Одной из альтернатив является использование сдвиговых регистров с параллельным входом и последовательным выходом, таких как 74HC165. Эти детали можно купить менее чем за 30 центов каждая на eBay или AliExpress., @ex-punctis

Расширители ввода-вывода, например pcf8574, имеют прерывание. Вам нужно будет только дождаться прерывания, а затем запросить через i2c, какой вывод изменился., @Jot


3 ответа


0

Похоже, что Mega 2560 имеет 24 прерывания смены контактов (я не проверял, все ли они выведены на плату Mega Arduino).

Сочетание такого количества прерываний по смене контактов и «ручного» сканирования может быть быстрее, чем сканирование их всех по отдельности.

Другой вариант — сгруппировать как можно больше портов по одним и тем же портам и использовать прямой доступ к оборудованию для поиска изменений — при этом вы сможете выполнять 8 входов одновременно. При наличии 8 входов на каждом порту вам просто нужно провести семь основных проверок того, изменилось ли значение порта, а затем перейти к обработчику, который определяет, какой конкретный вывод изменился и какое действие необходимо.

,

0

См. ответы в Хорошее решение для большего количества прерываний на Arduino. . Например:

Ответ lhballoti:

Вы можете использовать расширитель ввода-вывода, например MCP23008 и MCP23017. Они доступны в SPI и I2c. Прерывания могут быть настроены (чувствительные к фронту, чувствительные к уровню) для каждого входа.

Ответ Embedded.kyle:

Вы можете использовать программируемый контроллер прерываний (PIC), например 82C59A. Он будет каскадным, если вам понадобится больше восьми прерываний, которые он предоставляет. Это немного старомодно, но я думаю, что оно удовлетворит все ваши требования.

,

1

У меня был проект, в котором использовалось 16 поворотных энкодеров, и я использовал MUX Shield, который использует аналоговые мультиплексоры 74HC4067. Они портируются на A0–A3 на щите, и это нормально, поскольку вы можете настроить эти контакты на цифровые входы, иначе вы можете получить версию коммутационного модуля и подключиться к любым входным контактам. Я также использовал Due, поскольку ВСЕ контакты могут быть разрешены по прерыванию. Чтение было немного муторным, но сработало вот так... Метод заключается в следующем. Постоянно обращайтесь к каждому входу по очереди в цикле, иначе прерывание не будет обнаружено. Когда срабатывает прерывание, снова обратитесь к каждому входу по очереди, чтобы выяснить, какой вывод изменил состояние. Надеюсь, это поможет.

,