ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 아두이노(송신)와 프로세싱(수신)에서의 데이터 처리하기 - 상
    Processing 2020. 11. 10. 18:43

    아두이노에서 숫자를 보내나 문자를 보내를 보내나 프로세싱은 문자로 본다.

    아두이노에서 Serial.write(123); 을 하면 프로세싱은

    이를 '1', '2', '3' 으로 즉, 아스키 코드값인 49, 50, 51로 데이터를 받고 출력한다. 

    '0'은 아스키 코드값으로 48이다.
    송신 측에서는 데이터의 길이도 함께 보내줘야 한다.

    추가로 시작 코드는 0x7E를 보내준다.
    [시작 코드 / 데이터의 길이 / 데이터 / 종료 코드] 로 구성한다. 

    그리고 아두이노에서 데이터를 전송할 시에, print함수와 write함수를 사용할 수 있는데

    이 두 함수의 차이점은 print함수는 2바이트를 write함수는 1바이트 전송한다.

    네트워크에서는 write함수 사용한다.

    아두이노는 int가 2바이트이다. 이는 sizeof(int)를 출력해보면 알 수 있다.

     

    우리가 나중에 처리할 내용은 조이스틱의 x,y값을 아두이노가 입력받아 프로세싱에 송신하고

    프로세싱에서 이 데이터를 처리한다.

     

    우선 문제를 간단히 하기 위해서 조이스틱의 x값만 받는다고 가정을 하면 조이스틱의 x값은 0 ~ 1023의 값을 갖는다. 

    조이스틱의 x좌표 값은 sensor 변수가 저장한다.

    이 조이스틱의 x좌표 값은 최대값1023은 1바이트가 표현할 수 있는 최대값인 255를 넘긴다.

    그래서 조이스틱의 x좌표 값 하나를 전송하기 위해서는 2바이트만 있으면 충분하다.

    그래서 데이터의 길이는 우선 2로 두자.

    그리고 조이스틱의 x좌표값은 255를 넘느냐 넘지 않느냐에 따라 별도의 처리가 필요하다.

    이 읽은 값을 처리하기 위해서 highSensor, lowSensor 두 변수를 추가로 선언한다.

    즉,센서값이 1바이트로 표현할 수 있는 수의 범위를 넘어 갈 수 있으므로 변수 2개에 걸쳐 저장을 한다.

    데이터의 길이와 highSensor, LowSensor가 프로세싱에 수신이 되는지 알아보자.

    센서값이 1234라고 한다면

    1234 - 1024(2^10) = 210 이며, 210 - 128(2^7) = 82 이며, 82 - 64(2^6) = 18 이며, 18 - 16(2^4) = 2 이다.

     

     

    아두이노 소스 코드

    더보기
    void setup() 
    {
      Serial.begin(9600);
      
      int sensor = 1234;  //  센서로부터 읽은 값이라고 하자.
      int highSensor = 0; 
      int lowSensor = 0;  
      
      //  255는 1바이트가 표현할 수 있는 최대값
      if (sensor > 255)
      {
        highSensor = sensor >> 8;     //  highSensor에는 4가 저장된다.
        lowSensor = 0x00FF & sensor;  //  0x00FF는 255이다. lowSensor는 210이 저장 
      }
      else
      {
        highSensor = 0;
        lowSensor = sensor;
      }
      
      byte startByte = 0x7E;                    //  시작바이트
      //int dataLen = String(sensor).length();
      //byte dataLen = String(sensor).length(); //  데이터의 길이(비트 수로 전달)
      byte dataLen = 2;   //  정보를 처리하는데, 길이는 2바이트면 된다.
      byte endByte = 0xFE;                      //  끝 바이트
      /*
      Serial.print(startByte,HEX);
      Serial.print(dataLen);
      Serial.print(sensor);
      Serial.print(endByte,HEX);
      */
      Serial.write(startByte);
      Serial.write(dataLen);
      Serial.write(highSensor);
      Serial.write(lowSensor);
      Serial.write(endByte);
      delay(1000);
    }
    
    void loop() {}

     

     

     

    프로세싱에서는 데이터의 길이와 highSensor와 lowSensor의 값을 읽어서 출력을 해보자.

    프로세싱 소스 코드

    더보기
    import processing.serial.*;
    
    Serial port;
    
    void setup()
    {
      port=new Serial(this, "COM6",9600);
      
      delay(4000);
    }
    
    void draw()
    { 
      if (port.available() > 0)
      {
        int c = port.read();
        
        //  read start
        if (c == 0x7E) // 0x7E equals to 126
        {
          int i = 0;
          int buf[] = new int[3];
          
          //  until read endByte
          while (c != 0xFE)
          {
            buf[i++] = port.read();
            
            if (i == 3)
              break;
          }
          
          for (i = 0; i < 3; i++)
            println(buf[i]);
        }   
        delay(100);
      }  //  available end if
    }

     

    프로세싱의 출력 결과

     

    위의 프로세싱에서 출력 결과를 이용해서 원래의 센서 값을 다시 얻어보자.

    아두이노에서 처리한 과정의 역순으로 하면 된다.

    아래의 문장을 추가하면 된다.

    소스 코드

    더보기
    import processing.serial.*;
    
    Serial port;
    
    void setup()
    {
      port=new Serial(this, "COM6",9600);
      
      delay(4000);
    }
    
    void draw()
    { 
      if (port.available() > 0)
      {
        int c = port.read();
        
        //  read start
        if (c == 0x7E) // 0x7E equals to 126
        {
          int i = 0;
          int buf[] = new int[3];
          
          //  until read endByte
          while (c != 0xFE)
          {
            buf[i++] = port.read();
            
            if (i == 3)
              break;
          }
          
          for (i = 0; i < 3; i++)
            println(buf[i]);
            
          int sensor = (buf[1] << 8) + buf[2];
          
          print("sensor : "+sensor);
        }   
        delay(100);
      }  //  available end if
    }

    출력 결과

     

    아래에서 아두이노와 조이스틱을 연결해서 프로세싱과 통신을 해보자.

    designatedroom87.tistory.com/308

     

    아두이노(송신)와 프로세싱(수신)에서의 데이터 처리하기 - 하

    아래의 내용을 기반으로 아두이노에 조이스틱을 연결해서 조이스틱의 값을 받아서 프로세싱에 전달해보자. designatedroom87.tistory.com/306?category=902512 아두이노(송신)와 프로세싱(수신)에서의 데이터

    designatedroom87.tistory.com

     

    댓글

Designed by Tistory.