정보나눔

오픈소스하드웨어 프로젝트에 대한 다양한 정보를 나누는 공간입니다.

시리얼통신에 문제가 있는것같습니다.
전지윤 | 2016-09-03

아두이노와 프로세싱을 연동하여 이미지가 변하는 작품을 하고있습니다.

처음에는 (지구)이미지 1에서 7장 까지가 계속 반복적으로 보여집니다. 

버튼 1을 누르면 21부터 30장이 보인다음 (우주)이미지 40부터 46장까지 보이도록 하려고 하는데요 (이미지파일의 숫자는 임의로 정한거입니다)

처음에 코드를 짤때에는 시리얼 통신 없이 짜보아서 버튼1 대신 마우스 프레스드를 이용했습니다.  마우스가 눌리면 21장이 실행되고 그다음에 40장이 보이도록이요 근데 이걸 시리얼통신으로 가져오니 반응을 하지않습니다. 반응을 아예 안하는건 아닌데요. 

아두이노 시리얼모니터에서는 잘작동하는게보이는데 프로세싱모니터로보면 제대로 그 값을 받아오질 못하고, 값을 받아와도 작동을 안되거나

한참 후에 두장 정도보이다가 그냥 계쏙 첫 이미지들만 보여주네요

시리얼통신간의 문제인거같단 생각에 아두이노 딜레이와 이미지 변환속도 (fps)을 조절을 해보아도 해결책이 나지않습니다. 

어떻게 해야할까요? 

 

다음은 코드입니다.


import processing.serial.*;

Serial myPort;
String val;
int count, count2, count3, maxSeq, maxSeq2, a, space, earth;
float fps, time;
PImage img, img2;

void setup() {
   printArray(Serial.list());
  //Serial
  String portName = Serial.list()[1];
  myPort = new Serial(this,portName,9600);
  
  fps = 100;
  time = 0;
  count = 1;
  count2 = 21;
  count3 = 40;
  maxSeq = 7;
  maxSeq2 = 46;
  a=0;
  space = 0;
  earth = 1;
  
  size(800, 800);
  
}

void draw() {

 if (myPort.available() > 0) {
    if ( (val = myPort.readStringUntil(ENTER)) != null )  val = trim(val);
    else return;
    if (val != null) {
      println(val);
    }
  }
  
  
  if ( count == maxSeq + 1)
  {
    count = 1;
  }
  if ( count3 == maxSeq2 + 1)
  {
    count3 = 40;
  }


  if (space == 0 && earth == 1) { 
    if ( millis()-time > fps )
    {
      background(255);
      time = millis();
      img = loadImage(count+".jpg"); // 처음 이미지
      img2=loadImage(count2+".jpg"); // 두번째 이미지
      noTint();
      image( img, 100, 100, width/2, height/2);
      count++;

      if ("2High".equals(val)) { // 버튼이 눌리면..// Low도 해보고 High도 해봤어요
        if (count2 < 31) {
          tint(255, a);
          image( img2, 100, 100, width/2, height/2);
          a = a+70; 
          count2++;
          if (count2 == 30) { // 다음 이미지(40~46)로 넘어가기위해 값 변화를 줬습니다.
            space = 1;
            earth = 0;
          }
        }
      } else { // 중간에 버튼이 떨어지면 작동 안하도록했어요 
        count2 = 21;
        a = 0;
      }
    }


    // fps=mouseX;
  }

  //space // 

  if (space == 1 && earth == 0) { // 40~46 이미지 재생)
    if ( millis()-time > fps )
    {
      background(255);
      time = millis();
      img = loadImage(count3+".jpg");
      img2=loadImage(count2+".jpg");
      noTint();
      image( img, 100, 100, width/2, height/2);
      
      count3 ++;
      //println(fps);
    }

    if (mousePressed) { // 시리얼통신 전에 마우스로 작동시키던거를 실험삼아 한번더 작동시킨겁니다 아마 시리얼통신 문제가 해결되면 버튼 2로 만들거같아요 근데 얘는 마우스떄도 작동을 안해서 고민중입니다.. ㅠㅠ
      if (count2 < 31) {
        tint(255, a);
        image( img2, 100, 100, width/2, height/2);
        a = a+70;
        count2++;
        if (count2 == 30) {
          space = 0;
          earth = 1;
        }
      }
    } else {
      count2 = 21;
      a = 0;
    }
  }
}

 

 

이전글   |    이더넷 쉴드로 기상청 날씨정보 가져오기 2016-09-02
다음글   |    아날로그 센서값을 이용해서 마우스를 움직이고 싶습니다만.. 스케치 확인 부탁드립니다. ... 2016-09-04