Hardware/Arduino

ESP32 - Arduino 시리얼 통신

초인로크 2022. 9. 9. 14:47
반응형

UART를 이용한 시리얼 통신으로 기본적으로 아두이노 IDE를 이용한 방법이다.

 

ESP 쪽의 Tx와 Arduino 쪽의 Rx를 연결하여 송수신 기능을 테스트했다.

 

 

<ESP 측 소스코드>

int num = 0;

void setup() {

  // put your setup code here, to run once:
  Serial.begin(115200);
 
}
 
void loop() {
  // put your main code here, to run repeatedly:
  num = 1;
  Serial.write(num);
}

 

여기서는 Serial.write()를 이용해 1을 송신한다.

 

 

<Arduino UNO 측 소스코드>

int num;

void setup() {

  // put your setup code here, to run once:
  Serial.begin(115200);
 
}

void loop() {
  // put your main code here, to run repeatedly:
 
  if (Serial.available()){
    //delay(2);
    num = Serial.read();
    Serial.println(num);
  }
}

 

여기서는 Serial.read()를 이용해 송신된 데이터를 수신한다.

 

통신속도가 너무 빠르다 싶으면 delay를 넣어주면 된다.

 

소스코드를 업로드 한 뒤에 시리얼 모니터를 확인하면 아래와 같이 1 이 수신된 것을 볼 수 있다.

 

 

여기서 조심해야 되는 게,

 

시리얼 포트로 출력할 때 아래의 두 함수 어느 것을 이용해도

 

모두 출력이 가능한데 출력하는 성질이 좀 다르다.

 

Serial.write();

-> 괄호 안의 내용을 그대로 송신 (문자가 아닌 데이터를 보낼 때 많이 쓰임)

 

Serial.print();

-> 괄호안의 내용을 아스키코드 형식으로 출력 (문자를 시리얼 모니터에 표시하기 위해 많이 쓰임)

 

따라서 자신의 목적에 맞는 함수를 쓰는 게 좋겠다.

 

 

 

<Arduino MEGA를 이용한 시리얼 통신>

 

메가는 시리얼 통신을 하기위한 포트가 4개가 존재하므로

 

ESP 와의 통신은 시리얼 1로 설정했다.

 

 

 

<Arduino MEGA 측 소스코드>

//for mega
int num = 0;

void setup() {
  Serial.begin(115200);
  Serial1.begin(115200);
}

void loop() {
  if(Serial1.available()) {
    num = Serial1.read();
    //Serial.println(Serial1.read());
    Serial.println(num);
  }
  delay(100);
}

 

위의 소스코드를 업로드 하면 아래와 같이

 

아두이노 메가에서 숫자가 수신 되는 것을 확인 할 수 있다.

 

 

일단 간단한 예제를 적용한 시스템이라 단순이 선만 연결해 줬는데,

 

ESP32와 Arduino MEGA가 사용하는 전압이 다르기 때문에,

 

본격적으로 사용하기 위해서는 아래와 같은 레벨 시프터 (Level shifter) 등을 사용하여서 값을 교정해 주어야 한다.

 

LV(3.3V)와 HV(5V) 간의 통신에 사용 할 수 있다.

 

 

 

 

반응형