User:Zalán Szakács/grad prototyping: Difference between revisions

From XPUB & Lens-Based wiki
 
(31 intermediate revisions by the same user not shown)
Line 1,946: Line 1,946:
the brightness of the LED is not strong enough to be able to create a linear light beam with acrylic sheet in space
the brightness of the LED is not strong enough to be able to create a linear light beam with acrylic sheet in space


== Diving into PureData 1 ==
'''20 | 12 | 18'''
''Goal is to create sound generated animations for the LED strip with 144 px on 1m''
<gallery class="center" widths=562px heights=434px>
File:Screen Shot 2018-12-19 at 17.51.31.png|Input
File:Screen Shot 2018-12-19 at 17.51.35.png|Output
File:Screen Shot 2018-12-19 at 19.15.49.png|Working with oscillators and a slider for controlling different sound frequencies
File:Screen Shot 2018-12-19 at 23.05.18.png|Basic math
File:Screen Shot 2018-12-20 at 09.32.57.png|Problems opening the GEM library
</gallery>
''Conclusion''<br>
GEM library needs to be better installed on my computer


== Experimenting of creating a strong light beam in combination with movable 3D printed lens holder for adjusting the distance between the light source and lens ==
== Experimenting of creating a strong light beam in combination with movable 3D printed lens holder for adjusting the distance between the light source and lens ==
Line 1,962: Line 1,979:
''Conclusion''<br>
''Conclusion''<br>
The light source was not strong enough
The light source was not strong enough
== Diving into PureData 2 ==
'''14 | 01 | 19'''
''Goal is to create sound generated animations for the LED strip with 144 px on 1m''
<gallery class="center" widths=562px heights=434px>
File:Screen Shot 2019-01-14 at 21.05.31.png|adc~ microphone input
File:Screen Shot 2019-01-14 at 22.36.38.png| Using Arrays to See Waves - high frequency
File:Screen Shot 2019-01-14 at 22.36.32.png| Using Arrays to See Waves - low frequency
</gallery>
== Diving into PureData 3 ==
'''20 | 01 | 19'''
''Analysing partials – Fourier Analysis''
[https://www.youtube.com/watch?v=MtYA9AIQcz8 Tutorial 1] <br>
[http://www.pd-tutorial.com/english/ch03s08.html#id431716 Tutorial 2]
'''Fourier transformation'''<br>
It divides the entire frequency spectrum into parts of equal size and determines the amplitude and phase for each part. One could in turn reconstruct the original signal from these values. The derivation of the component parts is called analysis; the reconstruction is called resynthesis. You can realize this using the objects "rfft~" and "irfft~".
<gallery class="center" widths=562px heights=434px>
File:Screen Shot 2019-01-20 at 22.27.36.png|Analysis
File:Screen Shot 2019-01-20 at 22.42.11.png|Output
</gallery>
'''Output''' = Shows the power of different frequency components that make up that sound. Each of the number represents an amplitude of a particular band of frequencies.
== Diving into PureData 4 ==
'''28 | 01 | 19'''
''Loading audio into PD''
[https://www.youtube.com/watch?v=-y2SP2B6NxY&list=PL12DC9A161D8DC5DC&index=19| Tutorial]<br>
<gallery class="center" widths=562px heights=434px>
File:Screen Shot 2019-01-28 at 13.35.57.png|Analysis
</gallery>
'''sequencer tbb'''<br>
starting from left and moving towards right
== Experimenting with different LED lights for creating a strong blue light beam ==
'''31 | 01 | 19'''
<gallery class="center" widths=562px heights=434px>
File:50517164 809606392714069 2414652896101531648 n.jpg|10W LED
50517164_809606392714069_2414652896101531648_n.jpg|30W LED
File:50981713 1898733596915105 4015609587842416640 n.png|Reflection
File:50862987 802589230078781 1786761301997912064 n.jpg|3D printed ground
File:50697472 2243213262628607 3136308904791638016 n.jpg|15 degree lens cap
File:50758811 987550718116721 6028000919356964864 n.jpg|Plano convex lense in combination with 15 degree lens cap on 10W LED
File:50995014 742957419437906 9177010085392547840 n.jpg|Fresnel lens creating a straight light beam over 5m
</gallery>
'''Conclusion'''<br>
Fresnel lens seems to be a good option to investigate in
<gallery class="center" widths=562px heights=434px>
File:Fresnel-lens-1.jpg|Fresnel lens explanation
</gallery>
== Building a new arduino circuit board for Adafruit NeoPixel Digital RGBW LED Strip - Black PCB 144 LED/m - 1m  ==
'''01 | 02 | 19'''
[https://arduinobasics.blogspot.com/2015/07/neopixel-playground.html| Tutorial]<br>
<gallery class="center" widths=562px heights=434px>
File:NeoPixel Fritzing Sketch1.jpg|NeoPixel Fritzing Sketch
</gallery>
<gallery class="center" widths=562px heights=434px>
File:50853958 2085714128181934 6124094876960161792 n.jpg|Working setup
</gallery>
'''Arduino basic RGBW Script'''
<pre>
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
  #include <avr/power.h>
#endif
#define PIN 6
#define NUM_LEDS 60
#define BRIGHTNESS 50
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_GRBW + NEO_KHZ800);
byte neopix_gamma[] = {
    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,
    1,  1,  1,  1,  1,  1,  1,  1,  1,  2,  2,  2,  2,  2,  2,  2,
    2,  3,  3,  3,  3,  3,  3,  3,  4,  4,  4,  4,  4,  5,  5,  5,
    5,  6,  6,  6,  6,  7,  7,  7,  7,  8,  8,  8,  9,  9,  9, 10,
  10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 14, 14, 15, 15, 16, 16,
  17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 24, 24, 25,
  25, 26, 27, 27, 28, 29, 29, 30, 31, 32, 32, 33, 34, 35, 35, 36,
  37, 38, 39, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 50,
  51, 52, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 66, 67, 68,
  69, 70, 72, 73, 74, 75, 77, 78, 79, 81, 82, 83, 85, 86, 87, 89,
  90, 92, 93, 95, 96, 98, 99,101,102,104,105,107,109,110,112,114,
  115,117,119,120,122,124,126,127,129,131,133,135,137,138,140,142,
  144,146,148,150,152,154,156,158,160,162,164,167,169,171,173,175,
  177,180,182,184,186,189,191,193,196,198,200,203,205,208,210,213,
  215,218,220,223,225,228,231,233,236,239,241,244,247,249,252,255 };
void setup() {
  // This is for Trinket 5V 16MHz, you can remove these three lines if you are not using a Trinket
  #if defined (__AVR_ATtiny85__)
    if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
  #endif
  // End of trinket special code
  strip.setBrightness(BRIGHTNESS);
  strip.begin();
  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
  colorWipe(strip.Color(0, 0, 0, 255), 50); // White
  whiteOverRainbow(20,75,5); 
  pulseWhite(5);
  // fullWhite();
  // delay(2000);
  rainbowFade2White(3,3,1);
}
// 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 pulseWhite(uint8_t wait) {
  for(int j = 0; j < 256 ; j++){
      for(uint16_t i=0; i<strip.numPixels(); i++) {
          strip.setPixelColor(i, strip.Color(0,0,0, neopix_gamma[j] ) );
        }
        delay(wait);
        strip.show();
      }
  for(int j = 255; j >= 0 ; j--){
      for(uint16_t i=0; i<strip.numPixels(); i++) {
          strip.setPixelColor(i, strip.Color(0,0,0, neopix_gamma[j] ) );
        }
        delay(wait);
        strip.show();
      }
}
void rainbowFade2White(uint8_t wait, int rainbowLoops, int whiteLoops) {
  float fadeMax = 100.0;
  int fadeVal = 0;
  uint32_t wheelVal;
  int redVal, greenVal, blueVal;
  for(int k = 0 ; k < rainbowLoops ; k ++){
   
    for(int j=0; j<256; j++) { // 5 cycles of all colors on wheel
      for(int i=0; i< strip.numPixels(); i++) {
        wheelVal = Wheel(((i * 256 / strip.numPixels()) + j) & 255);
        redVal = red(wheelVal) * float(fadeVal/fadeMax);
        greenVal = green(wheelVal) * float(fadeVal/fadeMax);
        blueVal = blue(wheelVal) * float(fadeVal/fadeMax);
        strip.setPixelColor( i, strip.Color( redVal, greenVal, blueVal ) );
      }
      //First loop, fade in!
      if(k == 0 && fadeVal < fadeMax-1) {
          fadeVal++;
      }
      //Last loop, fade out!
      else if(k == rainbowLoops - 1 && j > 255 - fadeMax ){
          fadeVal--;
      }
        strip.show();
        delay(wait);
    }
 
  }
  delay(500);
  for(int k = 0 ; k < whiteLoops ; k ++){
    for(int j = 0; j < 256 ; j++){
        for(uint16_t i=0; i < strip.numPixels(); i++) {
            strip.setPixelColor(i, strip.Color(0,0,0, neopix_gamma[j] ) );
          }
          strip.show();
        }
        delay(2000);
    for(int j = 255; j >= 0 ; j--){
        for(uint16_t i=0; i < strip.numPixels(); i++) {
            strip.setPixelColor(i, strip.Color(0,0,0, neopix_gamma[j] ) );
          }
          strip.show();
        }
  }
  delay(500);
}
void whiteOverRainbow(uint8_t wait, uint8_t whiteSpeed, uint8_t whiteLength ) {
 
  if(whiteLength >= strip.numPixels()) whiteLength = strip.numPixels() - 1;
  int head = whiteLength - 1;
  int tail = 0;
  int loops = 3;
  int loopNum = 0;
  static unsigned long lastTime = 0;
  while(true){
    for(int j=0; j<256; j++) {
      for(uint16_t i=0; i<strip.numPixels(); i++) {
        if((i >= tail && i <= head) || (tail > head && i >= tail) || (tail > head && i <= head) ){
          strip.setPixelColor(i, strip.Color(0,0,0, 255 ) );
        }
        else{
          strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
        }
       
      }
      if(millis() - lastTime > whiteSpeed) {
        head++;
        tail++;
        if(head == strip.numPixels()){
          loopNum++;
        }
        lastTime = millis();
      }
      if(loopNum == loops) return;
   
      head%=strip.numPixels();
      tail%=strip.numPixels();
        strip.show();
        delay(wait);
    }
  }
 
}
void fullWhite() {
 
    for(uint16_t i=0; i<strip.numPixels(); i++) {
        strip.setPixelColor(i, strip.Color(0,0,0, 255 ) );
    }
      strip.show();
}
// 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);
  }
}
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);
  }
}
// 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 strip.Color(255 - WheelPos * 3, 0, WheelPos * 3,0);
  }
  if(WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3,0);
  }
  WheelPos -= 170;
  return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0,0);
}
uint8_t red(uint32_t c) {
  return (c >> 16);
}
uint8_t green(uint32_t c) {
  return (c >> 8);
}
uint8_t blue(uint32_t c) {
  return (c);
}
</pre>
<br>
'''Conclusion'''<br>
Goal is to solder together 4m LED strip for creating the setup for the circular frame
== Diving into PureData 5 ==
'''04 | 02 | 19'''
''Loading audio into PD''
[https://www.youtube.com/watch?v=boX0v54SqtU&list=PL12DC9A161D8DC5DC&index=24| Tutorial]<br>
<gallery class="center" widths=562px heights=434px>
File:Openaudio.png|Openaudio
File:Advanced Audio with -tabread4~-.png|Advanced Audio with [tabread4~]
</gallery>
== Diving into PureData 6 ==
'''04 | 02 | 19'''
'''Assigning the frequency to amplitude to receive 0,1 signals'''
[https://forum.pdpatchrepo.info/topic/7321/pure-data-to-arduino-help-please/3 | Tutorial]
<gallery class="center" widths=562px heights=434px>
File:Screen Shot 2019-02-04 at 17.45.04.png|Patch
</gallery>
This patch will be extended with several frequency level for triggering the animation libraries in Arduino through ASCII values
== Diving into PureData 7 ==
'''07 | 02 | 19'''
'''Transmitting ASCII values from PD to Arduino to be able to trigger the RGBW neopixel strip'''
<gallery class="center" widths=562px heights=434px>
File:Screen Shot 2019-02-07 at 17.10.25.png|PD patch
</gallery>
'''Arduino Script'''<br>
<pre>
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
  #include <avr/power.h>
#endif
#define PIN 6
#define NUM_LEDS 144
#define BRIGHTNESS 50
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_GRBW + NEO_KHZ800);
byte neopix_gamma[] = {
    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,
    1,  1,  1,  1,  1,  1,  1,  1,  1,  2,  2,  2,  2,  2,  2,  2,
    2,  3,  3,  3,  3,  3,  3,  3,  4,  4,  4,  4,  4,  5,  5,  5,
    5,  6,  6,  6,  6,  7,  7,  7,  7,  8,  8,  8,  9,  9,  9, 10,
  10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 14, 14, 15, 15, 16, 16,
  17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 24, 24, 25,
  25, 26, 27, 27, 28, 29, 29, 30, 31, 32, 32, 33, 34, 35, 35, 36,
  37, 38, 39, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 50,
  51, 52, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 66, 67, 68,
  69, 70, 72, 73, 74, 75, 77, 78, 79, 81, 82, 83, 85, 86, 87, 89,
  90, 92, 93, 95, 96, 98, 99,101,102,104,105,107,109,110,112,114,
  115,117,119,120,122,124,126,127,129,131,133,135,137,138,140,142,
  144,146,148,150,152,154,156,158,160,162,164,167,169,171,173,175,
  177,180,182,184,186,189,191,193,196,198,200,203,205,208,210,213,
  215,218,220,223,225,228,231,233,236,239,241,244,247,249,252,255 };
const int ledPinRed = 13;// the pins that the LEDs are attached to
const int ledPinGreen = 7;
int incomingByte;      // a variable to read incoming serial data into
void setup() {
  // This is for Trinket 5V 16MHz, you can remove these three lines if you are not using a Trinket
  #if defined (__AVR_ATtiny85__)
    if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
  #endif
  // End of trinket special code
  strip.setBrightness(BRIGHTNESS);
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
    // initialize serial communication:
  Serial.begin(9600);
  // initialize the LED pins as an output:
  pinMode(ledPinRed, OUTPUT);
  pinMode(ledPinGreen, OUTPUT);
}
void loop() {
  // see if there's incoming serial data:
  if (Serial.available() > 0) {
    // read the oldest byte in the serial buffer:
    incomingByte = Serial.read();
    // if it's a capital H (ASCII 72), turn on the red LED:
    if (incomingByte == 'H') {
      digitalWrite(ledPinRed, HIGH);
    }
    // if it's an L (ASCII 76) turn off the red LED:
    if (incomingByte == 'L') {
      digitalWrite(ledPinRed, LOW);
    }
    // if it's a capital M (ASCII 77), turn on the green LED:
    if (incomingByte == 'M') {
//      digitalWrite(ledPinGreen, HIGH);
  colorWipe(strip.Color(255, 0, 0), 50); // Red
    }
    // if it's a capital N (ASCII 78), turn off the green LED:
    if (incomingByte == 'N') {
//      digitalWrite(ledPinGreen, LOW);
  colorWipe(strip.Color(0, 255, 0), 50); // Green
    }
  }
  // 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
//  colorWipe(strip.Color(0, 0, 0, 255), 50); // White
// whiteOverRainbow(20,75,5); 
// pulseWhite(5);
  // fullWhite();
  // delay(2000);
  //rainbowFade2White(3,3,1);
}
// 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 pulseWhite(uint8_t wait) {
  for(int j = 0; j < 256 ; j++){
      for(uint16_t i=0; i<strip.numPixels(); i++) {
          strip.setPixelColor(i, strip.Color(0,0,0, neopix_gamma[j] ) );
        }
        delay(wait);
        strip.show();
      }
  for(int j = 255; j >= 0 ; j--){
      for(uint16_t i=0; i<strip.numPixels(); i++) {
          strip.setPixelColor(i, strip.Color(0,0,0, neopix_gamma[j] ) );
        }
        delay(wait);
        strip.show();
      }
}
void rainbowFade2White(uint8_t wait, int rainbowLoops, int whiteLoops) {
  float fadeMax = 100.0;
  int fadeVal = 0;
  uint32_t wheelVal;
  int redVal, greenVal, blueVal;
  for(int k = 0 ; k < rainbowLoops ; k ++){
   
    for(int j=0; j<256; j++) { // 5 cycles of all colors on wheel
      for(int i=0; i< strip.numPixels(); i++) {
        wheelVal = Wheel(((i * 256 / strip.numPixels()) + j) & 255);
        redVal = red(wheelVal) * float(fadeVal/fadeMax);
        greenVal = green(wheelVal) * float(fadeVal/fadeMax);
        blueVal = blue(wheelVal) * float(fadeVal/fadeMax);
        strip.setPixelColor( i, strip.Color( redVal, greenVal, blueVal ) );
      }
      //First loop, fade in!
      if(k == 0 && fadeVal < fadeMax-1) {
          fadeVal++;
      }
      //Last loop, fade out!
      else if(k == rainbowLoops - 1 && j > 255 - fadeMax ){
          fadeVal--;
      }
        strip.show();
        delay(wait);
    }
 
  }
  delay(500);
  for(int k = 0 ; k < whiteLoops ; k ++){
    for(int j = 0; j < 256 ; j++){
        for(uint16_t i=0; i < strip.numPixels(); i++) {
            strip.setPixelColor(i, strip.Color(0,0,0, neopix_gamma[j] ) );
          }
          strip.show();
        }
        delay(2000);
    for(int j = 255; j >= 0 ; j--){
        for(uint16_t i=0; i < strip.numPixels(); i++) {
            strip.setPixelColor(i, strip.Color(0,0,0, neopix_gamma[j] ) );
          }
          strip.show();
        }
  }
  delay(500);
}
/*
void whiteOverRainbow(uint8_t wait, uint8_t whiteSpeed, uint8_t whiteLength ) {
 
  if(whiteLength >= strip.numPixels()) whiteLength = strip.numPixels() - 1;
  int head = whiteLength - 1;
  int tail = 0;
  int loops = 3;
  int loopNum = 0;
  static unsigned long lastTime = 0;
  while(true){
    for(int j=0; j<256; j++) {
      for(uint16_t i=0; i<strip.numPixels(); i++) {
        if((i >= tail && i <= head) || (tail > head && i >= tail) || (tail > head && i <= head) ){
          strip.setPixelColor(i, strip.Color(0,0,0, 255 ) );
        }
        else{
          strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
        }
       
      }
      if(millis() - lastTime > whiteSpeed) {
        head++;
        tail++;
        if(head == strip.numPixels()){
          loopNum++;
        }
        lastTime = millis();
      }
      if(loopNum == loops) return;
   
      head%=strip.numPixels();
      tail%=strip.numPixels();
        strip.show();
        delay(wait);
    }
  }
 
}
*/
void fullWhite() {
 
    for(uint16_t i=0; i<strip.numPixels(); i++) {
        strip.setPixelColor(i, strip.Color(0,0,0, 255 ) );
    }
      strip.show();
}
// 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);
  }
}
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);
  }
}
// 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 strip.Color(255 - WheelPos * 3, 0, WheelPos * 3,0);
  }
  if(WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3,0);
  }
  WheelPos -= 170;
  return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0,0);
}
uint8_t red(uint32_t c) {
  return (c >> 16);
}
uint8_t green(uint32_t c) {
  return (c >> 8);
}
uint8_t blue(uint32_t c) {
  return (c);
}
</pre>
<gallery class="center" widths=562px heights=434px>
File:51974103 240665216812459 1929090110096146432 n.jpg|green & red got triggered
</gallery>
== Building a custom made LED frame to direct light  ==
'''03 | 03 | 19'''
'''Creating non-material spaces'''
<gallery class="center" widths=562px heights=434px>
File:Screen Shot 2019-05-01 at 17.11.46.png|2x1m Adafruit Neopixel Strips
</gallery>
<gallery class="center" widths=562px heights=434px>
File:Screen Shot 2019-05-01 at 23.53.59.png|Detailed look into the u profile
</gallery>
<gallery class="center" widths=562px heights=434px>
File:Screen Shot 2019-05-18 at 14.41.03.png|Testing with a smoke machine
</gallery>
<gallery class="center" widths=562px heights=434px>
File:Screen Shot 2019-05-18 at 14.41.11.png|Testing with a smoke machine
</gallery>
== Diving into Arduino Adafruit Neopixel programming  ==
'''25 | 03 | 19'''
'''Arduino Script'''
''Learning about Millis - time protocol''
'''Colour fading into each other'''
<pre>
#include <Adafruit_NeoPixel.h>
#define PIN_STRIP_1 6
#define PIN_STRIP_2 5
#define NUM_LEDS 144
#define BRIGHTNESS 255
int currentExpansion = 0;
int maxExpansion = 14;
int interval = maxExpansion*2;
int currentStrip1led = (maxExpansion/2) + 1;
int currentStrip2led = (maxExpansion/2) + 1;
boolean reverseAnimation = false;
 
int currentAnimationPlaying = 0;
//int currentStrip1led = 0;
//int currentStrip2led = NUM_LEDS-1;
byte reds[] = {0x00,  0x00, 0xff,0x00 };
byte greens[] = {0xff,0x00, 0x00,0x00  };
byte blues[] = {0xff,0xff, 0xff,0x00 };
byte whites[] = {0x00, 0x00, 0x50,0xff};
int indexColorCircle = 0;
Adafruit_NeoPixel strip1 = Adafruit_NeoPixel(NUM_LEDS, PIN_STRIP_1, NEO_GRBW + NEO_KHZ800);
Adafruit_NeoPixel strip2 = Adafruit_NeoPixel(NUM_LEDS, PIN_STRIP_2, NEO_GRBW + NEO_KHZ800);
// ________
//different intervals for each LED
int startingTimeAnimation1 = 5000;
int startingTimeAnimation2 = 15000;
int startingTimeAnimation3 = 37000;
unsigned long initialTimeAnimation=0;
void colorWipe1(uint32_t c, uint8_t wait);
void colorWipe2(uint32_t c, uint8_t wait);
// ________
byte neopix_gamma[] = {
    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,
    1,  1,  1,  1,  1,  1,  1,  1,  1,  2,  2,  2,  2,  2,  2,  2,
    2,  3,  3,  3,  3,  3,  3,  3,  4,  4,  4,  4,  4,  5,  5,  5,
    5,  6,  6,  6,  6,  7,  7,  7,  7,  8,  8,  8,  9,  9,  9, 10,
  10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 14, 14, 15, 15, 16, 16,
  17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 24, 24, 25,
  25, 26, 27, 27, 28, 29, 29, 30, 31, 32, 32, 33, 34, 35, 35, 36,
  37, 38, 39, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 50,
  51, 52, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 66, 67, 68,
  69, 70, 72, 73, 74, 75, 77, 78, 79, 81, 82, 83, 85, 86, 87, 89,
  90, 92, 93, 95, 96, 98, 99,101,102,104,105,107,109,110,112,114,
  115,117,119,120,122,124,126,127,129,131,133,135,137,138,140,142,
  144,146,148,150,152,154,156,158,160,162,164,167,169,171,173,175,
  177,180,182,184,186,189,191,193,196,198,200,203,205,208,210,213,
  215,218,220,223,225,228,231,233,236,239,241,244,247,249,252,255 };
void setup() {
 
  // End of trinket special code
  strip1.setBrightness(BRIGHTNESS);
  strip1.begin();
  strip1.show(); // Initialize all pixels to 'off'
initialTimeAnimation =millis();
strip2.setBrightness(BRIGHTNESS);
  strip2.begin();
  strip2.show(); // Initialize all pixels to 'off'
initialTimeAnimation =millis();
}
// -----
// -----
void loop() {
  unsigned long currentMillis = millis();
  unsigned long diffMillis = currentMillis - initialTimeAnimation;
//reverse order first if next else if
  if (diffMillis >=  startingTimeAnimation3 ){
    if( currentAnimationPlaying != 3){
      clearAll();
    }
        currentAnimationPlaying = 3;
  }
else  if (diffMillis >=  startingTimeAnimation2 ){
    if( currentAnimationPlaying != 2){
      clearAll();
    }
          currentAnimationPlaying = 2;
  }
  else if (diffMillis >=  startingTimeAnimation1 ){
    if( currentAnimationPlaying != 1){
      clearAll();
    }
    currentAnimationPlaying = 1;
  }
if( currentAnimationPlaying == 3){
      StrobeBgColor(0, 0, 0, 255,0,0,255,0, 10, 10, 1);
}else if( currentAnimationPlaying == 2){
 
    setCircleNoLoop(reds[indexColorCircle],greens[indexColorCircle],blues[indexColorCircle],whites[indexColorCircle],100);
}else if( currentAnimationPlaying == 1){
        SnowSparkle(0x00, 0x00, 0x00, 0x00, 1000, random(100,1000));   
}
//  setCircleNoLoop(reds[indexColorCircle],greens[indexColorCircle],blues[indexColorCircle],whites[indexColorCircle],100);
  // SnowSparkle(0x00, 0x00, 0x5, 0x00, 1000, random(100,1000));
  // openingUp(reds[indexColorCircle],greens[indexColorCircle],blues[indexColorCircle],whites[indexColorCircle],15);
// StrobeBgColor(0, 0, 0, 255,0,0,255,0, 10, 10, 1);
}
void clearAll(){
        //Clear them all
      for(int i = 0; i <NUM_LEDS;i++){   
        setPixel1(i, 0, 0, 0, 0);       
        setPixel2(i, 0, 0, 0, 0);       
      }
}
void setPixel1(int Pixel, byte red, byte green, byte blue, byte white) {
#ifdef ADAFRUIT_NEOPIXEL_H
  // NeoPixel
  strip1.setPixelColor(Pixel, strip1.Color(red, green, blue, white));
#endif
#ifndef ADAFRUIT_NEOPIXEL_H
  // FastLED
  leds[Pixel].r = red;
  leds[Pixel].g = green;
  leds[Pixel].b = blue;
  leds[Pixel].b = white;
#endif
}
void setPixel2(int Pixel, byte red, byte green, byte blue, byte white) {
#ifdef ADAFRUIT_NEOPIXEL_H
  // NeoPixel
  strip2.setPixelColor(Pixel, strip2.Color(red, green, blue, white));
#endif
#ifndef ADAFRUIT_NEOPIXEL_H
  // FastLED
  leds[Pixel].r = red;
  leds[Pixel].g = green;
  leds[Pixel].b = blue;
  leds[Pixel].b = white;
#endif
}
void setAll(byte red, byte green, byte blue, byte white) {
  for(int i = 0; i < NUM_LEDS; i++ ) {
    setPixel1(i, red, green, blue, white);
    setPixel2(i, red, green, blue, white);
  }
  strip1.show();
  strip2.show();
}
void Strobe(byte red, byte green, byte blue, byte white, int StrobeCount, int FlashDelay, int EndPause){
  for(int j = 0; j < StrobeCount; j++) {
//    setAll(red,green,blue,white);
    //setAll(0,0,0,255); //
    strip1.show();
    delay(FlashDelay);
    setAll(0,0,0,255); //red
  strip1.show();
    delay(FlashDelay);
    strip2.show();
    delay(FlashDelay);
    setAll(0,0,0,255); //red
  strip2.show();
    delay(FlashDelay);
  }
delay(EndPause);
}
void StrobeBgColor(byte red, byte green, byte blue, byte white, byte bgred, byte bggreen, byte bgblue, byte bgwhite, int StrobeCount, int FlashDelay, int EndPause){
  for(int j = 0; j < StrobeCount; j++) {
    setAll(bgred,bggreen,bgblue,bgwhite);
    strip1.show();
    delay(FlashDelay);
    setAll(red,green,blue,white);
    strip1.show();
    delay(FlashDelay);
    setAll(bgred,bggreen,bgblue,bgwhite);
    strip2.show();
    delay(FlashDelay);
    setAll(red,green,blue,white);
    strip2.show();
    delay(FlashDelay);
  }
delay(EndPause);
}
void showStrip() {
#ifdef ADAFRUIT_NEOPIXEL_H
  // NeoPixel
  strip1.show();
#endif
#ifndef ADAFRUIT_NEOPIXEL_H
  // FastLED
  FastLED.show();
#endif
#ifdef ADAFRUIT_NEOPIXEL_H
  // NeoPixel
  strip2.show();
#endif
#ifndef ADAFRUIT_NEOPIXEL_H
  // FastLED
  FastLED.show();
#endif
}
void setCircleNoLoop(byte red, byte green, byte blue, byte white, float SpeedDelay) {
    if( reverseAnimation == false){
      setPixel1(currentStrip1led, red, green, blue, white);
      strip1.show();
      delay(SpeedDelay);
      currentStrip1led = currentStrip1led +1;
      if(currentStrip1led  >= NUM_LEDS) {
        currentStrip1led = 0;
        reverseAnimation = true;
      }
    }else if( reverseAnimation == true){
      //currentStrip2led
      setPixel2(currentStrip2led, red, green, blue, white);
      strip2.show();
      delay(SpeedDelay);
      currentStrip2led = currentStrip2led -1;
    if (currentStrip2led == -1) {
        currentStrip2led =  NUM_LEDS -1;
      reverseAnimation = false;
      indexColorCircle = indexColorCircle +1;
      if( indexColorCircle == sizeof(reds) ){
        indexColorCircle = 0;
      }
    }
    }
   
    }
void setAll1(byte red, byte green, byte blue, byte white) {
  for(int i = 0; i < NUM_LEDS; i++ ) {
    setPixel1(i, red, green, blue, white);
  }
  strip1.show();
}
void setAll2(byte red, byte green, byte blue, byte white) {
  for(int i = 0; i < NUM_LEDS; i++ ) {
    setPixel2(i, red, green, blue, white);
  }
  strip2.show();
}
void SnowSparkle(byte red, byte green, byte blue, byte white, int SparkleDelay, int SpeedDelay) {
  setAll1(red,green,blue,white);
 
// int Pixel = random(NUM_LEDS);
    int Pixel = random(0,100) ;
  setPixel1(Pixel,0xff,0xff,0xff,0xff);
  strip1.show();
  delay(SparkleDelay);
  setPixel1(Pixel,red,green,blue,white);
  strip1.show();
  delay(SpeedDelay);
  setAll2(red,green,blue,white);
 
// int Pixel = random(NUM_LEDS);
//  int Pixel = random(NUM_LEDS) ;
  setPixel2(Pixel,0xff,0xff,0xff,0xff);
  strip2.show();
  delay(SparkleDelay);
  setPixel2(Pixel,red,green,blue,white);
  strip2.show();
  delay(SpeedDelay);
 
}
// Fill the dots one after the other with a color
void colorWipe1(uint32_t c, uint8_t wait) {
  for(uint16_t i=0; i<strip1.numPixels(); i++) {
    strip1.setPixelColor(i, c);
    strip1.show();
    delay(wait);
  }
}
void colorWipe2(uint32_t c, uint8_t wait) {
  for(uint16_t i=0; i<strip2.numPixels(); i++) {
    strip2.setPixelColor(i, c);
    strip2.show();
    delay(wait);
  }
}
</pre>
'''Strobe Effect'''
<pre>
#include <Adafruit_NeoPixel.h> 
      #define ADAFRUIT_NEOPIXEL_H
      #define PIN1 6
      #define PIN2 5
      #define NUM_LEDS 144
      #define BRIGHTNESS 255
// 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 strip1 = Adafruit_NeoPixel(NUM_LEDS, PIN1, NEO_GRBW + NEO_KHZ800);
Adafruit_NeoPixel strip2 = Adafruit_NeoPixel(NUM_LEDS, PIN2, NEO_GRBW + NEO_KHZ800);
byte neopix_gamma[] = {
    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,
    1,  1,  1,  1,  1,  1,  1,  1,  1,  2,  2,  2,  2,  2,  2,  2,
    2,  3,  3,  3,  3,  3,  3,  3,  4,  4,  4,  4,  4,  5,  5,  5,
    5,  6,  6,  6,  6,  7,  7,  7,  7,  8,  8,  8,  9,  9,  9, 10,
  10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 14, 14, 15, 15, 16, 16,
  17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 24, 24, 25,
  25, 26, 27, 27, 28, 29, 29, 30, 31, 32, 32, 33, 34, 35, 35, 36,
  37, 38, 39, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 50,
  51, 52, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 66, 67, 68,
  69, 70, 72, 73, 74, 75, 77, 78, 79, 81, 82, 83, 85, 86, 87, 89,
  90, 92, 93, 95, 96, 98, 99,101,102,104,105,107,109,110,112,114,
  115,117,119,120,122,124,126,127,129,131,133,135,137,138,140,142,
  144,146,148,150,152,154,156,158,160,162,164,167,169,171,173,175,
  177,180,182,184,186,189,191,193,196,198,200,203,205,208,210,213,
  215,218,220,223,225,228,231,233,236,239,241,244,247,249,252,255 };
void setup() {
  strip1.setBrightness(BRIGHTNESS);
  strip1.begin();
  strip1.show();
 
  strip2.setBrightness(BRIGHTNESS);
  strip2.begin();
  strip2.show();// Initialize all pixels to 'off'
}
void loop() {
  // Slower:
  // Strobe(0xff, 0x77, 0x00, 10, 100, 1000);
  // Fast:
// Strobe(0, 0, 0, 255, 10, 10, 1);
  //StrobeBgColor(0, 0, 0, 255,0,0,255,0, 10, 50, 1);
// StrobeBgColor(0, 0, 0, 255,0,0,255,0, 10, 10, 1);
  StrobeBgColor(255, 0, 0, 0,0,0,255,0, 10, 1, 1);
}
void Strobe(byte red, byte green, byte blue, byte white, int StrobeCount, int FlashDelay, int EndPause){
  for(int j = 0; j < StrobeCount; j++) {
//    setAll(red,green,blue,white);
    //setAll(0,0,0,255); //
    strip1.show();
    delay(FlashDelay);
    setAll(0,0,0,255); //red
  strip1.show();
    delay(FlashDelay);
    strip2.show();
    delay(FlashDelay);
    setAll(0,0,0,255); //red
  strip2.show();
    delay(FlashDelay);
  }
delay(EndPause);
}
void StrobeBgColor(byte red, byte green, byte blue, byte white, byte bgred, byte bggreen, byte bgblue, byte bgwhite, int StrobeCount, int FlashDelay, int EndPause){
  for(int j = 0; j < StrobeCount; j++) {
    setAll(bgred,bggreen,bgblue,bgwhite);
    strip1.show();
    delay(FlashDelay);
    setAll(red,green,blue,white);
    strip1.show();
    delay(FlashDelay);
    setAll(bgred,bggreen,bgblue,bgwhite);
    strip2.show();
    delay(FlashDelay);
    setAll(red,green,blue,white);
    strip2.show();
    delay(FlashDelay);
  }
delay(EndPause);
}
void showStrip() {
#ifdef ADAFRUIT_NEOPIXEL_H
  // NeoPixel
  strip1.show();
#endif
#ifndef ADAFRUIT_NEOPIXEL_H
  // FastLED
  FastLED.show();
#endif
#ifdef ADAFRUIT_NEOPIXEL_H
  // NeoPixel
  strip2.show();
#endif
#ifndef ADAFRUIT_NEOPIXEL_H
  // FastLED
  FastLED.show();
#endif
}
void setPixel(int Pixel, byte red, byte green, byte blue, byte white) {
#ifdef ADAFRUIT_NEOPIXEL_H
  // NeoPixel
  strip1.setPixelColor(Pixel, strip1.Color(red, green, blue, white));
    strip2.setPixelColor(Pixel, strip2.Color(red, green, blue, white));
#endif
#ifndef ADAFRUIT_NEOPIXEL_H
  // FastLED
  leds[Pixel].r = red;
  leds[Pixel].g = green;
  leds[Pixel].b = blue;
  leds[Pixel].b = white;
#endif
}
void setAll(byte red, byte green, byte blue, byte white) {
  for(int i = 0; i < NUM_LEDS; i++ ) {
    setPixel(i, red, green, blue, white);
  }
  strip1.show();
  strip2.show();
}
</pre>
== Stepper motor + mirror ==
'''27 | 03 | 19'''
On the stepper motor a mirror will be mounted that will create the reflections of the light. <br>
<gallery class="center" widths=692px heights=405px>
File:Screen Shot 2019-05-18 at 15.03.23.png|
</gallery>
<br>
<gallery class="center" widths=692px heights=405px>
File:Screen Shot 2019-05-18 at 15.10.31.png|
</gallery>
<br>
== New Arduino Circuit ==
'''29 | 03 | 19'''
After some serious (burning) issues I realised that my circuit wasn't safe enough so rebuilt with help of Yoana from the interaction station. This new setup with a shield allowed me a more safe and modular environment of experimentation <br>
<gallery class="center" widths=692px heights=405px>
File:Screen Shot 2019-05-18 at 15.14.40.png|
</gallery>
<br>
<gallery class="center" widths=692px heights=405px>
File:Screen Shot 2019-05-18 at 15.14.47.png|
</gallery>
<br>
== 12W blue LED light with a fresnel lens ==
'''27 | 04 | 19'''
'''Mid blue light'''
<br>
After an intensive experimentation process I discovered that a fresnel lens would be the best suitable way of creating a strong light beam. <br>
<gallery class="center" widths=692px heights=405px>
File:Screen Shot 2019-05-18 at 15.02.58.png|
</gallery>
<br>
<gallery class="center" widths=692px heights=405px>
File:Screen Shot 2019-05-18 at 15.03.11.png|
</gallery>
<br>
<gallery class="center" widths=692px heights=405px>
File:Screen Shot 2019-05-18 at 15.03.06.png|
</gallery>
<br>
== Technical driver ==
'''15 | 05 | 19'''
RPI – python script with the sound file <br>
<br>
Arduino 1 – circular LED <br>
Arduino 2 – Stepper Motor + Mirror <br>
Arduino 3 – blue light <br>
<br>
The idea behind is that the sound is running through a python script in the Raspberry Pi, which counting the seconds. And sending this data to the 3 Arduinos (LED ring, mid blue light, rotative mirror). When the Arduino receives the signal to the certain seconds it triggers the animations, starts the motor turns on the blue light. <br>
<br>
An additional soundcard with 4 channels output will be connected to the RPI to send the sound input to the 4 speakers to create quadraphonic sound.
<br>
<gallery class="center" widths=692px heights=405px>
File:Screen Shot 2019-05-18 at 15.21.19.png|
</gallery>
<br>
<gallery class="center" widths=692px heights=405px>
File:Screen Shot 2019-05-18 at 15.26.29.png|
</gallery>
<br>

Latest revision as of 14:27, 18 May 2019


P R O T O T Y P I N G

What is a Circuit?


What are Resistors?


conversion calculator resistor color code

Light-Emitting Diodes (LEDs)



All about LED

How to use Arduino?

1. Arduino Script


*
 * Zalan's first Program
 */

 int ledPin = 13;
 void setup()
 { 
  //initialize pins as outputs
  pinMode(ledPin, OUTPUT);
 }
void loop()
{ 
  digitalWrite(ledPin, HIGH);
  delay(1000);
  digitalWrite(ledPin, LOW);
  delay(1000);
}



2. Arduino Script

int LED = 12;
int BUTTON = 4;


void setup()
{
  pinMode(LED,OUTPUT);
  pinMode(BUTTON,INPUT);
}

void loop()
{
  if(digitalRead(BUTTON) == HIGH)
  {
  digitalWrite(LED,HIGH);
  }else
  {
  digitalWrite(LED,LOW);
  }
}



3. Arduino Script

int switchPin = 8;
int ledPin = 13;
boolean lastButton = LOW;
boolean currentButton = LOW;
boolean ledOn = false;

void setup()
{
  pinMode(switchPin, INPUT);
  pinMode(ledPin, OUTPUT);
 
}

boolean debounce(boolean last)
{
  boolean current = digitalRead(switchPin);
  if (last != current)
  {
    delay(5);
    current = digitalRead(switchPin);
   
  }
  return current;
  
}
void loop()
{
  currentButton = debounce(lastButton);
  if (lastButton == LOW && currentButton == HIGH)
  {
    ledOn -= !ledOn;
  }
      lastButton = currentButton;
    digitalWrite(ledPin, ledOn);
  

}


4. Arduino Script

// NeoPixel Ring simple sketch (c) 2013 Shae Erisson
// released under the GPLv3 license to match the rest of the AdaFruit NeoPixel library

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
  #include <avr/power.h>
#endif

// Which pin on the Arduino is connected to the NeoPixels?
// On a Trinket or Gemma we suggest changing this to 1
#define PIN            6

// How many NeoPixels are attached to the Arduino?
#define NUMPIXELS      16

// When we setup the NeoPixel library, we tell it how many pixels, and which pin to use to send signals.
// Note that for older NeoPixel strips you might need to change the third parameter--see the strandtest
// example for more information on possible values.
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

int delayval = 500; // delay for half a second

void setup() {
  // This is for Trinket 5V 16MHz, you can remove these three lines if you are not using a Trinket
#if defined (__AVR_ATtiny85__)
  if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
#endif
  // End of trinket special code

  pixels.begin(); // This initializes the NeoPixel library.
}

void loop() {

  // For a set of NeoPixels the first NeoPixel is 0, second is 1, all the way up to the count of pixels minus one.

  for(int i=0;i<NUMPIXELS;i++){

    // pixels.Color takes RGB values, from 0,0,0 up to 255,255,255
    pixels.setPixelColor(i, pixels.Color(0,150,0)); // Moderately bright green color.

    pixels.show(); // This sends the updated pixel color to the hardware.

    delay(delayval); // Delay for a period of time (in milliseconds).

  }
}




5. Arduino Script


#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
  #include <avr/power.h>
#endif

#define PIN 10

#define NUM_LEDS 60

#define BRIGHTNESS 50

Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_GRBW + NEO_KHZ800);

byte neopix_gamma[] = {
    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,
    1,  1,  1,  1,  1,  1,  1,  1,  1,  2,  2,  2,  2,  2,  2,  2,
    2,  3,  3,  3,  3,  3,  3,  3,  4,  4,  4,  4,  4,  5,  5,  5,
    5,  6,  6,  6,  6,  7,  7,  7,  7,  8,  8,  8,  9,  9,  9, 10,
   10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 14, 14, 15, 15, 16, 16,
   17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 24, 24, 25,
   25, 26, 27, 27, 28, 29, 29, 30, 31, 32, 32, 33, 34, 35, 35, 36,
   37, 38, 39, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 50,
   51, 52, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 66, 67, 68,
   69, 70, 72, 73, 74, 75, 77, 78, 79, 81, 82, 83, 85, 86, 87, 89,
   90, 92, 93, 95, 96, 98, 99,101,102,104,105,107,109,110,112,114,
  115,117,119,120,122,124,126,127,129,131,133,135,137,138,140,142,
  144,146,148,150,152,154,156,158,160,162,164,167,169,171,173,175,
  177,180,182,184,186,189,191,193,196,198,200,203,205,208,210,213,
  215,218,220,223,225,228,231,233,236,239,241,244,247,249,252,255 };


void setup() {
  // This is for Trinket 5V 16MHz, you can remove these three lines if you are not using a Trinket
  #if defined (__AVR_ATtiny85__)
    if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
  #endif
  // End of trinket special code
  strip.setBrightness(BRIGHTNESS);
  strip.begin();
  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
  colorWipe(strip.Color(0, 0, 0, 255), 50); // White

  whiteOverRainbow(20,75,5);  

  pulseWhite(5); 

  // fullWhite();
  // delay(2000);

  rainbowFade2White(3,3,1);


}

// 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 pulseWhite(uint8_t wait) {
  for(int j = 0; j < 256 ; j++){
      for(uint16_t i=0; i<strip.numPixels(); i++) {
          strip.setPixelColor(i, strip.Color(0,0,0, neopix_gamma[j] ) );
        }
        delay(wait);
        strip.show();
      }

  for(int j = 255; j >= 0 ; j--){
      for(uint16_t i=0; i<strip.numPixels(); i++) {
          strip.setPixelColor(i, strip.Color(0,0,0, neopix_gamma[j] ) );
        }
        delay(wait);
        strip.show();
      }
}


void rainbowFade2White(uint8_t wait, int rainbowLoops, int whiteLoops) {
  float fadeMax = 100.0;
  int fadeVal = 0;
  uint32_t wheelVal;
  int redVal, greenVal, blueVal;

  for(int k = 0 ; k < rainbowLoops ; k ++){
    
    for(int j=0; j<256; j++) { // 5 cycles of all colors on wheel

      for(int i=0; i< strip.numPixels(); i++) {

        wheelVal = Wheel(((i * 256 / strip.numPixels()) + j) & 255);

        redVal = red(wheelVal) * float(fadeVal/fadeMax);
        greenVal = green(wheelVal) * float(fadeVal/fadeMax);
        blueVal = blue(wheelVal) * float(fadeVal/fadeMax);

        strip.setPixelColor( i, strip.Color( redVal, greenVal, blueVal ) );

      }

      //First loop, fade in!
      if(k == 0 && fadeVal < fadeMax-1) {
          fadeVal++;
      }

      //Last loop, fade out!
      else if(k == rainbowLoops - 1 && j > 255 - fadeMax ){
          fadeVal--;
      }

        strip.show();
        delay(wait);
    }
  
  }



  delay(500);


  for(int k = 0 ; k < whiteLoops ; k ++){

    for(int j = 0; j < 256 ; j++){

        for(uint16_t i=0; i < strip.numPixels(); i++) {
            strip.setPixelColor(i, strip.Color(0,0,0, neopix_gamma[j] ) );
          }
          strip.show();
        }

        delay(2000);
    for(int j = 255; j >= 0 ; j--){

        for(uint16_t i=0; i < strip.numPixels(); i++) {
            strip.setPixelColor(i, strip.Color(0,0,0, neopix_gamma[j] ) );
          }
          strip.show();
        }
  }

  delay(500);


}

void whiteOverRainbow(uint8_t wait, uint8_t whiteSpeed, uint8_t whiteLength ) {
  
  if(whiteLength >= strip.numPixels()) whiteLength = strip.numPixels() - 1;

  int head = whiteLength - 1;
  int tail = 0;

  int loops = 3;
  int loopNum = 0;

  static unsigned long lastTime = 0;


  while(true){
    for(int j=0; j<256; j++) {
      for(uint16_t i=0; i<strip.numPixels(); i++) {
        if((i >= tail && i <= head) || (tail > head && i >= tail) || (tail > head && i <= head) ){
          strip.setPixelColor(i, strip.Color(0,0,0, 255 ) );
        }
        else{
          strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
        }
        
      }

      if(millis() - lastTime > whiteSpeed) {
        head++;
        tail++;
        if(head == strip.numPixels()){
          loopNum++;
        }
        lastTime = millis();
      }

      if(loopNum == loops) return;
    
      head%=strip.numPixels();
      tail%=strip.numPixels();
        strip.show();
        delay(wait);
    }
  }
  
}
void fullWhite() {
  
    for(uint16_t i=0; i<strip.numPixels(); i++) {
        strip.setPixelColor(i, strip.Color(0,0,0, 255 ) );
    }
      strip.show();
}


// 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);
  }
}

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);
  }
}

// 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 strip.Color(255 - WheelPos * 3, 0, WheelPos * 3,0);
  }
  if(WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3,0);
  }
  WheelPos -= 170;
  return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0,0);
}

uint8_t red(uint32_t c) {
  return (c >> 16);
}
uint8_t green(uint32_t c) {
  return (c >> 8);
}
uint8_t blue(uint32_t c) {
  return (c);
}


Quick prototyping with Joca

Experiment question
How to make a stronger and more equal light beam of an LED light?'
Tools: Phone, aluminium foil, plexisheet 1 x 1 x 16 cm







Building new circuit together with Joca

19 | 10 | 18



Experimenting with light beam setup

23 | 10 | 18


components: 1 beamer, 1 smokemachine, 1 vault (dark room)

focus: How to divide the space with basic geometrical elements?





Adafruit NeoPixel Arduino experiment

05 | 11 | 18
Fade In and Fade Out: Red, Green and Blue

Facts:

  • 1 m Adafruit NeoPixel
  • 30 LEDs


Tutorials




#include <Adafruit_NeoPixel.h>
#define PIN 8
#define NUM_LEDS 30
// 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(NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800);

void setup() {
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
}

void loop() { 
  RGBLoop();
}

void RGBLoop(){
  for(int j = 0; j < 3; j++ ) { 
    // Fade IN
    for(int k = 0; k < 256; k++) { 
      switch(j) { 
        case 0: setAll(k,0,0); break;
        case 1: setAll(0,k,0); break;
        case 2: setAll(0,0,k); break;
      }
      showStrip();
      delay(3);
    }
    // Fade OUT
    for(int k = 255; k >= 0; k--) { 
      switch(j) { 
        case 0: setAll(k,0,0); break;
        case 1: setAll(0,k,0); break;
        case 2: setAll(0,0,k); break;
      }
      showStrip();
      delay(3);
    }
  }
}

void showStrip() {
 #ifdef ADAFRUIT_NEOPIXEL_H 
   // NeoPixel
   strip.show();
 #endif
 #ifndef ADAFRUIT_NEOPIXEL_H
   // FastLED
   FastLED.show();
 #endif
}

void setPixel(int Pixel, byte red, byte green, byte blue) {
 #ifdef ADAFRUIT_NEOPIXEL_H 
   // NeoPixel
   strip.setPixelColor(Pixel, strip.Color(red, green, blue));
 #endif
 #ifndef ADAFRUIT_NEOPIXEL_H 
   // FastLED
   leds[Pixel].r = red;
   leds[Pixel].g = green;
   leds[Pixel].b = blue;
 #endif
}

void setAll(byte red, byte green, byte blue) {
  for(int i = 0; i < NUM_LEDS; i++ ) {
    setPixel(i, red, green, blue); 
  }
  showStrip();
}

Fade In and Fade Out: Custom colour



#include <Adafruit_NeoPixel.h>
#define PIN 8
#define NUM_LEDS 30
// 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(NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800);

void setup() {
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
}

void loop() { 
  FadeInOut(0xff, 0x77, 0x00);
}

void FadeInOut(byte red, byte green, byte blue){
  float r, g, b;
      
  for(int k = 0; k < 256; k=k+1) { 
    r = (k/256.0)*red;
    g = (k/256.0)*green;
    b = (k/256.0)*blue;
    setAll(r,g,b);
    showStrip();
  }
     
  for(int k = 255; k >= 0; k=k-2) {
    r = (k/256.0)*red;
    g = (k/256.0)*green;
    b = (k/256.0)*blue;
    setAll(r,g,b);
    showStrip();
  }
}
void showStrip() {
 #ifdef ADAFRUIT_NEOPIXEL_H 
   // NeoPixel
   strip.show();
 #endif
 #ifndef ADAFRUIT_NEOPIXEL_H
   // FastLED
   FastLED.show();
 #endif
}

void setPixel(int Pixel, byte red, byte green, byte blue) {
 #ifdef ADAFRUIT_NEOPIXEL_H 
   // NeoPixel
   strip.setPixelColor(Pixel, strip.Color(red, green, blue));
 #endif
 #ifndef ADAFRUIT_NEOPIXEL_H 
   // FastLED
   leds[Pixel].r = red;
   leds[Pixel].g = green;
   leds[Pixel].b = blue;
 #endif
}

void setAll(byte red, byte green, byte blue) {
  for(int i = 0; i < NUM_LEDS; i++ ) {
    setPixel(i, red, green, blue); 
  }
  showStrip();
}

Strobe

The function takes 6 parameters.

The first 3 are the same red, green and blue. In the example I used White.

The next parameter (StrobeCount) indicates how many flashes you’d like to see.
Parameters 5 (FlashDelay) and 6 (EndPause) are for delays between each individual flash and how long the function should wait once it completed all flashes.







#include <Adafruit_NeoPixel.h>
#define PIN 8
#define NUM_LEDS 30
// 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(NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800);

void setup() {
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
}

void loop() { 
  // Slower:
  // Strobe(0xff, 0x77, 0x00, 10, 100, 1000);
  // Fast:
  Strobe(0xff, 0xff, 0xff, 10, 30, 1000);
}

void Strobe(byte red, byte green, byte blue, int StrobeCount, int FlashDelay, int EndPause){
  for(int j = 0; j < StrobeCount; j++) {
    setAll(red,green,blue);
    showStrip();
    delay(FlashDelay);
    setAll(0,0,0);
    showStrip();
    delay(FlashDelay);
  }
 
 delay(EndPause);
}
void showStrip() {
 #ifdef ADAFRUIT_NEOPIXEL_H 
   // NeoPixel
   strip.show();
 #endif
 #ifndef ADAFRUIT_NEOPIXEL_H
   // FastLED
   FastLED.show();
 #endif
}

void setPixel(int Pixel, byte red, byte green, byte blue) {
 #ifdef ADAFRUIT_NEOPIXEL_H 
   // NeoPixel
   strip.setPixelColor(Pixel, strip.Color(red, green, blue));
 #endif
 #ifndef ADAFRUIT_NEOPIXEL_H 
   // FastLED
   leds[Pixel].r = red;
   leds[Pixel].g = green;
   leds[Pixel].b = blue;
 #endif
}

void setAll(byte red, byte green, byte blue) {
  for(int i = 0; i < NUM_LEDS; i++ ) {
    setPixel(i, red, green, blue); 
  }
  showStrip();
}


Cylon




The Cylon() function takes 6 parameters, where the first 3 are you preferred color. The 4th parameter (EyeSize) determines how many LEDs run around, or: the width of the “eye” (outer 2, faded, LEDs not counted).

The 5th parameter (SpeedDelay) influences how fast the eye moves, higher values means slow movement. The last parameter (ReturnDelay) sets how much time it should wait to bounce back.


#include <Adafruit_NeoPixel.h>
#define PIN 8
#define NUM_LEDS 30
// 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(NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800);

void setup() {
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
}

void loop() {
  CylonBounce(0xff, 0xff, 0xff, 4, 10, 50);
}

void CylonBounce(byte red, byte green, byte blue, int EyeSize, int SpeedDelay, int ReturnDelay){

  for(int i = 0; i < NUM_LEDS-EyeSize-2; i++) {
    setAll(0,0,0);
    setPixel(i, red/10, green/10, blue/10);
    for(int j = 1; j <= EyeSize; j++) {
      setPixel(i+j, red, green, blue); 
    }
    setPixel(i+EyeSize+1, red/10, green/10, blue/10);
    showStrip();
    delay(SpeedDelay);
  }

  delay(ReturnDelay);

  for(int i = NUM_LEDS-EyeSize-2; i > 0; i--) {
    setAll(0,0,0);
    setPixel(i, red/10, green/10, blue/10);
    for(int j = 1; j <= EyeSize; j++) {
      setPixel(i+j, red, green, blue); 
    }
    setPixel(i+EyeSize+1, red/10, green/10, blue/10);
    showStrip();
    delay(SpeedDelay);
  }
  
  delay(ReturnDelay);
}
void showStrip() {
 #ifdef ADAFRUIT_NEOPIXEL_H 
   // NeoPixel
   strip.show();
 #endif
 #ifndef ADAFRUIT_NEOPIXEL_H
   // FastLED
   FastLED.show();
 #endif
}

void setPixel(int Pixel, byte red, byte green, byte blue) {
 #ifdef ADAFRUIT_NEOPIXEL_H 
   // NeoPixel
   strip.setPixelColor(Pixel, strip.Color(red, green, blue));
 #endif
 #ifndef ADAFRUIT_NEOPIXEL_H 
   // FastLED
   leds[Pixel].r = red;
   leds[Pixel].g = green;
   leds[Pixel].b = blue;
 #endif
}

void setAll(byte red, byte green, byte blue) {
  for(int i = 0; i < NUM_LEDS; i++ ) {
    setPixel(i, red, green, blue); 
  }
  showStrip();
}

KITT

Instead of bouncing back and forth it now follows this pattern:



#include <Adafruit_NeoPixel.h>
#define PIN 8
#define NUM_LEDS 30
// 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(NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800);

void setup() {
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
}

void loop() {
  NewKITT(0xff, 0xff, 0xff, 8, 10, 50);
}

void NewKITT(byte red, byte green, byte blue, int EyeSize, int SpeedDelay, int ReturnDelay){
  RightToLeft(red, green, blue, EyeSize, SpeedDelay, ReturnDelay);
  LeftToRight(red, green, blue, EyeSize, SpeedDelay, ReturnDelay);
  OutsideToCenter(red, green, blue, EyeSize, SpeedDelay, ReturnDelay);
  CenterToOutside(red, green, blue, EyeSize, SpeedDelay, ReturnDelay);
  LeftToRight(red, green, blue, EyeSize, SpeedDelay, ReturnDelay);
  RightToLeft(red, green, blue, EyeSize, SpeedDelay, ReturnDelay);
  OutsideToCenter(red, green, blue, EyeSize, SpeedDelay, ReturnDelay);
  CenterToOutside(red, green, blue, EyeSize, SpeedDelay, ReturnDelay);
}

void CenterToOutside(byte red, byte green, byte blue, int EyeSize, int SpeedDelay, int ReturnDelay) {
  for(int i =((NUM_LEDS-EyeSize)/2); i>=0; i--) {
    setAll(0,0,0);
    
    setPixel(i, red/10, green/10, blue/10);
    for(int j = 1; j <= EyeSize; j++) {
      setPixel(i+j, red, green, blue); 
    }
    setPixel(i+EyeSize+1, red/10, green/10, blue/10);
    
    setPixel(NUM_LEDS-i, red/10, green/10, blue/10);
    for(int j = 1; j <= EyeSize; j++) {
      setPixel(NUM_LEDS-i-j, red, green, blue); 
    }
    setPixel(NUM_LEDS-i-EyeSize-1, red/10, green/10, blue/10);
    
    showStrip();
    delay(SpeedDelay);
  }
  delay(ReturnDelay);
}

void OutsideToCenter(byte red, byte green, byte blue, int EyeSize, int SpeedDelay, int ReturnDelay) {
  for(int i = 0; i<=((NUM_LEDS-EyeSize)/2); i++) {
    setAll(0,0,0);
    
    setPixel(i, red/10, green/10, blue/10);
    for(int j = 1; j <= EyeSize; j++) {
      setPixel(i+j, red, green, blue); 
    }
    setPixel(i+EyeSize+1, red/10, green/10, blue/10);
    
    setPixel(NUM_LEDS-i, red/10, green/10, blue/10);
    for(int j = 1; j <= EyeSize; j++) {
      setPixel(NUM_LEDS-i-j, red, green, blue); 
    }
    setPixel(NUM_LEDS-i-EyeSize-1, red/10, green/10, blue/10);
    
    showStrip();
    delay(SpeedDelay);
  }
  delay(ReturnDelay);
}

void LeftToRight(byte red, byte green, byte blue, int EyeSize, int SpeedDelay, int ReturnDelay) {
  for(int i = 0; i < NUM_LEDS-EyeSize-2; i++) {
    setAll(0,0,0);
    setPixel(i, red/10, green/10, blue/10);
    for(int j = 1; j <= EyeSize; j++) {
      setPixel(i+j, red, green, blue); 
    }
    setPixel(i+EyeSize+1, red/10, green/10, blue/10);
    showStrip();
    delay(SpeedDelay);
  }
  delay(ReturnDelay);
}

void RightToLeft(byte red, byte green, byte blue, int EyeSize, int SpeedDelay, int ReturnDelay) {
  for(int i = NUM_LEDS-EyeSize-2; i > 0; i--) {
    setAll(0,0,0);
    setPixel(i, red/10, green/10, blue/10);
    for(int j = 1; j <= EyeSize; j++) {
      setPixel(i+j, red, green, blue); 
    }
    setPixel(i+EyeSize+1, red/10, green/10, blue/10);
    showStrip();
    delay(SpeedDelay);
  }
  delay(ReturnDelay);
}
void showStrip() {
 #ifdef ADAFRUIT_NEOPIXEL_H 
   // NeoPixel
   strip.show();
 #endif
 #ifndef ADAFRUIT_NEOPIXEL_H
   // FastLED
   FastLED.show();
 #endif
}

void setPixel(int Pixel, byte red, byte green, byte blue) {
 #ifdef ADAFRUIT_NEOPIXEL_H 
   // NeoPixel
   strip.setPixelColor(Pixel, strip.Color(red, green, blue));
 #endif
 #ifndef ADAFRUIT_NEOPIXEL_H 
   // FastLED
   leds[Pixel].r = red;
   leds[Pixel].g = green;
   leds[Pixel].b = blue;
 #endif
}

void setAll(byte red, byte green, byte blue) {
  for(int i = 0; i < NUM_LEDS; i++ ) {
    setPixel(i, red, green, blue); 
  }
  showStrip();
}

KITT script with a plexiglass

For this experiment I placed an plexisheet on the LED strip to be able to create a stronger light beam




Experiments with Collimators & LEDs

09 | 11 | 18
Plano Convex Lens

Facts:

  • 2x small Plano Convex Lenses
  • 2x big Plano Convex Lenses
  • ADAFRUIT NEOPIXEL 1m (30 LEDs) - 4 used


I was interested, how the different plano convex lenses would create different light beams.





Conclusion
The distance between the LED and the lens is very important. By varying the distance you can control the light beam and measure it to be able to calculate in the formula.

Experiments with the distance between the collimators & LEDs

10 | 11 | 18
Plano Convex Lens

Facts:

  • 1x small Plano Convex Lenses
  • 1x big Plano Convex Lenses
  • ADAFRUIT NEOPIXEL 1m (30 LEDs) - 1 used
  • custom build black cardboard box


I was interested, how the different plano convex lenses would create different light beams in different distances to LEDs. Therefor I needed to build a custom box (1mx10cmx10cm) to be able to catch the light beam. The plano convex lenses were attached to a cardboard surface (10cm x 10 cm) and they were free to move in different distance inside of the box.









Conclusion
Having only around 1 cm distance between the plano convex lens and the LED – the light beam is strongest.

Building a circuit for 4 Adafruit Neopixel LED strips with Joca

13 | 11 | 18
4 Adafruit Neopixel LED strips
To be able to build an infrastructure of controlling 4 Adafruit Neopixel LED strips we needed to extend the breadboards and do some new wiring.






// NeoPixel Ring simple sketch (c) 2013 Shae Erisson
// released under the GPLv3 license to match the rest of the AdaFruit NeoPixel library

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
  #include <avr/power.h>
#endif

// Which pin on the Arduino is connected to the NeoPixels?
// On a Trinket or Gemma we suggest changing this to 1
#define PIN_A            5
#define NUMPIXELS_A      30

#define PIN_B            6
#define NUMPIXELS_B      30

#define PIN_C            9
#define NUMPIXELS_C      30

#define PIN_D            10
#define NUMPIXELS_D      30



// When we setup the NeoPixel library, we tell it how many pixels, and which pin to use to send signals.
// Note that for older NeoPixel strips you might need to change the third parameter--see the strandtest
// example for more information on possible values.
Adafruit_NeoPixel A = Adafruit_NeoPixel(NUMPIXELS_A, PIN_A, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel B = Adafruit_NeoPixel(NUMPIXELS_B, PIN_B, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel C = Adafruit_NeoPixel(NUMPIXELS_C, PIN_C, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel D = Adafruit_NeoPixel(NUMPIXELS_D, PIN_D, NEO_GRB + NEO_KHZ800);

int delayval = 500; // delay for half a second

void setup() {
  // This is for Trinket 5V 16MHz, you can remove these three lines if you are not using a Trinket
#if defined (__AVR_ATtiny85__)
  if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
#endif
  // End of trinket special code

  A.begin(); // This initializes the NeoPixel library.
  B.begin(); // This initializes the NeoPixel library.
  C.begin(); // This initializes the NeoPixel library.
  D.begin(); // This initializes the NeoPixel library.
}

void loop() {

  // For a set of NeoPixels the first NeoPixel is 0, second is 1, all the way up to the count of pixels minus one.

  for(int i=0;i<NUMPIXELS_A;i++){

    // pixels.Color takes RGB values, from 0,0,0 up to 255,255,255
    A.setPixelColor(i, A.Color(0,255,255)); // Moderately bright green color.
    A.show(); // This sends the updated pixel color to the hardware.

    // pixels.Color takes RGB values, from 0,0,0 up to 255,255,255
    B.setPixelColor(i, B.Color(0,255,255)); // Moderately bright green color.
    B.show(); // This sends the updated pixel color to the hardware.

    // pixels.Color takes RGB values, from 0,0,0 up to 255,255,255
    C.setPixelColor(i, C.Color(0,255,255)); // Moderately bright green color.
    C.show(); // This sends the updated pixel color to the hardware.

    // pixels.Color takes RGB values, from 0,0,0 up to 255,255,255
    D.setPixelColor(i, D.Color(0,255,255)); // Moderately bright green color.
    D.show(); // This sends the updated pixel color to the hardware.

    delay(delayval); // Delay for a period of time (in milliseconds).
  }

}


#include <Adafruit_NeoPixel.h>
#define PIN 8
#define NUM_LEDS 30

#define PIN_A            5
#define NUM_LEDS_A      30

#define PIN_B            6
#define NUM_LEDS_B      30

#define PIN_C            9
#define NUM_LEDS_C      30

#define PIN_D            10
#define NUM_LEDS_D      30

// 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 A = Adafruit_NeoPixel(NUM_LEDS_A, PIN_A, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel B = Adafruit_NeoPixel(NUM_LEDS_B, PIN_B, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel C = Adafruit_NeoPixel(NUM_LEDS_C, PIN_C, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel D = Adafruit_NeoPixel(NUM_LEDS_D, PIN_D, NEO_GRB + NEO_KHZ800);

void setup() {
  A.begin();
  A.show(); // Initialize all pixels to 'off'
  //B.begin();
  //B.show(); // Initialize all pixels to 'off'
  //C.begin();
  //C.show(); // Initialize all pixels to 'off'
  D.begin();
  D.show(); // Initialize all pixels to 'off
}

void loop() {
  CylonBounce(0xff, 0xff, 0xff, 4, 150, 50);
}

void CylonBounce(byte red, byte green, byte blue, int EyeSize, int SpeedDelay, int ReturnDelay){

  for(int i = 0; i < NUM_LEDS-EyeSize-2; i++) {
    setAll(0,0,0);
    setPixel(i, red/10, green/10, blue/10);
    for(int j = 1; j <= EyeSize; j++) {
      setPixel(i+j, red, green, blue); 
    }
    setPixel(i+EyeSize+1, red/10, green/10, blue/10);
    showStrip();
    delay(SpeedDelay);
  }

  delay(ReturnDelay);

  for(int i = NUM_LEDS-EyeSize-2; i > 0; i--) {
    setAll(0,0,0);
    setPixel(i, red/10, green/10, blue/10);
    for(int j = 1; j <= EyeSize; j++) {
      setPixel(i+j, red, green, blue); 
    }
    setPixel(i+EyeSize+1, red/10, green/10, blue/10);
    showStrip();
    delay(SpeedDelay);
  }
  
  delay(ReturnDelay);
}
void showStrip() {
 #ifdef ADAFRUIT_NEOPIXEL_H 
   // NeoPixel
   A.show();
   B.show();
   C.show();
   D.show();
 #endif
 #ifndef ADAFRUIT_NEOPIXEL_H
   // FastLED
   FastLED.show();
 #endif
}

void setPixel(int Pixel, byte red, byte green, byte blue) {
 #ifdef ADAFRUIT_NEOPIXEL_H 
   // NeoPixel
   A.setPixelColor(Pixel, A.Color(red, green, blue));
   B.setPixelColor(Pixel, A.Color(red, green, blue));
   C.setPixelColor(Pixel, A.Color(red, green, blue));
   D.setPixelColor(Pixel, A.Color(red, green, blue));
   
 #endif
 #ifndef ADAFRUIT_NEOPIXEL_H 
   // FastLED
   leds[Pixel].r = red;
   leds[Pixel].g = green;
   leds[Pixel].b = blue;
 #endif
}

void setAll(byte red, byte green, byte blue) {
  for(int i = 0; i < NUM_LEDS; i++ ) {
    setPixel(i, red, green, blue); 
  }
  showStrip();
}


#include <Adafruit_NeoPixel.h>
#define PIN 8
#define NUM_LEDS 30

#define PIN_A            5
#define NUM_LEDS_A      30

#define PIN_B            6
#define NUM_LEDS_B      30

#define PIN_C            9
#define NUM_LEDS_C      30

#define PIN_D            10
#define NUM_LEDS_D      30
// 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 A = Adafruit_NeoPixel(NUM_LEDS_A, PIN_A, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel B = Adafruit_NeoPixel(NUM_LEDS_B, PIN_B, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel C = Adafruit_NeoPixel(NUM_LEDS_C, PIN_C, NEO_GRB + NEO_KHZ800);
Adafruit_NeoPixel D = Adafruit_NeoPixel(NUM_LEDS_D, PIN_D, NEO_GRB + NEO_KHZ800);

void setup() {
  A.begin();
  A.show(); // Initialize all pixels to 'off'
  B.begin();
  B.show(); // Initialize all pixels to 'off'
  C.begin();
  C.show(); // Initialize all pixels to 'off'
  D.begin();
  D.show(); // Initialize all pixels to 'off'
}

void loop() { 
  // Slower:
  // Strobe(0xff, 0x77, 0x00, 10, 100, 1000);
  // Fast:
  Strobe(0xff, 0xff, 0xff, 10, 1000, 1);
}

void Strobe(byte red, byte green, byte blue, int StrobeCount, int FlashDelay, int EndPause){
  for(int j = 0; j < StrobeCount; j++) {
    setAll(red,green,blue);
    showStrip();
    delay(FlashDelay);
    setAll(0,0,0);
    showStrip();
    delay(FlashDelay);
  }
 
 delay(EndPause);
}
void showStrip() {
 #ifdef ADAFRUIT_NEOPIXEL_H 
   // NeoPixel
   A.show();
   B.show();
   C.show();
   D.show();
   
 #endif
 #ifndef ADAFRUIT_NEOPIXEL_H
   // FastLED
   FastLED.show();
 #endif
}

void setPixel(int Pixel, byte red, byte green, byte blue) {
 #ifdef ADAFRUIT_NEOPIXEL_H 
   // NeoPixel
   A.setPixelColor(Pixel, A.Color(red, green, blue));
   B.setPixelColor(Pixel, A.Color(red, green, blue));
   C.setPixelColor(Pixel, A.Color(red, green, blue));
   D.setPixelColor(Pixel, A.Color(red, green, blue));
   
 #endif
 #ifndef ADAFRUIT_NEOPIXEL_H 
   // FastLED
   leds[Pixel].r = red;
   leds[Pixel].g = green;
   leds[Pixel].b = blue;
 #endif
}

void setAll(byte red, byte green, byte blue) {
  for(int i = 0; i < NUM_LEDS; i++ ) {
    setPixel(i, red, green, blue); 
  }
  showStrip();
}



Building a software setup to connect live MadMapper input to 4 Adafruit Neopixel LED strips with Javier

19 | 11 | 18
Live MadMapper Input to Arduino


controlling each pixel individually
the length of them through a slider inside of Madmapper
setup
osc signal from mad mapper through processing and the processing is connected to arduino
Processing
MadmapperToProcessingLEDs

//WdKA - Interaction Station//
//2017////////////////////////

import processing.serial.*;

//Specify the number of Wekinator outputs 
final int number_wekinator_outputs = 4; 

//Current values in a [0.0 - 1.0] range
float current_values[];
//boolean current_values[];

//Class that parses the data received from Wekinator
WekinatorParser parser;

//OSC port used by Wekinator
final int oscPort = 7001;

//Printing some info in the console if true
final boolean verbose = false;

//Set to false to disable easing (smoothing) effect in the animations
final boolean usingEasing = false;

//Amount of easing
final float easing = 0.05;

//Serial port for communicating with Arduino
Serial myPort;  


void setup() {
  size(500, 500);
  frameRate(60);

  //Receiving data
  parser = new WekinatorParser(number_wekinator_outputs,oscPort,usingEasing,easing,verbose);
  
  //Serial connection
  printArray(Serial.list());
  // Change the index (0 in the example) to match your 
   String portName = Serial.list()[2];
  myPort = new Serial(this, portName, 9600);

   println(portName+" selected");
 
}

void draw() {
  background(235);
  
  current_values = parser.calculateValues();

  //Sending values to Arduno
  sendValuesToArduino();

}


void sendValuesToArduino(){
// int servoAngleRange = 180;
 String strSent = "";
 
 for(int i = 0; i < number_wekinator_outputs; i++){
   strSent += str(int(current_values[i]*100));
   
   if(i != (number_wekinator_outputs-1) ){
      strSent += ",";
   }
 }
 strSent += "\r";
 
 myPort.write(strSent);
 if(verbose){
   println(strSent);
  }
}

/*
//Arduino code

//WdKA - Interaction Station//
//2017////////////////////////

#include <Servo.h> 
 
//we define the number of servo motors that we will used
const int numServos = 3;

//The first servo motor is connected to this pin.
//Connect the rest of the servo motors to the next pins (Digital Pins 6 & 7)
const int initialServoPin = 5; 

Servo myServos[numServos];  
int servoValues[numServos];

void setup() 
{ 
  //Initialize Serial comunication
  Serial.begin(9600);

  //For each one of the servo motros
  for(int i = 0;i < numServos;++i){
    //attaches the pin to the servo object
    myServos[i].attach(i+initialServoPin); 
    //Initialize the servo motors to the position 0
    myServos[i].write(0); 
    servoValues[i] = 0;    
  }
  
} 

void loop() { 

  
  // if there's any serial available, read it:
  while (Serial.available() > 0) {

    for(int i = 0;i < numServos;++i){
      //attaches the pin to the servo object 
      servoValues[i] = Serial.parseInt();

      //contrain the values between 0 and 180 for the servo motors
      servoValues[i] = constrain(servoValues[i], 0, 180);      
    }

    // end of the line
    if (Serial.read() == '\r') {
       //we move the servos
       for(int i = 0;i < numServos;++i){
         myServos[i].write(servoValues[i]); 
       }
       
    }else{
      return;
    }
  }

}

*/


WekinatorParser

import oscP5.*;

//It receives the Wekinator outputs through OSC
class WekinatorParser {


  OscP5 oscP5;
  
//  float target_outputs[];
 // float current_outputs[];  
  boolean target_outputs[];
  float current_outputs[];  
  boolean usingEasing = true;
  boolean verbose = false;
  float easing = 0.0;
  int number_wekinator_outputs = 4;
  int oscPort = 0;

  WekinatorParser(int number_wekinator_outputs,int oscPort,boolean usingEasing,float easing,boolean verbose){
    this.number_wekinator_outputs = number_wekinator_outputs;
    this.oscPort = oscPort;
    this.usingEasing = usingEasing;
    this.easing = easing;
    this.verbose = verbose;
  
//    target_outputs = new float[number_wekinator_outputs];
  //  current_outputs = new float[number_wekinator_outputs];
    target_outputs = new boolean[number_wekinator_outputs];
    current_outputs = new float[number_wekinator_outputs];
  
    for(int i = 0; i < number_wekinator_outputs;i++){
//        target_outputs[i] = 0.0;          
        target_outputs[i] = false;          
    }  
    oscP5 = new OscP5(this,oscPort);  
  }
  
  //It returns the values received from Wekinator. If usingEasing is true, there is some smoothing effect
  float[] calculateValues() {
//  boolean[] calculateValues() {
    
    /*for (int i = 0; i < number_wekinator_outputs; i++) {
      if(usingEasing){
        current_outputs[i] += (target_outputs[i] - current_outputs[i]) * easing;
      }else{
        current_outputs[i] = target_outputs[i];
      }
  }  */
  
    return current_outputs;
  
  }

  void oscEvent(OscMessage theOscMessage) {
    
    if(verbose){
      theOscMessage.print();  
      println(" typetag: "+theOscMessage.typetag());
      println(" addrPattern: "+theOscMessage.addrPattern());
      println(" address: "+theOscMessage.address());
    }
    
    if (theOscMessage.addrPattern().equals("/red")) {
      Object[] objects = theOscMessage.arguments();
          if(verbose){
           //println(objects.length);
          }
        println(theOscMessage.get(0).floatValue());
          current_outputs[0] = theOscMessage.get(0).floatValue();

    }else if (theOscMessage.addrPattern().equals("/green")) {
      Object[] objects = theOscMessage.arguments();
          if(verbose){
           //println(objects.length);
          }
        println(theOscMessage.get(0).floatValue());
          current_outputs[1] = theOscMessage.get(0).floatValue();

    }else if (theOscMessage.addrPattern().equals("/blue")) {
      Object[] objects = theOscMessage.arguments();
          if(verbose){
           //println(objects.length);
          }
        println(theOscMessage.get(0).floatValue());
          current_outputs[2] = theOscMessage.get(0).floatValue();

    }else if (theOscMessage.addrPattern().equals("/opacity")) {
      Object[] objects = theOscMessage.arguments();
          if(verbose){
           //println(objects.length);
          }
        println(theOscMessage.get(0).floatValue());
          current_outputs[3] = theOscMessage.get(0).floatValue();

    }
  }

}


ProcessingtoArduino

import oscP5.*;

//It receives the Wekinator outputs through OSC
class WekinatorParser {


  OscP5 oscP5;
  
//  float target_outputs[];
 // float current_outputs[];  
  boolean target_outputs[];
  float current_outputs[];  
  boolean usingEasing = true;
  boolean verbose = false;
  float easing = 0.0;
  int number_wekinator_outputs = 4;
  int oscPort = 0;

  WekinatorParser(int number_wekinator_outputs,int oscPort,boolean usingEasing,float easing,boolean verbose){
    this.number_wekinator_outputs = number_wekinator_outputs;
    this.oscPort = oscPort;
    this.usingEasing = usingEasing;
    this.easing = easing;
    this.verbose = verbose;
  
//    target_outputs = new float[number_wekinator_outputs];
  //  current_outputs = new float[number_wekinator_outputs];
    target_outputs = new boolean[number_wekinator_outputs];
    current_outputs = new float[number_wekinator_outputs];
  
    for(int i = 0; i < number_wekinator_outputs;i++){
//        target_outputs[i] = 0.0;          
        target_outputs[i] = false;          
    }  
    oscP5 = new OscP5(this,oscPort);  
  }
  
  //It returns the values received from Wekinator. If usingEasing is true, there is some smoothing effect
  float[] calculateValues() {
//  boolean[] calculateValues() {
    
    /*for (int i = 0; i < number_wekinator_outputs; i++) {
      if(usingEasing){
        current_outputs[i] += (target_outputs[i] - current_outputs[i]) * easing;
      }else{
        current_outputs[i] = target_outputs[i];
      }
  }  */
  
    return current_outputs;
  
  }

  void oscEvent(OscMessage theOscMessage) {
    
    if(verbose){
      theOscMessage.print();  
      println(" typetag: "+theOscMessage.typetag());
      println(" addrPattern: "+theOscMessage.addrPattern());
      println(" address: "+theOscMessage.address());
    }
    
    if (theOscMessage.addrPattern().equals("/red")) {
      Object[] objects = theOscMessage.arguments();
          if(verbose){
           //println(objects.length);
          }
        println(theOscMessage.get(0).floatValue());
          current_outputs[0] = theOscMessage.get(0).floatValue();

    }else if (theOscMessage.addrPattern().equals("/green")) {
      Object[] objects = theOscMessage.arguments();
          if(verbose){
           //println(objects.length);
          }
        println(theOscMessage.get(0).floatValue());
          current_outputs[1] = theOscMessage.get(0).floatValue();

    }else if (theOscMessage.addrPattern().equals("/blue")) {
      Object[] objects = theOscMessage.arguments();
          if(verbose){
           //println(objects.length);
          }
        println(theOscMessage.get(0).floatValue());
          current_outputs[2] = theOscMessage.get(0).floatValue();

    }else if (theOscMessage.addrPattern().equals("/opacity")) {
      Object[] objects = theOscMessage.arguments();
          if(verbose){
           //println(objects.length);
          }
        println(theOscMessage.get(0).floatValue());
          current_outputs[3] = theOscMessage.get(0).floatValue();

    }
  }

}

Building a spatial setup for 4 Adafruit Neopixel LED strips

20 | 11 | 18
Lab setup 1



conclusion
no light beam effect

Experimenting with Jem Com­pact Hazer Pro (haze machine) + plano convex lenses + 4 Adafruit Neopixel LED strips

21 | 11 | 18



conclusion
light beam became visible through the haze

Experimenting with Jem Com­pact Hazer Pro (haze machine) + opaque acrylic sheets + 4 Adafruit Neopixel LED strips

27 | 11 | 18


conclusion

the brightness of the LED is not strong enough to be able to create a linear light beam with acrylic sheet in space

Diving into PureData 1

20 | 12 | 18

Goal is to create sound generated animations for the LED strip with 144 px on 1m

Conclusion

GEM library needs to be better installed on my computer

Experimenting of creating a strong light beam in combination with movable 3D printed lens holder for adjusting the distance between the light source and lens

11 | 01 | 19

LED Collimator 15 degree for 3W Star type Power LED

Conclusion
The light source was not strong enough

Diving into PureData 2

14 | 01 | 19

Goal is to create sound generated animations for the LED strip with 144 px on 1m

Diving into PureData 3

20 | 01 | 19

Analysing partials – Fourier Analysis

Tutorial 1
Tutorial 2

Fourier transformation
It divides the entire frequency spectrum into parts of equal size and determines the amplitude and phase for each part. One could in turn reconstruct the original signal from these values. The derivation of the component parts is called analysis; the reconstruction is called resynthesis. You can realize this using the objects "rfft~" and "irfft~".

Output = Shows the power of different frequency components that make up that sound. Each of the number represents an amplitude of a particular band of frequencies.

Diving into PureData 4

28 | 01 | 19

Loading audio into PD

Tutorial


sequencer tbb
starting from left and moving towards right

Experimenting with different LED lights for creating a strong blue light beam

31 | 01 | 19



Conclusion
Fresnel lens seems to be a good option to investigate in

Building a new arduino circuit board for Adafruit NeoPixel Digital RGBW LED Strip - Black PCB 144 LED/m - 1m

01 | 02 | 19

Tutorial


Arduino basic RGBW Script

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
  #include <avr/power.h>
#endif

#define PIN 6

#define NUM_LEDS 60

#define BRIGHTNESS 50

Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_GRBW + NEO_KHZ800);

byte neopix_gamma[] = {
    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,
    1,  1,  1,  1,  1,  1,  1,  1,  1,  2,  2,  2,  2,  2,  2,  2,
    2,  3,  3,  3,  3,  3,  3,  3,  4,  4,  4,  4,  4,  5,  5,  5,
    5,  6,  6,  6,  6,  7,  7,  7,  7,  8,  8,  8,  9,  9,  9, 10,
   10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 14, 14, 15, 15, 16, 16,
   17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 24, 24, 25,
   25, 26, 27, 27, 28, 29, 29, 30, 31, 32, 32, 33, 34, 35, 35, 36,
   37, 38, 39, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 50,
   51, 52, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 66, 67, 68,
   69, 70, 72, 73, 74, 75, 77, 78, 79, 81, 82, 83, 85, 86, 87, 89,
   90, 92, 93, 95, 96, 98, 99,101,102,104,105,107,109,110,112,114,
  115,117,119,120,122,124,126,127,129,131,133,135,137,138,140,142,
  144,146,148,150,152,154,156,158,160,162,164,167,169,171,173,175,
  177,180,182,184,186,189,191,193,196,198,200,203,205,208,210,213,
  215,218,220,223,225,228,231,233,236,239,241,244,247,249,252,255 };


void setup() {
  // This is for Trinket 5V 16MHz, you can remove these three lines if you are not using a Trinket
  #if defined (__AVR_ATtiny85__)
    if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
  #endif
  // End of trinket special code
  strip.setBrightness(BRIGHTNESS);
  strip.begin();
  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
  colorWipe(strip.Color(0, 0, 0, 255), 50); // White

  whiteOverRainbow(20,75,5);  

  pulseWhite(5); 

  // fullWhite();
  // delay(2000);

  rainbowFade2White(3,3,1);


}

// 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 pulseWhite(uint8_t wait) {
  for(int j = 0; j < 256 ; j++){
      for(uint16_t i=0; i<strip.numPixels(); i++) {
          strip.setPixelColor(i, strip.Color(0,0,0, neopix_gamma[j] ) );
        }
        delay(wait);
        strip.show();
      }

  for(int j = 255; j >= 0 ; j--){
      for(uint16_t i=0; i<strip.numPixels(); i++) {
          strip.setPixelColor(i, strip.Color(0,0,0, neopix_gamma[j] ) );
        }
        delay(wait);
        strip.show();
      }
}


void rainbowFade2White(uint8_t wait, int rainbowLoops, int whiteLoops) {
  float fadeMax = 100.0;
  int fadeVal = 0;
  uint32_t wheelVal;
  int redVal, greenVal, blueVal;

  for(int k = 0 ; k < rainbowLoops ; k ++){
    
    for(int j=0; j<256; j++) { // 5 cycles of all colors on wheel

      for(int i=0; i< strip.numPixels(); i++) {

        wheelVal = Wheel(((i * 256 / strip.numPixels()) + j) & 255);

        redVal = red(wheelVal) * float(fadeVal/fadeMax);
        greenVal = green(wheelVal) * float(fadeVal/fadeMax);
        blueVal = blue(wheelVal) * float(fadeVal/fadeMax);

        strip.setPixelColor( i, strip.Color( redVal, greenVal, blueVal ) );

      }

      //First loop, fade in!
      if(k == 0 && fadeVal < fadeMax-1) {
          fadeVal++;
      }

      //Last loop, fade out!
      else if(k == rainbowLoops - 1 && j > 255 - fadeMax ){
          fadeVal--;
      }

        strip.show();
        delay(wait);
    }
  
  }



  delay(500);


  for(int k = 0 ; k < whiteLoops ; k ++){

    for(int j = 0; j < 256 ; j++){

        for(uint16_t i=0; i < strip.numPixels(); i++) {
            strip.setPixelColor(i, strip.Color(0,0,0, neopix_gamma[j] ) );
          }
          strip.show();
        }

        delay(2000);
    for(int j = 255; j >= 0 ; j--){

        for(uint16_t i=0; i < strip.numPixels(); i++) {
            strip.setPixelColor(i, strip.Color(0,0,0, neopix_gamma[j] ) );
          }
          strip.show();
        }
  }

  delay(500);


}

void whiteOverRainbow(uint8_t wait, uint8_t whiteSpeed, uint8_t whiteLength ) {
  
  if(whiteLength >= strip.numPixels()) whiteLength = strip.numPixels() - 1;

  int head = whiteLength - 1;
  int tail = 0;

  int loops = 3;
  int loopNum = 0;

  static unsigned long lastTime = 0;


  while(true){
    for(int j=0; j<256; j++) {
      for(uint16_t i=0; i<strip.numPixels(); i++) {
        if((i >= tail && i <= head) || (tail > head && i >= tail) || (tail > head && i <= head) ){
          strip.setPixelColor(i, strip.Color(0,0,0, 255 ) );
        }
        else{
          strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
        }
        
      }

      if(millis() - lastTime > whiteSpeed) {
        head++;
        tail++;
        if(head == strip.numPixels()){
          loopNum++;
        }
        lastTime = millis();
      }

      if(loopNum == loops) return;
    
      head%=strip.numPixels();
      tail%=strip.numPixels();
        strip.show();
        delay(wait);
    }
  }
  
}
void fullWhite() {
  
    for(uint16_t i=0; i<strip.numPixels(); i++) {
        strip.setPixelColor(i, strip.Color(0,0,0, 255 ) );
    }
      strip.show();
}


// 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);
  }
}

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);
  }
}

// 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 strip.Color(255 - WheelPos * 3, 0, WheelPos * 3,0);
  }
  if(WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3,0);
  }
  WheelPos -= 170;
  return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0,0);
}

uint8_t red(uint32_t c) {
  return (c >> 16);
}
uint8_t green(uint32_t c) {
  return (c >> 8);
}
uint8_t blue(uint32_t c) {
  return (c);
}



Conclusion
Goal is to solder together 4m LED strip for creating the setup for the circular frame

Diving into PureData 5

04 | 02 | 19

Loading audio into PD

Tutorial


Diving into PureData 6

04 | 02 | 19

Assigning the frequency to amplitude to receive 0,1 signals

| Tutorial

This patch will be extended with several frequency level for triggering the animation libraries in Arduino through ASCII values

Diving into PureData 7

07 | 02 | 19

Transmitting ASCII values from PD to Arduino to be able to trigger the RGBW neopixel strip

Arduino Script

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
  #include <avr/power.h>
#endif

#define PIN 6

#define NUM_LEDS 144

#define BRIGHTNESS 50

Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_GRBW + NEO_KHZ800);

byte neopix_gamma[] = {
    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,
    1,  1,  1,  1,  1,  1,  1,  1,  1,  2,  2,  2,  2,  2,  2,  2,
    2,  3,  3,  3,  3,  3,  3,  3,  4,  4,  4,  4,  4,  5,  5,  5,
    5,  6,  6,  6,  6,  7,  7,  7,  7,  8,  8,  8,  9,  9,  9, 10,
   10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 14, 14, 15, 15, 16, 16,
   17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 24, 24, 25,
   25, 26, 27, 27, 28, 29, 29, 30, 31, 32, 32, 33, 34, 35, 35, 36,
   37, 38, 39, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 50,
   51, 52, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 66, 67, 68,
   69, 70, 72, 73, 74, 75, 77, 78, 79, 81, 82, 83, 85, 86, 87, 89,
   90, 92, 93, 95, 96, 98, 99,101,102,104,105,107,109,110,112,114,
  115,117,119,120,122,124,126,127,129,131,133,135,137,138,140,142,
  144,146,148,150,152,154,156,158,160,162,164,167,169,171,173,175,
  177,180,182,184,186,189,191,193,196,198,200,203,205,208,210,213,
  215,218,220,223,225,228,231,233,236,239,241,244,247,249,252,255 };


const int ledPinRed = 13;// the pins that the LEDs are attached to
const int ledPinGreen = 7;
int incomingByte;      // a variable to read incoming serial data into



void setup() {
  // This is for Trinket 5V 16MHz, you can remove these three lines if you are not using a Trinket
  #if defined (__AVR_ATtiny85__)
    if (F_CPU == 16000000) clock_prescale_set(clock_div_1);
  #endif
  // End of trinket special code
  strip.setBrightness(BRIGHTNESS);
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'

    // initialize serial communication:
  Serial.begin(9600);
  // initialize the LED pins as an output:
  pinMode(ledPinRed, OUTPUT);
  pinMode(ledPinGreen, OUTPUT);

}

void loop() {

  // see if there's incoming serial data:
  if (Serial.available() > 0) {
    // read the oldest byte in the serial buffer:
    incomingByte = Serial.read();
    // if it's a capital H (ASCII 72), turn on the red LED:

    if (incomingByte == 'H') {
      digitalWrite(ledPinRed, HIGH);
    }
    // if it's an L (ASCII 76) turn off the red LED:
    if (incomingByte == 'L') {
      digitalWrite(ledPinRed, LOW);
    }
    // if it's a capital M (ASCII 77), turn on the green LED:
    if (incomingByte == 'M') {
//      digitalWrite(ledPinGreen, HIGH);
  colorWipe(strip.Color(255, 0, 0), 50); // Red

    }
    // if it's a capital N (ASCII 78), turn off the green LED:
    if (incomingByte == 'N') {
//      digitalWrite(ledPinGreen, LOW);
  colorWipe(strip.Color(0, 255, 0), 50); // Green

    }
  }

  // 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
//  colorWipe(strip.Color(0, 0, 0, 255), 50); // White

 // whiteOverRainbow(20,75,5);  

 // pulseWhite(5); 

  // fullWhite();
  // delay(2000);

  //rainbowFade2White(3,3,1);


}

// 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 pulseWhite(uint8_t wait) {
  for(int j = 0; j < 256 ; j++){
      for(uint16_t i=0; i<strip.numPixels(); i++) {
          strip.setPixelColor(i, strip.Color(0,0,0, neopix_gamma[j] ) );
        }
        delay(wait);
        strip.show();
      }

  for(int j = 255; j >= 0 ; j--){
      for(uint16_t i=0; i<strip.numPixels(); i++) {
          strip.setPixelColor(i, strip.Color(0,0,0, neopix_gamma[j] ) );
        }
        delay(wait);
        strip.show();
      }
}


void rainbowFade2White(uint8_t wait, int rainbowLoops, int whiteLoops) {
  float fadeMax = 100.0;
  int fadeVal = 0;
  uint32_t wheelVal;
  int redVal, greenVal, blueVal;

  for(int k = 0 ; k < rainbowLoops ; k ++){
    
    for(int j=0; j<256; j++) { // 5 cycles of all colors on wheel

      for(int i=0; i< strip.numPixels(); i++) {

        wheelVal = Wheel(((i * 256 / strip.numPixels()) + j) & 255);

        redVal = red(wheelVal) * float(fadeVal/fadeMax);
        greenVal = green(wheelVal) * float(fadeVal/fadeMax);
        blueVal = blue(wheelVal) * float(fadeVal/fadeMax);

        strip.setPixelColor( i, strip.Color( redVal, greenVal, blueVal ) );

      }

      //First loop, fade in!
      if(k == 0 && fadeVal < fadeMax-1) {
          fadeVal++;
      }

      //Last loop, fade out!
      else if(k == rainbowLoops - 1 && j > 255 - fadeMax ){
          fadeVal--;
      }

        strip.show();
        delay(wait);
    }
  
  }



  delay(500);


  for(int k = 0 ; k < whiteLoops ; k ++){

    for(int j = 0; j < 256 ; j++){

        for(uint16_t i=0; i < strip.numPixels(); i++) {
            strip.setPixelColor(i, strip.Color(0,0,0, neopix_gamma[j] ) );
          }
          strip.show();
        }

        delay(2000);
    for(int j = 255; j >= 0 ; j--){

        for(uint16_t i=0; i < strip.numPixels(); i++) {
            strip.setPixelColor(i, strip.Color(0,0,0, neopix_gamma[j] ) );
          }
          strip.show();
        }
  }

  delay(500);


}
/*
void whiteOverRainbow(uint8_t wait, uint8_t whiteSpeed, uint8_t whiteLength ) {
  
  if(whiteLength >= strip.numPixels()) whiteLength = strip.numPixels() - 1;

  int head = whiteLength - 1;
  int tail = 0;

  int loops = 3;
  int loopNum = 0;

  static unsigned long lastTime = 0;


  while(true){
    for(int j=0; j<256; j++) {
      for(uint16_t i=0; i<strip.numPixels(); i++) {
        if((i >= tail && i <= head) || (tail > head && i >= tail) || (tail > head && i <= head) ){
          strip.setPixelColor(i, strip.Color(0,0,0, 255 ) );
        }
        else{
          strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
        }
        
      }

      if(millis() - lastTime > whiteSpeed) {
        head++;
        tail++;
        if(head == strip.numPixels()){
          loopNum++;
        }
        lastTime = millis();
      }

      if(loopNum == loops) return;
    
      head%=strip.numPixels();
      tail%=strip.numPixels();
        strip.show();
        delay(wait);
    }
  }
  
}
*/
void fullWhite() {
  
    for(uint16_t i=0; i<strip.numPixels(); i++) {
        strip.setPixelColor(i, strip.Color(0,0,0, 255 ) );
    }
      strip.show();
}


// 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);
  }
}

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);
  }
}

// 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 strip.Color(255 - WheelPos * 3, 0, WheelPos * 3,0);
  }
  if(WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3,0);
  }
  WheelPos -= 170;
  return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0,0);
}

uint8_t red(uint32_t c) {
  return (c >> 16);
}
uint8_t green(uint32_t c) {
  return (c >> 8);
}
uint8_t blue(uint32_t c) {
  return (c);
}



Building a custom made LED frame to direct light

03 | 03 | 19

Creating non-material spaces

Diving into Arduino Adafruit Neopixel programming

25 | 03 | 19

Arduino Script

Learning about Millis - time protocol

Colour fading into each other

#include <Adafruit_NeoPixel.h>
 

#define PIN_STRIP_1 6
#define PIN_STRIP_2 5

#define NUM_LEDS 144

#define BRIGHTNESS 255

int currentExpansion = 0;
int maxExpansion = 14;
int interval = maxExpansion*2;

int currentStrip1led = (maxExpansion/2) + 1;
int currentStrip2led = (maxExpansion/2) + 1;
boolean reverseAnimation = false;

  
int currentAnimationPlaying = 0;



//int currentStrip1led = 0;
//int currentStrip2led = NUM_LEDS-1;

byte reds[] = {0x00,  0x00, 0xff,0x00 };
byte greens[] = {0xff,0x00, 0x00,0x00  }; 
byte blues[] = {0xff,0xff, 0xff,0x00 };
byte whites[] = {0x00, 0x00, 0x50,0xff};

int indexColorCircle = 0;

Adafruit_NeoPixel strip1 = Adafruit_NeoPixel(NUM_LEDS, PIN_STRIP_1, NEO_GRBW + NEO_KHZ800);
Adafruit_NeoPixel strip2 = Adafruit_NeoPixel(NUM_LEDS, PIN_STRIP_2, NEO_GRBW + NEO_KHZ800);



// ________

//different intervals for each LED
int startingTimeAnimation1 = 5000;
int startingTimeAnimation2 = 15000;
int startingTimeAnimation3 = 37000;


unsigned long initialTimeAnimation=0;

void colorWipe1(uint32_t c, uint8_t wait);
void colorWipe2(uint32_t c, uint8_t wait);
// ________




byte neopix_gamma[] = {
    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,
    1,  1,  1,  1,  1,  1,  1,  1,  1,  2,  2,  2,  2,  2,  2,  2,
    2,  3,  3,  3,  3,  3,  3,  3,  4,  4,  4,  4,  4,  5,  5,  5,
    5,  6,  6,  6,  6,  7,  7,  7,  7,  8,  8,  8,  9,  9,  9, 10,
   10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 14, 14, 15, 15, 16, 16,
   17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 24, 24, 25,
   25, 26, 27, 27, 28, 29, 29, 30, 31, 32, 32, 33, 34, 35, 35, 36,
   37, 38, 39, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 50,
   51, 52, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 66, 67, 68,
   69, 70, 72, 73, 74, 75, 77, 78, 79, 81, 82, 83, 85, 86, 87, 89,
   90, 92, 93, 95, 96, 98, 99,101,102,104,105,107,109,110,112,114,
  115,117,119,120,122,124,126,127,129,131,133,135,137,138,140,142,
  144,146,148,150,152,154,156,158,160,162,164,167,169,171,173,175,
  177,180,182,184,186,189,191,193,196,198,200,203,205,208,210,213,
  215,218,220,223,225,228,231,233,236,239,241,244,247,249,252,255 };


void setup() {
  
  // End of trinket special code
  strip1.setBrightness(BRIGHTNESS);
  strip1.begin();
  strip1.show(); // Initialize all pixels to 'off'
initialTimeAnimation =millis();

 strip2.setBrightness(BRIGHTNESS);
  strip2.begin();
  strip2.show(); // Initialize all pixels to 'off'
initialTimeAnimation =millis();


}

// -----



// -----
void loop() {


   unsigned long currentMillis = millis();
  unsigned long diffMillis = currentMillis - initialTimeAnimation;

//reverse order first if next else if


   if (diffMillis >=  startingTimeAnimation3 ){
    if( currentAnimationPlaying != 3){
      clearAll();
    }
        currentAnimationPlaying = 3;

  }
 else  if (diffMillis >=  startingTimeAnimation2 ){
    if( currentAnimationPlaying != 2){
      clearAll();
    }
          currentAnimationPlaying = 2;
  }
  else if (diffMillis >=  startingTimeAnimation1 ){
    if( currentAnimationPlaying != 1){
      clearAll();
    }
    currentAnimationPlaying = 1;
  }


 if( currentAnimationPlaying == 3){
      StrobeBgColor(0, 0, 0, 255,0,0,255,0, 10, 10, 1);

 }else if( currentAnimationPlaying == 2){
   
     setCircleNoLoop(reds[indexColorCircle],greens[indexColorCircle],blues[indexColorCircle],whites[indexColorCircle],100);

 }else if( currentAnimationPlaying == 1){
        SnowSparkle(0x00, 0x00, 0x00, 0x00, 1000, random(100,1000));    
 }

//  setCircleNoLoop(reds[indexColorCircle],greens[indexColorCircle],blues[indexColorCircle],whites[indexColorCircle],100);

  // SnowSparkle(0x00, 0x00, 0x5, 0x00, 1000, random(100,1000));

  // openingUp(reds[indexColorCircle],greens[indexColorCircle],blues[indexColorCircle],whites[indexColorCircle],15);

 // StrobeBgColor(0, 0, 0, 255,0,0,255,0, 10, 10, 1);


}

void clearAll(){
        //Clear them all
      for(int i = 0; i <NUM_LEDS;i++){    
        setPixel1(i, 0, 0, 0, 0);        
        setPixel2(i, 0, 0, 0, 0);        
      }

}



void setPixel1(int Pixel, byte red, byte green, byte blue, byte white) {
 #ifdef ADAFRUIT_NEOPIXEL_H 
   // NeoPixel
   strip1.setPixelColor(Pixel, strip1.Color(red, green, blue, white));


 #endif
 #ifndef ADAFRUIT_NEOPIXEL_H 
   // FastLED
   leds[Pixel].r = red;
   leds[Pixel].g = green;
   leds[Pixel].b = blue;
   leds[Pixel].b = white;
 #endif
}
void setPixel2(int Pixel, byte red, byte green, byte blue, byte white) {
 #ifdef ADAFRUIT_NEOPIXEL_H 
   // NeoPixel
   strip2.setPixelColor(Pixel, strip2.Color(red, green, blue, white));


 #endif
 #ifndef ADAFRUIT_NEOPIXEL_H 
   // FastLED
   leds[Pixel].r = red;
   leds[Pixel].g = green;
   leds[Pixel].b = blue;
   leds[Pixel].b = white;
 #endif
}

void setAll(byte red, byte green, byte blue, byte white) {
  for(int i = 0; i < NUM_LEDS; i++ ) {
    setPixel1(i, red, green, blue, white); 
    setPixel2(i, red, green, blue, white); 
  }
  strip1.show();
  strip2.show();
}




void Strobe(byte red, byte green, byte blue, byte white, int StrobeCount, int FlashDelay, int EndPause){
  for(int j = 0; j < StrobeCount; j++) {
//    setAll(red,green,blue,white);
    //setAll(0,0,0,255); //
    strip1.show();
    delay(FlashDelay);
    setAll(0,0,0,255); //red
   strip1.show();
    delay(FlashDelay);

     strip2.show();
    delay(FlashDelay);
    setAll(0,0,0,255); //red
   strip2.show();
    delay(FlashDelay);
  }
 
 delay(EndPause);
}


void StrobeBgColor(byte red, byte green, byte blue, byte white, byte bgred, byte bggreen, byte bgblue, byte bgwhite, int StrobeCount, int FlashDelay, int EndPause){
  for(int j = 0; j < StrobeCount; j++) {
    setAll(bgred,bggreen,bgblue,bgwhite);
    strip1.show();
    delay(FlashDelay);
    setAll(red,green,blue,white);
    strip1.show();
    delay(FlashDelay);

    setAll(bgred,bggreen,bgblue,bgwhite);
    strip2.show();
    delay(FlashDelay);
    setAll(red,green,blue,white);
    strip2.show();
    delay(FlashDelay);
  }
 
 delay(EndPause);
}
void showStrip() {
 #ifdef ADAFRUIT_NEOPIXEL_H 
   // NeoPixel
   strip1.show();
 #endif
 #ifndef ADAFRUIT_NEOPIXEL_H
   // FastLED
   FastLED.show();
 #endif

 #ifdef ADAFRUIT_NEOPIXEL_H 
   // NeoPixel
   strip2.show();
 #endif
 #ifndef ADAFRUIT_NEOPIXEL_H
   // FastLED
   FastLED.show();
 #endif
}

void setCircleNoLoop(byte red, byte green, byte blue, byte white, float SpeedDelay) {



    if( reverseAnimation == false){
      setPixel1(currentStrip1led, red, green, blue, white); 
      strip1.show();
       delay(SpeedDelay);

       currentStrip1led = currentStrip1led +1;

       if(currentStrip1led  >= NUM_LEDS) {
        currentStrip1led = 0;
        reverseAnimation = true;
       }
    }else if( reverseAnimation == true){
      //currentStrip2led

      setPixel2(currentStrip2led, red, green, blue, white); 
      strip2.show();
       delay(SpeedDelay);

      currentStrip2led = currentStrip2led -1;

     if (currentStrip2led == -1) {
        currentStrip2led =  NUM_LEDS -1;
      reverseAnimation = false;
      indexColorCircle = indexColorCircle +1;
      if( indexColorCircle == sizeof(reds) ){
        indexColorCircle = 0;
      }

    }

    }



    
    }



void setAll1(byte red, byte green, byte blue, byte white) {
  for(int i = 0; i < NUM_LEDS; i++ ) {
    setPixel1(i, red, green, blue, white); 
  }
  strip1.show();
}


void setAll2(byte red, byte green, byte blue, byte white) {
  for(int i = 0; i < NUM_LEDS; i++ ) {
    setPixel2(i, red, green, blue, white); 
  }
  strip2.show();
}


 
 


void SnowSparkle(byte red, byte green, byte blue, byte white, int SparkleDelay, int SpeedDelay) {
  setAll1(red,green,blue,white);
  
 // int Pixel = random(NUM_LEDS);
    int Pixel = random(0,100) ;

  setPixel1(Pixel,0xff,0xff,0xff,0xff);
  strip1.show();
  delay(SparkleDelay);
  setPixel1(Pixel,red,green,blue,white);
   strip1.show();
  delay(SpeedDelay);


  setAll2(red,green,blue,white);
  
 // int Pixel = random(NUM_LEDS);
 //   int Pixel = random(NUM_LEDS) ;

  setPixel2(Pixel,0xff,0xff,0xff,0xff);
  strip2.show();
  delay(SparkleDelay);
  setPixel2(Pixel,red,green,blue,white);
   strip2.show();
  delay(SpeedDelay);



  
}






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

void colorWipe2(uint32_t c, uint8_t wait) {
  for(uint16_t i=0; i<strip2.numPixels(); i++) {
    strip2.setPixelColor(i, c);
    strip2.show();
    delay(wait);
  }
}

Strobe Effect


#include <Adafruit_NeoPixel.h>  

      #define ADAFRUIT_NEOPIXEL_H 
      #define PIN1 6
      #define PIN2 5

      #define NUM_LEDS 144

      #define BRIGHTNESS 255

// 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 strip1 = Adafruit_NeoPixel(NUM_LEDS, PIN1, NEO_GRBW + NEO_KHZ800);
Adafruit_NeoPixel strip2 = Adafruit_NeoPixel(NUM_LEDS, PIN2, NEO_GRBW + NEO_KHZ800);


byte neopix_gamma[] = {
    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  1,  1,  1,  1,
    1,  1,  1,  1,  1,  1,  1,  1,  1,  2,  2,  2,  2,  2,  2,  2,
    2,  3,  3,  3,  3,  3,  3,  3,  4,  4,  4,  4,  4,  5,  5,  5,
    5,  6,  6,  6,  6,  7,  7,  7,  7,  8,  8,  8,  9,  9,  9, 10,
   10, 10, 11, 11, 11, 12, 12, 13, 13, 13, 14, 14, 15, 15, 16, 16,
   17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 24, 24, 25,
   25, 26, 27, 27, 28, 29, 29, 30, 31, 32, 32, 33, 34, 35, 35, 36,
   37, 38, 39, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 50,
   51, 52, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 66, 67, 68,
   69, 70, 72, 73, 74, 75, 77, 78, 79, 81, 82, 83, 85, 86, 87, 89,
   90, 92, 93, 95, 96, 98, 99,101,102,104,105,107,109,110,112,114,
  115,117,119,120,122,124,126,127,129,131,133,135,137,138,140,142,
  144,146,148,150,152,154,156,158,160,162,164,167,169,171,173,175,
  177,180,182,184,186,189,191,193,196,198,200,203,205,208,210,213,
  215,218,220,223,225,228,231,233,236,239,241,244,247,249,252,255 };


void setup() {
  strip1.setBrightness(BRIGHTNESS);
  strip1.begin();
  strip1.show();
  
   strip2.setBrightness(BRIGHTNESS);
  strip2.begin();
  strip2.show();// Initialize all pixels to 'off'
}

void loop() { 
  // Slower:
  // Strobe(0xff, 0x77, 0x00, 10, 100, 1000);
  // Fast:
 // Strobe(0, 0, 0, 255, 10, 10, 1);
  //StrobeBgColor(0, 0, 0, 255,0,0,255,0, 10, 50, 1);
 // StrobeBgColor(0, 0, 0, 255,0,0,255,0, 10, 10, 1);
   StrobeBgColor(255, 0, 0, 0,0,0,255,0, 10, 1, 1);


}

void Strobe(byte red, byte green, byte blue, byte white, int StrobeCount, int FlashDelay, int EndPause){
  for(int j = 0; j < StrobeCount; j++) {
//    setAll(red,green,blue,white);
    //setAll(0,0,0,255); //
    strip1.show();
    delay(FlashDelay);
    setAll(0,0,0,255); //red
   strip1.show();
    delay(FlashDelay);

     strip2.show();
    delay(FlashDelay);
    setAll(0,0,0,255); //red
   strip2.show();
    delay(FlashDelay);
  }
 
 delay(EndPause);
}


void StrobeBgColor(byte red, byte green, byte blue, byte white, byte bgred, byte bggreen, byte bgblue, byte bgwhite, int StrobeCount, int FlashDelay, int EndPause){
  for(int j = 0; j < StrobeCount; j++) {
    setAll(bgred,bggreen,bgblue,bgwhite);
    strip1.show();
    delay(FlashDelay);
    setAll(red,green,blue,white);
    strip1.show();
    delay(FlashDelay);

    setAll(bgred,bggreen,bgblue,bgwhite);
    strip2.show();
    delay(FlashDelay);
    setAll(red,green,blue,white);
    strip2.show();
    delay(FlashDelay);
  }
 
 delay(EndPause);
}
void showStrip() {
 #ifdef ADAFRUIT_NEOPIXEL_H 
   // NeoPixel
   strip1.show();
 #endif
 #ifndef ADAFRUIT_NEOPIXEL_H
   // FastLED
   FastLED.show();
 #endif

 #ifdef ADAFRUIT_NEOPIXEL_H 
   // NeoPixel
   strip2.show();
 #endif
 #ifndef ADAFRUIT_NEOPIXEL_H
   // FastLED
   FastLED.show();
 #endif
}

void setPixel(int Pixel, byte red, byte green, byte blue, byte white) {
 #ifdef ADAFRUIT_NEOPIXEL_H 
   // NeoPixel
   strip1.setPixelColor(Pixel, strip1.Color(red, green, blue, white));
    strip2.setPixelColor(Pixel, strip2.Color(red, green, blue, white));
 #endif
 #ifndef ADAFRUIT_NEOPIXEL_H 
   // FastLED
   leds[Pixel].r = red;
   leds[Pixel].g = green;
   leds[Pixel].b = blue;
   leds[Pixel].b = white;
 #endif
}

void setAll(byte red, byte green, byte blue, byte white) {
  for(int i = 0; i < NUM_LEDS; i++ ) {
    setPixel(i, red, green, blue, white); 
  }
  strip1.show();
  strip2.show();
}



Stepper motor + mirror

27 | 03 | 19

On the stepper motor a mirror will be mounted that will create the reflections of the light.




New Arduino Circuit

29 | 03 | 19

After some serious (burning) issues I realised that my circuit wasn't safe enough so rebuilt with help of Yoana from the interaction station. This new setup with a shield allowed me a more safe and modular environment of experimentation



12W blue LED light with a fresnel lens

27 | 04 | 19

Mid blue light

After an intensive experimentation process I discovered that a fresnel lens would be the best suitable way of creating a strong light beam.




Technical driver

15 | 05 | 19

RPI – python script with the sound file

Arduino 1 – circular LED
Arduino 2 – Stepper Motor + Mirror
Arduino 3 – blue light

The idea behind is that the sound is running through a python script in the Raspberry Pi, which counting the seconds. And sending this data to the 3 Arduinos (LED ring, mid blue light, rotative mirror). When the Arduino receives the signal to the certain seconds it triggers the animations, starts the motor turns on the blue light.

An additional soundcard with 4 channels output will be connected to the RPI to send the sound input to the 4 speakers to create quadraphonic sound.