URL
https://opencores.org/ocsvn/neopixel_fpga/neopixel_fpga/trunk
Subversion Repositories neopixel_fpga
[/] [neopixel_fpga/] [trunk/] [src/] [strandtest/] [strandtest.ino] - Rev 3
Compare with Previous | Blame | View Log
/** FpgaNeoPixel - A spi to ws2812 machine** Modified for FpgaNeoPixel by Hirosh Dabui <hirosh@dabui.de>** Permission to use, copy, modify, and/or distribute this software for any* purpose with or without fee is hereby granted, provided that the above* copyright notice and this permission notice appear in all copies.** THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.**/// just overwrite show from Adafruit_NeoPixel to use it// i have use strandtest.ino, just copy class FPGA_NeoPixel in your Adafruit_NeoPixel code// and instantiate FPGA_NeoPixel#define READY_PIN 49#define RESETN_PIN 47#define LED_PIN 6 // this pin is not needed// but i don't wanted to touch Adafruit_NeoPixel code deeper#include <FPGA_NeoPixel.h>#define LED_COUNT 60FPGA_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);// Argument 1 = Number of pixels in NeoPixel strip// Argument 2 = Arduino pin number (most are valid)// Argument 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)// NEO_RGBW Pixels are wired for RGBW bitstream (NeoPixel RGBW products)// setup() function -- runs once at startup --------------------------------void setup() {// These lines are specifically to support the Adafruit Trinket 5V 16 MHz.// Any other board, you can remove this part (but no harm leaving it):#if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)clock_prescale_set(clock_div_1);#endif// END of Trinket-specific code.strip.begin(); // INITIALIZE NeoPixel strip object (REQUIRED)strip.show(); // Turn OFF all pixels ASAPstrip.setBrightness(50); // Set BRIGHTNESS to about 1/5 (max = 255)}// loop() function -- runs repeatedly as long as board is on ---------------void loop() {#if 0// just set some pixel for testingstrip.setPixelColor(0,255,0,0);strip.setPixelColor(59,0,0,255);strip.show();return;#else// Fill along the length of the strip in various colors...colorWipe(strip.Color(255, 0, 0), 50); // RedcolorWipe(strip.Color( 0, 255, 0), 50); // GreencolorWipe(strip.Color( 0, 0, 255), 50); // Blue// Do a theater marquee effect in various colors...theaterChase(strip.Color(127, 127, 127), 50); // White, half brightnesstheaterChase(strip.Color(127, 0, 0), 50); // Red, half brightnesstheaterChase(strip.Color( 0, 0, 127), 50); // Blue, half brightnessrainbow(10); // Flowing rainbow cycle along the whole striptheaterChaseRainbow(50); // Rainbow-enhanced theaterChase variant#endif}// Some functions of our own for creating animated effects -----------------// Fill strip pixels one after another with a color. Strip is NOT cleared// first; anything there will be covered pixel by pixel. Pass in color// (as a single 'packed' 32-bit value, which you can get by calling// strip.Color(red, green, blue) as shown in the loop() function above),// and a delay time (in milliseconds) between pixels.void colorWipe(uint32_t color, int wait) {for(int i=0; i<strip.numPixels(); i++) { // For each pixel in strip...strip.setPixelColor(i, color); // Set pixel's color (in RAM)strip.show(); // Update strip to matchdelay(wait); // Pause for a moment}}// Theater-marquee-style chasing lights. Pass in a color (32-bit value,// a la strip.Color(r,g,b) as mentioned above), and a delay time (in ms)// between frames.void theaterChase(uint32_t color, int wait) {for(int a=0; a<10; a++) { // Repeat 10 times...for(int b=0; b<3; b++) { // 'b' counts from 0 to 2...strip.clear(); // Set all pixels in RAM to 0 (off)// 'c' counts up from 'b' to end of strip in steps of 3...for(int c=b; c<strip.numPixels(); c += 3) {strip.setPixelColor(c, color); // Set pixel 'c' to value 'color'}strip.show(); // Update strip with new contentsdelay(wait); // Pause for a moment}}}// Rainbow cycle along whole strip. Pass delay time (in ms) between frames.void rainbow(int wait) {// Hue of first pixel runs 5 complete loops through the color wheel.// Color wheel has a range of 65536 but it's OK if we roll over, so// just count from 0 to 5*65536. Adding 256 to firstPixelHue each time// means we'll make 5*65536/256 = 1280 passes through this outer loop:for(long firstPixelHue = 0; firstPixelHue < 5*65536; firstPixelHue += 256) {for(int i=0; i<strip.numPixels(); i++) { // For each pixel in strip...// Offset pixel hue by an amount to make one full revolution of the// color wheel (range of 65536) along the length of the strip// (strip.numPixels() steps):int pixelHue = firstPixelHue + (i * 65536L / strip.numPixels());// strip.ColorHSV() can take 1 or 3 arguments: a hue (0 to 65535) or// optionally add saturation and value (brightness) (each 0 to 255).// Here we're using just the single-argument hue variant. The result// is passed through strip.gamma32() to provide 'truer' colors// before assigning to each pixel:strip.setPixelColor(i, strip.gamma32(strip.ColorHSV(pixelHue)));}strip.show(); // Update strip with new contentsdelay(wait); // Pause for a moment}}// Rainbow-enhanced theater marquee. Pass delay time (in ms) between frames.void theaterChaseRainbow(int wait) {int firstPixelHue = 0; // First pixel starts at red (hue 0)for(int a=0; a<30; a++) { // Repeat 30 times...for(int b=0; b<3; b++) { // 'b' counts from 0 to 2...strip.clear(); // Set all pixels in RAM to 0 (off)// 'c' counts up from 'b' to end of strip in increments of 3...for(int c=b; c<strip.numPixels(); c += 3) {// hue of pixel 'c' is offset by an amount to make one full// revolution of the color wheel (range 65536) along the length// of the strip (strip.numPixels() steps):int hue = firstPixelHue + c * 65536L / strip.numPixels();uint32_t color = strip.gamma32(strip.ColorHSV(hue)); // hue -> RGBstrip.setPixelColor(c, color); // Set pixel 'c' to value 'color'}strip.show(); // Update strip with new contentsdelay(wait); // Pause for a momentfirstPixelHue += 65536 / 90; // One cycle of color wheel over 90 frames}}}
