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이상의 값을 넘겨 받으면 전혀 다른 값이 넘어온다


포토인터럽터


구입후 어떻게 쓸까 고민하고 있는 센서다.

적외선 송신부와 수신부가 결합되어있어 사이에 물체를 

감지할수 있다


사이간격은 1cm정도로 작은 센서이다.


실모형은 그림과 같다.

핀이 2개가 있는 곳이 송신부

3개가 있는 곳이 수신부다.




도면에서 


송신부 1번과 2번핀에 전원을 연결할때 저항(330옴정도?)을 연결하고 

수신부 3번과 5번핀에 역시 전원을 연결한다.


송신부에서 항상 적외선을 수신부로 보내며

차단여부를 4번핀으로 digital 또는 analog로 출력한다.

아두이노에서 analogRead로 읽으면 0~1023 사이의 값으로 받거나

digitalRead로 읽게 되면 0,1로 값을 읽을 수 있다.




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


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

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);    // 서보 작동

  }

}

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



작동 영상



+ Recent posts