초급 예제

누구나 쉽게 따라해볼 수 있는 쉬운 예제들입니다. 가볍게 도전~!

Soft Potentiometer로 RGB 색을 바꿔보자

2014-07-30 04:43:20

개요

Soft Potentiometer는 터치센서로 아래와 같이 모양이 다양합니다.
터치하는 순간 저항값을 변화시키는 가변저항입니다.
Soft Potentiometer에 대해 더 자세한 내용은 
Soft Potentiometer 사용하기 를 참고해주세요.
  
출처 : www.sparkfun.com / qqrs.github.io

쉬운 사용법과 다양한 디자인으로 인해 많이 응용할 수 있습니다.
장갑 등에 넣고도 사용 하실 수 있습니다.

  
출처 : tarekmohammad.wordpress.com

본문에서는 soft potentiometer를 사용하여 RGB의 색을 변화 시켜보겠습니다.

주의 : 소프트 팟의 시작점과 끝점을 동시에 누르면 열이 발생할수 있으니 주의하세요.




미리보기 동영상

 

시작 전 개념이해하기

아래 링크를 통하여 본 학습에 필요한 사전 지식을 얻을 수 있습니다.

부품목록

본 학습에는 총 7종류의 부품이 필요합니다.
각각의 부품에 대한 자세한 설명은 하단의 상세설명 링크를 통하여 파악하실 수 있습니다.



NO 부품명 수량
1 아두이노 우노 R3 1
2 브레드 보드 1
3 5mm RGB LED 1
4 Soft Potentiometer 1
5 330Ω 저항 3
6 10KΩ 저항 1
7 점퍼 케이블 9

부품명 아두이노 우노 R3 브레드 보드 RGB LED soft potentiometer 330Ω 저항
파트 x1 x1 x1 x1 x3

부품명 10KΩ 저항 점퍼 케이블
파트 x1 x9

주의 : 소프트 팟의 시작점과 끝점을 동시에 누르면 열이 발생할수 있으니 주의하세요.

하드웨어 making

회로도


브레드 보드 레이아웃

소프트웨어 Coding

아래의 코드를 아두이노에 업로드 합니다.

/*
 Soft Potentiometer를 사용해서 RGB 색 바꾸기
 This sketch was written by SparkFun Electronics,
 with lots of help from the Arduino community.
*/

const int RED_LED_PIN = 11;       //RED_LED와 연결된 핀 번호를 저장하는 변수 선언
const int GREEN_LED_PIN = 10;    //Green_LED와 연결된 핀 번호를 저장하는 변수 선언
const int BLUE_LED_PIN = 9;     //Blue_LED와 연결된 핀 번호를 저장하는 변수 선언

const int SENSOR_PIN = 0;        //Soft Potentiometer와 연결된 핀 번호 저장하는 변수 선언

int redValue, greenValue, blueValue;  //각 LED로 전달할 출력값(밝기)를 저장하는 변수 선언

void setup()
{
  //아날로그 출력 핀도 자동 설정되기 때문에 핀모드를 설정할 필요 없습니다.

Serial.begin(9600);
//밝기 값을 찍어보기 위해서 시리얼 포트를 초기화 } void loop() { int sensorValue; //읽어온 아날로그 값을 저장 할 변수를 선언 sensorValue = analogRead(0); //0번 핀을 통해 아날로그 값을 읽어와서 변수에 저장
setRGB(sensorValue);
//위 변수 값과 함께 색깔 바꾸는 함수 호출

//아날로그 입력 값, 밝기 값을 출력
Serial.print("sensorValue : "); Serial.print(sensorValue); Serial.print(" red : "); Serial.print(redValue); Serial.print(" green : "); Serial.print(greenValue); Serial.print(" blue : "); Serial.println(blueValue);

delay(1000);
//1초 일시정지 } /*
RGB 색 바꾸는 함수
매개변수 : RGBposition(=읽어온 아날로그 값)
*/ void setRGB(int RGBposition) { //빨강 밝기 계산
redValue = constrain(map(RGBposition, 0, 341, 255, 0), 0, 255)
+ constrain(map(RGBposition, 682, 1023, 0, 255), 0, 255);

//초록 밝기 계산 greenValue = constrain(map(RGBposition, 0, 341, 0, 255), 0, 255) - constrain(map(RGBposition, 341, 682, 0,255), 0, 255);
//파랑 밝기 계산 blueValue = constrain(map(RGBposition, 341, 682, 0, 255), 0, 255) - constrain(map(RGBposition, 682, 1023, 0, 255), 0, 255); analogWrite(RED_LED_PIN, redValue); //빨강 LED, redValue만큼 밝혀짐 analogWrite(GREEN_LED_PIN, greenValue); //초록 LED, greenValue만큼 밝혀짐 analogWrite(BLUE_LED_PIN, blueValue); //파랑 LED, blueValue만틈 밝혀짐 }

소프트웨어 & 하드웨어 설명

1. 사전설명


Soft Potentiometer는 어디에 압력을 가하는 가에 따라 다른 저항 값을 가지게 됩니다.
압력을 가할 때는 5V와 연결되어 일정한 전압 값을 입력 받게 되지만
압력을 가하지 않을 때는 일정하지 않는 값을  갖게 되는 floating현상이 발생합니다.

그래서 중간 핀을 풀 다운 저항(10KΩ 저항)을 연결합니다.
압력을 가하지 않을 경우 전압을 0V로 항상 내려주는 역할을 합니다.

RGB LED는 아날로그 출력값을 받을 것이기 때문에 PWM모드로 사용할 수 있는 ~이 디지털 핀과 연결해야 합니다.

2. 스케치


void setup()
{
  //아날로그 출력 핀도 자동 설정되기 때문에 핀모드를 설정할 필요 없습니다.
  Serial.begin(9600);     //밝기 값을 찍어보기 위해서 시리얼 포트를 초기화
}

아날로그 입력 핀도 pinMode함수를 이용해서 설정 할 필요 없듯이
아날로그 출력용으로 사용하는 핀도 설정을 반드시 하지 않아도 됩니다.

시리얼 포트를 사용하여 값을 출력하기 위해 시리얼 포트를 초기화 합니다.


setRGB함수를 살펴보기 전에 위 그림을 먼저 보겠습니다.

Soft Potentiometer에 따라 달라진 전압을 아날로그 0번핀에 의해서 읽어옵니다.
0~1023인 sensorValue를 가지고 세가지 LED마다 다른 출력값을 전달해서 색깔을 표현 할 것입니다.

간단하게 0 ~ 1023의 각 값마다 나타낼 수 있는 색깔이 있다고 생각하면 됩니다.
빨강은 0 또는 1023 일 때 가장 빨간색을 나타내고
300일 때는 빨강은 조금, 초록이 많이 섞인 색이 나온다고 생각하면 됩니다.

/*
RGB 색 바꾸는 함수
매개변수 : RGBposition(=읽어온 아날로그 값)
*/ void setRGB(int RGBposition) { //빨강 밝기 계산
redValue = constrain(map(RGBposition, 0, 341, 255, 0), 0, 255)
+ constrain(map(RGBposition, 682, 1023, 0, 255), 0, 255);

//초록 밝기 계산 greenValue = constrain(map(RGBposition, 0, 341, 0, 255), 0, 255) - constrain(map(RGBposition, 341, 682, 0,255), 0, 255);
//파랑 밝기 계산 blueValue = constrain(map(RGBposition, 341, 682, 0, 255), 0, 255) - constrain(map(RGBposition, 682, 1023, 0, 255), 0, 255); analogWrite(RED_LED_PIN, redValue); //빨강 LED, redValue만큼 밝혀짐 analogWrite(GREEN_LED_PIN, greenValue); //초록 LED, greenValue만큼 밝혀짐 analogWrite(BLUE_LED_PIN, blueValue); //파랑 LED, blueValue만틈 밝혀짐 }

0 ~ 1023인 값을 0~ 255 사이의 숫자로 바꾸기 위해서 map, constrain 함수를 사용합니다.
map, constrain함수의 정확한 계산이나 이 수식들을 정확하게 이해할 필요는 없습니다.
적절한 상황에서 위 부분 코드를 사용할 수 있으면 됩니다.

간단하게 341 ~ 682 이라는 아날로그 값을 읽어왔을 경우,
초록과 파랑 사이의 색입니다. 
숫자가 커질수록 파란 LED로 출력되는 값은 커지고 초록 LED로 출력되는 값은 작아지면 됩니다.

시리얼 모니터를 통해서 출력되는 값을 확인 해 보세요.

Soft Potentiometer 밑 부분에서 윗부분으로 순서로 빨 -> 초 -> 파 -> 빨  순서로 색이 바뀔 것입니다.

순서를 바꾸고 싶은 경우 setRGB함수에서 변수명을 바꾸면 됩니다.
파란색이 먼저 나오게 하고 싶은 경우 맨 처음의 redValue에 관한 수식 부분에서
계산 결과를 저장할 변수를 blueValue 변경하면 됩니다.

위의 그림의 값의 따른 색의 변화가 바뀌는 것이죠.

기술문서

  • 부품목록
  • 회로도
  • 브레드 보드 레이아웃
  • 스케치

kocoafabeditor

항상 진취적이고, 새로운 것을 추구하는 코코아팹 에디터입니다!

soft pontentiometer, 풀 다운, float, RGB

hihyo 2014-08-01 15:26:08

감사합니다.

jy 2014-08-01 16:50:25

누를 때 마다 바뀌는 군요!