Processing 코드를 사용하여 Firmata 프로토콜을 사용하지 않으면서 아두이노 보드에 설치된 LED의 밝기를 조절해 보자. Firmata 프로토콜 사용 시에는 Firmata의 복잡성으로 인해 아두이노 코딩 자체가 제약을 받기도 한다.
보다 자유롭게 Processing 코드를 사용하여 아두이노의 밝기를 조절하기 위해서는 가변저항에 해당하는 수단을 Processing 의 그래픽 기능을 사용하여 대체할 필요가 있다.
일전에 올렸던 블로그에 아두이노에 설치한 가변 저항을 돌려서 LED 의 밝기를 조정하였다.
그 사례에 관해서는 다음의 블로그를 참조하기 바란다.
초보자를 위한 아두이노 코딩-23: 가변저항으로 LED 밝기조절
https://steemit.com/kr/@codingart/23-led
흑백 그래픽 화면을 사용할 때 차이점을 알아보자. analogWrite(pin, brightness) 명령에서 밝기 brightness 의 주어진 범위는 0∼255까지이다. 따라서 Processing 코딩 작업에서는 mouseX 명령에 의해서 그래픽 스크린을 스윕하게 되면 0∼255까지의 값을 감지하게 된다.
이 값을 USB 케이블을 통해 write 명령을 실행하면 연결된 아두이노 입력 버퍼에 문자 정보가 입력되며, 아두이노에서 이 데이터를 읽어 brightness 데이터로 처리하도록 한다.
아두이노 배선은 아래 그림과 같이 전류제한 저항 220Ω과 LED를 연결하여 디지털 데이터 핀 3번에 배선한다. 가변저항은 설치되어 있어도 무방하다.
디지털 데이터 3번 핀 배선 이유는 analogWrite() 명령이 가능하려면 아두이노 우노의 핀 다이아그램을 참조하여 물결 표시(∼)가 있는 즉 PWM이 가능한 핀 즉 3,5,6,9,10,11 중에 하나이기 때문이다.
다음은 Processing에서 실행해야 할 코드이다. processing.serial 라이브러리를 불러들이고 Serial 클라스 명을 port 로 설정하자.
setup()에서 그래픽 스크린 크기를 (256, 150)으로 정한다. Serial.list()는 장치관리자에서 볼 수 있는 키보드 와 프린터 및 아두이노 연결 포트를 의미한다. 즉 Serial.list()[2] 는 아두이노 보드를 PC 연결한 COM 포트를 뜻하게 된다.
Processing에서는 아두이노의 loop()를 draw()라는 루틴이 대신하게 된다.
for loop 코딩을 통해 흑배 컬러 값에 해당하는 stroke()를 0∼255 까지 설정한다.
line() 명령에 의해 (i,0)에서 (i,150)까지 stroke(i) 값에 해당하는 수직선을 긋는다.
다음의 그래픽 스크린 좌표 설정을 참고하여라.
Processing에서 그래픽 화면 스윕을 통해 0∼255 사이의 정수 값을 추출하여 port.write() 명령 실행에 의해 시리얼로 바이트 데이터를 보내면 즉 ASCII 문자를 보내면 if문에서 Serial.availabe()이 시리얼 입력 버퍼를 점검하게 된다. 뭔가 바이트 문자 정보가 있으면 Serial.read()를 실행하는 것이다.
동영상을 통해 흑백 명암진 스크린을 마우스로 스윕하면서 LED 의 밝기 변화를 관찰해 보자.
//Processing_analogWrite_LED_01
import processing.serial.*;
Serial port;
void setup() {
size(256, 150);
println("Available serial ports:");
println(Serial.list());
port = new Serial(this, Serial.list()[2], 9600);
}
void draw() {
// draw a gradient from black to white
for (int i = 0; i < 256; i++) {
stroke(i);
line(i, 0, i, 150);
}
// write the current X-position of the mouse
//to the serial port asa single byte
port.write(mouseX);
}//End
//grphicscrn_input_analogWrite_LED_01
const int ledPin = 3; // LED 설치 데이터 핀 번호
void setup() {
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
}
void loop() {
byte brightness;
if (Serial.available()) { // 시리얼 입력 확인
brightness = Serial.read(); //입력 버퍼 읽기
analogWrite(ledPin, brightness);
}
}//프로그램 끝