포트 확장기를 사용하여 Arduino의 디지털 핀 수를 늘리는 방법 Arduino Shields – 입력/출력 포트를 늘리는 Arduino Arduino용 확장 보드

Arduino 플랫폼의 주요 장점 중 하나는 인기입니다. 인기 있는 플랫폼은 전자 장치 제조업체의 적극적인 지원을 받아 컨트롤러의 기본 기능을 확장하는 다양한 보드의 특별 버전을 출시합니다. 논리적으로 확장 보드(다른 이름: Arduino Shield, Shield)라고 불리는 이러한 보드는 다양한 작업을 수행하는 데 사용되며 Arduino 운영자의 수명을 크게 단순화할 수 있습니다. 이 기사에서는 Arduino 확장 보드가 무엇인지, 모터(모터 드라이버 실드), LCD 화면(LCD 실드), SD 카드(데이터 로거), 센서 등 다양한 Arduino 장치와 함께 작동하는 데 이를 사용하는 방법을 알아봅니다. (센서 쉴드) 및 기타 여러 가지.

먼저 용어를 이해해 봅시다. Arduino 확장 보드는 특정 기능을 수행하도록 설계된 완전한 장치이며 표준 커넥터를 사용하여 메인 컨트롤러에 연결됩니다. 확장 보드의 또 다른 유명한 이름은 영어 Arduino 쉴드 또는 간단히 쉴드입니다. 필요한 모든 전자 부품은 확장 보드에 설치되며 마이크로컨트롤러 및 메인 보드의 기타 요소와의 상호 작용은 표준 Arduino 핀을 통해 이루어집니다. 대부분의 경우 쉴드에 대한 전원은 메인 Arduino 보드에서도 공급되지만, 대부분의 경우 다른 소스에서 전원을 공급할 수도 있습니다. 모든 쉴드에는 다른 구성 요소를 연결하여 재량에 따라 사용할 수 있는 여러 개의 무료 핀이 있습니다.

영어 단어 Shield는 방패, 스크린, 스크린으로 번역됩니다. 우리의 맥락에서 이는 컨트롤러 보드를 덮고 장치의 추가 레이어를 생성하는 것으로 이해되어야 하며 그 뒤에는 다양한 요소가 숨겨져 있습니다.

왜 Arduino 쉴드가 필요한가요?

모든 것이 매우 간단합니다. 1) 시간을 절약하고 2) 누군가가 이를 통해 돈을 벌 수 있습니다. 이미 조립되어 바로 사용할 수 있는 것을 설계, 배치, 납땜 및 디버깅하는 데 왜 시간을 낭비합니까? 고품질 장비에 조립된 잘 설계된 확장 카드는 일반적으로 더 안정적이며 최종 장치에서 더 적은 공간을 차지합니다. 이는 자체 조립을 완전히 포기해야 함을 의미하지 않으며 특정 요소의 작동 원리를 이해할 필요가 없습니다. 결국, 실제 엔지니어는 항상 자신이 사용하는 것이 어떻게 작동하는지 이해하려고 노력합니다. 하지만 매번 바퀴를 재발명하지 않고 이전에 소수의 사람들이 해결한 문제에 주의를 집중한다면 우리는 더 복잡한 장치를 만들 수 있을 것입니다.

당연히 기회에 대한 대가를 지불해야 합니다. 거의 항상 최종 보호막의 비용은 개별 구성 요소의 가격보다 높습니다. 유사한 옵션을 더 저렴하게 만들 수 있습니다. 그러나 여기에서 지출된 시간이나 돈이 얼마나 중요한지 결정하는 것은 귀하에게 달려 있습니다. 중국 산업의 가능한 모든 지원을 고려하면 보드 비용이 지속적으로 감소하므로 기성 장치를 사용하는 것이 가장 자주 선택됩니다.

가장 널리 사용되는 실드의 예로는 센서, 모터, LCD 화면, SD 카드, 네트워크 및 GPS 실드와 함께 작동하기 위한 확장 보드, 부하 연결용 릴레이가 내장된 실드가 있습니다.

Arduino Shield 연결

쉴드를 연결하려면 메인 보드에 조심스럽게 "놓기"만 하면 됩니다. 일반적으로 빗형 실드(수)의 접점은 Arduino 보드의 커넥터에 쉽게 삽입됩니다. 어떤 경우에는 보드 자체가 제대로 납땜되지 않은 경우 핀을 조심스럽게 조정해야 합니다. 여기서 가장 중요한 것은 조심스럽게 행동하고 과도한 힘을 사용하지 않는 것입니다.

일반적으로 쉴드는 매우 특정 버전의 컨트롤러용으로 설계되었지만 예를 들어 Arduino Uno용 많은 쉴드는 Arduino Mega 보드와 매우 잘 작동합니다. 메가의 핀아웃은 처음 14개의 디지털 핀과 보드 반대편의 핀이 UNO의 핀아웃과 일치하도록 만들어져 있어 Arduino 실드를 쉽게 삽입할 수 있습니다.

Arduino Shield 프로그래밍

확장 보드를 사용하여 회로를 프로그래밍하는 것은 일반 Arduino 프로그래밍과 다르지 않습니다. 컨트롤러의 관점에서 보면 장치를 일반 핀에 연결하기만 하면 되기 때문입니다. 스케치에서 보드의 해당 접점에 실드에 연결된 핀을 표시해야 합니다. 일반적으로 제조업체는 실드 자체 또는 별도의 연결 지침에 핀의 대응을 표시합니다. 보드 제조업체에서 자체적으로 권장하는 스케치를 다운로드하면 이 작업을 수행할 필요도 없습니다.

쉴드 신호를 읽거나 쓰는 것도 일반적인 방법으로 수행됩니다. 즉, 모든 Arduino 사용자에게 친숙한 기능 및 기타 명령을 사용합니다. 경우에 따라 특정 연결 방식에 익숙하고 제조업체가 다른 연결 방식을 선택한 경우 충돌이 발생할 수 있습니다(예: 버튼을 접지로 당기고 실드를 전원 공급 장치로 당김). 여기서는 조심하면 됩니다.

일반적으로 이 확장 보드는 Arduino 키트에 포함되어 있으므로 Arduino 엔지니어가 가장 자주 접하는 것은 바로 이 확장 보드입니다. 실드는 매우 간단합니다. 주요 임무는 Arduino 보드에 연결하기 위한 보다 편리한 옵션을 제공하는 것입니다. 이는 보드에 있는 각 아날로그 및 디지털 핀에 대한 추가 전원 및 접지 커넥터를 통해 수행됩니다. 또한 보드에는 외부 전원 연결용 커넥터(스위치에 점퍼를 설치해야 함), LED 및 재시작 버튼이 있습니다. 실드 옵션과 사용 예는 그림에서 확인할 수 있습니다.




터치 확장 보드에는 여러 버전이 있습니다. 커넥터 수와 유형이 모두 다릅니다. 오늘날 가장 인기 있는 버전은 Sensor Shield v4 및 v5입니다.

이 Arduino 쉴드는 로봇 프로젝트에서 매우 중요합니다. 왜냐하면... 일반 모터와 서보 모터를 아두이노 보드에 한 번에 연결할 수 있습니다. 실드의 주요 임무는 일반 Arduino 보드에 충분히 높은 전류를 소비하는 장치를 제어하는 ​​것입니다. 보드의 추가 기능은 모터 전력을 제어하고(PWM 사용) 회전 방향을 변경하는 기능입니다. 모터 쉴드 보드에는 다양한 유형이 있습니다. 이들 모두의 공통점은 외부 부하가 연결되는 강력한 트랜지스터, 방열판 요소(일반적으로 라디에이터), 외부 전원 연결용 회로, 모터 연결용 커넥터 및 연결용 핀이 회로에 존재한다는 것입니다. 아두이노.



네트워크로 작업을 구성하는 것은 현대 프로젝트에서 가장 중요한 작업 중 하나입니다. 이더넷을 통해 로컬 네트워크에 연결하는 데 해당 확장 카드를 사용할 수 있습니다.




프로토타이핑용 확장 보드

이 보드는 매우 간단합니다. 장착 요소용 접촉 패드, 재설정 버튼 및 외부 전원 연결 기능이 있습니다. 이러한 실드의 목적은 필요한 모든 구성 요소가 메인 보드 바로 위에 위치할 때 장치의 소형화를 높이는 것입니다.





Arduino LCD 쉴드 및 TFT 쉴드

이 유형의 실드는 Arduino의 LCD 화면에서 작동하는 데 사용됩니다. 아시다시피 가장 단순한 2줄 텍스트 화면을 연결하는 것은 결코 쉬운 일이 아닙니다. 전원 공급 장치를 계산하지 않고 한 번에 6개의 화면 접점을 올바르게 연결해야 합니다. 완성된 모듈을 Arduino 보드에 삽입하고 해당 스케치를 업로드하는 것이 훨씬 쉽습니다. 인기 있는 LCD Keypad Shield에서는 4~8개의 버튼이 보드에 즉시 설치되므로 장치 사용자를 위한 외부 인터페이스를 즉시 구성할 수 있습니다. TFT Shield도 도움이 됩니다.



Arduino 데이터 로거 쉴드

제품에서 독립적으로 구현하기 매우 어려운 또 다른 작업은 센서에서 수신한 데이터를 시간 참조와 함께 저장하는 것입니다. 완성된 실드는 내장된 시계에서 데이터를 저장하고 시간을 얻을 수 있을 뿐만 아니라 납땜이나 회로 기판에 편리한 형태로 센서를 연결할 수 있습니다.




간단한 요약

이 기사에서는 Arduino의 기능을 확장하는 다양한 장치 중 극히 일부만 살펴보았습니다. 확장 카드를 사용하면 가장 중요한 것, 즉 프로그램의 논리에 집중할 수 있습니다. 쉴드 제작자는 정확하고 안정적인 설치와 필요한 전원 공급 장치를 제공했습니다. 이제 남은 것은 소중한 영단어 쉴드를 이용하여 필요한 보드를 찾아 아두이노에 연결하고 스케치를 업로드하는 것 뿐입니다. 일반적으로 모든 쉴드 프로그래밍은 기성 프로그램의 내부 변수 이름을 바꾸는 간단한 작업을 수행하는 것으로 구성됩니다. 결과적으로 사용과 연결이 간편할 뿐 아니라 완성된 장치나 프로토타입의 조립 속도도 빨라졌습니다.

확장 카드 사용의 단점은 비용이 많이 들고 그 특성상 쉴드의 보편성으로 인해 효율성이 저하될 수 있다는 것입니다. 좁은 작업이나 최종 장치의 경우 모든 쉴드 기능이 필요하지 않을 수 있습니다. 이 경우 프로토타입 제작 및 테스트 단계에서만 쉴드를 사용해야 하며, 장치의 최종 버전을 만들 때는 자체 회로 및 레이아웃 유형을 갖춘 디자인으로 교체하는 것을 고려하십시오. 결정하는 것은 귀하에게 달려 있으며 올바른 선택을 할 수 있는 모든 기회가 있습니다.

모두가 저렴한 Arduino 보드를 좋아하지만 프로젝트에는 하나 또는 두 개의 무료 포트만 필요한 경우가 많습니다. 때로는 포트가 충분하지만 구조의 다른 부분에 많은 전선을 연결하고 싶지 않은 경우도 있습니다. 장치의 전면 패널에 여러 개의 버튼과 LED를 배치해야 한다고 가정해 보겠습니다. 케이블이나 하네스보다는 데이터 버스 선 2개만으로 메인보드에 연결하는 것이 더 안정적이고 쉽죠?

이러한 상황을 위해 다양한 Arduino 포트 확장기가 설계되었습니다.

일반적으로 마이크로 컨트롤러 핀은 여러 가지 기능을 구현하므로 다양한 확장기가 있습니다.

  1. 표준 GPIO 포트 확장기
  2. PWM 출력 확장기
  3. 아날로그 입력 확장기 – 멀티플렉서 및 외부 ADC

이와 별도로 DAC(디지털-아날로그 변환기) 및 I2C 버스의 주소 공간 확장기에 대해 언급할 가치가 있습니다. 이러한 장치는 포트 기능을 직접 복제하지 않지만 마이크로 컨트롤러의 기능을 확장합니다.

시리즈의 첫 번째 기사에서는 디지털 I/O 포트로 작동하는 가장 간단하고 유용한 확장기에 대해 설명합니다. 이것은 미세 회로와 . 이들은 완전히 동일하게 설계되고 작동하며 포트 수만 다릅니다.

Arduino용 확장 모듈 선택

가장 인기 있고 저렴한 모듈은 PCF8574 칩에서 만들어졌습니다(그림 1).

쌀. 1. 널리 사용되는 PCF8574 포트 확장 모듈

장점:
  • 저렴한 가격.
  • 한 모듈의 플러그를 이전 모듈의 소켓에 삽입하기만 하면 모듈을 체인으로 연결할 수 있습니다. 점퍼를 다른 모듈 주소로 설정하는 것을 잊지 마십시오!
결점:
  • 브레드보드에 직접 삽입할 수 없습니다(포트 커넥터를 반대쪽에 납땜하는 것이 좋습니다).
  • 하나의 모듈에 총 8개의 포트가 있습니다.

좀 더 진지한 프로젝트를 원하신다면 Aliexpress에서 16비트 PCF8575 모듈을 주문하세요. 나는 그림에 표시된 모듈을 강력히 추천합니다. 2.

쌀. 2. PCF8575 포트 확장 모듈

장점:
  • 포트가 2배 더 많습니다.
  • 3.3V 전원 공급 장치가 내장되어 있어 다른 모듈에 전원을 공급할 수 있습니다.
  • 다양한 공급 전압에서 I2C 버스에 대한 논리 레벨 매칭이 내장되어 있습니다.
  • 프로토타이핑 보드에 편리한 형식입니다.
결점:
  • 더 높은 가격.

PCF8574/PCF8575 GPIO 포트 확장기의 작동 원리

데이터 교환은 I2C 버스를 통해 이루어집니다. Arduino 보드에 연결하려면 전원을 포함해 4개의 전선만 필요합니다. 확장기 주소는 입력 A0...A2의 3개 점퍼로 설정되므로 8개의 동일한 칩을 버스에 동시에 연결할 수 있으며 PCF8574를 사용하면 최대 8*8=64개의 추가 포트를 얻을 수 있고 PCF8575 칩을 사용하면 8*16=128을 얻을 수 있습니다. .

포트에 데이터를 출력하려면 I2C 버스의 모듈 주소에 데이터 바이트를 씁니다. 포트에서 데이터를 읽으려면 동일한 주소에서 바이트를 읽으십시오. 바이트는 항상 전체적으로 쓰여지고 읽혀집니다. 개별 비트는 프로그래밍 방식으로 처리됩니다.

마이크로 회로의 출력도 입력이며 출력의 목적을 결정하는 서비스 레지스터가 없습니다. 출력 바이트가 기록되는 래치 레지스터만 있습니다.이것이 어떻게 가능한지?

포트는 유사한 오픈 컬렉터 방식으로 작동하며 내부 풀업 저항기가 장착되어 있습니다. 출력에 논리 0이 기록되면 출력 트랜지스터가 열리고 출력이 강제로 접지됩니다. 해당 포트에서 읽으면 항상 0이 반환됩니다.

낮은 핀에 직접 공급 전압을 인가하거나 전류가 초과되는 경우 주의하십시오. 50mA당신은 칩을 망칠 것입니다!

포트를 입력으로 사용하려면 포트에 1을 쓰십시오. 이 경우 내부 트랜지스터는 꺼지고 핀에 적용된 외부 로직 레벨에 따라 판독 결과가 결정됩니다. 프리 핀은 내장 저항을 통해 전원 공급 장치에 연결됩니다.

포트 중 일부를 입력으로, 일부를 출력으로 동시에 사용하려면 확장기에 데이터 바이트를 쓰기 전에 "논리적"을 사용하여 입력에 해당하는 비트에 1의 마스크를 적용해야 합니다. OR' 동작을 수행합니다. 그게 다야)))

인터럽트 생성

PCF857* 포트 확장기가 인터럽트 펄스를 생성함 낮은 수준마이크로 회로의 모든 입력에서 입력 신호의 변경에 대해 INT 출력에서. 확장기가 키패드 역할을 하는 경우 편리합니다. 그러나 어떤 버튼이 눌렸거나 해제되었는지 인터럽트 핸들러에서 직접 결정해야 합니다. 인터럽트 발생기에는 접점 바운스 억제 필터가 장착되어 있습니다.

예 1: PCF8574 모듈 사용

4개의 LED, PCF8574 모듈 및 Arduino 보드로 구성된 간단한 회로를 조립해 보겠습니다(그림 3 및 4). 이 연결 방식을 사용하면 LED용 퀀칭 저항도 필요하지 않습니다. 전류는 LED와 전원 레일에 연결된 내장 저항기를 통해 흐릅니다.

쌀. 3. PCF8574 모듈 연결 다이어그램

쌀. 4. PCF8574 모듈을 사용한 회로 레이아웃

스케치 1을 복사하여 Arduino 보드에 작성합니다.

// 버스의 모듈 주소(A0, A1, A2 = 0) int address = 0x38; // 모듈에서 읽은 데이터 uint8_t dataReceive; // 모듈에 쓸 데이터 uint8_t dataSend; void setup() ( Wire.begin(); Serial.begin(9600); // 모든 포트에 대한 상위 레벨 PCF8574 dataSend = B11111111; pcf8574_write(dataSend); ) void loop() ( // 모듈에서 바이트 읽기 dataReceive = pcf8574_read (); // 바이너리 형식으로 모니터에 출력 Serial.println(dataReceive, BIN) // 니블만큼 비트를 왼쪽으로 이동 dataSend = dataReceive<< 4; // Накладываем битовую маску dataSend |= B00001111; // Записываем байт в модуль pcf8574_write(dataSend); delay(500); } // Процедура записи байта в модуль void pcf8574_write(uint8_t dt) { Wire.beginTransmission(address); Wire.write(dt); Wire.endTransmission(); } // Процедура чтения байта из модуля int8_t pcf8574_read() { Wire.beginTransmission(address); Wire.endTransmission(); Wire.requestFrom(address, 1); return (Wire.read()); }

처음에는 칩의 모든 포트에 높은 레벨이 기록되므로 포트 P0...P3이 입력으로 작동할 수 있습니다.

포트 핀의 레벨은 500ms마다 판독되고 판독 결과가 모니터에 표시됩니다. 입력 P0...P3 중 하나를 공통 와이어에 연결하면 해당 비트에 0이 나타납니다. 그런 다음 읽은 값이 4비트만큼 왼쪽으로 이동하고 결과가 포트에 출력되고 LED 중 하나가 꺼집니다. 예를 들어, 핀 P0에서 0을 읽으면 핀 P4에 연결된 LED가 꺼집니다.

확장기에 쓸 때마다 입력되어야 하는 모든 비트에 1의 비트마스크를 적용해야 한다는 점에 유의하십시오. dataSend |= B00001111;

I2C 버스 작업 루틴은 매우 단순화되어 오류가 처리되지 않습니다.

조언: I2C 버스에서 모듈 주소를 찾고 확인하려면 를 사용할 수 있습니다. 버스 요청에 응답하는 모든 장치의 주소를 터미널에 표시합니다.

예 2: PCF8575 모듈 사용

PCF8575 모듈의 특징은 16개의 포트를 가지고 있다는 점입니다. 항상 2바이트를 쓰고 2바이트를 읽습니다.. 두 번째 바이트가 필요하지 않은 경우에도 이 규칙을 따라야 합니다.

다이어그램을 조금 변경해 보겠습니다. LED를 포트 P10…P13에 연결하고 점퍼를 사용하여 포트 P00…P03을 공통 와이어에 연결합니다(그림 5 및 6).

쌀. 5. PCF8575 모듈 연결 다이어그램

쌀. 6. PCF8575 모듈을 사용한 회로 레이아웃

스케치 2에서는 먼저 모든 포트에 1이 기록된 다음 해당 상태가 500ms마다 읽혀집니다. 읽기 루틴은 바이트로 나누어진 16비트 워드를 반환합니다. 하위 바이트(핀 P00...P07)의 내용은 상위 바이트에 복사되어 모듈에 다시 업로드됩니다. 핀 P00...P03 중 하나를 공통 와이어에 연결하면 P10...P13에 연결된 LED 중 하나가 꺼집니다.

// I2C 작업을 위한 라이브러리 #include // 기본적으로 버스의 모듈 주소 int address = 0x20; // 모듈 uint8_t에서 읽은 데이터 hi, lo; uint16_t 데이터수신; uint8_t dataHighByte; // 상위 바이트(P10...P17) uint8_t dataLowByte; // 하위 바이트(P00...P07) void setup() ( Wire.begin(); Serial.begin(9600); // 모든 포트에 대한 상위 레벨 PCF8575 dataHighByte = B11111111; dataLowByte = B11111111; pcf8575_write(dataLowByte, dataHighByte ); ) void loop() ( // 모듈에서 바이트를 읽습니다. dataReceive = pcf8575_read(); // 바이너리 형식으로 모니터에 출력합니다. Serial.println(dataReceive, BIN); // 긴 단어에서 하위 바이트를 선택합니다. dataLowByte = lowByte(dataReceive) ); // 하위 바이트를 상위 바이트에 복사 dataHighByte; // 하위 바이트에 마스크 적용 dataLowByte |= B11111111; // 모듈에 새 데이터 쓰기 pcf8575_write(dataLowByte, dataHighByte) ); / 모듈에 바이트를 쓰는 절차 void pcf8575_write(uint8_t dtl, int8_t dth) ( Wire.beginTransmission(address); Wire.write(dtl); // 하위 바이트 쓰기(P00...P07) Wire .write(dth); / / 상위 바이트 쓰기(P10...P17) Wire.endTransmission(); // 모듈에서 바이트를 읽는 절차 int16_t pcf8575_read() ( Wire.beginTransmission(address); Wire.endTransmission(); Wire.requestFrom(주소, 2); lo = Wire.read(); // 하위 바이트(P00...P07) 읽기 hi = Wire.read(); // 상위 바이트(P10...P17) 읽기 return (word(hi, lo)); // 긴 단어를 반환합니다 )

PCF8574/PCF8575용 Arduino 라이브러리

라이브러리는 GitHub에서 다운로드할 수 있습니다. 그러나 보시다시피 포트 확장기로 작업하는 것은 매우 간단하며 특별한 라이브러리 없이도 쉽게 수행할 수 있습니다.

새 기사

● 5.4. MCP23017 칩을 사용하는 NodeMCU ESP8266용 디지털 포트 확장

Nodemcu 모듈을 스마트홈 컨트롤러로 사용할 때 LED 표시와 소리 알람을 소개하겠습니다. Nodemcu 모듈의 핀 수는 Arduino Mega보다 훨씬 적으므로 MCP23017 입력 확장 칩이 필요합니다. MCP23017 칩은 입력과 출력 모두로 구성할 수 있는 16개의 포트를 추가합니다(그림 5.7). 이 칩은 널리 사용되는 2선 I2C 버스를 사용합니다.

쌀. 5.7. MCP23017 칩의 핀아웃

I2C 프로토콜용 MCP23017 마이크로 회로의 주소는 디지털 입력 A0 - A2(그림 5.8)의 신호 조합으로 설정할 수 있으며, 이를 통해 8개의 MCP23017 마이크로 회로를 각각 마이크로 컨트롤러에 동시에 연결할 수 있습니다(16 * 8 =). 연락처 128개.

쌀. 5.8. MCP23017 칩의 주소 설정

칩에는 포트 A(GPA0-GPA7) 및 B(GPB0-GPAB)의 2개 뱅크가 있으며, 각 포트는 입력 또는 출력용으로 구성될 수 있습니다.
목록 5.3에서. 핀 뱅크 A와 B를 설정한 예를 보여줍니다.

목록 5.3

// Wire.h 라이브러리 연결 #포함하다 바이트 입력=0 ; 무효 설정()( Serial.begin(9600 ); Wire.begin(0 ,2 ); // I2C 시작 Wire.beginTransmission(0x20 ); // i2c - 주소 (A0-0,A1-0,A2-0) Wire.write(0x00); // 아이오디라 레지스터 Wire.write(0x00 ); // PORT A를 출력으로 설정 Wire.endTransmission(); ) 무효 루프(){ // 포트 B에서 데이터를 읽습니다. Wire.beginTransmission(0x20); Wire.write(0x13); Wire.endTransmission(); Wire.requestFrom(0x20 , 1 ); 입력=Wire.read(); // 수신된 데이터를 PORT A에 씁니다. Wire.beginTransmission(0x20); Wire.write(0x12); // 포트 A 주소 Wire.write(input); // 포트 A Wire.endTransmission(); 지연(100); // 정지시키다)

MCP23017 마이크로 회로를 사용하면 Nodemcu 모듈의 디지털 접점 수가 16개까지 확장되고 중요한 센서 매개변수의 LED 표시 및 사운드 신호를 구성할 수 있습니다.

이미 그랬듯이 Arduino용으로 겹치지 않는 세 개의 센서 세트를 주문했습니다. 두 세트 모두에서 당분간 상자에 남아 있던 74HC595 마이크로 회로를 받았습니다. 한동안 나는 그것이 어떤 종류의 미세 회로인지, 이 검은 바퀴벌레에 어떻게 라벨이 붙었는지조차 몰랐습니다.

그러나 스테퍼 모터를 테스트하기 위한 장치를 만드는 동안 Arduino Nano의 출력 신호를 충분히 얻을 수 없는 어두운 날이 왔습니다. (해야 할 일: 준비가 되면 SD 테스터에 관한 기사 링크를 삽입하세요). 결과적으로 스테퍼 모터를 테스트하기 위한 장치는 매우 복잡한 것으로 나타났습니다. 전 기능 4x4 키보드로 제어되는 메뉴 시스템이 있는 2라인 1602 디스플레이, 스테퍼 모터의 마이크로스테핑 값을 설정하기 위한 3개의 디지털 숫자, Step 스테퍼 모터 등의 Dir 신호 이제 다른 버전의 Arduino로 마이그레이션할 때가 된 것 같습니다. 그러나 나의 자연스러운 게으름은 이러한 마이그레이션에 반대했습니다. 그리고 게으른 머리는 해결책을 찾기 시작했습니다.

이미 존재하는 것을 기반으로 솔루션을 찾기로 결정했습니다. 키트에서 스카프와 부품을 분류하는 동안 16핀 검정색 "딱정벌레"를 발견했습니다. 먼저 한 세트로, 그 다음에는 다른 세트로. 이게 어떤 부분인지, 왜 세트에 추가됐는지 물어보기로 했어요. 왜 키트에 넣었는지는 모르겠지만 NXP 웹사이트에서 칩 자체를 발견했습니다.

이것은 직렬 입력과 병렬 출력을 갖춘 시프트 레지스터라는 다소 흥미로운 마이크로 회로라는 것이 밝혀졌습니다.

(데이터 시트에서)

핀 설명

연락하다 이름 설명 및 연결
10 ~씨 마스터 리셋- 재설정, 활성 레벨이 낮습니다. 이상적으로는 먼저 이 입력을 낮게 구동한 다음 단일 상태로 구동하는 재설정 회로를 만드는 것이 좋습니다. 하지만 굳이 +5V에 연결할 필요는 없습니다. 이 경우 첫 번째 레코드 이전의 출력에는 임의의 값이 포함됩니다.
13 ~OE 출력 활성화- 출력 해상도, 활성 레벨이 낮습니다. 0이 적용되면 레지스터의 내용이 출력에 제공되고, 1이 적용되면 출력이 꺼지고 Z 상태로 전환되어 서로 다른 장치가 하나의 버스를 교대로 사용할 수 있습니다. 출력 상태를 제어할 필요가 없으면 접지에 연결하십시오.
14 D.S. 직렬 데이터 입력- 직렬 입력. 이 입력은 SHCP 시프트 클럭이 적용되기 전에 입력 신호 값으로 설정되어야 합니다.
11 SHCP 시프트 레지스터 입력 클럭- 시프트 레지스터의 클럭 입력. 비트를 레지스터로 이동하려면 0에서 1로의 전환을 적용해야 합니다. 언제 0으로 돌아갈지는 귀하의 재량에 달려 있습니다. 즉시 가능합니다. 입주 직전에 가능합니다. 첫 번째 경우에는 직접 신호의 가장자리를 따라 전환이 발생하고 두 번째 경우에는 역 신호의 감소를 따라 전환이 발생한다고 가정할 수 있습니다. 아래 성능 참고 사항도 참조하세요. 또한 이 신호가 도착하면 직렬 출력 Q7/S의 값이 변경됩니다.
12 STCP 저장 레지스터 클록 입력- 래치 레지스터의 클럭 입력. 이 펄스의 에지에서 값은 시프트 레지스터에서 병렬 출력 Q0-Q7로 전송됩니다.
9 Q7S 직렬 데이터 출력- 직렬 출력. 시프트 레지스터의 최상위 비트 값이 표시됩니다. 이 출력은 시프트 레지스터를 16비트, 24비트 등으로 스케일링하는 데 사용할 수 있습니다. 계획
15, 1-7 Q0, Q1-7 래치 레지스터 출력. STCP 신호가 도착하면 신호가 내부 시프트 레지스터에서 전송됩니다.
8 접지 영양물 섭취- 공통선
16 VCC 영양물 섭취 - +

영양물 섭취

마이크로 회로의 HC 버전에는 2V ~ 6V 전원 공급 장치가 필요하고 HCT 버전(TTL 호환)은 4.5V ~ 5.5V가 필요합니다. HCT - TTL - 아직도 사용되나요? Arduino는 CMOS 자체인 것처럼 보이므로 HCT가 필요하지 않지만 외부 TTL 소비자와 레벨을 조정해야 하는 경우 3.3V에서 HC에 전원을 공급할 수 있으며 신호 레벨은 TTL과 호환됩니다. 일반적으로 HC와 HCT는 모두 5V Arduino에서 작동해야 합니다. 이것이 그들이 인터넷에 쓴 글입니다.

더 중요한 것은 차단 커패시터입니다. 이것이 없으면 회로가 의도한 대로 작동하지 않을 수 있으며, 더욱이 예측이 불가능할 수도 있습니다. 이론적으로 각 케이스의 전원 회로에는 0.1μF 커패시터를 설치해야 합니다. 이 용량 값은 인터넷에서 평균으로 계산했습니다. 내 계획은 그 사람 없이도 잘 작동했습니다. 명확히 하기 위해 나는 회로 설계자의 바이블에 들어갔습니다. Hill과 Horowitz, "The Art of Circuit Design"은 Donald Knutt의 "The Art of Programing"과 거의 비슷하지만 하드웨어 사용자에게만 해당됩니다(그런데 Hill과 Horowitz는 Knutt는 사람들에게 훨씬 더 가깝습니다. 그는 너무 영리합니다. 그러나 여기서는 차단 커패시터를 입력의 디커플링 커패시터라고 부르는 것 같습니다. 안타깝고 좋은 책이지만 이미 시대에 뒤떨어진 책입니다. 나는 90년대 후반 또는 0년대 초반의 두 번째 또는 세 번째 러시아어 버전을 가지고 있는데, 원본은 아마도 여전히 10년 더 오래되었을 것입니다. 세 번째, 분홍색 볼륨에서 나는 "14 루블"이라는 스티커를 발견했습니다. 현대 표준에 따르면 당시 모든 것이 얼마나 저렴했는지입니다. 그러나 불과 15년 남짓의 시간이 흘렀습니다. 향수가 압도적이었습니다.

성능

데이터 시트 74HC595의 제목에는 100MHz에서 작동한다고 기록되어 있습니다. 데이터시트 그래프와 표를 잠깐 살펴보면 4.5V 전원 공급 장치를 사용할 때 -40C ~ +85C의 온도 범위에서 가장 긴 타이밍이 10-20ns(100-50MHz)임을 알 수 있습니다. Arduino가 작동하는 주파수를 사용하면 다른 것을 알 필요가 없습니다. 표준 라이브러리 digitalRead/digitalWrite는 다양한 검사로 인해 큰 브레이크가 될 수 있으며 더 빠른 버전으로 다시 작성될 수 있습니다(그리고 그래야 합니다). 이에 대해 좀 더 자세히 알아보고 글을 쓸 계획이 있지만 지금은 특별한 필요 사항이 없습니다.

내 관찰에 따르면 출력 전환 및 입력 처리 속도 측면에서 Arduino Nano 및 Arduino 라이브러리의 성능은 몇 킬로헤르츠에서 수십 킬로헤르츠의 중간 정도입니다. 따라서 제 생각에는 74HC595 시프트 레지스터를 제어하는 ​​코드를 작성할 때 제어 신호 설정 시 지연에 대해 걱정할 필요가 없습니다.

또 다른 점은 8비트 직렬 확장기의 경우 Arduino에서 사용할 수 있는 최대 출력 스위칭 주파수를 나누어 DS를 설정하고 SHCP를 1로 설정하고 SHCP를 0으로 재설정 - 8회, STCP를 설정/재설정해야 한다는 것입니다. 한눈에 보면 총 3 * 8 + 2 = 26개의 digitalWrite 작업입니다. 전체적으로 Arduino 자체가 수행할 수 있는 것보다 약 25배 느린 것으로 나타났습니다.

16, 24 또는 32개의 출력으로 확장할 때 감속은 각각 약 3*16 + 2 = 50, 3*24 + 2 = 74 및 3*32 + 2 = 98배입니다.

분명히 이러한 74HC595 시프트 레지스터 확장기는 매우 빠른 것을 제어하는 ​​데 적합하지 않지만 일부 애플리케이션에서는 거의 변경되지 않는 정적 신호를 설정하는 데 매우 적합합니다. 그래서 예를 들어 스테퍼 모터용 테스터에서 DRV8825 스테퍼 모터 드라이버의 마이크로스텝 모드를 설정하기 위해 이러한 확장기를 사용하여 3비트 마이크로스텝 모드를 설정했습니다. 그건 그렇고, 이것은 아직 나에게 특히 유용하지 않았습니다. 도트 매트릭스 프린터의 스테퍼는 적어도 DRV8825 드라이버의 제어하에 마이크로 스테핑 모드에서 끔찍하게 작동합니다. 예를 들어 마이크로 스테핑 모드에서는 단계의 1/2 절반이 어떻게 든 부진하고 불확실한 나머지 후반만이 낙관적이고 강력하다. 따라서 마이크로스텝을 사용할 때 스테퍼 모터 축에 약간의 힘을 가해도 전반 단계를 건너뛰기 시작했습니다. 그 이후에는 어떻게든 기존 프린터 SD에 남아 있는 마이크로스테핑 모드를 탐색하지 않았습니다.

스케일링

74HC595를 기반으로 하는 Arduino 출력 확장기는 8비트 버전에서 모든 용량의 회로로 아주 간단하게 변환할 수 있습니다. 이를 위해서는 낮은 레지스터 Q7S의 직렬 출력이 상위 레지스터의 DS 입력에 연결되어야 하며 SHCP 및 STCP 라인은 병렬로 연결되어야 합니다. 글쎄, 채택된 회로 및 소프트웨어 솔루션에 따라 ~MR 및 ~OE 라인을 연결하는 방법을 선택해야 합니다.

입력 확장

Arduino의 입력 라인 확장은 출력에서 ​​DS 값을 설정할 필요가 없지만 입력에서 읽고 74HC597 유형 칩을 사용한다는 사실을 고려하면 원칙적으로 출력 확장과 유사합니다. 그러나 아직 실제로 이것을 테스트해 본 적은 없습니다.

멀티플렉싱

두 가지 방법으로 Arduino가 제어하는 ​​출력 라인 수를 늘릴 수 있습니다. 1) 하나의 직렬 출력의 비트 용량을 늘리십시오. 즉, 비트 용량을 2배, 3배 또는 4배 늘리면 이에 따라 확장기의 속도가 2배 감소합니다. , 서너 번; 2) 각 확장기에 하나의 추가 출력을 사용하면서 여러 확장기를 병렬 연결하면 허용 가능한 수준에서 성능을 유지할 수 있지만 각 확장기에 대해 최소 하나의 Arduino 출력을 사용해야 합니다.

Arduino를 사용하여 레지스터 신호 74HC595 - ~MR, ~OE를 직접 제어하지 않는 경우 3개의 Arduino 출력만으로 시프트 레지스터 신호 DS, SHCP 및 STCP를 제어하여 8개 또는 16개 이상의 출력 신호로 변환할 수 있습니다. 74HC595 칩을 사용합니다.

74HC595를 기반으로 여러 확장기를 다중화하려면 두 가지 방법으로 이동할 수 있습니다. 1) 각 신호 확장기에 대해 별도의 래치 신호를 선택합니다. 버스의 모든 레지스터는 들어오는 데이터를 병렬로 이동하고 그에 따라 내부 시프트 레지스터의 출력에서 ​​값을 이동하지만 하나만 내부 시프트 레지스터의 값을 마이크로 회로의 출력으로 전송합니다. 2) 변속 신호는 확장기 중 하나로만 전송되며, 출력으로의 신호 값 전송은 모든 확장 모듈에서 동시에 발생합니다.

내부 시프트 레지스터에 원하는 것이 무엇이든 포함될 수 있고(옵션 1) 이전 값 중 일부가 출력에 고정되어 있을 때 이 옵션을 사용하는 경향이 더 크며 그 이유는 다음과 같습니다. 내부 시프트에서 값을 전송할 때 레지스터를 출력에 등록하면 내부 레지스터와 출력의 초기 값이 동일하더라도 0에서 1로 및 그 반대로 제어되지 않은 전환이 발생할 수 있으며 일종의 신호 바운스가 발생할 수 있습니다. 그리고 내 생각에는 내부 시프트 레지스터의 상태를 74HC595의 출력으로 전송하는 작업을 가능한 한 적게 사용해야 한다고 생각합니다.

소프트웨어 지원

이 확장 및 유사한 확장에 대한 소프트웨어 지원은 사용된 Arduino 컨트롤러의 digitalRead/digitalWrite를 사용하여 특정 핀을 통해 직접 장치에 액세스하는 것이 아니라 추상 I/O 장치의 핀을 통해 연결되어 초기화될 수 있는 것으로 구성됩니다. 특정 유형의 Arduino 및 다른 유사한 추상 장치.

13개의 디지털 라인과 6개의 아날로그 입력은 Arduino가 입력/출력 기능으로 제공하는 전부입니다. 그러나 어떤 경우에는(특히 주변 장치 수가 많은 프로젝트에서) 이러한 포트 라인 세트로는 충분하지 않습니다.



이와 관련하여, 입출력 라인 수를 확장하는 것이 타당성에 대한 의문이 제기됩니다. 이 자료에서는 MCP23017 칩을 사용한 확장의 예를 보여줍니다.


6개의 아날로그 핀을 다음과 같은 방식으로 디지털 I/O 핀으로 사용할 수도 있다는 것을 알 수 있습니다.


아날로그 입력 0 = 라인 14
아날로그 입력 1 = 라인 15
아날로그 입력 2 = 라인 16
아날로그 입력 3 = 라인 17
아날로그 입력 4 = 라인 18
아날로그 입력 5 = 라인 19

따라서 실제로 아날로그 입력 5를 digitalWrite(19,HIGH)와 같은 디지털 라인으로 참조할 수 있습니다. 이러한 명령은 포트 19, 즉 아날로그 라인 5에 논리적 명령을 기록합니다.


기술적으로는 TX/RX 직렬 포트 라인을 사용할 수 있습니다. 그러나 어떤 경우에는 이를 수행하기가 매우 어렵습니다. 특히 코드가 직렬 포트 작동에 필요한 Serial.begin()과 같은 함수를 사용하는 경우에는 더욱 그렇습니다. 따라서 사용자가 사용할 수 있는 총 접점 수는 여전히 17개입니다. 하지만 17개의 핀으로 많은 수의 LED나 서보모터를 제어하는 ​​것이 가능합니까? 이 경우 특수 외부 미세 회로를 사용하는 것이 좋습니다. 종종 74HC595와 같은 시프트 레지스터가 이러한 목적으로 사용됩니다. 그러나 제어를 위해서는 세 개의 추가 라인이 필요하며 동시에 모든 라인을 "확장"할 수는 없습니다. MAX7219와 같은 디스플레이 드라이버도 실제로 핀 수를 "확장"합니다. 그러나 MAX7219는 값비싼 칩이다. 따라서 MCP23017 포트 확장 칩을 사용하는 것이 더 저렴하고 합리적입니다. 이 칩은 16개 라인용으로 설계되었으며 1.8~5.5V의 넓은 작동 전압 범위를 가지며 I2C 인터페이스를 통해 제어됩니다.


MCP23017은 2개의 Arduino 핀을 사용하고 16개의 I/O 라인을 제공합니다. 따라서 기술적으로 MCP23017 8개를 사용하여 16핀 Arduino 하나를 16 x 8 = 128핀으로 확장할 수 있습니다. Arduino에는 Wire.h라는 I2C 버스용 라이브러리가 있으므로 MCP23017과의 인터페이스는 매우 간단합니다. 아래는 Arduino와 MCP23017 사이의 연결 다이어그램입니다.




#include "Wire.h" void setup() ( Wire.begin(); // I2C 버스 활성화 // 라인을 출력으로 설정 Wire.beginTransmission(0x20); Wire.write(0x00); // IODIRA 레지스터 Wire.write (0x00); // 포트 A의 모든 라인을 출력으로 설정 Wire.endTransmission(); ) void loop() ( Wire.beginTransmission(0x20); Wire.write(0x12); // 주소 뱅크 A Wire. write((byte )0xAA); // 전송된 값 - 로그의 모든 라인. 1 Wire.beginTransmission(0x20); // 주소 뱅크 A Wire.write(( byte)0x55); 값 - 로그의 모든 행 1 Wire.endTransmission();

질문이 있으신가요?

오타 신고

편집자에게 전송될 텍스트: