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) 등을 사용하여서 값을 교정해 주어야 한다.