arduino에 14 개 이상의 출력 핀을 갖는 방법이 있습니까?


52

Arduino에서 14 개 이상의 출력 핀을 가질 수 있습니까? 저는 여러 개의 LED를 개별적으로 조명 해야하는 프로젝트를 진행하고 있습니다. 나는 Arduino Uno 만 가지고 있으며 Mega를 얻고 싶지 않습니다.


확장 성의 정신에서 I2C는 Arduino의 옵션일까요?
Chris O

@ChrisO I2C 무엇을 의미합니까? 내가 이해하는 바에 따르면 시프트 레지스터는 I2C로 간주됩니다.
JVarhol

아, 그럼 내 질문에 대답하게 해줘 ;-) 이 버스 표준에 관한 위키피디아 기사 가 있습니다. 그리고 방금 Wire lib 에서 I2C에 대한 지원을 찾았 으므로 I2C 체인을 Uno에 연결할 수 있습니다.
Chris O

@JVarhol 확실하지 않습니다. I2C, 일명 TWI는 2- 와이어 인터페이스이지만 SPI는 3- 와이어 인터페이스로 간주 될 수 있습니다.
Klaus-Dieter Warzecha

1
@JVarhol 프로젝트에 대한 솔루션을 이미 선택 했습니까? 그렇다면 질문을 편집하고 답과 일치하거나 가장 가까운 답을 받아들이는 것이 좋습니다.
jfpoilpret

답변:


50

Arduino에서 사용 가능한 출력 핀 세트를 확장하는 일반적인 방법은 74HC595 IC ( 데이터 시트 링크) 와 같은 시프트 레지스터를 사용하는 것 입니다.

이러한 칩을 제어하려면 3 개의 핀이 필요합니다.

  1. 시계
  2. 걸쇠
  3. 데이터

프로그램에서 shiftOut () 명령을 사용하여 한 번에 한 비트 씩 데이터를 시프트 레지스터로 전달합니다.

shiftOut(dataPin, clockPin, data); 

이 명령을 사용하면 595 IC에서 8 개의 각 출력을 data변수 의 8 비트로 설정 합니다.

하나의 595로 5 개의 핀을 얻을 수 있습니다 (IC에서 8 개이지만 3 개를 소비하기 위해 소비합니다). 더 많은 출력을 얻으려면 직렬 출력 핀을 다음의 데이터 핀에 연결하여 일련의 595를 데이지 체인 방식으로 연결할 수 있습니다. 또한 모든 595 IC의 클록 및 래치 핀을 함께 연결해야합니다.

결과 회로 (595 하나 사용)는 다음과 같습니다.

595 시프트 레지스터를 사용하는 회로

위 그림은 codeproject.com 웹 페이지 에서 가져온 것입니다 .

래치 핀은 다음과 같이 데이터를 출력하는 동안 595 출력을 일정하게 유지하는 데 사용됩니다.

digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, data); 
digitalWrite(latchPin, HIGH);

1
Thx, 시프트 레지스터 작동 방식을 포함하는 것을 잊었습니다. 나는 계획을 세웠지 만, 나는 작곡가를 떠나야했고 돌아 왔을 때 내 마음이 미끄러졌다. :)
JVarhol

문제 없습니다. 그래서 우리는 커뮤니티입니다. 우리는 서로의 답변을 보완합니다. 그러나 EZ-Expander 쉴드에 대한 답변에 몇 가지 유용한 팁을 추가 한 것이 좋습니다. 쉽게 PCB를 만들 수없는 사람들이 사용 가능한 포트 수를 확장 할 수 있습니다.
Ricardo

2
또한 프로그래밍이 쉬워 지므로 데이터를 옮길 필요가 없으며 클럭을 펄스 한 다음 래치를 활성화 할 필요가 없습니다. 나는 방패에 대해 꽤 오랫동안 알고 있었고 초보자에게 완벽하다고 생각합니다. 가장 좋은 점은 코드가 오픈 소스이기 때문에 실제로 방패를 사용하지 않고 자신의 보드를 사용하거나 브레드 보드를 사용하는 경우에도 코드를 사용할 수 있다는 것입니다.
JVarhol

1
2 개의 8 비트 레지스터가 1 개의 16 비트가 될 수 있으므로 (이론적으로) 무한대로 링크 할 수 있음을 잊지 마십시오.
Scott M.

감사! 다음 경우에 놀라운 CodeProject의 설명에 아카이브 링크는 링크가 지금까지 내려갑니다 archive.fo/1uvPE
akhmed

27

arduino에서 더 많은 핀을 얻을 수있는 두 가지 방법이 있습니다.

첫 번째 방법은 아날로그 핀을 디지털 출력 핀으로 사용하는 것입니다. 핀 14,15,16,17,18,19로 A0-A5를 참조하기 만하면됩니다. 예를 들어 핀 A0에 하이를 쓰려면 digitalWrite (14, HIGH)를 사용하십시오.

Arduino에서 더 많은 핀을 얻는 다른 방법은 Shift Register를 사용하는 것입니다. 이렇게하려면 EZ-Expander Shield를 사용하는 것이 좋습니다 . EZ-Expander 라이브러리를 가져올 때 digitalWrite ([20-35], HIGH)를 사용할 수 있습니다. 그러나이 쉴드는 핀만 출력으로 사용하고 핀 8, 12 및 13을 사용하여 시프트 레지스터를 제어합니다.

가장 좋은 점은 위의 두 가지 방법을 문제없이 함께 사용할 수 있다는 것입니다.


3
Arduino 참조에 따르면 실제로 숫자 14-19 대신 A0- A5식별자를 직접 사용할 수 있습니다 . 예를 들면 다음과 같습니다 digitalWrite(A0, HIGH).
Peter Bloomfield

3
@ PeterR.Bloomfield 둘 다 정확하지만 간단하고 읽기 쉬운 A0-A5를 권장합니다. LED가 깜박이는 것은 아니지만 큰 프로젝트가있을 때 습관이 거의 ​​들지 않습니다.
Anonymous Penguin

2
실제로, 둘 다 UNO 및 호환 보드에서 작업을 수행하지만 , 전자가 항상 올바른 물리적 (아날로그) 핀에 매핑되므로 digitalWrite(A0)보다 정확합니다 digitalWrite(14). 다른 보드에서 pin 14실제로하지 않을 수 있습니다 A0예를 들어, pin 14메가가 Serial3입니다에 TX당신이 후있어 아날로그 핀에 영향을주지 않습니다. 즉, digitalWrite아날로그 핀에서 사용하는 경우 A0- A5참조를 사용하십시오 .
Madivad

18

LED를 구동하려면 추가 회로없이 신호를 증폭하기 위해 64 개의 LED를 구동 할 수있는 MAX7219를 사용할 수도있다.

MAX7219를 구동 하려면 Arduino에서 3 개의 출력 핀만 있으면됩니다. 또한 Arduino 라이브러리도 있습니다.

64 개가 넘는 LED에 전원을 공급해야하는 경우 이들 중 몇 개를 연결할 수도 있습니다.

여러 개의 7- 세그먼트 LED 디스플레이에 성공적으로 사용했습니다.

단점 : 비싸다 (약 $ 10).


MAX7219를 잊어 버렸습니다. 게시 해 주셔서 감사합니다!
JVarhol

384 개 LED ... 우와! USB 추론을위한 2 개의 핀이 추가되어 있습니다. 충분한 전원 공급 장치로 어떤 종류의 성가신 악세사리를 만들 수 있는지 궁금합니다.
Anonymous Penguin

17

Charlieplexing 을 사용할 수 있습니다 . 이 기술을 사용하면 직접 운전할 수 있습니다n*(n-1) n 핀에서 LED를 . 따라서 3 개의 핀으로 6 개의 LED, 4 개의 핀-12 개의 LED, 5 개의 핀-20 개의 LED 등을 구동 할 수 있습니다.

예 :

3 개의 핀에 6 개의 LED

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

여기에 이미지 설명을 입력하십시오

더 나은 튜토리얼을 여기서 볼 수 있습니다 .


한 가지 주목할 점은이 기술을 사용하면 더 많은 LED를 제어 할 수 있지만 반드시 그런 것은 아닙니다.
kontur

1
@ kontur 네, 맞습니다. 그러나 비전의 지속성 측면에서 그 비전을 고려할 수 있습니다. 질문에는 그러한 세부 사항이 없습니다.
Daniel Grillo

Charlieplexing은 시프트 레지스터를 사용하지 않고 LED를 멀티플렉싱하는 유일한 방법은 아닙니다.
linhartr22

1
@ linhartr22 나는 그것이 유일한 방법이라고 결코 말하지 않았습니다. Charlieplexing은이 문제에 대한 일반적인 솔루션입니다. 그리고 제 대답은 7 번째였습니다. 그래서 다른 가능성은 이미 전에 나타났습니다.
Daniel Grillo

@DanielGrillo 저는 좀 더 구체적이고, LED 큐브에서 일반적으로 사용되는 열 및 행 멀티플렉싱이 시프트 레지스터와 Charlieplexing의 제한없이 어떻게 수행 될 수 있는지 설명했습니다. 4x4 행 열 매트릭스는 8 개의 I / O 라인으로 16 개의 LED를 개별적으로 제어 할 수 있습니다. 4x4x4 큐브는 12 개의 I / O 라인으로 64 개의 LED를 개별적으로 제어 할 수 있습니다 (아날로그 A0-A5를 디지털 라인으로 사용하여 Uno에서도 가능).
linhartr22

13

나는 2 C (와이어)

당신은 I 2를 사용할 수 있습니다 C 프로토콜 (Wire 라이브러리)을 사용하여 포트 확장기와 같은 다른 장치에 연결할 수 있습니다. 예를 들어 MCP23017입니다.

그 칩 중 하나를 사용하여 LCD 보드에 연결했습니다. MCP23017에는 16 개의 포트가 있으며 입력 또는 출력으로 구성 할 수 있습니다. 원하는 경우 입력으로 인터럽트를 발생시킬 수 있습니다.

16 개 중 13 개를 LCD에 연결하는 예 :

LCD 화면에 연결된 MCP23017

이제 우리는 2 와이어 (SDA / SCL)와 전력 및 접지 만 사용하여 Arduino에 연결합니다.

Arduino에 연결된 MCP23017


일부 타사 제조업체는 4 x MCP23017로 보드를 만들었으며 64 개의 입력 / 출력을 제공합니다.

지네 보드


멀티플렉서

74HC4051 (8 포트) 또는 74HC4067 (16 포트)와 같은 아날로그 멀티플렉서를 사용하여 다음과 같이 하나의 핀을 8/16 포트 중 하나 (하지만 주어진 시간에 하나씩)에 연결할 수 있습니다.

74HC4051 멀티플렉서

이들은 양방향이므로 입력 또는 출력 확장기로 사용할 수 있습니다.


74HC595의 SPI

SPI를 사용하면 74HC595와 같은 빠른 직렬 데이터를 시프트 레지스터로 보낼 수 있습니다. 이들은 데이지 체인으로 연결될 수 있습니다. 이 예에서는 3 개의 I / O 핀 (MOSI / MISO / SCK)과 전력 및 접지만으로 32 개의 LED를 제어하고 있습니다.

32 개의 LED를 구동하는 74HC595


상용 LED 사인 안에서 72 개의 LED가 74HC595 칩으로 구동되었다는 것을 알았습니다.

스크롤 LED 표시

이것은 멀티플렉싱 된 구성에서 9 개의 칩 (9 x 8 = 72 개의 LED)을 구동하고 1 개의 칩이 행을 구동합니다.


MAX7219의 SPI

LED를 구동하려는 경우 일반적으로 다중화 할 수 있습니다. MAX7219는 7- 세그먼트 디스플레이와 같은 LED 매트릭스를 구동하도록 설계되어이를 단순화한다.

7 세그먼트 디스플레이가 내장 된 MAX7219

또는 64 개의 LED 매트릭스 :

64 개 LED 매트릭스가 내장 된 MAX7219

두 경우 모두 다음과 같이 데이지 체인으로 연결할 수 있습니다.

MAX7219 데이지 체인

이러한 모든 예제는 Arduino (MOSI / MISO / SCK)의 3 핀과 전력 및 접지 만 사용합니다.


MCP23S17을 사용한 SPI

앞에서 언급 한 16 포트 포트 익스팬더 (MCP23017)도 SPI 변형 (MCP23S17)으로 제공되며 이는 사실상 동일한 기능을 수행합니다. 하나 이상의 와이어를 사용하지만 더 빠릅니다.


다른 프로토콜

LED 스트립 (NeoPixel과 같은)에는 자체 프로토콜이 있습니다. Josh Levine의 Youtube에 저자가 Duemilanove와 함께 1000 픽셀 이상을 운전 한 게시물 이있었습니다 !


참고 문헌


12

시프트 레지스터는 다른 답변에서 언급되었으며 많은 프로젝트에서 탁월한 선택입니다. 그것들은 저렴하고 단순하며 적당히 빠르며 일반적으로 더 많은 출력을 추가하기 위해 서로 연결될 수 있습니다. 그러나 일반적으로 몇 개의 핀 (설정 방법에 따라 2 ~ 4 사이)을 독점적으로 사용해야한다는 단점이 있습니다.

대안은 16 비트 MCP23017 및 MCP23S17과 같은 고급 포트 확장기를 사용하는 것입니다. . 이들은 I2C 및 SPI를 각각 지원하므로 여러 다른 장치 (잠재적으로 다른 유형의 장치)가있는 버스에 배치 할 수 있습니다. 버스의 각 장치는 개별적으로 주소가 지정 될 수 있습니다. 즉, 모든 장치와 통신하려면 2 개 또는 3 개의 핀만 있으면됩니다. 업데이트 속도는 일반적으로 매우 빠르기 때문에 Arduino 프로젝트에서 상당한 지연 (즉, 전송 지연)이 발생하지 않을 수 있습니다.

낮은 수준에서 I2C 또는 SPI를 사용하는 것은 간단한 시프트 레지스터보다 훨씬 더 복잡합니다. 그러나 Arduino가이를 처리하기위한 라이브러리 코드가 있습니다. 이 질문을 참조하십시오 : 예 : Arduino와 함께 I2C 장치를 어떻게 사용합니까?


와우, 나는 그들에 대해 알지 못했습니다.
JVarhol

I2C를 사용하여 LED를 제어 할 수 있습니까?
프로 Q

1
@ProQ I2C를 사용하여 표준 LED를 직접 제어 할 수 없습니다. 그러나 I2C 드라이버가 내장 된 일부 LED 제품을 얻을 수 있습니다. 이것은 일반적으로 스트립 또는 매트릭스와 같은 LED가 많은 제품에 해당됩니다.
피터 블룸필드

8

Ricardo 의 답변 외에도 Wikipedia는 시프트 레지스터에 대해 설명합니다 .

시프트 레지스터의 가장 일반적인 용도 중 하나는 직렬 인터페이스와 병렬 인터페이스 간을 변환하는 것입니다. [...] SIPO 레지스터는 일반적으로 사용 가능한 것보다 더 많은 범용 입력 / 출력 핀이 필요한 경우 마이크로 프로세서의 출력에 연결됩니다. 따라서 2 개 또는 3 개의 핀만 사용하여 여러 이진 장치를 제어 할 수 있지만 병렬 I / O보다 느립니다.

에서 기사 리카르도는 시프트 레지스터의 다이어그램을 볼 수있는 링크.

시프트 레지스터 다이어그램

여기서 발생하는 일은 8 핀의 데이터를 순서대로 배치하고 각 클럭 틱에 대해 시프트 레지스터가 "원을 만들 때"(예 : 첫 번째 비트)까지 이진 데이터를 각 래치에서 다음 래치로 이동합니다. 마지막 핀에 도착합니다. 시프트 레지스터에는 데이터를 위치로 이동 한 후에도 상태를 유지할 수 있도록 시프트를 켜거나 끌 수있는 입력이 있습니다. 간단한 데모는 다음 애니메이션을 참조하십시오.

시프트 레지스터 애니메이션

여기서 빨간색 표시등은 직렬 입력이고 녹색 표시등은이 단순화 된 SIPO 시프트 레지스터 의 래치 상태를 보여줍니다 . 데이터를 이동 한 후 위치 이동을 끄고 핀을 읽을 수 있습니다. 이 예에서 나는 밖으로 이동했다 10101011.

이러한 예에서 시프트 레지스터가 비트를 제자리로 시프트 할 때까지 기다려야하므로 직렬 전송이 병렬보다 느리다는 것을 알 수 있습니다. 로드하려는 비트 수와 동일한 양의 클럭 틱을 기다려야합니다. 로딩에 시간이 오래 걸리기 때문에 무한정 연결할 수없는 많은 이유 중 하나입니다.


1
추가 정보와 예쁜 애니메이션 GIF 및 그 효과를 보려면 +1! GIF는 어디에서 찾았습니까? 아니면 만들었습니까?
Ricardo

1
@Ricardo Digital Works로 회로를 만든 다음 화면 인쇄, 편집, gif 애니메이터를 작성했습니다.
totymedli

6

이미 작성했듯이 TX 및 RX를 포함한 모든 핀을 디지털 출력으로 사용할 수 있습니다. 나는 시연을 위해 얼마 전에 그 일을 했고이 무의미한 프로젝트 의 비디오 ( 20 핀의 20 LEDS)를 녹화했습니다 .

에 의해 설명 된 바와 같이 피터 R. 블룸필드 여기 , 당신은 업로드 TX 및 RX를 분리해야합니다. 또한, 인터랙티브 한 가능성을 위해 센서를 읽을 수있는 핀이 없으며 총 전류 제한에 도달하지 않아야합니다. Arduino로 직접 구동하는 경우 5V LED로 제한된다는 것을 잊지 마십시오.

따라서 일반적으로 시프트 레지스터와 Ricardo 가 설명한 595를 사용 하는 것이 좋습니다.

  • 그들은 싸다!
  • 캐스케이드하기는 다소 쉽습니다.
  • 하드웨어 -SPI를 사용하면 많은 속도를 얻을 수 있습니다.

나는 업 사이클 아티스트 Dominik JaisKawaii me (링크의 텍스트는 독일어로되어 있음)의 납땜 및 프로그래밍 부분을 깨달았을 때 그것들을 사용했습니다 .

여기에서는 8x11 LED 디스플레이를 구동하는 데 595 개만 사용되었습니다. 12V SMD LED 스트라이프에서 LED를 절단했기 때문에 시프트 레지스터의 출력 핀에 연결된 추가 전원 공급 장치 및 일부 UDN2803A Darlington 어레이가 필요했습니다.

다른 일반적인 방법에는 I2C 버스를 통해 제어되는 PCF8574 (A) 8 비트 포트 확장기 사용이 포함됩니다.

어쨌든, 595 개의 시프트 레지스터에 먼저 시도해 보겠다.

그러나 몇 개의 RGB LED를 제어해야하는 경우보다 전문적인 솔루션을 찾고 싶을 것입니다. 일부 RGB LED에는 자체 WS2812가 제공 됩니다. 이러한 미세 부품은 캐스케이드 연결 (1-Wire 버스) 될 수 있으며 체인 내 위치를 통해 처리됩니다.


3

LED에 관한 것이면 WS2812B LED 스트립 또는 드라이버 칩 자체는 어떻습니까? 하나의 핀만 사용하여 거의 무제한의 LED를 제어 할 수 있습니다!

사람들이 이러한 스트립을 사용하지만, 독립형 LED (Adafruit의 네오 픽셀이라고도 함)로 제공됩니다. 또는 단일 색상 만 구동하는 경우 각 WS2811 칩은 각각 단일 LED에 대해 각 RGB 출력을 사용하여 3 개의 LED를 제어 할 수 있습니다.

최근에 Door1 open / closed, Door2 open / closed, motor1 active, motor2 active and power 등 5 개의 LED를 사용하는 프로젝트를 만들었습니다. "액티브"LED는 활성 모터에서 빨간색으로 입력되고 Arduino 내부에서 녹색으로 활성화 된 플래그이므로 이중 용도입니다.

포인트는 1 핀과 라이브러리가 설치된 상태에서 원하는 수의 LED를 제어 할 수 있음


2

나는이 방법을 스스로 주장하지는 않지만 MUX-DEMUX 웹 페이지 에서이 깔끔한 트릭을 발견했습니다 : CD4051 Parlor Tricks

출력을 구동하거나 입력 (시프트 레지스터, 멀티플렉서 또는 Arduino 핀 자체를 직접 사용하기 위해)을 선택하기 위해 어떤 방법을 사용하든 병렬 회로 쌍을 영리하게 사용하여 출력 또는 입력 수를 두 배로 늘릴 수 있습니다 (듀얼을 형성하기 위해) 입출력 뱅크 ), 각각의 병렬 브랜치에 감각 대향 다이오드를 채용하고, 높은 및 낮은 입력 / 출력을 전환.

출력 방법을 설명하기 위해 (이 경우 LED는 추가 다이오드가 필요하지 않음)

LED 뱅크

이 예에서 LED 쌍을 "뱅크"로 간주하고 LED_0을 밝게하려면 PIN 17을 HIGH로 설정하고 PIN 18을 LOW로 설정해야합니다. (핀 번호는 혼란 스럽지만 나중에 나오는 예제와 일치합니다.) LED_1을 켜려면 PINS를 반대로 바꾸면됩니다. LED의 다이오드 특성은 전류가 반대 방향으로 흐르지 않도록하여 다른 하나를 차단합니다.

입력 방법을 설명하기 위해 (이 경우 CDS는 추가 다이오드가 필요함)

CdS 은행

CdS 광 센서에서 아날로그 판독을 수행하려는 경우 조금 더 복잡해집니다. 먼저 흐름을 제어하기 위해 각 센서에 다이오드를 추가해야합니다. 둘째, 값을 읽고 있기 때문에 입력이 부동 상태가되지 않도록 입력을 높이거나 낮춰야합니다. 게으른 사람이기 때문에 내부 풀업 저항을 사용하여 높이 끌어 올릴 것입니다. CdS_0을 읽으려면 PIN 17 모드를 OUTPUT으로 설정하고 낮음으로 설정하십시오. 이것은 땅을 만든다. 그런 다음 PIN 18 모드를 INPUT으로 설정하고 풀업 저항을 사용하려면 HIGH로 설정하십시오. 이제 PIN 18 (일명 아날로그 핀 4)을 읽도록 설정되었습니다. 다른 센서에 액세스하려면 모드와 출력을 전환하면됩니다.

따라서 CD4051 8 포트 멀티플렉서가있는 경우 Arduino의 5 핀 (일반 3 대신)을 사용하여 16 개의 입력 또는 출력 또는이 둘을 혼합하여 얻을 수 있습니다.

CD4051을 사용한 16 개의 출력 / 입력

마찬가지로 4067 16 포트 멀티플렉서가있는 경우 32 개의 입력 또는 출력 또는이 둘을 혼합하여 얻을 수 있습니다.

스케치의 예는 다음과 같습니다.

/*
 * Example of getting 16 i/o from 5 pins using a CD4051
 *
 * Based on tutorial and code by david c. and tomek n.* for k3 / malmö högskola
 * http://www.arduino.cc/playground/Learning/4051?action=sourceblock&ref=1
 */ 


int selPin[] = { 14, 15, 16 }; // select pins on 4051 (analog A0, A1, A2)
int commonPin[] = { 17, 18};   // common in/out pins (analog A3, A4)
int led[] = {LOW, LOW, LOW, LOW, LOW, LOW, LOW, LOW };  // stores eight LED states
int CdSVal[] = { 0, 0, 0, 0 }; // store last CdS readings
int cnt = 0;  // main loop counter
int persistDelay = 100; // LED ontime in microseconds


void setup(){
  Serial.begin(9600);  // serial comms for troubleshooting (always)
  for(int pin = 0; pin < 3; pin++){ // setup select pins
    pinMode(selPin[pin], OUTPUT);
  } 
}


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


void flashLEDs() {
  for(int pin = 0; pin < 2; pin++) {  // set common pins low
    pinMode(commonPin[pin], OUTPUT);
    digitalWrite(commonPin[pin], LOW);
  } 
  for (int bank = 0; bank < 4; bank++) {
    for(int pin = 0; pin < 3; pin++) { // parse out select pin bits
      int signal = (bank >> pin) & 1;  // shift  & bitwise compare
      digitalWrite(selPin[pin], signal);
    }
    if (led[bank * 2]){        // first LED
      digitalWrite(commonPin[0], HIGH);  // turn common on
      delayMicroseconds(persistDelay);   // leave led lit
      digitalWrite(commonPin[0], LOW);   // turn common off
    } 
    if (led[bank * 2 + 1]){     // repeat for second LED
      digitalWrite(commonPin[1], HIGH);
      delayMicroseconds(persistDelay);
      digitalWrite(commonPin[1], LOW); 
    }
  } 
}

첫 번째 줄에서 말했듯이 MUX-DEMUX 에서 전체 설명을 볼 수 있습니다 . CD4051 Parlor Tricks


1

A의 클래스 프로젝트 I는 7 세그먼트 디스플레이를 구동하기 위해 CD4024과 두 아두 이노 핀을 사용했다.

이 방법에는 몇 가지주의 사항이 있습니다. 예를 들어, high리플 카운터의 첫 번째 출력에 값 을 쓰 reset려면 클럭 핀을 두 번만 토글 해야합니다 . 그러나 high모든 n 핀 에 쓰려면 클럭 핀을 2 n 번 토글해야하며 그 동안 다른 모든 핀은 지속적으로 켜고 꺼집니다.

애플리케이션이 이러한 제한을 처리 할 수 ​​있고 핀이 부족한 경우 다른 옵션입니다.

보너스 답변 : 여기 에 멀티플렉싱 입력의 많은 예가 있으며 , 그중 다수는 멀티플렉싱 출력에도 적용됩니다.


7 단계 카운터를 사용하여 7 세그먼트 디스플레이를 구동하는 것은 자신이 지시 한 이유로 최적이 아닌 접근법으로 보입니다.
jfpoilpret

1

약간의 작업 (다른 부트 로더 설치)을 사용하면 ICSP1 및 JP2 헤더의 Uno에서 추가로 7 개의 I / O 라인을 사용할 수 있습니다. 교체 부트 로더는 HoodLoader2 입니다. 또한 Uno의 Atmega328 및 Atmega16U2에 스케치를 설치할 수 있습니다. 여러 프로세서를 다루는 것이이 방법을 사용하는 주요 합병증이 될 것입니다.

Uno에서 ICSP1 및 JP2 헤더는 Atmega16U2의 PB1 ... PB7 핀에 연결됩니다. 또한 Atmega16U2에는 회로 보드에 연결되지 않은 약 9 개의 I / O 핀이 있습니다. 현미경으로 작업하는 사람은 16U2의 총 18 개 I / O 핀에 와이어를 연결할 수 있지만 다른 3 개의 I / O 핀은 일반 연결에 연결 한 채로 둘 수 있습니다.

HoodLoader2는 메가 보드에서도 작동합니다.


0

여기에는 많은 좋은 답변이 있지만 시간을 내면 Mega를 구입하는 것이 더 저렴하다는 것을 알 수 있습니다.

내 3 / 2-d 가치.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.