정보나눔

오픈소스하드웨어 프로젝트에 대한 다양한 정보를 나누는 공간입니다.

해당 코드를 응용해서 LED 스트립에 튀어오르는 애니매이션을 넣고 싶습니다
Ordermaker | 2019-07-16

1. 프로젝트 사용한 보드 종류

 

아두이노 UNO

 

 

2. 사용한 개발 프로그램명

 

아두이노

 

 

3. 사용한 센서 모델명

 

Adafruit NEOPIXEL WS2812b

 

 

4. 연결한 회로 설명 (또는 이미지)

 

 

 

5. 소스코드 (주석 필수)

#include Adafruit_NeoPixel.h


//

enum  pattern { NONE, SCANNER, FADE };
enum  direction { FORWARD, REVERSE };

class NeoPatterns : public Adafruit_NeoPixel
{
    public:
 
    // Member Variables:  
    pattern  ActivePattern;  // which pattern is running
    direction Direction;     // direction to run the pattern
    
    unsigned long Interval;   // milliseconds between updates
    unsigned long lastUpdate; // last update of position
    
    uint32_t Color1, Color2;  // What colors are in use
    uint16_t TotalSteps;  // total number of steps in the pattern
    uint16_t Index;  // current step within the pattern
    uint16_t count;
    uint16_t acceleration;
    
    void (*OnComplete)();  // Callback on completion of pattern
  
    NeoPatterns(uint16_t pixels, uint8_t pin, uint8_t type)
    :Adafruit_NeoPixel(pixels, pin, type)
    {
    }

    void Update()
    {
    
    //
    
        if((millis() - lastUpdate) > Interval) // time to update
        {
            lastUpdate = millis();
            
            switch(ActivePattern)
            {
                case SCANNER:
                    ScannerUpdate();
                    break;
                case FADE:
                    FadeUpdate();
                    break;
                default:
                    break;
            }
        }
    }

    void Increment()
    {
        if (Direction == FORWARD)
        {
           Index++;
           if (Index >= TotalSteps)
            {  
               Index = 0;
               setBrightness(0);
             }
        }
        else // Direction == REVERSE
        {
            --Index;
            if (Index <= 0)
            {
                Index = TotalSteps-1;
            }
        }
    }
//

    void Reverse()
    {
        if (Direction == FORWARD)
        {
            Direction = REVERSE;
            Index = TotalSteps-1;
        }
        else
        {
            Direction = FORWARD;
            Index = 0;
        }
    }

    void Scanner(uint32_t color1, uint8_t interval)
    {
        ActivePattern = SCANNER;
        Interval = interval;
        TotalSteps = (numPixels());
        Color1 = color1;
        Index = 0;
        count = 0;
    }
 
    // Update the Scanner Pattern
    void ScannerUpdate()
    {
    Serial.println(Interval);
    
    
    
    if ( brightness < 230)
    {
      
    brightness = brightness+random(1,10);
    setBrightness(brightness);
    setPixelColor(0, Color1);
    show();
    
    }
      if (brightness >= 230)
        {
        
        for (int i = 0; i < numPixels(); i++)
        {
          
        //
            
       //
            if (i == Index)  // Scan Pixel to the right
            {
                 setPixelColor(i, Color1);
            }
            
            else // Fading tail
            {
                 setPixelColor(i, DimColor(getPixelColor(i)));
            }

        }
        show();
        Increment();
        
  }
}
    // Initialize for a Fade
    void Fade(uint32_t color1, uint32_t color2, uint16_t steps, uint8_t interval, direction dir = FORWARD)
    {
        ActivePattern = FADE;
        Interval = interval;
        TotalSteps = steps;
        Color1 = color1;
        Color2 = color2;
        Index = 0;
        Direction = dir;
    }
    
    // Update the Fade Pattern
    void FadeUpdate()
    {
        // Calculate linear interpolation between Color1 and Color2
        // Optimise order of operations to minimize truncation error
        uint8_t red = ((Red(Color1) * (TotalSteps - Index)) + (Red(Color2) * Index)) / TotalSteps;
        uint8_t green = ((Green(Color1) * (TotalSteps - Index)) + (Green(Color2) * Index)) / TotalSteps;
        uint8_t blue = ((Blue(Color1) * (TotalSteps - Index)) + (Blue(Color2) * Index)) / TotalSteps;
        
        ColorSet(Color(red, green, blue));
        show();
        Increment();
    }
   
    // Calculate 50% dimmed version of a color (used by ScannerUpdate)
    uint32_t DimColor(uint32_t color)
    {
        // Shift R, G and B components one bit to the right
        uint32_t dimColor = Color(Red(color) >> 1, Green(color) >> 1, Blue(color) >> 1);
        return dimColor;
    }
 
    // Set all pixels to a color (synchronously)
    void ColorSet(uint32_t color)
    {
        for (int i = 0; i < numPixels(); i++)
        {
            setPixelColor(i, color);
        }
        show();
    }
 
    // Returns the Red component of a 32-bit color
    uint8_t Red(uint32_t color)
    {
        return (color >> 16) & 0xFF;
    }
 
    // Returns the Green component of a 32-bit color
    uint8_t Green(uint32_t color)
    {
        return (color >> 8) & 0xFF;
    }
 
    // Returns the Blue component of a 32-bit color
    uint8_t Blue(uint32_t color)
    {
        return color & 0xFF;
    }
    
    // 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)
    {
        WheelPos = 255 - WheelPos;
        if(WheelPos < 85)
        {
            return Color(255 - WheelPos * 3, 0, WheelPos * 3);
        }
        else if(WheelPos < 170)
        {
            WheelPos -= 85;
            return Color(0, WheelPos * 3, 255 - WheelPos * 3);
        }
        else
        {
            WheelPos -= 170;
            return Color(WheelPos * 3, 255 - WheelPos * 3, 0);
        }
    }
};

///

int brightness = 0;
NeoPatterns Stick(50, 7, NEO_GRB + NEO_KHZ800);

void setup() {
  
Stick.begin();
Stick.setBrightness(0);
Serial.begin(9600);
Stick.Scanner(Stick.Color(255,0,0), 55);
}

void loop() {

    Stick.Update();

}

 

 

6. 문제점 및 에러 내용

 

 

 

위쪽이 예제, 아래쪽이 글에 올린 코딩의 실험 영상입니다.

 

인터넷에서 본 위쪽의 영상을 보고 비슷한 애니매이션을 코딩하고 싶습니다.

 

( FastLED를 이용한 다른분이 포팅해둔 예제가 있었습니다만, 제가 바라는 애니매이션과는 조금 다른 형태였습니다.)

 

https://learn.adafruit.com/multi-tasking-the-arduino-part-3/scanner

 

의 코딩을 이용해 빛이 일정값 (230) 에 도달하면 애니매이션이 진행되는 것까지는 하였습니다만

LED가 Totalsteps에 도달하였을때 튀어오르는 코딩을 만들지 못하겠습니다.

 

 

혹여 방법이 있을까요?

프로필사진

판다마니아 2019-07-18 09:29:00

빛이 떨어지는 애니메이션을 구현하셨으니 마찬가지로 밝기를 낮춰서 위로 올라왔다가 내려가는 애니메이션을 하나 더 만드시면 될것 같습니다.

 

떨어지는 애니메이션 끝나고 다음에 밝기를 줄이신 후 다시 numPixels() 위치 부터 위로 약간 올라갔다 다시 내려가는 반복문을 이용해 LED를 제어해주시면 될것 같습니다.

이전글   |    미로찾기 관련 작은 피드백 부탁 드립니다... 2019-07-16
다음글   |    라즈베리파이와 아두이노 연동 2019-07-20