- STM32F103C8 I2C 개요
- STM32F103C8의 I2C 핀
- Arduino의 I2C 핀
- 필요한 구성 요소
- 회로도 및 연결
- STM32의 I2C 프로그래밍
- 마스터 STM32 프로그래밍 설명
- 슬레이브 Arduino 프로그래밍 설명
이전 튜토리얼에서 두 Arduino 보드 간의 SPI 및 I2C 통신에 대해 배웠습니다. 이 튜토리얼에서는 하나의 Arduino 보드를 STM32F103C8 인 Blue Pill 보드로 교체 하고 I2C 버스를 사용하여 Arduino 보드와 통신합니다.
STM32는 Arduino 보드보다 더 많은 기능을 가지고 있습니다. 따라서 SPI 및 I2C 버스를 사용하여 STM32와 Arduino 간의 통신 에 대해 배우는 것이 좋습니다. 이 튜토리얼에서는 Arduino와 STM32F103C8 간의 통신에 I2C 버스를 사용 하고 다음 튜토리얼에서 SPI 버스에 대해 학습합니다. STM32 보드에 대한 자세한 내용은 다른 STM32 프로젝트를 확인하십시오.
STM32F103C8 I2C 개요
STM32F103C8 Blue Pill 보드의 I2C (Inter Integrated Circuits)를 Arduino Uno와 비교하면 Arduino에는 ATMEGA328 마이크로 컨트롤러가 있고 STM32F103C8에는 ARM Cortex- M3이 포함되어 있음을 알 수 있습니다. STM32에는 2 개의 I2C 버스가있는 반면 Arduino Uno에는 하나의 I2C 버스 만 있으며 STM32는 Arduino보다 빠릅니다.
I2C 통신에 대한 자세한 내용은 이전 기사를 참조하십시오.
- Arduino에서 I2C를 사용하는 방법: 두 Arduino 보드 간의 통신
- PIC 마이크로 컨트롤러 PIC16F877과의 I2C 통신
- I2C를 사용하여 16X2 LCD와 ESP32 인터페이스
- MSP430 Launchpad와 I2C 통신
- I2C를 사용하지 않고 NodeMCU와 LCD 인터페이스
- Arduino의 단일 프로그램에서 다중 통신 (I2C SPI UART)을 처리하는 방법
STM32F103C8의 I2C 핀
SDA: PB7 또는 PB9, PB11.
SCL: PB6 또는 PB8, PB10.
Arduino의 I2C 핀
SDA: A4 핀
SCL: A5 핀
필요한 구성 요소
- STM32F103C8
- Arduino Uno
- LED (2-Nos)
- 누름 버튼 (2-Nos)
- 저항기 (4-Nos)
- 브레드 보드
- 전선 연결
회로도 및 연결
다음 표는 I2C 버스 사용을위한 STM32 Blue Pill과 Arduino Uno 간의 연결을 보여줍니다. 두 개의 전선 만 필요합니다.
STM32F103C8 |
Arduino |
핀 설명 |
B7 |
A4 |
SDA |
B6 |
A5 |
SCL |
GND |
GND |
바닥 |
중대한
- Arduino GND와 STM32F103C8 GND를 함께 연결하는 것을 잊지 마십시오.
- 그런 다음 10k의 풀다운 저항을 두 보드의 푸시 버튼 핀에 개별적으로 연결합니다.
이 STM32 I2C 튜토리얼 에서는 STM32F103C8을 마스터로, Arduino를 슬레이브로 구성합니다. 두 보드 모두 LED 및 푸시 버튼으로 별도로 부착됩니다.
STM32에서 I2C 통신을 시연하기 위해 슬레이브 Arduino 푸시 버튼 값을 사용하여 마스터 STM32 LED를 제어하고 마스터 STM32F103C8 푸시 버튼 값을 사용하여 슬레이브 Arduino LED를 제어합니다. 이 값은 I2C 통신 버스를 통해 전송됩니다.
STM32의 I2C 프로그래밍
프로그래밍은 Arduino 코드와 유사합니다. 똑같다
이 튜토리얼에는 마스터 STM32 용 프로그램과 슬레이브 Arduino 용 프로그램이 있습니다. 양측을위한 완전한 프로그램 은 데모 비디오 와 함께이 프로젝트의 끝에 제공됩니다.
마스터 STM32 프로그래밍 설명
Master STM32에서 무슨 일이 일어나는지 봅시다:
1. 먼저 STM32F103C8에서 I2C 통신 기능을 사용하기 위해 Wire 라이브러리와 softwire 라이브러리를 포함해야합니다.
#포함
2. void setup ()에서
- Baud Rate 9600에서 직렬 통신을 시작합니다.
Serial.begin (9600);
- 다음으로 핀 (B6, B7)에서 I2C 통신을 시작합니다.
Wire.begin ();
3. 무효 loop ()에서
- 먼저 슬레이브 아두 이노에서 데이터를 가져 오므로 슬레이브 주소 8과 함께 requestFrom ()을 사용하고 1 바이트를 요청합니다.
Wire.requestFrom (8,1);
받은 값은 Wire.read ()를 사용하여 읽습니다.
바이트 a = Wire.read ();
- 슬레이브로부터 수신 된 값에 따라 PA1 핀에서 디지털 쓰기 를 사용하여 Master LED를 켜거나 끄고 직렬 인쇄를 사용하여 직렬 모니터에 값을 인쇄합니다.
if (a == 1) { digitalWrite (LED, HIGH); Serial.println ("마스터 LED 켜짐"); } else { digitalWrite (LED, LOW); Serial.println ("마스터 LED 꺼짐"); }
- 다음으로 마스터 STM32 푸시 버튼 인 핀 PA0의 상태를 읽어야합니다.
int pinvalue = digitalRead (버튼 핀);
- 그런 다음 로직에 따라 핀 값을 보내므로 if 조건 을 사용 하고 주소가 8 인 슬레이브 arduino로 전송을 시작한 다음 누름 버튼 입력 값에 따라 값을 씁니다.
if (pinvalue == HIGH) { x = 1; } 그렇지 않으면 { x = 0; } Wire.beginTransmission (8); Wire.write (x); Wire.endTransmission ();
슬레이브 Arduino 프로그래밍 설명
1. 먼저 I2C 통신 기능을 사용하기위한 Wire 라이브러리를 포함해야합니다.
#포함
2. void setup ()에서
- Baud Rate 9600에서 직렬 통신을 시작합니다.
Serial.begin (9600);
- 다음으로 슬레이브 주소가 8 인 핀 (A4, A5)에서 I2C 통신을 시작합니다. 여기서 슬레이브 주소를 지정하는 것이 중요합니다.
Wire.begin (8);
우리는 호출해야 옆 Wire.onReceive 슬레이브는 마스터로부터 값을 수신 할 때 기능 Wire.onRequest 슬레이브로부터 함수 호출시 마스터 요구 값.
Wire.onReceive (receiveEvent); Wire.onRequest (requestEvent);
3. 다음으로 요청 이벤트에 대한 기능과 수신 이벤트에 대한 기능이 있습니다.
요청 이벤트
Master STM32가 슬레이브로부터 값을 요청하면이 기능이 실행됩니다. 이 함수는 Slave Arduino 누름 버튼에서 입력 값을 가져와 Wire.write () 를 사용하여 누름 버튼 값에 따라 바이트 (1 또는 0)를 Master STM32로 보냅니다.
void requestEvent () { int value = digitalRead (buttonpin); if (값 == HIGH) { x = 1; } 그렇지 않으면 { x = 0; } Wire.write (x); }
수신 이벤트
마스터가 슬레이브 주소 (8)로 데이터를 슬레이브로 보내면이 기능이 실행됩니다. 이 기능은 마스터로부터 수신 된 값을 읽어서 바이트 타입의 변수에 저장 한 후 수신 된 값에 따라 슬레이브 LED를 켜거나 끄는 로직을 사용 합니다 . 수신 값이 1이면 LED가 켜지고 0이면 LED가 꺼집니다.
void receiveEvent (int howMany) { byte a = Wire.read (); if (a == 1) { digitalWrite (LED, HIGH); Serial.println ("슬레이브 LED 켜짐"); } else { digitalWrite (LED, LOW); Serial.println ("슬레이브 LED 꺼짐"); } 지연 (500); }
산출
1. Master STM32의 누름 버튼을 누르면 Slave Ardiono에 연결된 LED가 켜집니다 (흰색).
2. 이제 Slave 측의 누름 버튼을 누르면 Master에 연결된 LED가 켜지고 (적색) 버튼을 놓으면 LED가 꺼집니다.
3. 두 푸시 버튼을 동시에 누르면 두 LED가 동시에 켜지고 버튼을 누를 때까지 계속 켜져 있습니다.
그래서 이것이 STM32에서 I2C 통신이 이루어지는 방식입니다. 이제 모든 I2C 센서를 STM32 보드와 연결할 수 있습니다.
Master STM32 및 Slave Arduino의 전체 코딩은 데모 비디오와 함께 아래에 제공됩니다.