아두이노프로세싱 프로그래밍

아두이노 코딩-178: 아두이노 Neopixel Ring

coding art 2018. 12. 20. 17:42
728x90

파이선 코딩을 배우는 초보자도 머신 러닝에 한번 도전해 보자.

머신 러닝을 배우려는 초보자들이 가지게 될 의문점들을 하나하나 찾아내어

실제 풀어보고 결과를 확인해볼 수 있도록  완전히 뒷문으로 들어가 시작하는 머신 러닝!

noname03.png

_____________________________________________________________________________________________________________________________

 

자동차 차폭등 써클링 튜닝을 비롯하여 RC카 장식에 사용할 수 있는 네오픽셀을 배선하여 컬러풀한 색상을 빠른 속도로 움직여 보자. RGB(3색)LED를 16개 링 형태로 만들어진 네오픽셀은 자체에 이미 전류제한 저항을 포함하고 있어 전원과 디지털 데이터 핀을 포함 도합 3선을 배선하면 된다.

최종 장식을 위해서는 세밀하게 납땜 배선을 하되 점퍼선을 잘 은닉할 필요가 있다. 하지만 납땜 작업 이전에 위 사진 오른쪽에서처럼 수커넥터 점퍼선을 네오픽셀 PCB 홀에 관통시켜 암커넥터 점퍼선과 체결시키면 임시로 배선을 테스트하기 편리하다.

네오픽셀 뒷면에 4개의 홀이 있는데 GND, 5V, Data Input 과 Data Output 핀이다. 이 중 GND, 5V, Data Input 3 핀만을 사용한다.  Data Input 핀은 디지털 데이터 핀 6번 핀에 연결하자. Data Output 핀은 추가되는 네오픽셀과 연동시켜 점등하기 위한 핀으로 보인다.

헤더 영역에서 Adafruit_pixel.h  라이브러리를 사용하고 있다. 이 라이브러리는 다음 url 주소에서 ZIP 파일을 다운 받을 수 있다. 최신 버전으로 다운 받아서 압축을 풀도록 한다.
https://www.arduinolibraries.info/libraries/adafruit-neo-pixel
압축을 푼 곳의 폴더 위치를 정확히 알아둔 후 아두이노 편집기에서 스케치 탭의 라이브러리 포함하기 메뉴에서 ZIP 라이브러리 추가하기를 눌러 폴더 창이 뜨면 라이브러리 위치를 정확하게 입력하도록 하자.

첨부된 오픈 소스를 활용하여 네오픽셀을 on 시켜보자. Adafruit_NeoPixel  명령에서 16은 링에 설치된 3색 LED 의 수이며 PIN 은 디지털 데이터 핀 번호를 의미한다.

setup()에서 strip.begin() 은 Adafruit 라이브러리 시작을 선언하고 밝기를 조절한다. 범위는 1부터인데 1이면 은은한 느낌을 주며 50이면 눈이 부시다.

loop()에서 사용도는 라이브러리 루틴은 3가지다. strip.colorWipe()는 LED 색상을 지정 시 일정 시간 delay 시키면서 16개를 하나씩 지정색으로 on 시켜나간다.
rainbow()는 한가지 색상으로 좀 빠른 속도로 LED를 on 하며 GRB 로 색상 변화가 이어지게 된다.
rainbowCycle()은 삼분지 1씩 색상별로 on 시킨 상태에서 하나씩 LED 가 시계방향으로 움직이는 듯 회전하게 된다. 3가지 명령을 적절히 조합해서 환상적인 색의 조합을 만들어 보자. 동영상에서 배선 상태를 확인하고 루틴별 특성을 관찰한다. 하지만 우리 눈이 느끼는 것과 LED on 영상은 판이하게 다르므로 직접 만들어 체험해 보도록 하자.
https://youtu.be/xG7B9n8OtsY

 

//Neopixel_01

 

#include <Adafruit_NeoPixel.h>

#define PIN 6

// Parameter 1 = number of pixels in strip
// Parameter 2 = pin number (most are valid)
// Parameter 3 = pixel type flags, add together as needed:
// NEO_KHZ800 800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
// NEO_KHZ400 400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
// NEO_GRB Pixels are wired for GRB bitstream (most NeoPixel products)
// NEO_RGB Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
Adafruit_NeoPixel strip = Adafruit_NeoPixel(16, PIN, NEO_GRB + NEO_KHZ800);

void setup() {
strip.begin();
strip.setBrightness(1); //adjust brightness here
strip.show(); // Initialize all pixels to 'off'
}

void loop() {
// Some example procedures showing how to display to the pixels:
// colorWipe(strip.Color(255, 0, 0), 50); // Red
// colorWipe(strip.Color(0, 255, 0), 50); // Green
// colorWipe(strip.Color(0, 0, 255), 50); // Blue
// rainbow(16);
rainbowCycle(16);
}

// Fill the dots one after the other with a color
void colorWipe(uint32_t c, uint8_t wait) {
for(uint16_t i=0; i<strip.numPixels(); i++) {
strip.setPixelColor(i, c);
strip.show();
delay(wait);
}
}

void rainbow(uint8_t wait) {
uint16_t i, j;

for(j=0; j<256; j++) {
for(i=0; i<strip.numPixels(); i++) {
strip.setPixelColor(i, Wheel((i+j) & 255));
}
strip.show();
delay(wait);
}
}

// Slightly different, this makes the rainbow equally distributed throughout
void rainbowCycle(uint8_t wait) {
uint16_t i, j;

for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel
for(i=0; i< strip.numPixels(); i++) {
strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
}
strip.show();
delay(wait);
}
}

// Input a value 0 to 255 to get a color value.
// The colours are a transition r - g - b - back to r.
uint32_t Wheel(byte WheelPos) {
if(WheelPos < 85) {
return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
} else if(WheelPos < 170) {
WheelPos -= 85;
return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
} else {
WheelPos -= 170;
return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
}
}//끝