Wednesday, December 17, 2014

Just saw this project and had to share.

THIS

While its not a video directly, I saw this on my twitter feed and had to share. I would love to make this baby someday, got to finish a couple other projects first though.

-Charlie

Friday, December 12, 2014

Its built!!! Well sort of, again




Good news everyone! I finally got my project built. Its not how I wanted or designed it but it is something. The school ran out of the 1/4" acrylic that I wanted to use so I had to use 1/8" inch thick stuff. Also there was only 1 more pane of it left and it was only a 12" by 12" square. Thus the TA scaled everything down by 50%. So it's tiny hehe.
The original idea was to put led strips on the spokes of the wheel, use a slip ring to allow the led strips to rotate and still have electrical connection, and to make the motor spin at a speed Dependant on the signal the microphone received.  Like I said in the last post I finally got the led strips to work, but I never got the motor code integrated into the system because I spent so much time on the led strips. Always remember to check hardware before software ><.
When I was putting it together the bottom of the wheel touched the ground, so looks like I need make the supports just a bit taller. It all went together well enough and it spins once the supports were on spacers. Oh, the spacers that went on the center axle melted in the laser cutter, the scale was too small for them so I didn't put any on the axle and the wheel sometimes catches.
It was assembled on cardboard using hot glue and the wheels to the cross arms with hot glue. The center axle just has some tape on it to hold it in place and let the wheels spin somewhat freely.
The end caps couldn't be 3D printed as the printer went down for a while and with the scale down of the parts, the original design wouldn't have worked anyway.
There was an expo with all of the projects today at school but since I work when it was starting I didnt go. And I'm uploading all this while at work :).
-Charlie
Can't post pictures while using the mobile app, it crashes. But rest assured they exist and I will upload them when I get home from work at 11:30

 Edit - I figured out how to add the pics, I had to use a browser instead of the app but there they are :)

Thursday, December 11, 2014

Software struggles

Programming is not what i like to do.  With a modified adafruit code that i found for a light up bracelet that i further played with and modified, i kind of got the lights to blink in time with the music.  I wish that i could get it to blink in time with certain frequencies but i didn't get around to figuring out if the microphone can actually do that or not.  Either way here is the code and a video of the blinking.

I learned that you cant share the ground of the mic or the LED strip.  There was some kind of interference caused the LED strip to continuously blink and it was really annoying to say the least.

Here is a video of it working after I cleaned up the ground issue




I didn't get to work with the motor code to get a motor to change speed based on input from the mic.  I figured it would need a PWM port and some kind of combination of our lab code to change the speed of the motor using a square wave, as well as taking input put out by the mic program so that the motor activates in time with the LED blinks.

 Here is the code that got it to work

/*
LED VU meter for Arduino and Adafruit NeoPixel LEDs.

Hardware requirements:
 - Most Arduino or Arduino-compatible boards (ATmega 328P or better).
 - Adafruit Electret Microphone Amplifier (ID: 1063)
 - Adafruit Flora RGB Smart Pixels (ID: 1260)
   OR
 - Adafruit NeoPixel Digital LED strip (ID: 1138)
 - Optional: battery for portable use (else power through USB or adapter)
Software requirements:
 - Adafruit NeoPixel library

Connections:
 - 3.3V to mic amp +
 - GND to mic amp -
 - Analog pin to microphone output (configurable below)
 - Digital pin to LED data input (configurable below)
 See notes in setup() regarding 5V vs. 3.3V boards - there may be an
 extra connection to make and one line of code to enable or disable.

Written by Adafruit Industries.  Distributed under the BSD license.
This paragraph must be included in any redistribution.
*/
 
#include <Adafruit_NeoPixel.h>
 
#define N_PIXELS  15  // Number of pixels in strand
#define MIC_PIN   A0  // Microphone is attached to this analog pin
#define LED_PIN    8  // NeoPixel LED strand is connected to this pin
#define DC_OFFSET  0  // DC offset in mic signal - if unusure, leave 0
#define NOISE     70  // Noise/hum/interference in mic signal
#define SAMPLES   60    // Length of buffer for dynamic level adjustment
#define TOP       (N_PIXELS + 2) // Allow dot to go slightly off scale
#define PEAK_FALL 25  // Rate of peak falling dot
 
byte
  peak      = 0,      // Used for falling dot
  dotCount  = 0,      // Frame counter for delaying dot-falling speed
  volCount  = 5;      // Frame counter for storing past volume data
int
  vol[SAMPLES],       // Collection of prior volume samples
  lvl       = 50,      // Current "dampened" audio level
  minLvlAvg = 0,      // For dynamic adjustment of graph low & high
  maxLvlAvg = 512;
Adafruit_NeoPixel
  strip = Adafruit_NeoPixel(N_PIXELS, LED_PIN, NEO_GRB + NEO_KHZ800);
 
void setup() {
 
  // This is only needed on 5V Arduinos (Uno, Leonardo, etc.).
  // Connect 3.3V to mic AND TO AREF ON ARDUINO and enable this
  // line.  Audio samples are 'cleaner' at 3.3V.
  // COMMENT OUT THIS LINE FOR 3.3V ARDUINOS (FLORA, ETC.):
//  analogReference(EXTERNAL);
 
  memset(vol, 0, sizeof(vol));
  strip.begin();
}
 
void loop() {
  uint8_t  i;
  uint16_t minLvl, maxLvl;
  int      n, height;
 
 
 
  n   = analogRead(MIC_PIN);                        // Raw reading from mic 
  n   = abs(n - 512 - DC_OFFSET); // Center on zero
  n   = (n <= NOISE) ? 0 : (n - NOISE);             // Remove noise/hum
  lvl = ((lvl * 7) + n) >> 3;    // "Dampened" reading (else looks twitchy)
 
  // Calculate bar height based on dynamic min/max levels (fixed point):
  height = TOP * (lvl - minLvlAvg) / (long)(maxLvlAvg - minLvlAvg);
 
  if(height < 0L)       height = 2;      // Clip output
  else if(height > TOP) height = TOP;
  if(height > peak)     peak   = height; // Keep 'peak' dot at top
 
 
  // Color pixels based on rainbow gradient
  for(i=0; i<N_PIXELS; i++) {
    if(i >= height)               strip.setPixelColor(i,   0,   0, 0);
    else strip.setPixelColor(i,Wheel(map(i,0,strip.numPixels()-1,30,150)));
    
  }
 
 
 
  // Draw peak dot  
  if(peak > 0 && peak <= N_PIXELS-1) strip.setPixelColor(peak,Wheel(map(peak,0,strip.numPixels()-1,30,150)));
  
   strip.show(); // Update strip
 
// Every few frames, make the peak pixel drop by 1:
 
    if(++dotCount >= PEAK_FALL) { //fall rate 
      
      if(peak > 0) peak--;
      dotCount = 0;
    }
 
 
 
  vol[volCount] = n;                      // Save sample for dynamic leveling
  if(++volCount >= SAMPLES) volCount = 0; // Advance/rollover sample counter
 
  // Get volume range of prior frames
  minLvl = maxLvl = vol[0];
  for(i=1; i<SAMPLES; i++) {
    if(vol[i] < minLvl)      minLvl = vol[i];
    else if(vol[i] > maxLvl) maxLvl = vol[i];
  }
  // minLvl and maxLvl indicate the volume range over prior frames, used
  // for vertically scaling the output graph (so it looks interesting
  // regardless of volume level).  If they're too close together though
  // (e.g. at very low volume levels) the graph becomes super coarse
  // and 'jumpy'...so keep some minimum distance between them (this
  // also lets the graph go to zero when no sound is playing):
  if((maxLvl - minLvl) < TOP) maxLvl = minLvl + TOP;
  minLvlAvg = (minLvlAvg * 63 + minLvl) >> 6; // Dampen min/max levels
  maxLvlAvg = (maxLvlAvg * 63 + maxLvl) >> 6; // (fake rolling average)
 
}
 
// Input a value 0 to 255 to get a color value.
// The colors are a transition r - g - b - back to r.
uint32_t Wheel(byte WheelPos) {
  if(WheelPos < 85) {
   return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
  } else if(WheelPos < 170) {
   WheelPos -= 85;
   return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  } else {
   WheelPos -= 170;
   return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
}

-Charlie

Friday, December 5, 2014

Logistics.

I suppose this is a good experience of logistics in the real world.

I've submitted the parts that need to be laser cut to the email address provided, but I do t know if they have gotten to it yet. I submitted them on Monday because I was waiting for the materials to come in, which i don't know if they came in or not.

So I'm waiting for the right material to ce in, so that the parts can be cut and then built. But I'm depending on my professor having ordered the right parts. And he's a wicked busy man with 3 classes to teach and probably 500 students between all the sections. Then the TA's who need to cut the parts and all the requests they have and how much other work then have to do as students themselves.

Combine all that with me being married and working full time and I can't be around school all day trying to track everything down. As it is, I may just cut everything out of cardboard just to have something physical to show for.

-Charlie

Monday, December 1, 2014

Getting close to deadline

With only 11 days left to complete the project, its getting down to the wire. I decided to go with 8 inch wheels since the adafruit neopixle strip is smaller than I expected.

I finished the design in solid works and if my prof ordered 1/4" thick clear acrylic then all the parts just need to be cut out of that.  The end cap just needs to be 3D printed, one for each end so 2. Once everything is out then I can put it together easily.

I'm going to see if the DC motor we got in the sparkfun kit will spin the wheels. If it won't then there's a broken aero bed in my closet that might have a motor I can salvage out of it and see if that one works.

The hope is to get the motor code we used in a lab and have the I put to the serial A0 port also be called to run the motor with pwm so the speed varies.

-Charlie

Monday, November 24, 2014

Forgot to put up the pic of the new Ferris wheel assembly

I made some changes to some of the parts and took a picture earlier today but forgot to upload it here.

-Charlie

ITS ALIVE!!!! sort of

For home from work and had a chance to play around with the mic and the neopixel strip :).
Using the code I found for a music reactive bracket and changing some of the values, I kinda got it to work.
It blinks at least.


I even got a video of it sort of reacting to music, the volume is really low, i was probably covering the mic by accident.





-Charlie