[아두이노] 시리얼 통신으로 다수 명령 처리 방법

IOT/아두이노|2019. 8. 19. 09:00

[아두이노] 시리얼 통신으로 다수 명령 처리 방법



시리얼통신으로 통해 전송되는 하나의 패턴 문자열에 대한 처리에 대해 다뤘습니다. 문득 아두이노에 연결 된 여러개의 부품을 통신을 통해 제어를 할 경우에 대해 어떻게 처리하면 좋을지 궁금해 지더군요. 하나의 패턴 문자열을 통해 A부품을 제어했다면 또다른 패턴문자열로 B부품을 제어할 일이 생길 경우가 있습니다. 여러개의 서로 다른 패턴 문자열을 아두이노우노에서 동시에 처리하고자 할 때 기초적인 방법으로 처리하는 상상코딩을 해보도록 하겠습니다.

1. 부품 패턴 문자열


LED와 Servo Motor를 통신을 통해 제어를 한다면 어떻게 할까요.

LED(A부품)패턴 문자열 : LED 핀이 13번일 경우를 가정해 봅시다.

String inString = "a13,1" or "a13,0";
  • "a13,1" => a부품이고 13번 pin에 상태는 1이다.
digitalWrite(13,1);
  • "a13,0" => a부품이고 13번 pin에 상태는 0이다.
digitalWrite(13,0);

위 A 패턴문자열을 통해서 13번 핀을 HIGH(1) or LOW(0) 상태를 지정할 수 있게 됩니다.

Servo Motor(B부품)패턴 문자열" : Servo pin이 7번일 경우를 가정해 봅시다.

String inString = "b90";
  • "b90" => b부품이고 회전각 90도이다.
servo.write(90);

위 B 패턴문자열을 통해서 고정 Servo Motor 핀을 특정각으로 회전 시킬 수 있게 됩니다.

예를들어, 2개의 패턴 문자열을 통신을 통해 전송되고 아두이노는 서로 다른 문자열이 입력되면 해당 문자열에 맞은 동작을 처리하도록 하기 위해서는 어떻게 할까요. 바로, 문자열을 분해하여 부품 패턴형태를 선택문(switch)문으로 분리해 내면 됩니다.

2. 다수 패턴 문자열을 선택


패턴 형태를 앞글자 첫번째 알파벳으로 지정하게 했습니다. 즉, a,b로 2개의 부품의 패턴부품으로 분류가 됩니다.

a,b의 부품 패턴을 선택문을 통해서 해당 부품을 지정할 수 있습니다.

  • 문자열 읽기 :
String inString = Serial.readStringUntil('\n');   
  • 첫번째 문자(부품패턴) 읽기 : 문자열에서 특정 위치의 알파벳은 charAt(위치)함수로 해당 문자를 읽어옴
char ch = inString.charAt(0); //문자열에서 첫문자 읽기
  • 패턴 선택
switch(ch){
  case 'a':  
           A부품 문자열 읽기;
           A부품 LED동작;
           break;
  case 'b':
           B부품 문자열 읽기;
           B부품 Servo Motor동작;
           break;
}

예를 들어, 두개의 부품 a,b 부품를 제어하는 명령인데 실제로 뭔가를 만들 때는 여러개 부품을 통신에을 통해 제어 할때는 여러개의 case를 만들면 되겠죠.

2개 부품을 읽을 때는 아래와 같이 2개의 case를 살펴봅시다.

  • "a13,1" or "a13,0" 읽기(A부품)
index_pin = inString.indexOf(',');     
index_state = inString.length(); 
pin = inString.substring(1, index_pin).toInt();     
state = inString.substring(index_pin+1,index_state).toInt(); 
  • "b90" 읽기(B부품)
index_servo = inString.length();   
angle = inString.substring(1, index_servo).toInt(); 
  • "a13,1" or "a13,0" 동작(A부품)
void LedOutput(int pin, int state){
  digitalWrite(pin, state);
}
  • "b90" 동작(B부품)
void ServoOutput(int angle){
  servo.write(angle);  
}

처리 동작을 보면 단순합니다. 실제는 좀 복잡한 제어 명령으로 출력함수를 코딩하겠죠.

종합해보면,

#include <Servo.h>

Servo servo;
const byte servoPin = 7;
const byte redPin = 13;
const byte greenPin = 11;
const byte bluePin = 9;

int index_pin, index_state;
int pin, state;
int index_servo, angle;


void setup()
{
  Serial.begin(9600); 
  pinMode(redPin,OUTPUT);
  pinMode(greenPin,OUTPUT);
  pinMode(bluePin,OUTPUT);
  
  servo.attach(servoPin); 
  servo.write(0);
  delay(1000);
}

void loop()
{  
  if(Serial.available()){
    String inString = Serial.readStringUntil('\n');    
    
    char ch = inString.charAt(0);
    
    switch(ch){
      case 'a':                 
                index_pin = inString.indexOf(',');     
                index_state = inString.length(); 
                pin = inString.substring(1, index_pin).toInt();     
                state = inString.substring(index_pin+1,index_state).toInt(); 
                LedOutput(pin,state);
                break;
      case 'b':
                index_servo = inString.length();   
                angle = inString.substring(1, index_servo).toInt();       
                ServoOutput(angle);
                break;                                
    }      
  } 
}

void LedOutput(int pin, int state){
  digitalWrite(pin, state);
}

void ServoOutput(int angle){
  servo.write(angle);  
} 

부품 2개를 시리얼통신을 통해서 제어해 보는 간단한 코딩입니다. 여러 부품을 제어할 때는 switch문을 이용하여 여러개의 패턴 문자열에 대한 처리 동작을 코딩을 표현하시면 다수의 부품을 제어할 수 있습니다.

위 코딩이 실제로 동작하는지 가상시뮬레이터로 돌려 볼까요.

3. 회로도


준비물 : LED 3개, 저항 220옴 3개, Servo Motor 1개, 아두이노우노
내용 : LED은 13, 11, 9번 핀에 연결하고 Servo Motor은 7번핀에 연결하시오.


LED핀은 12,11,10이렇게 하셔도 됩니다. 사실 회로도의 배선을 가상시뮬레이터에서 디자인할 때 최소화 하기 위해서 한칸씩 띄워서 연결햇네요.


4. 결과


LED와 Servo Motor에 대한 명령을 시리얼 통신을 통해 패턴 문자열을 아두이노에 보내고 그 명령들을 아두이노가 처리하는 과정을 간단히 테스트 했습니다.


마무리


오늘은 다수의 패턴 문자열을 만들고 각 문자열에 맞는 동작처리를 하는 방법을 살펴 보았습니다. 이 방법은 어디에다가 쓸까요. 가령, 다양한 부품들을 통신을 통해 한꺼번에 제어할 할때 유용합니다. 즉, 다양한 명령을 문자열로 아두이노로 전송을 하게 되면 각 문자열의 명령들을 아두이노가 식별하고 해당 부품의 동작 명령을 내릴 수 있습니다.

예를 들어, 아두이노가 웹서버에 연결되어 있다고 상상해 봅시다. 웹서버에서는 아두이노로 "A 모터를 돌려라!", "B 부품의 전원을 공급하라", "C 부품으로 온도를 측정하여 온도를 알려달라!" 등 다양한 명령을 내린다고 상상해 봅시다. 아두이노는 이런 다양한 명령을 어떻게 처리해야 할까요. 바로 오늘 소개한 방식으로 다양한 명령 패턴문자열로 보내오고 그 문자열을 위에서 코딩했던 방식으로 switch문을 통해서 분류하여 선택한다면 원하는 동작을 수행 할 수 있게 됩니다.

간단한 원리지만 활용도 면에서 꽤 유용하니깐 참고해 주세요.


댓글()