본문으로 바로가기

  아두이노(Arduino) 기초 시리얼(RS232) 통신 2편  


애드라이프의 아두이노 모든 포스팅 리스트를 보고 싶으신 분은 공지 읽어주세요.




안녕하세요.  애드라이프입니다.

시리얼(RS232)통신 응용편 포스팅을 시작하겠습니다.


[아두이노/아두이노 기초] - 아두이노(Arduino) 기초 시리얼(RS232) 통신 1편



이전 포스팅▲에서 단순한 통신 기능만 구현해 봤다면 이번엔 통신기능을 

이용한 디지털 In/Out 컨트롤까지해보는 시간을 갖도록 하겠습니다.


[ 목적 ] 원하는 명령어를 이용하여 해당 LED ON/OFF 

회로를 살펴볼까요? ▼

아두이노 시리얼통신을 시용한 LED켜기 회로TINKERCAD를 이용하여 구현한 시리얼 통신을 이용한 LED켜기 회로입니다.


디지털 In/Out포트의 2,3,4번에 LED를 각각 연결해 주고 전류 제어저항 470옴을 모두 연결해줍니다.

회로구성은 이게 끝!

다만 이전 포스팅에 비해 프로그램이 쪼~~~금 깁니다....... 쉽게 설명해 드릴테니 걱정 마세요^^;

이제 프로그램을 살펴보시죠.!!


int WhiteLed = 2;   //LED별 IO 지정
int RedLed = 3;   
int BuleLed = 4;   
void setup() {  
  Serial.begin(9600);     //시리얼 통신 속도 9600으로 설정
  pinMode( WhiteLed, OUTPUT );  //각 LED를 켜줄 포트의 기능을 OUT으로 설정
  pinMode( RedLed, OUTPUT ); 
  pinMode( BuleLed, OUTPUT ); 
  LedInit();                    //LED초기화
}    
void LedInit(){
  digitalWrite(WhiteLed,LOW);  
  digitalWrite(RedLed,LOW);
  digitalWrite(BuleLed,LOW);
}
String ReadSerialData(){
  String str = "";
  char c;
  while( Serial.available())  //Serial.available() -> 받아드린 문자열의 갯수를 반환하는 함수
  {  
    c = Serial.read();             //수신된 시리얼데이터 1바이트를 읽어 c 변수에 저장
    str.concat(c);                  //받아드리는 문자열을 붙여주는 역할
    delay(10);  
  }
  return str;
      
}
void loop() {  
  
  String str; 
  str = ReadSerialData();
  if ( str == "" )
    ;  
  else if (str=="white on")  //입력한 문자열이 white on이면 WhiteLed를 켜라
  {      
    Serial.println(str);  
    digitalWrite(WhiteLed,HIGH); 
  }  
  else if (str=="white off")  //입력한 문자열이 white off이면 WhiteLed를 꺼라
  {      
    Serial.println(str);  
    digitalWrite(WhiteLed,LOW); 
  }
  else if (str=="red on")  
  {      
    Serial.println(str);  
    digitalWrite(RedLed,HIGH); 
  }  
  else if (str=="red off")  
  {      
    Serial.println(str);  
    digitalWrite(RedLed,LOW); 
  }   
  else if (str=="blue on")  
  {      
    Serial.println(str);  
    digitalWrite(BuleLed,HIGH); 
  }  
  else if (str=="blue off")  
  {      
    Serial.println(str);  
    digitalWrite(BuleLed,LOW); 
  } 
  else if (str=="help")              //입력한 문자열이 help이면 유효한 명령어가 무엇인지 출력
  {      
    Serial.println( "================" );  
    Serial.println( "white on" );  
    Serial.println( "red on" );  
    Serial.println( "blue on" );  
    Serial.println( "white off" );  
    Serial.println( "red off" );  
    Serial.println( "blue off" );  
    Serial.println( "================" ); 
  }
  else{  
    Serial.println( "==================================" );  //입력한 문자열이 정의되어 있지 않다면
    Serial.println( "Type 'help' to get the command." );     //help를 입력해 달라는 문구를 띄움
    Serial.println( "==================================" );  
  }
}  


어때요? 어렵나요? 단순히 길기만 하지 어렵진 않았을겁니다.

위에 주석을 참고하시면 해석하시는데 큰 어려움은 없을 것 입니다.

다만, 


String ReadSerialData(){
  String str = "";
  char c;
  while( Serial.available())  //Serial.available() -> 받아드린 문자열의 갯수를 반환하는 함수
  {  
    c = Serial.read();             //수신된 시리얼데이터 1바이트를 읽어 c 변수에 저장
    str.concat(c);                  //받아드리는 문자열을 붙여주는 역할
    delay(10);  
  }
  return str;
      
}

이 부분에서 막히시는 분들이 좀 있으실 것 같아서 추가로 설명 드리려합니다. ▲

약간 c언어 관련된 지식이 필요한 내용입니다. 



첫번째로, 우선 함수 정의 형태가 다른 함수들과 다릅니다.

함수정의에 대해 약간 설명 하자면 함수는 

출력형태 함수이름 (입력형태)
{
함수동작 정의부분
}

전체 프로그램을 살펴보더라도 출력형태와 입력형태가 없는 'void' 로 정의를 많이 하곤 합니다.

출력형태가 비어있는 괄호->()로 표시되어있는 것은 (void)와 같습니다.


하지만 살펴보고자 하는 함수는 출력형태 정의가 String으로 되어있지요.

그 뜻은 이 함수는 어떤 값을 반환하는 기능이 있는데 반환하는 값의 형태가 String이다. 라는 말입니다.

실제로 함수에서 return으로 반환되는 str변수의 형태가 String으로 정의되어있음을 알수 있습니다.


두번째로, str.concat()에 대한 설명입니다.

간단하게 설명드리면 문자열을 이어주는 역할을 하는 함수입니다.


예를들어

int  일 = 1;

int  이 = 2;

int  삼 = 3;


이라는 변수가 있다고 가정하면 

str.concat(일,이,삼);의 출력은 

123이 됩니다. 간단하죠?


이런기능을 이용하여 입력해준 문자열을 모두 이어서 출력하는 것이죠! 

이론적인 설명은 여기까지입니다. 이제 실제로 구현된 회로와 동작을 확인 해보도록 하죠.



아두이노 시리얼 통신을 이용한 LED제어 회로

실제로 구현한 회로으 모습입니다. 저한테 LED가 초록색이 없어서......하얀색으로 썼습니다. ▲




시리얼 모니터의 결과

해당하는 커멘드 입력시 출력되는 화면▲



시리얼 통신으로 켜진 White LED

white on 입력시▲

시리얼 통신으로 켜진 Red LED

red on 입력시▲

시리얼 통신으로 켜진 Blue LED

blue on 입력시▲



위 사진들에 해당 LED를 제외하곤 다 꺼져있죠? 

off 명령으로 먼저 꺼준 후에 on명령으로 켜줘야 하나씩 켜져있는 모습을 확인 할 수 있습니다.


지금까지 시리얼 통신 2편으로 응용을 해봤습니다.

스스로 통신 속도를 바꿔서도 해보고 LED를 더 많이 사용하여 다른 예제도 해보면서 응용력을 키워 보세요.

다시한번 강조합니다. 기본을 배우고나서 응용까지 하는것을 하나로 생각하는 것을 습관화 하세요.

그 시간이 쌓이면 나중에 분명 차이가 느껴지실 겁니다. 응용력은 누가 만들어 주지 않아요....ㅠㅠ


마지막으로 시연 동영상을 확인 하면서 이번 포스팅을 끝냅니다. ▼

계속해서 도움되는 포스팅으로 찾아뵙겠습니다.

작업환경이 소음이 심하니 주의하세요.

by 애드라이프