- SPI 란 무엇입니까?
- SPI의 작동
- Arduino UNO의 SPI 핀
- Arduino에서 SPI 사용
- Arduino SPI 통신에 필요한 구성 요소
- Arduino SPI 통신 회로도
- SPI 통신을 위해 Arduino를 프로그래밍하는 방법 :
- Arduino SPI 마스터 프로그래밍 설명
- Arduino SPI 슬레이브 프로그래밍 설명
- Arduino에서 SPI는 어떻게 작동합니까? -테스트 해보자!
마이크로 컨트롤러는 다양한 프로토콜을 사용하여 다양한 센서 및 모듈과 통신합니다. 무선 및 유선 통신을위한 다양한 유형의 통신 프로토콜이 있으며 가장 일반적으로 사용되는 통신 기술은 직렬 통신입니다. 직렬 통신은 통신 채널 또는 버스를 통해 한 번에 한 비트 씩 순차적으로 데이터를 보내는 프로세스입니다. UART, CAN, USB, I2C 및 SPI 통신과 같은 많은 유형의 직렬 통신이 있습니다.
이 튜토리얼에서는 SPI 프로토콜과 Arduino에서 사용하는 방법에 대해 알아 봅니다. 두 Arduino 간의 통신 을 위해 SPI 프로토콜을 사용 합니다. 여기서 하나의 Arduino는 마스터로 작동하고 다른 하나는 슬레이브로 작동하며 두 개의 LED와 푸시 버튼이 두 Arduino에 연결됩니다. SPI 통신을 시연하기 위해 슬레이브 측의 푸시 버튼으로 마스터 측 LED를 제어하고 그 반대의 경우 SPI 직렬 통신 프로토콜을 사용하여 제어 합니다.
SPI 란 무엇입니까?
SPI (Serial Peripheral Interface) 는 직렬 통신 프로토콜입니다. SPI 인터페이스는 1970 년 Motorola에 의해 발견되었습니다. SPI에는 전이중 연결이있어 데이터가 동시에 전송되고 수신됩니다. 즉, 마스터는 슬레이브로 데이터를 보낼 수 있고 슬레이브는 데이터를 마스터로 동시에 보낼 수 있습니다. SPI는 동기식 직렬 통신으로 통신을 위해 클럭이 필요함을 의미합니다.
SPI 통신은 이전에 다른 마이크로 컨트롤러에서 설명했습니다.
- PIC 마이크로 컨트롤러 PIC16F877A와 SPI 통신
- 3.5 인치 터치 스크린 TFT LCD와 Raspberry Pi 인터페이스
- SPI 핀으로 AVR 마이크로 컨트롤러 프로그래밍
- Arduino와 Nokia 5110 그래픽 LCD 인터페이스
SPI의 작동
SPI에는 4 개의 회선을 사용하여 마스터 / 슬레이브 통신이 있습니다. SPI는 하나의 마스터 만 가질 수 있으며 여러 슬레이브를 가질 수 있습니다. 마스터는 일반적으로 마이크로 컨트롤러이고 슬레이브는 마이크로 컨트롤러, 센서, ADC, DAC, LCD 등이 될 수 있습니다.
아래는 SPI 마스터와 단일 슬레이브 의 블록 다이어그램 표현입니다.
SPI에는 MISO, MOSI, SS 및 CLK의 네 가지 라인이 있습니다.
- MISO (Master in Slave Out) -데이터를 마스터로 보내기위한 Slave 라인입니다.
- MOSI (Master Out Slave In) -주변기기로 데이터를 전송하기위한 마스터 라인.
- SCK (Serial Clock) -마스터에서 생성 한 데이터 전송을 동기화하는 클럭 펄스입니다.
- SS (Slave Select) – 마스터는이 핀을 사용하여 특정 장치를 활성화 및 비활성화 할 수 있습니다.
다중 슬레이브가있는 SPI 마스터
마스터와 슬레이브 간의 통신을 시작하려면 필요한 장치의 슬레이브 선택 (SS) 핀을 LOW로 설정하여 마스터와 통신 할 수 있도록해야합니다. 높으면 마스터를 무시합니다. 이를 통해 동일한 MISO, MOSI 및 CLK 마스터 라인을 공유하는 여러 SPI 장치를 가질 수 있습니다. 위 이미지에서 볼 수 있듯이 SCLK, MISO, MOSI가 마스터에 공통으로 연결되고 각 슬레이브의 SS가 마스터의 개별 SS 핀 (SS1, SS2, SS3)에 개별적으로 연결된 4 개의 슬레이브가 있습니다. 필요한 SS 핀을 LOW로 설정하면 마스터가 해당 슬레이브와 통신 할 수 있습니다.
Arduino UNO의 SPI 핀
아래 이미지는 Arduino UNO (빨간색 상자)에있는 SPI 핀을 보여줍니다.
SPI 라인 |
Arduino의 핀 |
MOSI |
11 또는 ICSP-4 |
MISO |
12 또는 ICSP-1 |
SCK |
13 또는 ICSP-3 |
SS |
10 |
Arduino에서 SPI 사용
두 Arduino 간의 SPI 통신 프로그래밍을 시작하기 전에. Arduino IDE에서 사용되는 Arduino SPI 라이브러리 에 대해 배워야합니다.
도서관
1. SPI.begin ()
사용: SCK, MOSI 및 SS를 출력으로 설정하고 SCK 및 MOSI를 낮게, SS를 높임으로써 SPI 버스를 초기화합니다.
2. SPI.setClockDivider (divider)
USE: 시스템 클록에 상대적인 SPI 클록 분배기를 설정합니다. 사용 가능한 구분선은 2, 4, 8, 16, 32, 64 또는 128입니다.
분할기:
- SPI_CLOCK_DIV2
- SPI_CLOCK_DIV4
- SPI_CLOCK_DIV8
- SPI_CLOCK_DIV16
- SPI_CLOCK_DIV32
- SPI_CLOCK_DIV64
- SPI_CLOCK_DIV128
3. SPI.attachInterrupt (핸들러)
USE: 이 기능은 슬레이브 장치가 마스터로부터 데이터를받을 때 호출됩니다.
4. SPI.transfer (val)
사용: 이 기능은 마스터와 슬레이브간에 데이터를 동시에주고받을 때 사용합니다.
이제 Arduino에서 SPI 프로토콜의 실제 데모로 시작하겠습니다. 이 튜토리얼에서는 두 개의 arduino를 마스터로 사용하고 다른 하나는 슬레이브로 사용합니다. 두 Arduino 모두 LED와 푸시 버튼이 별도로 부착되어 있습니다. 마스터 LED는 슬레이브 아두 이노의 누름 버튼을 사용하여 제어 할 수 있으며 슬레이브 아두 이노의 LED는 아두 이노에있는 SPI 통신 프로토콜을 사용하여 마스터 아두 이노의 누름 버튼으로 제어 할 수 있습니다.
Arduino SPI 통신에 필요한 구성 요소
- 아두 이노 UNO (2)
- LED (2)
- 푸시 버튼 (2)
- 저항기 10k (2)
- 저항기 2.2k (2)
- 브레드 보드
- 전선 연결
Arduino SPI 통신 회로도
아래 회로도는 Arduino UNO에서 SPI를 사용하는 방법을 보여 주지만 Arduino Mega SPI 통신 또는 Arduino nano SPI 통신에 대해 동일한 절차를 따를 수 있습니다. 핀 번호를 제외하고 거의 모든 것이 동일하게 유지됩니다. Arduino nano 또는 mega의 핀아웃을 확인하여 Arduino nano SPI 핀과 Arduino Mega 핀을 찾아야합니다. 일단 완료하면 다른 모든 것이 동일합니다.
위에 표시된 회로를 브레드 보드 위에 구축했습니다. 아래에서 테스트에 사용한 회로 설정을 볼 수 있습니다.
SPI 통신을 위해 Arduino를 프로그래밍하는 방법:
이 튜토리얼에는 마스터 Arduino 용 프로그램과 슬레이브 Arduino 용 프로그램이 있습니다. 이 프로젝트의 끝에 양측을위한 완전한 프로그램이 제공됩니다.
Arduino SPI 마스터 프로그래밍 설명
1. 먼저 SPI 통신 기능을 사용하기위한 SPI 라이브러리를 포함해야합니다.
#포함
2. void setup ()에서
- Baud Rate 115200에서 직렬 통신을 시작합니다.
Serial.begin (115200);
- 핀 7에 LED를 연결하고 핀 2에 푸시 버튼을 연결하고 각 핀을 OUTPUT 및 INPUT에 설정합니다.
pinMode (ipbutton, INPUT); pinMode (LED, OUTPUT);
- 다음으로 SPI 통신을 시작합니다.
SPI.begin ();
- 다음으로 SPI 통신을 위해 Clockdivider를 설정합니다. 여기에 구분선 8을 설정했습니다.
SPI.setClockDivider (SPI_CLOCK_DIV8);
- 그런 다음 슬레이브 arduino 로의 전송을 시작하지 않았으므로 SS 핀을 HIGH로 설정하십시오.
digitalWrite (SS, HIGH);
3. void loop ()에서:
- 이 값을 슬레이브 Arduino로 보내기 위해 pin2 (Master Arduino)에 연결된 푸시 버튼 핀의 상태를 읽습니다.
buttonvalue = digitalRead (ipbutton);
- 2 번 핀의 입력에 따라 x 값 (슬레이브로 전송) 설정 로직 설정
if (버튼 값 == HIGH) { x = 1; } 그렇지 않으면 { x = 0; }
- 값을 보내기 전에 마스터에서 슬레이브로 전송을 시작하기 위해 슬레이브 선택 값을 낮춰야합니다.
digitalWrite (SS, LOW);
- 다음 문장에서 Mastersend 변수에 저장된 푸시 버튼 값 을 슬레이브 arduino로 보내고 Mastereceive 변수에 저장할 슬레이브에서 값을 수신 합니다.
Mastereceive = SPI.transfer (Mastersend);
- 그 후 Mastereceive 값 에 따라 Master Arduino LED를 켜거나 끕니다.
if (Mastereceive == 1) { digitalWrite (LED, HIGH); // 7 번 핀을 HIGH로 설정 Serial.println ("Master LED ON"); } else { digitalWrite (LED, LOW); // 7 번 핀을 LOW로 설정 Serial.println ("Master LED OFF"); }
참고: Arduino IDE의 Serial Motor에서 결과를보기 위해 serial.println () 을 사용 합니다. 마지막에 비디오를 확인하십시오.
Arduino SPI 슬레이브 프로그래밍 설명
1. 먼저 SPI 통신 기능을 사용하기위한 SPI 라이브러리를 포함해야합니다.
#포함
2. void setup ()에서
- Baud Rate 115200에서 직렬 통신을 시작합니다.
Serial.begin (115200);
- 핀 7에 LED를 연결하고 핀 2에 푸시 버튼을 연결하고 각 핀을 OUTPUT 및 INPUT에 설정합니다.
pinMode (ipbutton, INPUT); pinMode (LED, OUTPUT);
- 여기서 중요한 단계는 다음 진술입니다.
pinMode (MISO, OUTPUT);
위의 문장은 MISO를 OUTPUT (Have to Send data to Master IN)로 설정합니다. 따라서 데이터는 Slave Arduino의 MISO를 통해 전송됩니다.
- 이제 SPI 제어 레지스터를 사용하여 슬레이브 모드에서 SPI를 켭니다.
SPCR-= _BV (SPE);
- 그런 다음 SPI 통신을 위해 인터럽트를 켭니다. 마스터로부터 데이터가 수신되면 인터럽트 루틴이 호출되고 수신 된 값은 SPDR (SPI 데이터 레지스터)에서 가져옵니다.
SPI.attachInterrupt ();
- 마스터의 값은 SPDR에서 가져와 Slavereceived 변수에 저장됩니다. 이는 다음 인터럽트 루틴 기능에서 발생합니다.
ISR (SPI_STC_vect) { Slavereceived = SPDR; 받은 = 참; }
3. 다음으로 void 루프 ()에서 슬레이브 arduino LED가 Slavereceived 값에 따라 켜지거나 꺼 지도록 설정합니다.
if (Slavereceived == 1) { digitalWrite (LEDpin, HIGH); // 7 번 핀을 HIGH LED ON으로 설정 Serial.println ("Slave LED ON"); } else { digitalWrite (LEDpin, LOW); // 7 번 핀을 LOW LED OFF로 설정 Serial.println ("Slave LED OFF"); }
- 다음으로 Slave Arduino Push 버튼의 상태를 읽고 Slavesend 에 값을 저장하여 SPDR 레지스터에 값을 부여하여 Master Arduino에 값을 보냅니다.
buttonvalue = digitalRead (버튼 핀); if (buttonvalue == HIGH) {x = 1; } 그렇지 않으면 {x = 0; } Slavesend = x; SPDR = 노예;
참고: Arduino IDE의 Serial Motor에서 결과를보기 위해 serial.println () 을 사용 합니다. 마지막에 비디오를 확인하십시오.
Arduino에서 SPI는 어떻게 작동합니까? -테스트 해보자!
아래는 두 Arduino 보드 간의 SPI 통신을 위한 최종 설정 사진입니다 .
Master 측 Push 버튼을 누르면 Slave 측 백색 LED가 점등됩니다.
그리고 Slave 측의 누름 버튼을 누르면 Master 측의 Red LED가 켜집니다.
아래 비디오를 통해 Arduino SPI 통신 데모를 볼 수 있습니다. 질문이 있으시면 우리 포럼을 사용하여 댓글 섹션에 남겨주세요.