Возможно ли иметь более 14 выходных выводов на Arduino, я работаю над проектом, в котором мне нужно зажечь несколько светодиодов по отдельности. У меня есть только Arduino Uno, и я не хочу получать Mega.
pins
arduino-uno
JVarhol
источник
источник
Ответы:
Распространенным способом расширения набора доступных выходных выводов на Arduino является использование сдвиговых регистров, таких как микросхема 74HC595 ( ссылка на таблицу данных ).
Вам нужно 3 контакта для управления этими чипами:
В программе вы передаете данные по одному в регистр сдвига с помощью команды shiftOut () , например так:
С помощью этой команды вы устанавливаете каждый из 8 выходов на 595 IC с 8 битами в
data
переменной.С одним 595 вы получаете 5 булавок (8 на IC, но вы тратите 3, чтобы поговорить с ним). Чтобы получить больше выходов, вы можете последовательно соединить серию 595, соединив ее вывод последовательного выхода с выводом данных следующего. Вы также должны соединить вместе контакты часов и фиксаторов всех 595 ИС.
Результирующая схема (с использованием одного 595) будет выглядеть так:
Приведенный выше рисунок был взят с этой веб-страницы codeproject.com :
Защелка используется для обеспечения стабильной работы выходов 595 во время перемещения данных в нее, например, так:
источник
Есть два способа получить больше булавок из Arduino.
Первый способ - использование аналоговых выводов в качестве выводов цифрового выхода, что очень легко сделать. Все, что вам нужно сделать, это обратиться к A0-A5 как кеглям 14,15,16,17,18,19. Например, для записи высокого значения на вывод A0 просто используйте digitalWrite (14, HIGH).
Другой способ получить больше пинов из Arduino - использовать Shift Register. Для этого я рекомендую использовать EZ-Expander Shield , который позволяет использовать digitalWrite ([20-35], HIGH) при импорте библиотеки EZ-Expander. Этот экран, однако, позволяет использовать выводы только в качестве выходов и использует контакты 8, 12 и 13 для управления регистрами сдвига.
Самое замечательное то, что вы можете использовать оба вышеупомянутых метода без проблем.
источник
A0
-A5
вместо цифр 14-19. Например,digitalWrite(A0, HIGH)
.digitalWrite(A0)
это более правильно, чем то,digitalWrite(14)
что первое всегда будет отображаться на правильный физический (аналоговый) вывод. На другой платеpin 14
может фактически не бытьA0
, например,pin 14
на MEGA есть Serial3TX
и не будет влиять на аналоговый вывод, который вам нужен . то есть, если вы используетеdigitalWrite
аналоговый вывод, используйте ссылкуA0
-A5
.Если вы хотите управлять светодиодами, то вы также можете использовать MAX7219, который может управлять 64 светодиодами, без дополнительной схемы (нет необходимости в транзисторе для усиления сигнала).
Для вождения MAX7219 требуется всего 3 выходных контакта на Arduino. Также вы можете найти несколько библиотек Arduino для него.
Вы также можете подключить несколько из них, если вам нужно подключить более 64 светодиодов.
Я успешно использовал его для нескольких 7-сегментных светодиодных дисплеев.
Недостаток: это дорого (около 10 долларов).
источник
Вы можете использовать Чарлиплексирование . С помощью этой техники вы можете напрямую управлять
n*(n-1)
светодиодами из n контактов. Таким образом, с 3 контактами вы можете управлять 6 светодиодами, 4 контактами - 12 светодиодов, 5 контактами - 20 светодиодов и так далее.Exemple:
Шесть светодиодов на 3 контакта
Вы можете увидеть лучший учебник здесь .
источник
I 2 C (Провод)
Вы можете использовать протокол I 2 C (библиотека проводов) для подключения к другим устройствам, таким как расширители портов. Например, MCP23017.
Я использовал один из этих чипов для подключения к ЖК-плате. MCP23017 имеет 16 портов, которые можно настроить как входы или выходы. В качестве входных данных они могут вызывать прерывания, если это необходимо.
Пример подключения 13 из этих 16 к ЖК-дисплею:
Теперь мы подключаемся к Arduino, используя только 2 провода (SDA / SCL) плюс питание и заземление:
Некоторые сторонние производители изготовили платы с 4-мя MCP23017 на них, что дает вам 64 входа / выхода:
мультиплексоры
Вы можете использовать аналоговые мультиплексоры, такие как 74HC4051 (8 портов) или 74HC4067 (16 портов), чтобы подключить один контакт к одному из портов 8/16 (но только один в данный момент времени), например так:
Они являются двунаправленными, поэтому их можно использовать как расширитель входа или выхода.
SPI с 74HC595
Используя SPI, вы можете отправлять быстрые последовательные данные в сдвиговый регистр, такой как 74HC595. Они могут быть соединены вместе. В этом примере я управляю 32 светодиодами только с 3 контактами ввода / вывода (MOSI / MISO / SCK) плюс питание и заземление.
Внутри коммерческого светодиода я обнаружил, что эти 72 светодиода работают на чипах 74HC595.
Он имел 9 чипов, управляющих столбцами (9 x 8 = 72 светодиода), и один чип, управляющий рядами, в мультиплексированной конфигурации.
SPI с MAX7219
Если вы просто хотите управлять светодиодами, вы обычно можете их мультиплексировать. MAX7219 упрощает это, будучи разработанным для управления светодиодными матрицами, например, 7-сегментными дисплеями:
Или 64-светодиодные матрицы:
В обоих случаях они могут быть соединены последовательно, например:
Во всех этих примерах используются только 3 контакта Arduino (MOSI / MISO / SCK) плюс питание и заземление.
SPI с MCP23S17
Упомянутый ранее 16-портовый расширитель портов (MCP23017) также поставляется в варианте SPI (MCP23S17), который делает практически идентичные вещи. Он использует еще один провод, но будет быстрее.
Другие протоколы
У светодиодных лент (как у NeoPixel) есть свои протоколы. На Youtube был пост от Джоша Левина, где автор проехал более 1000 пикселей с помощью Duemilanove!
Рекомендации
источник
Сдвиговые регистры упоминались в других ответах, и они, безусловно, являются отличным выбором для многих проектов. Они дешевы, просты, в меру быстрые и, как правило, могут быть объединены в цепочку, чтобы добавить больше выходов. Однако у них есть недостаток, заключающийся в том, что они обычно нуждаются в эксклюзивном использовании нескольких контактов (от 2 до 4, в зависимости от того, как вы их настроили).
Альтернативой является использование более продвинутых расширителей портов, таких как 16-битные MCP23017 и MCP23S17 . Они поддерживают I2C и SPI соответственно, что означает, что вы можете разместить их на шине с несколькими другими устройствами (потенциально разных типов). Каждое устройство в шине может быть адресовано индивидуально, то есть вам нужно всего 2 или 3 контакта, чтобы общаться со всеми из них. Скорость обновления, как правило, чрезвычайно высока, поэтому вы вряд ли будете испытывать значительные задержки (т.е. задержки передачи) в проекте Arduino.
На низком уровне использование I2C или SPI существенно сложнее, чем простой сдвиговый регистр. Однако для Arduino есть код библиотеки, который позаботится об этом за вас. Посмотрите этот вопрос, например: Как я могу использовать устройства I2C с Arduino?
источник
В дополнение к ответу Рикардо , что Википедия указывает на сменные регистры :
В статье Ricardo Linked вы можете увидеть схему регистра сдвига.
Здесь происходит то, что вы помещаете данные из 8 выводов в последовательность, и для каждого такта такта сдвиговый регистр будет сдвигаться (перемещать двоичные данные из каждой защелки в следующую), пока он не "сделает круг", т.е. первый бит прибывает к последнему выводу. Сдвиговые регистры также имеют вход, с помощью которого вы можете включить / выключить смещение, чтобы сохранить статус после смещения данных в положение. Для простой демонстрации смотрите следующую анимацию.
Здесь красный свет является последовательным входом, а зеленый показывает состояние защелок в этом упрощенном сдвиговом регистре SIPO . После того, как данные сдвинуты на место, сдвиг можно отключить, и вы сможете прочитать выводы. В этом примере я переместился
10101011
.Из этих примеров вы можете понять, что последовательная передача будет медленнее, чем параллельная, потому что вам нужно ждать, пока сдвиговый регистр не сдвинет биты на их место. Вам придется ждать столько же тактов, сколько битов вы хотите загрузить. Это одна из многих причин, почему вы не можете связывать их бесконечно, потому что загрузка будет длиться вечно.
источник
Как вы уже писали, вы можете использовать все выводы, включая TX и RX, в качестве цифрового выхода. Я сделал это некоторое время назад для демонстратора и записал видео - 20 светодиодов на 20 контактов - этого довольно бессмысленного проекта.
Как описано Peter R. Bloomfield здесь , Вы должны отключить TX и RX для загрузки. Более того, у вас нет контактов, чтобы прочитать датчики на предмет возможной интерактивности и вы должны убедиться, что общий предел тока не достигнут. Не забывайте, что вы ограничены 5-вольтовыми светодиодами, если управляете ими напрямую с помощью Arduino.
Поэтому настоятельно рекомендуется использовать сдвиговые регистры в целом и 595, описанные Рикардо .
Я использовал их некоторое время назад, когда понял паяльную и программирующую часть Kawaii me (текст ссылки на немецком языке) художника по восходящему циклу Доминика Джайса .
Здесь всего 595 использовались для управления дисплеями 8x11. Поскольку светодиоды были вырезаны из полосы светодиодов SMD 12 В, был необходим дополнительный источник питания и несколько массивов UDN2803A Darlington, подключенных к выходным контактам сдвиговых регистров.
Другие общие методы включают использование 8-битных расширителей портов PCF8574 (A), которые управляются через шину I2C.
В любом случае, я бы сначала попробовал 595 сменных регистров.
Однако если вам необходимо управлять парой RGB-светодиодов, возможно, вы захотите найти более специализированные решения. Некоторые RGB-светодиоды поставляются с собственным WS2812 . Эти мелкие части могут быть каскадными (1-проводная шина) и адресованы через их положение в цепи.
источник
Если речь идет о светодиодах, что о светодиодных полосках WS2812B или самих микросхемах драйверов? Вы можете управлять практически неограниченным количеством светодиодов, используя только один контакт!
Хотя люди используют их в полосах, они доступны в виде автономных светодиодов (известных как нео пикселей на Adafruit). Или, если вы используете только один цвет, каждый чип WS2811 может управлять 3 светодиодами, используя каждый из выходов RGB для одного светодиода каждый.
Недавно я только что создал созданный проект, который использует 5 таких светодиодов: дверь1 открыта / закрыта, дверь2 открыта / закрыта, мотор1 активен, мотор2 активен и мощность. «Активные» светодиоды имеют двойное назначение, потому что у меня красный - вход от активного двигателя, а зеленый - активный флаг внутри Arduino.
Точка, с 1 контактом и установленной библиотекой, вы можете управлять любым количеством светодиодов
источник
Я не претендую на этот метод для себя, но я нашел этот хитрый трюк на веб - странице MUX-DEMUX: CD4051 Уловки салона
Какой бы метод вы ни выбрали для управления выходами или считывания входов (сдвиговые регистры, мультиплексоры или прямое прямое использование самих выводов Arduino), вы можете удвоить количество выходов или входов путем умного использования пар параллельных цепей (для формирования двойной банк ввода или вывода ), используя диоды в противоположных направлениях на каждой параллельной ветви, и переключая входы / выходы на высокий и низкий.
Чтобы проиллюстрировать метод для выходов (в этом случае светодиоды, обратите внимание, что дополнительные диоды не требуются):
Чтобы проиллюстрировать метод для входов (CdS в этом случае, обратите внимание, что требуются дополнительные диоды):
Итак, если у вас есть 8-портовый мультиплексор CD4051, использующий 5 выводов на Arduino (вместо обычных 3), вы можете получить 16 входов или выходов или их сочетание.
Аналогично, если у вас есть 4067 16-портовый мультиплексор, вы можете получить 32 входа или выхода или их сочетание.
Примером эскиза будет:
Как я уже говорил в первой строке, полное объяснение можно найти на MUX-DEMUX: CD4051 Трюки с салоном
источник
Для проекта класса я использовал CD4024 и два вывода Arduino для управления 7-сегментным дисплеем.
Есть некоторые оговорки к этому подходу. Например, чтобы записать
high
значение в первый выход счетчика пульсаций, требуется только areset
и дважды переключать тактовый вывод. Но если вы хотите , чтобы писатьhigh
на всех п штифтов требует переключая тактовый контакт 2 п раз, и за это время все остальные контакты постоянно переключая и выключаться.Если ваше приложение может справиться с этими ограничениями, и у вас мало контактов, это еще один вариант.
Бонус Ответ: Есть много примеров мультиплексирования входов здесь , многие из которых применяются также к мультиплексированию выходов.
источник
Немного поработав (установка другого загрузчика), дополнительные семь линий ввода / вывода доступны на Uno, на заголовках ICSP1 и JP2. Запасной загрузчик называется HoodLoader2 . Это позволяет вам устанавливать эскизы как на Atmega328, так и на Atmega16U2 на Uno. Работа с несколькими процессорами будет основным осложнением при использовании этого метода.
На Uno заголовки ICSP1 и JP2 подключаются к контактам PB1 ... PB7 Atmega16U2. Кроме того, Atmega16U2 имеет около 9 выводов ввода / вывода без подключения к плате. Человек, работающий под микроскопом, может подключить провода к 18 контактам ввода-вывода на 16U2, оставив три других контакта ввода-вывода на своих обычных соединениях.
HoodLoader2 также работает на мега платах.
источник
Здесь есть множество хороших ответов, но если вы будете тратить свое время, вы найдете дешевле купить Mega.
Моя 3/2-я ценность.
источник