Есть ли способ иметь более 14 выходных контактов на arduino?

Возможно ли иметь более 14 выходных контактов на Arduino, я работаю над проектом, в котором мне нужно разжечь несколько светодиодов. У меня только Arduino Uno, и я не хочу получать Mega.

49 голосов | спросил JVarhol 12 FebruaryEurope/MoscowbWed, 12 Feb 2014 20:42:31 +0400000000pmWed, 12 Feb 2014 20:42:31 +040014 2014, 20:42:31

13 ответов


48

Общим способом расширения набора доступных выходных контактов на Arduino является использование регистров сдвига, таких как ICC 74HC595 ( ссылка на таблицу ).

Для управления этими микросхемами необходимы 3 контакта:

  1. Часы
  2. Защелка
  3. Данные

В программе вы передаете данные по одному бит в регистр сдвига, используя shiftOut () , например:

shiftOut (dataPin, clockPin, data);

С помощью этой команды вы устанавливаете каждый из 8 выходов на 595 IC с 8 битами в переменной data.

С одним 595 вы получаете 5 контактов (8 на IC, но вы тратите 3, чтобы поговорить с ним). Чтобы получить больше выходов, вы можете последовательно подключить серию 595, подключив ее последовательный вывод к выходу данных следующего. Вы также должны соединять между собой часы и защелки всех микросхем 595.

Результирующая схема (с использованием одного 595) будет выглядеть так:

Цепь с использованием регистра сдвига 595

Рисунок выше был взят из этой codeproject.com веб-страницы:

Штырь фиксатора используется для того, чтобы выдержать 595 выходов, когда вы перемещаете данные в него, например:

digitalWrite (latchPin, LOW);
shiftOut (dataPin, clockPin, data);
digitalWrite (latchPin, HIGH);
ответил Ricardo 12 FebruaryEurope/MoscowbWed, 12 Feb 2014 20:54:59 +0400000000pmWed, 12 Feb 2014 20:54:59 +040014 2014, 20:54:59
25

Есть два способа получить больше контактов из arduino.

Первый способ - использовать аналоговые контакты в качестве цифровых выходных контактов, что очень легко сделать. Все, что вам нужно сделать, это обратиться к A0-A5 как контакты 14,15,16,17,18,19. Например, чтобы написать high для вывода A0, просто используйте digitalWrite (14, HIGH).

Другой способ получить больше контактов из Arduino - это использовать регистр сдвига. Для этого я рекомендую использовать EZ-Expander Shield , который позволяет использовать digitalWrite ([20-35], HIGH) при импорте библиотеки EZ-Expander. Однако этот экран позволяет использовать штыри только в качестве выходов и использует штыри 8, 12 и 13 для управления сдвиговыми регистрами.

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

ответил JVarhol 12 FebruaryEurope/MoscowbWed, 12 Feb 2014 20:42:31 +0400000000pmWed, 12 Feb 2014 20:42:31 +040014 2014, 20:42:31
16

Если вы хотите управлять светодиодами, вы также можете использовать MAX7219, который может управлять 64 светодиодами без дополнительной схемы (без необходимости использования транзистора для усиления сигнала).

Вождение MAX7219 требует только 3 выходных вывода на Arduino. Кроме того, вы можете найти несколько библиотек Arduino .

Вы также можете подключить несколько из них, если вам нужно включить более 64 светодиодов.

Я успешно использовал его для нескольких 7-сегментных светодиодных дисплеев.

Даунсайд: это дорого (около $ 10).

ответил jfpoilpret 12 FebruaryEurope/MoscowbWed, 12 Feb 2014 23:41:02 +0400000000pmWed, 12 Feb 2014 23:41:02 +040014 2014, 23:41:02
15

Вы можете использовать Charlieplexing . С помощью этой технологии вы можете напрямую управлять светодиодами n * (n-1) с n контактов. Таким образом, с 3 выводами вы можете управлять 6 светодиодами, 4 выводами - 12 светодиодами, 5 выводами - 20 светодиодами и т. Д.

Пример:

Шесть светодиодов на 3 штырьках

PINS LEDS
0 1 2 1 2 3 4 5 6
0 0 0 0 0 0 0 0 0
0 1 Z 1 0 0 0 0 0
1 0 Z 0 1 0 0 0 0
Z 0 1 0 0 1 0 0 0
Z 1 0 0 0 0 1 0 0
0 Z 1 0 0 0 0 1 0
1 Z 0 0 0 0 0 0 1
0 0 1 0 0 1 0 1 0
0 1 0 1 0 0 1 0 0
0 1 1 1 0 0 0 1 0
1 0 0 0 1 0 0 0 1
1 0 1 0 1 1 0 0 0
1 1 0 0 0 0 1 0 1
1 1 1 0 0 0 0 0 0

введите описание изображения здесь>> </p>

<p> Здесь вы можете увидеть лучший учебник <a href= .

ответил Daniel Grillo 26 FebruaryEurope/MoscowbWed, 26 Feb 2014 16:14:39 +0400000000pmWed, 26 Feb 2014 16:14:39 +040014 2014, 16:14:39
12

Регистры сдвига были упомянуты в других ответах, и они определенно являются отличным выбором для многих проектов. Они дешевы, просты, умеренно быстры и обычно могут быть соединены вместе, чтобы добавить больше выходов. Тем не менее, у них есть недостаток, что они обычно нуждаются в эксклюзивном использовании нескольких контактов (от 2 до 4, в зависимости от того, как вы их настроили).

Альтернативой является использование более продвинутых расширителей портов, таких как 16- бит MCP23017 и MCP23S17 . Они поддерживают I2C и SPI соответственно, что означает, что вы можете разместить их на шине с несколькими другими устройствами (потенциально разных типов). Каждое устройство на шине может быть индивидуально адресовано, то есть вам нужно всего 2 или 3 контакта, чтобы поговорить со всеми из них. Скорость обновления, как правило, чрезвычайно высока, поэтому вы вряд ли испытаете значительную задержку (то есть задержки передачи) в проекте Arduino.

На низком уровне использование I2C или SPI существенно сложнее, чем простой регистр сдвига. Однако для Arduino есть код библиотеки, который позаботится об этом. См. Этот вопрос, например: Как использовать устройства I2C с Arduino?

ответил Peter Bloomfield 14 FebruaryEurope/MoscowbFri, 14 Feb 2014 15:36:15 +0400000000pmFri, 14 Feb 2014 15:36:15 +040014 2014, 15:36:15
11

I 2 C (провод)

Вы можете использовать протокол I 2 C (проводная библиотека) для подключения к другим устройствам, таким как портовые расширители. Например, MCP23017.

Я использовал один из этих чипов для подключения к ЖК-панели. MCP23017 имеет 16 портов, которые могут быть сконфигурированы как входы или выходы. В качестве входных данных они могут поднять прерывания, если это необходимо.

Пример подключения 13 из этих 16 к ЖК-дисплею: ​​

MCP23017 подключен к ЖК-экрану

Теперь мы подключаемся к Arduino, используя только 2 провода (SDA /SCL) плюс мощность и массу:

MCP23017 подключен к Arduino


Некоторые сторонние производители сделали на них платы с 4 x MCP23017, это дает вам 64 входа /выхода:

Многоступенчатая доска


мультиплексоры

Вы можете использовать аналоговые мультиплексоры, такие как 74HC4051 (8 портов) или 74HC4067 (16 портов) для подключения одного контакта к одному из портов 8/16 (но только к одному в данный момент времени), например:

74HC4051 мультиплексор

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


SPI с 74HC595

Используя SPI, вы можете отправлять быстрые последовательные данные в сдвиговый регистр, например, 74HC595. Они могут быть соединены вместе. В этом примере я управляю 32 светодиодами только с тремя выводами ввода /вывода (MOSI /MISO /SCK), а также мощностью и заземлением.

74HC595 вождение 32 светодиодов


Я обнаружил внутри коммерческого светодиодного знака, что 72 светодиода управлялись чипами 74HC595.

Прокрутка светодиодного знака

Это имело 9 чипов, управляющих колонками (9 x 8 = 72 светодиода) и один чип, управляющий строками, в мультиплексированной конфигурации.


SPI с MAX7219

Если вы просто хотите управлять светодиодами, вы обычно можете их мультиплексировать. MAX7219 упрощает это, будучи разработанным для управления светодиодными матрицами, например 7-сегментными дисплеями:

MAX7219 с 7-сегментным дисплеем

Или 64-светодиодные матрицы:

MAX7219 с 64-светодиодной матрицей

В обоих случаях они могут быть соединены последовательно, например:

MAX7219 daisy-chain

Все эти примеры используют только 3 контакта Arduino (MOSI /MISO /SCK) плюс мощность и заземление.


SPI с MCP23S17

16-портовый расширитель портов, упомянутый ранее (MCP23017), также поставляется в варианте SPI (MCP23S17), который делает практически идентичные вещи. Он использует еще один провод, но будет быстрее.


Другие протоколы

Светодиодные полосы (например, NeoPixel) имеют свои собственные протоколы. сообщение на Youtube было опубликовано Джошем Левином , где автор проехал более 1000 пикселей с помощью Duemilanove!


Ссылки

ответил Nick Gammon 8 J000000Wednesday15 2015, 02:39:54
8

В дополнение к ответу Рикарду , о чем говорится в Wikipedia на регистры сдвига :

  

Одним из наиболее распространенных применений сдвигового регистра является преобразование между последовательными и параллельными интерфейсами. [...] Регистры SIPO обычно подключаются к выходу микропроцессоров, когда требуются дополнительные выводы ввода /вывода общего назначения, чем есть. Это позволяет управлять несколькими двоичными устройствами с использованием только двух или трех контактов, но медленнее, чем параллельный ввод-вывод.

В статье Рикардо связан вы можете увидеть диаграмму сдвигового регистра.

Схема регистров сдвига

Что здесь происходит, так это то, что вы поместите данные из 8 контактов в последовательности и для каждого такта поменяете сдвиговый регистр (переместите двоичные данные с каждой защелки на следующую) до тех пор, пока он не «сделает круг», т.е. первый бит поступает на последний вывод. Регистры сдвига также имеют вход, где вы можете включить /выключить сдвиг, чтобы статус сохранялся после того, как данные смещены в позицию. Для простой демонстрации см. Следующую анимацию.

Shift register animation

Здесь красный свет является последовательным входом, а зеленые отображают состояние защелок в этом упрощенном SIPO shift register . После того, как данные сдвинутся на место, сдвиг может быть отключен, и вы можете прочитать контакты. В этом примере я переместил 10101011.

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

ответил totymedli 13 FebruaryEurope/MoscowbThu, 13 Feb 2014 06:24:28 +0400000000amThu, 13 Feb 2014 06:24:28 +040014 2014, 06:24:28
6

Как вы уже писали, вы можете использовать все контакты, включая TX и RX, в качестве цифрового выхода. Я сделал это некоторое время назад для демонстратора и записал видео - 20 светодиодов на 20 контактах - этого довольно бессмысленного проекта.

Как описано Peter R. Bloomfield здесь , вам необходимо отключить TX и RX для загрузки. Кроме того, у вас нет контактов для считывания датчиков для возможной интерактивности, и вы должны убедиться, что общий предел тока не достигнут. Не забывайте, что вы ограничены светодиодами 5V, если вы ведете их прямо с вашим Arduino.

Поэтому рекомендуется использовать сдвиговые регистры в целом и 595, описанные Ricardo .

  • Они дешевы!
  • Довольно легко их каскадировать.
  • При использовании аппаратного SPI может быть достигнута большая скорость.

Я использовал их некоторое время назад, когда я понял часть пайки и программирования Kawaii me (текст ссылки находится на немецком языке) исполнителя upcycling Dominik Jais .

Здесь для включения отображения 8x11 светодиодов использовалась только группа 595 . Поскольку светодиоды были вырезаны из полосы 12V SMD-светодиодов, необходимы дополнительные источники питания и некоторые массивы Darlington UDN2803A , подключенные к выходным выводам сдвиговых регистров.

Другие общие методы включают использование расширителей портов PCF8574 (A) с пропускной способностью 8 бит, которые управляются через шину I2C.

Во всяком случае, я бы сначала дал 595 регистрам сдвига.

Если вам нужно управлять несколькими светодиодами RGB, вы можете захотеть найти более специализированные решения. Некоторые светодиоды RGB поставляются со своим WS2812 . Эти мелкие детали могут быть каскадированы (1-Wire-шина) и адресуются через их положение в цепочке.

ответил Klaus-Dieter Warzecha 13 FebruaryEurope/MoscowbThu, 13 Feb 2014 04:28:13 +0400000000amThu, 13 Feb 2014 04:28:13 +040014 2014, 04:28:13
3

Если речь идет о светодиодах, то о светодиодных полосах WS2812B или о самих чипах драйверов? Вы можете управлять практически неограниченным количеством светодиодов, используя только один вывод!

Хотя люди используют их в полосках, они доступны как автономные светодиоды (известные как нео-пикселы на Adafruit). Или, если вы используете только один цвет, каждый чип WS2811 может управлять 3 светодиодами, используя каждый из выходов RGB для каждого светодиода.

Недавно я создал созданный проект, который использует 5 таких светодиодов: Дверь1 открыта /закрыта, Дверь 2 открыта /закрыта, активна 1, активна мотор2 и мощность. «Активные» светодиоды имеют двойное назначение, так как у меня красный индикатор ввода активного двигателя, а зеленый - активный флаг внутри Arduino.

Точка, с 1 пинком и установленной библиотекой, вы можете контролировать любое количество светодиодов

ответил Madivad 2 Maypm14 2014, 19:08:51
1

Для проекта класса Я использовал CD4024 и два вывода Arduino для управления 7-сегментным дисплеем.

Есть некоторые оговорки к этому подходу. Например, чтобы написать значение high для первого вывода счетчика пульсаций, требуется только reset и дважды переключить два раза. Но если вы хотите написать high для всех n контактов, необходимо переключить тактовый вывод 2 n , и за это время все остальные контакты будут постоянно переключаться и выключаться.

Если ваше приложение может справиться с этими ограничениями, а у вас короткие контакты, это еще один вариант.

Бонусный ответ: есть много примеров входов мультиплексирования здесь , многие из которых также применимы к выходам мультиплексирования.

ответил hoosierEE 2 Maypm14 2014, 18:11:30
1

Я не претендую на этот метод для себя, но я нашел этот опрятный трюк на веб-странице MUX-DEMUX: CD4051 Тестом для салона

Какой бы метод вы ни выбрали для управления выводом или считыванием входов (сдвиговых регистров, мультиплексоров или непосредственного непосредственного использования контактов Arduino), вы можете ДВОЙНО количество выходов или входов путем умного использования пар параллельных схем (до образуют двойной вход или выход bank ), используя диоды в противостоящих чувствах на каждой параллельной ветви и переключающие входы /выходы на высокий и низкий.

Чтобы проиллюстрировать метод выходов (в этом случае светодиоды, обратите внимание, что дополнительные диоды не требуются):

LED bank

  

Если вы считаете пару светодиодов в этом примере «банком» и   вы хотите, чтобы свет LED_0, вам нужно установить PIN 17 на HIGH, а PIN 18 -   НИЗКИЙ. (Номера контактов сбивают с толку, но они соответствуют более позднему примеру   так голый со мной). Чтобы подсветить LED_1, вы просто отменяете PINS. Диод   природа светодиодов препятствует протеканию тока в противоположном направлении   оставляя другого.

Чтобы проиллюстрировать метод входов (CdS в этом случае, обратите внимание, что необходимы дополнительные диоды):

CdS bank

  

Это немного усложняется, если вы хотите сделать аналоговое чтение   на датчике освещенности CdS. Во-первых, вам нужно добавить диод к каждому датчику   для управления потоком. Во-вторых, поскольку вы читаете значения, вам нужно   потяните входы высоко или низко, чтобы они не плавали. Быть ленивым   человек, я собираюсь вытащить их высоко, используя внутреннее подтягивание   резисторы. Чтобы прочитать CdS_0, вы устанавливаете режим PIN 17 на OUTPUT и устанавливаете его на   НИЗКИЙ. Это делает его основой. Затем вы устанавливаете режим PIN 18 для INPUT и   установите его в положение HIGH для включения подтягивающего резистора. Теперь вы настроены сделать   прочитайте на PIN-код 18 (аналоговый вывод 4 a.k.a.). Чтобы получить доступ к другому датчику, просто   переключите режимы и выходы.

Итак, если у вас есть мультиплексор с 8 портами CD4051, используя 5 контактов на Arduino (вместо обычных 3), вы можете получить 16 входов или выходов или комбинацию из двух.

16 выходов /входов с использованием CD4051

Аналогично, если у вас есть мультиплексор с портом 4067 16 портов, вы можете получить 32 входа или выхода или их сочетание.

Примерный эскиз:

 /*
 * Пример получения 16 входов /выходов из 5 контактов с использованием CD4051
 *
 * На основе учебника и кода от david c. и tomek n. * для k3 /malmö högskola
 * http://www.arduino.cc/playground/Learning/4051?action=sourceblock&ref=1
 * /


int selPin [] = {14, 15, 16}; //выбираем контакты на 4051 (аналоговые A0, A1, A2)
int commonPin [] = {17, 18}; //общие входы /выходы (аналоговые A3, A4)
int led [] = {LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW}; //хранит восемь состояний светодиодов
int CdSVal [] = {0, 0, 0, 0}; //сохраняем последние показания CdS
int cnt = 0; //счетчик основного контура
int persistDelay = 100; //Время включения светодиода в микросекундах


void setup () {
  Serial.begin (9600); //серийная связь для устранения неполадок (всегда)
  for (int pin = 0; pin <3; pin ++) {//настройка выберите контакты
    pinMode (selPin [pin], OUTPUT);
  }
}


void loop () {
  flashLEDs ();
  if (cnt == 0) {
    для (int x; x <8; x ++) {
      led [x] = random (2);
    }
  }
  CNT ++;
  if (cnt> 100) {cnt = 0; }
}


void flashLEDs () {
  for (int pin = 0; pin <2; pin ++) {//установить общие контакты низкого уровня
    pinMode (commonPin [pin], OUTPUT);
    digitalWrite (commonPin [pin], LOW);
  }
  for (int bank = 0; bank <4; bank ++) {
    for (int pin = 0; pin <3; pin ++) {//разобрать выбранные биты
      int signal = (bank> pin) & 1; //shift & побитовое сравнение
      digitalWrite (selPin [pin], сигнал);
    }
    if (led [bank * 2]) {//первый светодиод
      digitalWrite (commonPin [0], HIGH); //Обменяем
      delayMicroseconds (persistDelay); //оставить светодиод включен
      digitalWrite (commonPin [0], LOW); //Обход
    }
    if (led [bank * 2 + 1]) {//повторить для второго светодиода
      digitalWrite (commonPin [1], HIGH);
      delayMicroseconds (persistDelay);
      digitalWrite (commonPin [1], LOW);
    }
  }
}

Как я уже сказал в первой строке, полное объяснение можно найти на MUX-DEMUX: CD4051 Приколы для посетителей

ответил Greenonline 28 PMpTue, 28 Apr 2015 20:34:34 +030034Tuesday 2015, 20:34:34
1

С небольшим количеством работы (установка другого загрузчика) в Uno, в заголовках ICSP1 и JP2 доступны еще семь строк ввода /вывода. Сменный загрузчик называется HoodLoader2 . Он позволяет устанавливать эскизы как на Atmega328, так и на Atmega16U2 на Uno. Работа с несколькими процессорами будет основным осложнением использования этого метода.

В Uno заголовки ICSP1 и JP2 подключаются к контактам PB1 ... PB7 от Atmega16U2. Кроме того, Atmega16U2 имеет около 9 контактов ввода /вывода без подключения к печатной плате. Человек, работающий под микроскопом, может подключить провода к общим выводам ввода-вывода 18 на 16U2, оставив три других контакта ввода /вывода, подключенных к их обычным соединениям.

HoodLoader2 также работает на досках Mega.

ответил James Waldby - jwpat7 22 AM00000050000002431 2015, 05:47:24
0

Здесь есть много хороших ответов, но если бы вы потратили свое время, вам было бы дешевле купить Mega.

Мой 3/2-й достоин.

ответил Jim 11 Jpm1000000pmWed, 11 Jan 2017 19:05:22 +030017 2017, 19:05:22

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132