본문 바로가기
아두이노 기초 학습

9. 아두이노 시리얼통신 네번째( 채팅 )

by 에이치엘 2022. 12. 15.

★ 그동안 시리얼통신 관련 기초학습한 내용을 사용하여 간단한 채팅을 만들어보려고 합니다.

  ○ 채팅은 아두이노 <-> 아두이노 를 생각했으나, 아직은 눈으로 확인할 수 없는 상태에서 진행하기는 역부족이라고 판단하여, PC(시리얼모니터) <-> 아두이노 간의 간단한 채팅을 구현해보려고 합니다.

 

1. 기초학습 8에서 사용한 코드를 다음과 같이 수정합니다

◎ String protocol 변수가 추가되었습니다

  ○ 이전 시간에 String은 '문자열' 타입이라고 학습했습니다( char 타입은 '문자' )

    ※ 문자란 하나의 문자(a), 문자열이란 하나 이상의 문자(abcd)가 나열된 것을 이야기합니다.

  ○ = ""; <- 초기화. 즉, protocol 변수에 아무 값도 담지 않는다 라고 선언했다고 보시면 됩니다.

    ※ 변수를 선언할 때, 초기화를 안해주면 쓰레기값이라고 해서 이상한 값이 들어있을 수 있습니다. 그래서 선언과 동시에 초기화를 해주는것을 추천드립니다. 특히! c 언어에서는...

◎ if( c != '\n' ) {}

  ○ 만약 c의 문자 값이 '\n'이 아니라면 {}를 실행하라 입니다

    ※ '\n'는 줄바꿈 제어문자라고 지난시간에 학습하였습니다.

  ○ '!=' 비교 연산자로 '==' 비교 연사자의 반대입니다. 'a != b' (a값과 b값이 다를경우), 'a==b' ( a값과 b값이 같을경우 ) 

◎ protocol += c

  ○ protocol 변수에 c의 문자를 대입합니다.

    ※ 대입은 변수 = 값 이라고 배웠을 것입니다. '=' 대입 연산자에 '+' 산술 연산자를 추가하면 protocol = protocol + c; 즉, 프로토콜 변수의 값은 그대로 놔둔채 c 변수에 저장된 문자를 protocol 문자열의 끝에 붙이라는 뜻과 같습니다. '+=' 연산자는 정수형태의 변수에서도 흔히 사용되는데 만약 int a = 0; a += 1; 이라는 내용은 정수형 a 변수 선언과 동시에 0 값을 넣고, a = 0 + 1; 하는 것입니다. 최종 적으로는 a 변수에 값이 1이 들어가있을 것입니다.

 ( 좀 더 깊게 연산자에 대해서 공부하고 싶다면 '연산자'를 검색해보세요, 프로그래밍에서 연산자는 자주 사용되니, 이번 기회에 알아두시면 좋습니다)

◎  else{}

  ○ if(조건){} <- if는 조건을 만족할 경우 {}안의 코드를 진행합니다. 하지만 else는 if의 조건을 만족하지 않을 경우 else{} 구문을 이용하여 아닐 경우에 대한 코드를 입력할 수 있습니다.

    ☆if(조건){ 조건을 만족할 경우 }else{ 만족하지 않을 경우 }의 형태로 사용됩니다. ( 좀 더 깊은 '조건문'에 대한 공부는 검색을 통해 학습합니다. )

◎ Serial.print()는 ()안에 값을 송신하는 것으로 배웠습니다. protocol + '\n' 은 protocol 변수의 값에 줄바꿈 문자를 더해서 송신하라는 것입니다.

◎ protocol = ""; 초기화를 한번 더 해주는 이유는 해당 부분을 주석석처리 후 실행해보시면 왜 초기화를 해줘야되는지 알 수 있습니다.

 

★★ 위 코드를 간단하게 설명한다면, Serial 버퍼에 들어있는 문자를 꺼내 문자를 비교, 조건이 만족할 때 까지 문자열로 만들어서 출력한다! 입니다. 

 

◎ 시리얼 모니터에서 위 이미지와 같이 새 줄을 선택합니다

  ※ 새 줄을 선택하는 이유는, 시리얼모니터의 입력란에 제어문자를 입력할 수 없기에, 새 줄('\n')을 위와 같이 설정으로 추가합니다. 즉, 전송 버튼을 클릭시 입력값 + '\n'형태로 송신한다는 것이며, 새 줄을 선택함으로써 '\n'은 자동으로 문자 또는 문자열의 끝부분에 포함해준다는 것입니다.

 

◎ 시리얼모니터 입력칸에 문자 또는 문자열을 입력 후 전송 버튼을 눌러봅니다. 출력창에 입력한 내용이 출력이 되나요?

※ 시리얼모니터를 보면, 전송 버튼을 클릭할 경우 그대로 출력창에 보여주는거 아닌가? 라고 생각할 수 있습니다만, 실제로는 입력칸에 데이터를 입력하고 전송 버튼을 누르면 해당 입력 문자를 아두이노에게 송신하고, 아두이노는 문자열을 받아서 pc로 해당 데이터를 송신합니다. 시리얼모니터는 아두이노로 부터 수신받은 데이터를 출력창에 표기해줍니다.

쉽게말해, 시리얼모니터의 출력창은 아두이노로 부터 받은 데이터를 표기해주는 곳! 시리얼모니터의 입력창은 아두이노에게 데이터를 송신해주는 창이라고 보시면됩니다.

 

2. 그럼 1에서 배운것을 토대로 간단한 채팅을 하나 만들어봅시다. 아래와 같이 코드를 수정합니다.

 

◎ 위와 같이 "안녕" 이라는 문자열을 아두이노가 수신받을 경우, Serial.print() 함수를 통해 pc에게 메세지를 전달합니다.

◎ Serial.print("문자열" + '\n') 형태로 문자열의 뒷부분에 줄 바꿈('\n')을 더해주면 되지 않느냐? 라고 할 수 있습니다.

아두이노의 경우 print()에 직접입력한 문자열 뒷 부분에 + 문자를 제대로 인식하지 못합니다. 코드 오류로 판단합니다. 그래서 출력 마지막에 줄 바꿈('\n')을 따로 송신합니다.

  ※ 정확히는 String, char 자료형 타입은 비슷하면서도 다른 점이 있습니다. C언어 string, char 타입에 대해 검색해보세요.

  ※ String 타입 변수를 하나 생성하고 해당 변수에 문자열을 담아봅니다( String a = "네, 안녕하세요"; ) 그 후 Serial.print(a + '\n'); 을 실행하면 정상적으로 + 연산이 되는 것을 알 수 있습니다. 

◎ 조건은 if(){} if(){} if(){} 형태로 작성이 되어있죠? 그리고 위 소스는 조건이 만족할 경우에만 실행됩니다. 만약, "안녕", "너는 누구야?", "너는 뭘 좋아해?" 라는 문자열이 아닌 오타 또는 다른 문자열이 온다면??? 어떻게 할까요?

◎ if(조건){조건을 만족할경우}else{조건을 만족하지않을경우} 라고 배웠습니다.

◎ if(조건A){A}else if(조건B){B}else if(조건C){C}else{D}을 풀이해보자면, 만약 조건A를 만족할 경우 A를 실행하고,

조건 A를 만족하지 않지만, 조건 B를 만족한다면 B를 출력, 조건A, B 둘다 만족하지 않지만 조건C를 만족한다면 C를 출력하고, 조건A,B,C 모두 만족하지 않을 경우 D를 출력하라! 입니다.

◎ 위 소스에서 줄바꿈(\n)문자를 문자열 내에 포함된 것이 보이나요? Serial.print("네,안녕하세요\n"); 직접 문자열을 입력할 경우, + '\n' 대신 문자열 속에 줄바꿈을 표기해줘야합니다.( 위에서 이야기했듯, 왜 그런지는 String, char 자료형을 검색해보세요 )

◎ 위와 같이 오타 또는 다른 서로 맞춰지지 않은 문자열은 위와 같이 else{} 를 실행하는 모습을 볼 수 있습니다.

 

◎ 위와 같이 else if(조건){} 을 추가하여, 다른 대화내용도 작성해봅니다.

 

※ 간단한 채팅을 만들어 봄으로써 1. 마지막에 작성했던, 시리얼모니터의 "입력창", "출력창"에 대해서 이제 이해가 되실거라고 생각합니다. 입력창에 입력한 내용은 PC -> 아두이노 , 출력창에 출력되는 내용은 PC <- 아두이노 형태란것을..

 

★ 이번 시간에 배운 내용은 protocol 이라는 것입니다. 서로 통신을 하기위해서는 protocol을 서로 맞춰야됩니다.

protocol이란, 서로 짜여진 언어 즉, 내가 이렇게 말하면 너는 이렇게 알아듣고 그것에 대한 답을 짜여진 형태로 해줘라고 하는 것입니다. 이것이 통신의 전부이고, AI같은 인공지능의 경우는 조금 개념이 다르지만, 큰 틀에서는 비슷합니다. AI의 경우는 어떤 질문이 올 경우, 그것을 분석해서 상대가 말한 내용에 맞는 대답을 할 수 있도록 프로그래밍(로직)이 추가되는 것입니다.

 

내용이 길어졌으나, 이번 시간은 protocol 이라는 것을 배웠고, "안녕" -> "네,안녕하세요" 와 같이 protocol을 만들어보기도 했습니다. protocol을 한글로 했지만, 다양한 형태로 구성할 수 있습니다.

 

★★ 시리얼모니터를 이용하여 채팅을 구성했지만, 아두이노 <->아두이노 , 디바이스<->디바이스 , SW <-> 디바이스 등, 어떠한 통신이든 큰 틀에서는 위 내용과 별 다를게 없습니다. 다만, 어떻게 구현하는지, 어떤 프로토콜을 지정하는지, 어떤 통신 방식을 할 것인지만 다를뿐입니다. 1:N, 1:1, N:N 의 통신은 다르지 않을까? 라고 생각할 수 있지만, 기본은 위와 같이 1:1 통신을 바탕으로 1:N, N:N 통신을 구현하는 것입니다. 

 

★★★ 여러분은, 시리얼통신 기초학습 4회만에 아두이노를 이용한 채팅 프로그램을 하나 개발했다고 할 수 있습니다. 

 

★★★★ 단순한 led를 켜고 끄고 delay() 함수를 이용하여 시간을 조절하는 방식의 교육이 아닌, 기초라도 실무에서 사용될 수 있는 기초를 진행하기 위해, serial 통신과 millis()함수의 사용법을 먼저 학습했습니다.

※ 단순한 led를 켜고 끄고 delay()함수를 이용한 시간 조절도 실무에서 사용이 안되는건 아니에요.

 

다음 시간에는 시리얼통신, millis()를 이용한 LED를 켜고 끄고 하는 학습을 해보려고 합니다.

댓글