[아두이노] 시리얼 플로터 사용

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

[아두이노] 시리얼 플로터 사용



아두이노를 실험 할 때 지금까지는 시리얼 모니터로 디지털 값으로만 확인 해 봤습니다. 사실 지금까지 시리얼 플로터를 사용하지 않는 이유는 시이얼 플로터로 결과를 확인이 필요한 경우가 없었는데 지난 시간에 Color Sensor를 사용하면서 시리얼 플로터로 결과를 확인할 필요성이 느껴져서 이번에 post 주제로 선정했네요. 시리얼 플로터는 아날로그 파형으로 그래프 형태로 결과를 시각적으로 보여주는 출력 장치입니다. 그럼 이제 시리얼 플로터가 어떤 느낌인지 자세히 살펴보도록 하죠.

1. 시리얼 플로터


시리얼 모니터는 출력값을 디지털 형태의 숫자로 결과를 출력을 하고 시리얼 플로터는 아날로그 형태의 그래프 형태로 시각화 출력을 합니다.

그러면 시리얼 모니터와 시리얼 플로터의 출력 형태를 비교해 볼까요.

[실험 소스]

int output = 1;
unsigned long timeVal = 0;

void setup()
{
  Serial.begin(9600);
}

void loop()
{   
   if(millis()-timeVal>=100){ //0.1초 단위로 1 or -1의 결과를 출력합니다.
    output=-output;
    timeVal=millis();    
   }
   Serial.println(output); //시리얼 출력
}

[시리얼모니터 결과]


[시리얼플로터 결과]


둘의 출력 형태가 어떤 느낌인지 아시겠지요.

2. 시리얼 플로터에 여러개의 데이터 출력


위에서는 한개의 데이터만 출력했습니다. 지난 시간에 실험한 Color Sensor은 3개의 RGB 데이터를 출력하는데 그러면 그 데이터는 한번에 같이 어떻게 출력 할까요.

아래와 같은 방식으로 코딩하시면 됩니다. 즉, 데이터와 데이터 사이를 공백으로 띄워서 데이터를 출력하면 나눠서 출력하게 됩니다.

int output = 1;
unsigned long timeVal = 0;

void setup()
{
  Serial.begin(9600);
}

void loop()
{   
   if(millis()-timeVal>=100){ //0.1초 단위로 1 or -1의 결과를 출력합니다.
    output=-output;
    timeVal=millis();    
   }
     
     //시리얼 출력
   Serial.print(output); //데이터 1번
   Serial.print(" "); 
   Serial.println(output*2); //데이터 2번
}

즉, output와 output*2의 값 사이에 공백을 넣어주면 두개의 데이터를 동시에 아래 결과처럼 출력하게 됩니다.

[결과]


3. Color Sensor 값을 시리얼 플로터로 출력



지난 시간의 회로도를 그대로 적용 합니다.

1) Color Sensor 회로도


위 회로도는 지난시간에 만들 회로도이고 코딩도 그래도 적용합니다.

2) 코딩


시리얼 출력 부문만 약간 수정합니다.

const byte s0_pin = 3;
const byte s1_pin = 4;
const byte s2_pin = 5;
const byte s3_pin = 6;
const byte out_pin = 7;

const byte r_pin = 9;
const byte g_pin = 10;
const byte b_pin = 11;


void setup() {
  Serial.begin(9600);
  
  pinMode(r_pin, OUTPUT);
  pinMode(g_pin, OUTPUT);
  pinMode(b_pin, OUTPUT);
  
  pinMode(s0_pin, OUTPUT);
  pinMode(s1_pin, OUTPUT);
  pinMode(s2_pin, OUTPUT);
  pinMode(s3_pin, OUTPUT);
  
  pinMode(out_pin, INPUT);
  
  digitalWrite(s0_pin,HIGH);
  digitalWrite(s1_pin,LOW);
}


void loop() {
  digitalWrite(s2_pin,LOW);
  digitalWrite(s3_pin,LOW);
  int red_color = pulseIn(out_pin, LOW);
  red_color = map(red_color, 25,72,255,0);
  red_color = constrain(red_color, 0, 255);
  delay(50);
  
  digitalWrite(s2_pin,HIGH);
  digitalWrite(s3_pin,HIGH);
  int green_color = pulseIn(out_pin, LOW);
  green_color = map(green_color, 30,90,255,0);
  green_color = constrain(green_color, 0, 255);
  delay(50);
  
  digitalWrite(s2_pin,LOW);
  digitalWrite(s3_pin,HIGH);
  int blue_color = pulseIn(out_pin, LOW);
  blue_color = map(blue_color, 25,70,255,0);
  blue_color = constrain(blue_color, 0, 255);
  delay(50);

  analogWrite(r_pin, red_color);
  analogWrite(g_pin, green_color);
  analogWrite(b_pin, blue_color);

  //시리얼 플로터 출력
  Serial.print(blue_color);
  Serial.print("  ");  
  Serial.print(red_color);
  Serial.print("  ");      
  Serial.println(green_color);
  
  delay(100);
}

시리얼 출력 부분에서 시리얼 플로터 출력으로 약간 수정 했네요. 시리얼 플로터에 색상에 맞추다 보니깐 B, R, G 순으로 했네요. 혹시 여러분들이 출력을 했는데 아래 결과의 색상이 다르면 위 코딩의 색상 출력 순서를 변경하시면 됩니다.

3) 결과



Color의 변화를 시각적으로 확인 할 수 있습니다. 자세히 보시면 노이즈로 인해 색값이 변화가 중간에 심하게 발생하는 보실 수 있을꺼에요. 센서 자체가 납땜이 안되어 있고 전선꼽아서 하기 때문에 손으로 만지면 전선과 센서 사이에 잡음이 발생 할 수 밖에 없네요.

아래는 색상이 측정되고 출력되는 결과를 기록해 놓았습니다.


마무리


시리얼 플로터는 특정한 값의 변화를 시각적으로 확인하기에 편합니다. Color Sensor와 같은 부품을 제어 할 때에 값의 변화가 수치보다는 시각적 챠트로 보는게 더 효과적이겠죠. 이 챠트를 보면 색의 주파수 범위를 나중에 색종이를 가지고 지정할 때 활용하면 좋겠죠.

오늘은 간단히 시리얼 플로터를 사용하는 방법을 살펴 보았네요.


댓글()