Processing

2024. 7. 5. 13:26LiDAR

 

✅ Processing 개발 환경 구축

https://processing.org/donate

 

Donate

We need your help! Please support Processing by making a donation to the Processing Foundation. Your donation contributes to software development, education resources like code examples and tutorials,…

processing.org

 

Processing

 

✅ Processing 오류 원인

Processing 코딩

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

void loop() {
  // 프로세싱으로 값을 전달
  
  Serial.write(0);
}

 

import processing.serial .*;

Serial port;

void setup() {
  
  // 사용 가능한 시리얼 포트 검색
  // Serial.list() : 사용 가능한 포트 리스트
  
  for (int i = 0; i < Serial.list().length; i++) {
    println("[" + i + "]" + Serial.list()[i]);
  }
  
  // 시리얼 포트 할당
  
  port = new Serial(this, Serial.list()[1], 9600);
  
  // 창 크기 설정
  
  size(300, 300);
  
}

void draw() {
  
  // 배경색 설정 (0 ~ 255)
  
  background(150);
  
  // 시리얼 포트로부터 데이터가 수신 되었다면
  
  if (port.available() > 0) {
    // 수신된 값을 읽어온다
    
    int x = port.read();
    
    if (x == 0) {
      // 사각형 그리기 (좌상단 좌표 (x, y), 폭, 높이)
      rect(100, 100, 50, 50);
    } else {
      // 타원 그리기 (중심점 좌표 (cx, cy), 폭 반지름, 높이 반지름, )
      ellipse(100, 100, 50, 50);
    }
    
  }
  
}

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

void loop() {
  // 프로세싱으로 값을 전달
  
  Serial.write(1);
}
import processing.serial .*;

Serial port;

void setup() {
  
  // 사용 가능한 시리얼 포트 검색
  // Serial.list() : 사용 가능한 포트 리스트
  
  for (int i = 0; i < Serial.list().length; i++) {
    println("[" + i + "]" + Serial.list()[i]);
  }
  
  // 시리얼 포트 할당
  
  port = new Serial(this, Serial.list()[1], 9600);
  
  // 창 크기 설정
  
  size(300, 300);
  
}

void draw() {
  
  // 배경색 설정 (0 ~ 255)
  
  background(150);
  
  // 시리얼 포트로부터 데이터가 수신 되었다면
  
  if (port.available() > 0) {
    // 수신된 값을 읽어온다
    
    int x = port.read();
    
    if (x == 0) {
      // 사각형 그리기 (좌상단 좌표 (x, y), 폭, 높이)
      rect(100, 100, 50, 50);
    } else {
      // 타원 그리기 (중심점 좌표 (cx, cy), 폭 반지름, 높이 반지름, )
      ellipse(100, 100, 50, 50);
    }
    
  }
  
}

 

LED 제어하기

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

  pinMode(8, OUTPUT);
}

void loop() {
  if (Serial.available() > 0) {
    int val = Serial.read();

    if (val > 128) {
      digitalWrite(8, HIGH);
    } else {
      digitalWrite(8, LOW);
    }
  }
}
import processing.serial .*;

Serial port;

void setup() {
  
  // 사용 가능한 시리얼 포트 검색
  // Serial.list() : 사용 가능한 포트 리스트
  
  for (int i = 0; i < Serial.list().length; i++) {
    println("[" + i + "]" + Serial.list()[i]);
  }
  
  // 시리얼 포트 할당
  
  port = new Serial(this, Serial.list()[1], 9600);
  
  // 창 크기 설정
  
  size(300, 300);
  
}

void draw() {
  
  // 현재 마우스 좌표를 출력
  
  println("mouseX = " + mouseX + ", mouseY = " + mouseY);
  
}

import processing.serial .*;

Serial port;

void setup() {
  
  // 사용 가능한 시리얼 포트 검색
  // Serial.list() : 사용 가능한 포트 리스트
  
  for (int i = 0; i < Serial.list().length; i++) {
    println("[" + i + "]" + Serial.list()[i]);
  }
  
  // 시리얼 포트 할당
  
  port = new Serial(this, Serial.list()[1], 9600);
  
  // 창 크기 설정
  
  size(300, 300);
  
}

void draw() {
  
  // 현재 마우스 좌표를 출력
  
  println("mouseX = " + mouseX + ", mouseY = " + mouseY);
  
  background(mouseX);
  
  port.write(mouseX);
  
}

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

  pinMode(9, OUTPUT);
}

void loop() {
  if (Serial.available() > 0) {
    int val = Serial.read();

    analogWrite(9, val);

    // if (val > 128) {
    //   digitalWrite(9, HIGH);
    // } else {
    //   digitalWrite(9, LOW);
    // }
  }
}

 

2개 이상의 센서 값 전송하기

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

  pinMode(8, INPUT);
}

void loop() {
  int val1 = analogRead(A0);
  int val2 = digitalRead(8);

  // 읽은 값들을 프로세싱으로 전송
  // 문자열로 만들어서 보내는 방식 "val1 : val2"
  // 시작 비트 -> 값1, 값2 -> 종료 비트
  // 255를 시작 비트로 사용

  Serial.write(255);

  // 데이터 전송
  // 가변저항 값 전송 (0~253)
  // map(변수, 원 시작값, 원 종료값, 목표 시작값, 목표 종료값)

  Serial.write(map(val1, 0, 1024, 0, 253));

  // 버튼 값 전송

  Serial.write(val2);

  // 254를 종료 비트로 사용

  Serial.write(254);
}
import processing.serial .*;

Serial port;

// 시작, 다음

int start, next;

// 수신된 값 저장

int data1, data2;

// 각도 값

float rot = 0.0;

// 이미지 객체

PImage img;

void setup() {
  
  // 사용 가능한 시리얼 포트 검색
  // Serial.list() : 사용 가능한 포트 리스트
  
  for (int i = 0; i < Serial.list().length; i++) {
    println("[" + i + "]" + Serial.list()[i]);
  }
  
  // 시리얼 포트 할당
  
  port = new Serial(this, Serial.list()[1], 9600);
  
  // 창 크기 설정
  // P3D : 3차원 화면
  
  size(512, 512, P3D);
  
  // 이미지 로드
  
  img = loadImage("wind.png");
  
}

void draw() {
  
  background(255);
  
  image(img, 256 - img.width / 2, 256 - img.height / 2);
  
}

import processing.serial .*;

Serial port;

// 시작, 다음

int start, next;

// 수신된 값 저장

int data1, data2;

// 각도 값

float rot = 0.0;

// 이미지 객체

PImage img;

void setup() {
  
  // 사용 가능한 시리얼 포트 검색
  // Serial.list() : 사용 가능한 포트 리스트
  
  for (int i = 0; i < Serial.list().length; i++) {
    println("[" + i + "]" + Serial.list()[i]);
  }
  
  // 시리얼 포트 할당
  
  port = new Serial(this, Serial.list()[1], 9600);
  
  // 창 크기 설정
  // P3D : 3차원 화면
  
  size(512, 512, P3D);
  
  // 이미지 로드
  
  img = loadImage("wind.png");
  
}

void draw() {
  
  background(255);
  
  // 수신된 값을 읽어온다
  
  while (port.available() > 0) {
    // 시작/종료 비트 읽음
    
    int data = port.read();
    
    // 시작 비트라면
    
    if (data == 255)
      start = 1;
      
    // 종료 비트라면
    
    else if (data == 254)
      start = 0;
      
    // 시작 비트인 경우에 값 읽기
    
    if (start == 1) {
      
      // 첫 번째 값이라면 : 가변저항 값
      // 값 범위가 0 ~ 253이므로 화면 크기 512 x 512에 맞추기 위해서 2를 곱한다
      
      if (next == 1) data1 = data * 2;
      
      // 두 번째 값이라면 : 버튼 값
      
      else if (next == 2) data2 = data;
      
      next++;
    } else {
      next = 0;
    }
    
  }
  
  // 읽은 값을 이용해서 이미지를 제어
  // 3D 화면에서 이미지 제어 시작
    
  pushMatrix();
  
  // 가변 저항 값으로 이미지 이동 (대각 방향)
  
  translate(data1, data1, 0);
  
  // 이미지 회전
  
  rotateZ(rot);
    
  image(img, - img.width / 2, - img.height / 2);
    
  // 3D 화면에서 이미지 제어 종료
    
  popMatrix();
  
  // 버튼을 누른 경우 회전 각도 변경
  
  if (data2 == 1) {
    rot -= 0.05;
  }
  
}

 

✅ 프로세싱 사용 사례

자이로 센서 - GY-521

#include<Wire.h>

// 자이로 센서 I2C주소
const int MPU = 0x68;
// 센서값 저장 : 자이로 센서  x,y,z, 온도 센서, 가속도 센서 x,y,z
// 2byte -> 14byte
int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ;
void setup() {
  // I2C 통신 시작(0을 전송해서 시작)
  Wire.begin();
  // I2C주소 확인
  Wire.beginTransmission(MPU);
  // 자이로 센서 동작
  Wire.write(0x6B);
  // 0을 전송해서 시작
  Wire.write(0);
  // 1을 전송해서 종료
  Wire.endTransmission(true);

  Serial.begin(9600);

}

void loop() {
  // 자이로 센서 연결
  Wire.beginTransmission(MPU);
  //데이터 저장 주소
  Wire.write(0x3B);  
  // 0을 전송해서 I2C통신 유지
  Wire.endTransmission(false);

  //자이로 센서로부터 값을 읽어온다.
    Wire.requestFrom(MPU,14,true);  
  // Wire.read(); :1byte읽기
  // << 8 : 8비트 (1byte)만큼 왼쪽으로 쉬프트
  // | Wire.read() : 다음 1byte를 읽어 이전 쉬프트란 값에 연결
  // 2byte 데이터를 GX에 저장
  GyX=Wire.read()<<8|Wire.read();  
  GyY=Wire.read()<<8|Wire.read();  
  GyZ=Wire.read()<<8|Wire.read();  
  Tmp=Wire.read()<<8|Wire.read();

  AcX=Wire.read()<<8|Wire.read();  
  AcY=Wire.read()<<8|Wire.read();  
  AcZ=Wire.read()<<8|Wire.read();  

 //Serial.print(" | Tmp= "); Serial.print(Tmp/340.00+36.53);

 int16_t GX2 = map(GyX, -32255, 32255, -180, 180);
 int16_t GY2 = map(GyY, -32255, 32255, -180, 180);
 int16_t GZ2 = map(GyZ, -32255, 32255, -180, 180);
 Serial.print(" | GX2 = "); Serial.print(GX2);
 Serial.print(" | GY2 = "); Serial.print(GY2);
 Serial.print(" | GZ2 = "); Serial.println(GZ2);
 delay(333);
}

'LiDAR' 카테고리의 다른 글

LiDAR 센서 이해하기  (0) 2024.07.09
ROS(Robot Operating System)  (0) 2024.07.08
RFID  (0) 2024.07.08
I2C 통신  (0) 2024.07.04