write와 print로 넘어오는 통신값


아두이노와 프로세싱을 같이 활용하려면

아두이노에서의 센서값을 프로세싱으로 넘긴다든지

프로세싱에서의 처리된 값을 아두이노로 넘겨 모터나 LED를 활용한다든지

두 프로그램간 값을 주고 받기 때문에 시리얼 통신을 해야한다.


통신을 통해 값을 넘길때는 write나 print를 사용하는데

각각 넘기는 값의 차이가 있다.


write는 값 그대로 넘기는 반면

print는 값을 아스키 코드 값으로 넘긴다.


즉 write(3)으로 '3'을 넘기면 그대로 '3'이 넘어오지만

print(3)으로 '3'을 넘기면 아스키코드로 '3'에 해당하는 '51'을 넘긴다.


위 그림에서

프로세싱 스케치를 보면

넘긴 값을 x로 받아 x=3일경우는 원을(주석처리부분)

x=51일 경우에는 사각형을 그리도록 스케치하였다.


아두이노 쪽에서 print로 '3'을 넘기면 사각형이

write로 '3'을 넘기면 원이 그려진다.


만약 print로 넘어온 '3'을 그대로 표현 하려 한다면

char을 이용하여 char(51)을 이용하면 '3'으로 변환 된다.


참고로

write(10)은 값을 그대로 10을 넘기지만

write("10")은 1과 0문자를 넘김 즉 1의 49와, 0의 48 (문자열로 넘김)

print(10)과 같다.


또 write로 통신시 1byte통신으로 최대 255값까지 넘긴다. 

255이상의 값을 넘겨 받으면 전혀 다른 값이 넘어온다


프로세싱 + 아두이노 서보모터 제어


프로세싱을 통해 마우스값을 아두이노로 넘겨

LED를 제어해 보았다. 

(이전글 http://eskelt.tistory.com/65  )


그와 비슷하게 이번에는 서보 모터를 제어해보자.

(서보모터제어 이전글  http://eskelt.tistory.com/8 )


일단 프로세싱에서 마우스X 값을 아두이노로 넘기고

아두이노에서 서보 라이브러리이용하여

서보모터를 동작하도록 한다.


예제에서 마우스의 움직임과 마우스의 좌표값을 

화면에 표현하기 위한 폰트를 사용하였다.

공부한 내용을 정리한 것으로

폰트 부분과 마우스의 위치를 화살표로 표시하기 위한

부분은 삭제하면 스케치는 간단하다



프로세싱 스케치

-------------------------------------------------------------------------------------------------

import processing.serial.*;   // 아두이노와 통신을 위한 시리얼 라이브러리 사용

Serial myport;                      // 시리얼통신 선언


PFont font;                         // 폰트선언


int x;

int offset = 10;                     // 마우스의 위치를 화살표로 그리기 위한 값


void setup(){

  size(256,150);

  myport = new Serial(this,Serial.list()[2],9600);     //연결된 3번째 시리얼통신 사용

  font = loadFont("Arial-Black-48.vlw");                 //폰트적용

  textFont(font,15);                                              //폰트속성

}


void draw(){

  background(204);

  line(x,0,x,150);                    // 임의의 x좌표의 수직선

  if(mouseX>x){x+=1; offset = 10;}              // 마우스가 x좌표보다 오른쪽에 있으면 offset를 10으로하고

                                                             // x값을 증가시켜 마우스값으로 이동

  if(mouseX<x){x-=1; offset = -10;}            // 마우스가 x좌표보다 왼쪽에 있으면 offset를 -10으로하고

                                                             // x값을 감소시켜 마우스값으로 이동

  fill(0);   // 글씨색

  text(x,x,145);                                         // 현재 x 값을, 좌표 (x,145) 지점에 표시 

                                                             // x값에 따라 이동하는 글씨

  text(mouseX,mouseX,mouseY-15);          // 마우스의 좌표값을 (mouseX,mouseY-10) 지점에 표시

                                                             // 마우스 포인터 보다 약간 위쪽에 마우스X좌표 표시

  line(mouseX,mouseY,mouseX+offset*3,mouseY);       // 마우스의 위치를 화살표로 표현

  line(mouseX,mouseY,mouseX+offset,mouseY-10);     // 마우스의 위치를 화살표로 표현

  line(mouseX,mouseY,mouseX+offset,mouseY+10);     // 마우스의 위치를 화살표로 표현


  myport.write(mouseX);                 // 아두이노로 마우스의 X값 보냄

}

--------------------------------------------------------------------------------------------------



아두이노 스케치

---------------------------------------------------------

#include <Servo.h>   // 서보 라이브러리 사용

    

int x ;   

Servo servoA;   // 서보 선언

void setup(){

  Serial.begin(9600);   //시리얼 통신 시작

  servoA.attach(10);    // 서보 신호핀 10번

}


void loop(){

  if(Serial.available()>0){

    x=Serial.read();

    x = map(x,0,255,0,179);   // 데이터 값을 0~179로 범위 지정

    servoA.write(x);    // 서보 작동

  }

}

---------------------------------------------------------



작동 영상



프로세싱과 아두이노를 연결하여

아두이노에 연결된 자원을 제어해보자

이번엔 간단히 LED으 밝기를 제어해보자.


프로세싱과 아두이노는 Serial 통신으로 연결하고

서로 데이터를 주고 받을 수 있다.


일단 프로세싱에서는 Serial 라이브러리를 활용한다.


프로세싱 스케치

-----------------------------------------------------------------------------

import processing.serial.*;      //Serial 라이브러리 임포트


Serial mport;                    // mport라는 시리얼포트 선언

void setup(){

  size(512,100);

  mport = new Serial(this,Serial.list()[1],9600);   //컴퓨터에 배정된 시리얼포트중 

                                                                    //2번째포트로 9600rate의 포트 사용

}


void draw(){

  background(mouseX/2);    // 마우스 x좌표값에 따른 배경색 변화

  mport.clear();                   // 주석처리해도 무방

  mport.write(mouseX/2);     //선언한 포트로 마우스값 전송

}

------------------------------------------------------------------------------


위 스케치에서

Serial.list()[1]부분은 컴퓨터에서 할당한 포트중에서 두번째 포트를 선택하는 것으로

[0],[1],[2],[3]......순이다.

아두이노에서 확인해보면 아래그림과 같다.




아두이노 스케치

----------------------------------------------------------------------------------------

int pdata = 0;               // 프로세싱에서 받을 데이터 변수 선언


void setup(){

  Serial.begin(9600);    // 시리얼 통신 시작

}


void loop(){

  if(Serial.available()>0){                      // 넘어오는 데이터가 있으면

    pdata = Serial.read();                       // 시리얼에서 오는 데이터 저장

    pdata = map(pdata,0,255,0,250);         // 데이터를 0~255명확한 한계지정

    analogWrite(10,pdata);                      // 아날로그 값으로 표현

  }

}

---------------------------------------------------------------------------------------



작동 영상


+ Recent posts