아두이노 동작 스케치 = 영점 조정 값설정, 주기적 색 감지, RGB 갑스올 바꾸고 시리얼 통신 통해 PC 전달
PC 동작 프로세싱 IDE 스케치 = 전달받은 데이터에서 3개 정수 값 분리해 실행 창 배경색으로 설정
아두이노 스케치
/*
TCS230 Color Sensing
색 감지 & PC 전달 & Processing 스케치 배경색 예제
Calibrate 스케치로 얻어낸 영점 조정 데이터 사용 = 먼저 Calibrate 스케치 실행
*/
#include <MD_TCS230.h>
#include <FreqCount.h>
// 연결된 핀 번호들: S0_OUT <-> 8, S1_OUT <-> 9
#define S2_OUT 12
#define S3_OUT 11
#define LED 13 // HIGH = ENABLED
// TCS230 객체인 CS 사용 핀 선언
MD_TCS230 CS(S2_OUT, S3_OUT, /* S0_OUT, S1_OUT, */ LED);
// Calibrate 스케치 실행 얻은 영점 조정 데이터.
// TCS3200 컬러 감지 센서 1 게시물에서 나온 본인 결과값 적어야함.
sensorData sdBlack = { 40, 50, 50 };
sensorData sdWhite = { 2640, 1370, 1980 };
// 전역 변수들:
colorData rgb;
void setup()
{
// 시리얼 포트 초기화
Serial.begin(115200);
// 컬러 센서 초기화 begin()
// 영점 조정 위한 검정색, 흰색 값 설정
CS.begin();
CS.setDarkCal(&sdBlack);
CS.setWhiteCal(&sdWhite);
}
void loop()
{
// 색 감지, RGB 값 읽기
CS.read();
// 읽을 데이터 준비 때까지 기다림
while(!CS.available()) ;
// RGB 데이터 값 읽기
CS.getRGB(&rgb);
// 쉼표 분리된 값 출력
Serial.print(rgb.value[TCS230_RGB_R]);
Serial.print(",");
Serial.print(rgb.value[TCS230_RGB_G]);
Serial.print(",");
Serial.println(rgb.value[TCS230_RGB_B]);
delay(100);
}
프로세싱 스케치
import processing.serial.*;
int redValue = 0; // Red 컬러 값
int greenValue = 0; // Green 컬러 값
int blueValue = 0; // Blue 컬러 값
Serial myPort;
void setup() {
size(200, 200);
// 사용 가능 모든 시리얼 포트 출력
println(Serial.list());
// PC 두번째 시리얼 포트가 아두이노와 연결된 시리얼 포트라 Serial.list()[2] 사용
// 다른 포트를 사용 시 그 포트 숫자 작성
myPort = new Serial(this, Serial.list()[6], 115200);
// '\n' 받을 때까지 serialEvent() 발생 X
myPort.bufferUntil('\n');
}
void draw() {
// 아두이노 RGB 데이터 배경색 설정
background(redValue, greenValue, blueValue);
}
void serialEvent(Serial myPort) {
// 시리얼 포트 ~ 새 줄문자 = inString 문자열 받음
String inString = myPort.readStringUntil('\n');
if (inString != null) {
// 문자열 있다면 앞 뒤 공백 문자 삭제
inString = trim(inString);
// 쉼표 분리 integer 값 만듦
int[] colors = int(split(inString, ","));
// 3개의 값 받으면 RGB 모든 값 받아 들인 것
// 각 redValue, greenValue, blueValue 넣고 콘솔 출력
if (colors.length >=3) {
redValue = colors[0];
greenValue = colors[1];
blueValue = colors[2];
System.out.println(String.format("RGB(%d, %d, %d)", redValue, greenValue, blueValue));
}
}
}
int LED_T = 10; // 위 LED
int LED_B = 9; // 아래 LED
int CLK = 2; // CLK
int DT = 3; // DT
int SW = 4; // SW
static int oldCLK = LOW; // CLK 값 저장 변수
static int oldDT = LOW; // DT 값 저장 변수
int brightness = 143; // LED 밝기 값(=중간(0~255))
int location = 0; // 켜진 LED 위치 저장 변수 (0(=위) 초기화)
void setup() {
pinMode(CLK, INPUT_PULLUP); // 내장 풀업 저항 사용하는 입력
pinMode(DT, INPUT_PULLUP);
pinMode(SW, INPUT_PULLUP);
pinMode(LED_T, OUTPUT);
pinMode(LED_B, OUTPUT);
}
void loop() {
if (digitalRead(SW) == LOW) { // 노브 눌렸을 때
changeLED(); // changeLED 함수 호출, LED 켜기
location++; // LED 위치 바꾸기
delay(300); // 중복 입력 방지
}
else { // 노브 돌렸을 때
brightness += (getDirection()*5); // 밝기 조절
if(brightness < 0) // LED 밝기 최솟값(0)이하 떨어지는 것 방지
brightness = 0;
if(brightness > 255) // LED 밝기 최댓값(255)이상 올라가는 것 방지
brightness = 255;
changeLED(); // 변화한 밝기값 적용
}
}
//방향 반환 함수
int getDirection() {
int direct = 0; // 방향 초기화
int newCLK = digitalRead(CLK); // 현재 CLK 값 저장 변수
int newDT = digitalRead(DT); // 현재 DT 값 저장 변수
if (newCLK != oldCLK) { // CLK 값 변한 경우
if (oldCLK == LOW) { // LOW에서 HIGH 경우
direct = oldDT * 2 - 1; // direct 값 변경
}
}
oldCLK = newCLK; // 갱신
oldDT = newDT;
return direct; // 시계방향 = -1, 반시계방향 = +1 반환
}
// LED 위치 조절 함수
void changeLED() {
if(location%2 == 1) { // 변수를 2로 나눈 나머지 = 1
analogWrite(LED_T, brightness); // 위 LED만 ON
analogWrite(LED_B, LOW);
}
else { // 나머지 = 0
analogWrite(LED_T, LOW);
analogWrite(LED_B, brightness); // 아래 LED만 ON
}
}