| 1 |
3 |
splinedriv |
/*
|
| 2 |
|
|
* FpgaNeoPixel - A spi to ws2812 machine
|
| 3 |
|
|
*
|
| 4 |
|
|
* Modified for FpgaNeoPixel by Hirosh Dabui
|
| 5 |
|
|
*
|
| 6 |
|
|
* Permission to use, copy, modify, and/or distribute this software for any
|
| 7 |
|
|
* purpose with or without fee is hereby granted, provided that the above
|
| 8 |
|
|
* copyright notice and this permission notice appear in all copies.
|
| 9 |
|
|
*
|
| 10 |
|
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
| 11 |
|
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
| 12 |
|
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
| 13 |
|
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
| 14 |
|
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
| 15 |
|
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
| 16 |
|
|
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
| 17 |
|
|
*
|
| 18 |
|
|
*/
|
| 19 |
|
|
|
| 20 |
|
|
// just overwrite show from Adafruit_NeoPixel to use it
|
| 21 |
|
|
// i have use strandtest.ino, just copy class FPGA_NeoPixel in your Adafruit_NeoPixel code
|
| 22 |
|
|
// and instantiate FPGA_NeoPixel
|
| 23 |
|
|
|
| 24 |
|
|
#define READY_PIN 49
|
| 25 |
|
|
#define RESETN_PIN 47
|
| 26 |
|
|
#define LED_PIN 6 // this pin is not needed
|
| 27 |
|
|
// but i don't wanted to touch Adafruit_NeoPixel code deeper
|
| 28 |
|
|
|
| 29 |
|
|
#include
|
| 30 |
|
|
|
| 31 |
|
|
#define LED_COUNT 60
|
| 32 |
|
|
|
| 33 |
|
|
|
| 34 |
|
|
FPGA_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);
|
| 35 |
|
|
|
| 36 |
|
|
// Argument 1 = Number of pixels in NeoPixel strip
|
| 37 |
|
|
// Argument 2 = Arduino pin number (most are valid)
|
| 38 |
|
|
// Argument 3 = Pixel type flags, add together as needed:
|
| 39 |
|
|
// NEO_KHZ800 800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)
|
| 40 |
|
|
// NEO_KHZ400 400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
|
| 41 |
|
|
// NEO_GRB Pixels are wired for GRB bitstream (most NeoPixel products)
|
| 42 |
|
|
// NEO_RGB Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
|
| 43 |
|
|
// NEO_RGBW Pixels are wired for RGBW bitstream (NeoPixel RGBW products)
|
| 44 |
|
|
|
| 45 |
|
|
|
| 46 |
|
|
// setup() function -- runs once at startup --------------------------------
|
| 47 |
|
|
|
| 48 |
|
|
void setup() {
|
| 49 |
|
|
// These lines are specifically to support the Adafruit Trinket 5V 16 MHz.
|
| 50 |
|
|
// Any other board, you can remove this part (but no harm leaving it):
|
| 51 |
|
|
#if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
|
| 52 |
|
|
clock_prescale_set(clock_div_1);
|
| 53 |
|
|
#endif
|
| 54 |
|
|
// END of Trinket-specific code.
|
| 55 |
|
|
|
| 56 |
|
|
strip.begin(); // INITIALIZE NeoPixel strip object (REQUIRED)
|
| 57 |
|
|
strip.show(); // Turn OFF all pixels ASAP
|
| 58 |
|
|
strip.setBrightness(50); // Set BRIGHTNESS to about 1/5 (max = 255)
|
| 59 |
|
|
}
|
| 60 |
|
|
|
| 61 |
|
|
|
| 62 |
|
|
// loop() function -- runs repeatedly as long as board is on ---------------
|
| 63 |
|
|
|
| 64 |
|
|
void loop() {
|
| 65 |
|
|
#if 0
|
| 66 |
|
|
// just set some pixel for testing
|
| 67 |
|
|
strip.setPixelColor(0,255,0,0);
|
| 68 |
|
|
strip.setPixelColor(59,0,0,255);
|
| 69 |
|
|
strip.show();
|
| 70 |
|
|
return;
|
| 71 |
|
|
#else
|
| 72 |
|
|
// Fill along the length of the strip in various colors...
|
| 73 |
|
|
colorWipe(strip.Color(255, 0, 0), 50); // Red
|
| 74 |
|
|
colorWipe(strip.Color( 0, 255, 0), 50); // Green
|
| 75 |
|
|
colorWipe(strip.Color( 0, 0, 255), 50); // Blue
|
| 76 |
|
|
|
| 77 |
|
|
// Do a theater marquee effect in various colors...
|
| 78 |
|
|
theaterChase(strip.Color(127, 127, 127), 50); // White, half brightness
|
| 79 |
|
|
theaterChase(strip.Color(127, 0, 0), 50); // Red, half brightness
|
| 80 |
|
|
theaterChase(strip.Color( 0, 0, 127), 50); // Blue, half brightness
|
| 81 |
|
|
|
| 82 |
|
|
rainbow(10); // Flowing rainbow cycle along the whole strip
|
| 83 |
|
|
theaterChaseRainbow(50); // Rainbow-enhanced theaterChase variant
|
| 84 |
|
|
#endif
|
| 85 |
|
|
}
|
| 86 |
|
|
|
| 87 |
|
|
|
| 88 |
|
|
// Some functions of our own for creating animated effects -----------------
|
| 89 |
|
|
|
| 90 |
|
|
// Fill strip pixels one after another with a color. Strip is NOT cleared
|
| 91 |
|
|
// first; anything there will be covered pixel by pixel. Pass in color
|
| 92 |
|
|
// (as a single 'packed' 32-bit value, which you can get by calling
|
| 93 |
|
|
// strip.Color(red, green, blue) as shown in the loop() function above),
|
| 94 |
|
|
// and a delay time (in milliseconds) between pixels.
|
| 95 |
|
|
void colorWipe(uint32_t color, int wait) {
|
| 96 |
|
|
for(int i=0; i
|
| 97 |
|
|
strip.setPixelColor(i, color); // Set pixel's color (in RAM)
|
| 98 |
|
|
strip.show(); // Update strip to match
|
| 99 |
|
|
delay(wait); // Pause for a moment
|
| 100 |
|
|
}
|
| 101 |
|
|
}
|
| 102 |
|
|
|
| 103 |
|
|
// Theater-marquee-style chasing lights. Pass in a color (32-bit value,
|
| 104 |
|
|
// a la strip.Color(r,g,b) as mentioned above), and a delay time (in ms)
|
| 105 |
|
|
// between frames.
|
| 106 |
|
|
void theaterChase(uint32_t color, int wait) {
|
| 107 |
|
|
for(int a=0; a<10; a++) { // Repeat 10 times...
|
| 108 |
|
|
for(int b=0; b<3; b++) { // 'b' counts from 0 to 2...
|
| 109 |
|
|
strip.clear(); // Set all pixels in RAM to 0 (off)
|
| 110 |
|
|
// 'c' counts up from 'b' to end of strip in steps of 3...
|
| 111 |
|
|
for(int c=b; c
|
| 112 |
|
|
strip.setPixelColor(c, color); // Set pixel 'c' to value 'color'
|
| 113 |
|
|
}
|
| 114 |
|
|
strip.show(); // Update strip with new contents
|
| 115 |
|
|
delay(wait); // Pause for a moment
|
| 116 |
|
|
}
|
| 117 |
|
|
}
|
| 118 |
|
|
}
|
| 119 |
|
|
|
| 120 |
|
|
// Rainbow cycle along whole strip. Pass delay time (in ms) between frames.
|
| 121 |
|
|
void rainbow(int wait) {
|
| 122 |
|
|
// Hue of first pixel runs 5 complete loops through the color wheel.
|
| 123 |
|
|
// Color wheel has a range of 65536 but it's OK if we roll over, so
|
| 124 |
|
|
// just count from 0 to 5*65536. Adding 256 to firstPixelHue each time
|
| 125 |
|
|
// means we'll make 5*65536/256 = 1280 passes through this outer loop:
|
| 126 |
|
|
for(long firstPixelHue = 0; firstPixelHue < 5*65536; firstPixelHue += 256) {
|
| 127 |
|
|
for(int i=0; i
|
| 128 |
|
|
// Offset pixel hue by an amount to make one full revolution of the
|
| 129 |
|
|
// color wheel (range of 65536) along the length of the strip
|
| 130 |
|
|
// (strip.numPixels() steps):
|
| 131 |
|
|
int pixelHue = firstPixelHue + (i * 65536L / strip.numPixels());
|
| 132 |
|
|
// strip.ColorHSV() can take 1 or 3 arguments: a hue (0 to 65535) or
|
| 133 |
|
|
// optionally add saturation and value (brightness) (each 0 to 255).
|
| 134 |
|
|
// Here we're using just the single-argument hue variant. The result
|
| 135 |
|
|
// is passed through strip.gamma32() to provide 'truer' colors
|
| 136 |
|
|
// before assigning to each pixel:
|
| 137 |
|
|
strip.setPixelColor(i, strip.gamma32(strip.ColorHSV(pixelHue)));
|
| 138 |
|
|
}
|
| 139 |
|
|
strip.show(); // Update strip with new contents
|
| 140 |
|
|
delay(wait); // Pause for a moment
|
| 141 |
|
|
}
|
| 142 |
|
|
}
|
| 143 |
|
|
|
| 144 |
|
|
// Rainbow-enhanced theater marquee. Pass delay time (in ms) between frames.
|
| 145 |
|
|
void theaterChaseRainbow(int wait) {
|
| 146 |
|
|
int firstPixelHue = 0; // First pixel starts at red (hue 0)
|
| 147 |
|
|
for(int a=0; a<30; a++) { // Repeat 30 times...
|
| 148 |
|
|
for(int b=0; b<3; b++) { // 'b' counts from 0 to 2...
|
| 149 |
|
|
strip.clear(); // Set all pixels in RAM to 0 (off)
|
| 150 |
|
|
// 'c' counts up from 'b' to end of strip in increments of 3...
|
| 151 |
|
|
for(int c=b; c
|
| 152 |
|
|
// hue of pixel 'c' is offset by an amount to make one full
|
| 153 |
|
|
// revolution of the color wheel (range 65536) along the length
|
| 154 |
|
|
// of the strip (strip.numPixels() steps):
|
| 155 |
|
|
int hue = firstPixelHue + c * 65536L / strip.numPixels();
|
| 156 |
|
|
uint32_t color = strip.gamma32(strip.ColorHSV(hue)); // hue -> RGB
|
| 157 |
|
|
strip.setPixelColor(c, color); // Set pixel 'c' to value 'color'
|
| 158 |
|
|
}
|
| 159 |
|
|
strip.show(); // Update strip with new contents
|
| 160 |
|
|
delay(wait); // Pause for a moment
|
| 161 |
|
|
firstPixelHue += 65536 / 90; // One cycle of color wheel over 90 frames
|
| 162 |
|
|
}
|
| 163 |
|
|
}
|
| 164 |
|
|
}
|