esp32와 Arduino간에 Serial 통신하기

Six-legged-robot을 무선조종하기 위해서는 ps3 컨트롤러의 모션값을 esp32를 통해 받고, 이 정보를 아두이노에 전달해줘야합니다. USB_host_shield를 사용하면 이 번거러운 작업을 하지 않아도 되지만, bluetooth dongle의 문제로 되지가 않아서 esp32로 진행을 하도록 하겠습니다.

 

사용보드 : LOLIN D32 보드

 

아두이노보드는 메가를 사용하였습니다.(아두이노 우노는 SoftwareSerial을 사용하여 진행해주시면 됩니다.)

 

아두이노메가에는 Serial통신을 위한 핀이 여러개가 있습니다. usb포트를 사용할때는 setup함수에서 Serial.begin();로 작성하잖아요? 통신핀을 사용할 때는 Rx1이면 Serial1.begin(); Rx2이면 Serial2.begin(); 이라고 작성해주시면 됩니다.

void setup()
{
  Serial.begin(9600);
  Serial1.begin(9600); //Rx1, Tx1 사용
}

void loop(){
  Serial1.println("SERIAL");
  delay(1500);
}

 

esp32보드는 최대 3개의 Serial통신핀을 사용할 수 있다고 합니다. 제가 사용하는 보드에는 Serial통신핀이 따로 있지는 않고 begin함수를 이용해 설정을 해주어야합니다. Serial2.begin의 두번째인자는 통신방식을 말합니다. 3,4번째 인자는 송신핀과 수신핀을 지정하는 것입니다. 

#define RXp2 16
#define TXp2 17

void setup() {
  Serial.begin(9600); // communicate with computer
  Serial2.begin(9600, SERIAL_8N1, RXp2, TXp2); //communicate with Arduino
}

void loop() {
  if( Serial2.available() )
  {
    String text = Serial2.readStringUntil('\n');
    Serial.println(text);
  }
}

esp32보드에 Rx0,Tx0이 있는데 이걸 사용하면 안되나요? 라고 질문하실 수도 있습니다. 저도 처음에 그렇게 했는 데 코드 업로드가 안되고 무슨 "fatal error~~~"하면서 뜨더라구요. 찾아보니, usb포트를 활용해 컴퓨터와 통신하고 있는 데 또 직렬핀에 꽂아서 하면 위와 같은 오류가 뜨며 안되는 경우가 있다고 하더라구요. 그래서 따로 Serial통신핀을 설정해서 사용해주면 해결이 됩니다. 

 

available함수는 버퍼에 수신받은 데이터가 있는 지 확인하는 함수입니다. 있다면 1을 반환합니다.

readStringUntil함수는 함수 이름에서 보다시피 '\n'전까지 text변수에 저장하고 끝을 냅니다.

 

코드를 돌려주면 1.5초마다 'SERIAL'이 뜨는 것을 볼 수 있습니다.

 

<참고자료>

https://www.programmingboss.com/2021/04/esp32-arduino-serial-communication-with-code.html