Taking An Arduino Project Mobile/Memory Limitations?

Post here about your Arduino projects, get help - for Adafruit customers!

Moderators: adafruit_support_bill, adafruit

Please be positive and constructive with your questions and comments.
Locked
thatsnomoon
 
Posts: 2
Joined: Thu Jul 19, 2012 1:23 am

Taking An Arduino Project Mobile/Memory Limitations?

Post by thatsnomoon »

Hi!

I'm just getting into Arduino (and programming) and I've got a few nice sketches going for my Arudino Uno that drive sequences on my WS2801 RGB LED Pixels

I'm to the point now where I'd like to take my pixels out in the wild and show them off but I'm having trouble getting sketches to run properly (or sometimes at all) when the Arduino isn't connected to the computer via USB. I'm still working off of a breadboard at the moment, haven't committed to soldering anything just yet.

Here's the run down of events in my workflow at the moment:

I'll start with the Arduino powered via USB and the LED Pixels powered via the battery pack. All my connections between Arduino, Pixels, breadboard etc. are in order, everything looks good. I'll pull up a sketch, let's say "strandtest" which is the default sketch available on the GitHub website. I'll upload it to the Arduino, and BAM! ... b-e-a-utiful color patterns flashing across the pixels as expected. Now that I've confirmed that everything is working I'll power off the battery pack, unhook the USB cable from the Arduino, grab a few jumper wires and pass the - and + connections from the breadboard (which are being fed by the battery pack) to the Vin and GND connections in the Power section of the Arduino. I'll flip the power switch on the battery pack and the pixels will turn on, but now they're just stuck at whatever color they happened to be at in the Rainbow sequence. Or, if I caught it in the ColorWipe sequence it'll wipe the first 15 or 20 LEDs in sequence (as expected) but it'll stop dead in it's tracks, leaving the other LEDs off and ceasing all movement.

For reference, here's the strandtest code

Code: Select all

#include "SPI.h"
#include "Adafruit_WS2801.h"

/*****************************************************************************
Example sketch for driving Adafruit WS2801 pixels!


  Designed specifically to work with the Adafruit RGB Pixels!
  12mm Bullet shape ----> https://www.adafruit.com/products/322
  12mm Flat shape   ----> https://www.adafruit.com/products/738
  36mm Square shape ----> https://www.adafruit.com/products/683

  These pixels use SPI to transmit the color data, and have built in
  high speed PWM drivers for 24 bit color per pixel
  2 pins are required to interface

  Adafruit invests time and resources providing this open source code, 
  please support Adafruit and open-source hardware by purchasing 
  products from Adafruit!

  Written by Limor Fried/Ladyada for Adafruit Industries.  
  BSD license, all text above must be included in any redistribution

*****************************************************************************/

// Choose which 2 pins you will use for output.
// Can be any valid output pins.
// The colors of the wires may be totally different so
// BE SURE TO CHECK YOUR PIXELS TO SEE WHICH WIRES TO USE!
int dataPin  = 2;    // Yellow wire on Adafruit Pixels
int clockPin = 3;    // Green wire on Adafruit Pixels

// Don't forget to connect the ground wire to Arduino ground,
// and the +5V wire to a +5V supply

// Set the first variable to the NUMBER of pixels. 25 = 25 pixels in a row
Adafruit_WS2801 strip = Adafruit_WS2801(25, dataPin, clockPin);

// Optional: leave off pin numbers to use hardware SPI
// (pinout is then specific to each board and can't be changed)
//Adafruit_WS2801 strip = Adafruit_WS2801(25);

// For 36mm LED pixels: these pixels internally represent color in a
// different format.  Either of the above constructors can accept an
// optional extra parameter: WS2801_RGB is 'conventional' RGB order
// WS2801_GRB is the GRB order required by the 36mm pixels.  Other
// than this parameter, your code does not need to do anything different;
// the library will handle the format change.  Examples:
//Adafruit_WS2801 strip = Adafruit_WS2801(25, dataPin, clockPin, WS2801_GRB);
//Adafruit_WS2801 strip = Adafruit_WS2801(25, WS2801_GRB);

void setup() {
    
  strip.begin();

  // Update LED contents, to start they are all 'off'
  strip.show();
}


void loop() {
  // Some example procedures showing how to display to the pixels
  
  colorWipe(Color(255, 0, 0), 50);
  colorWipe(Color(0, 255, 0), 50);
  colorWipe(Color(0, 0, 255), 50);
  rainbow(20);
  rainbowCycle(20);
}

void rainbow(uint8_t wait) {
  int i, j;
   
  for (j=0; j < 256; j++) {     // 3 cycles of all 256 colors in the wheel
    for (i=0; i < strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel( (i + j) % 255));
    }  
    strip.show();   // write all the pixels out
    delay(wait);
  }
}

// Slightly different, this one makes the rainbow wheel equally distributed 
// along the chain
void rainbowCycle(uint8_t wait) {
  int i, j;
  
  for (j=0; j < 256 * 5; j++) {     // 5 cycles of all 25 colors in the wheel
    for (i=0; i < strip.numPixels(); i++) {
      // tricky math! we use each pixel as a fraction of the full 96-color wheel
      // (thats the i / strip.numPixels() part)
      // Then add in j which makes the colors go around per pixel
      // the % 96 is to make the wheel cycle around
      strip.setPixelColor(i, Wheel( ((i * 256 / strip.numPixels()) + j) % 256) );
    }  
    strip.show();   // write all the pixels out
    delay(wait);
  }
}

// fill the dots one after the other with said color
// good for testing purposes
void colorWipe(uint32_t c, uint8_t wait) {
  int i;
  
  for (i=0; i < strip.numPixels(); i++) {
      strip.setPixelColor(i, c);
      strip.show();
      delay(wait);
  }
}

/* Helper functions */

// Create a 24 bit color value from R,G,B
uint32_t Color(byte r, byte g, byte b)
{
  uint32_t c;
  c = r;
  c <<= 8;
  c |= g;
  c <<= 8;
  c |= b;
  return c;
}

//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)
{
  if (WheelPos < 85) {
   return Color(WheelPos * 3, 255 - WheelPos * 3, 0);
  } else if (WheelPos < 170) {
   WheelPos -= 85;
   return Color(255 - WheelPos * 3, 0, WheelPos * 3);
  } else {
   WheelPos -= 170; 
   return Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
}
The funny thing is, as a test I ran one of my simpler sketches which is just a single LED chase pattern back and forth in one color. If I upload that to the Arduino and run it using just the battery pack it runs just fine. It'll chase back and forth, no problem, no USB connection needed ... just the Arduino, the LED Pixels, and the battery pack. Here's the code for the chase pattern for reference (it's messy, I know):

Code: Select all

#include "SPI.h"
#include "Adafruit_WS2801.h"

/*****************************************************************************
Example sketch for driving Adafruit WS2801 pixels!


  Designed specifically to work with the Adafruit RGB Pixels!
  12mm Bullet shape ----> https://www.adafruit.com/products/322
  12mm Flat shape   ----> https://www.adafruit.com/products/738
  36mm Square shape ----> https://www.adafruit.com/products/683

  These pixels use SPI to transmit the color data, and have built in
  high speed PWM drivers for 24 bit color per pixel
  2 pins are required to interface

  Adafruit invests time and resources providing this open source code, 
  please support Adafruit and open-source hardware by purchasing 
  products from Adafruit!

  Written by Limor Fried/Ladyada for Adafruit Industries.  
  BSD license, all text above must be included in any redistribution

*****************************************************************************/

// Choose which 2 pins you will use for output.
// Can be any valid output pins.
// The colors of the wires may be totally different so
// BE SURE TO CHECK YOUR PIXELS TO SEE WHICH WIRES TO USE!
int dataPin  = 2;    // Yellow wire on Adafruit Pixels
int clockPin = 3;    // Green wire on Adafruit Pixels
int j;
int k;
int l;

// Don't forget to connect the ground wire to Arduino ground,
// and the +5V wire to a +5V supply

// Set the first variable to the NUMBER of pixels. 25 = 25 pixels in a row
Adafruit_WS2801 strip = Adafruit_WS2801(25, dataPin, clockPin);

// Optional: leave off pin numbers to use hardware SPI
// (pinout is then specific to each board and can't be changed)
//Adafruit_WS2801 strip = Adafruit_WS2801(25);

// For 36mm LED pixels: these pixels internally represent color in a
// different format.  Either of the above constructors can accept an
// optional extra parameter: WS2801_RGB is 'conventional' RGB order
// WS2801_GRB is the GRB order required by the 36mm pixels.  Other
// than this parameter, your code does not need to do anything different;
// the library will handle the format change.  Examples:
//Adafruit_WS2801 strip = Adafruit_WS2801(25, dataPin, clockPin, WS2801_GRB);
//Adafruit_WS2801 strip = Adafruit_WS2801(25, WS2801_GRB);
void setup() {
    
  strip.begin();

  // Update LED contents, to start they are all 'off'
  strip.show();
}


void loop() {
  // Some example procedures showing how to display to the pixels
colorWipe(Color(255,0,0),Color(0,255,0),Color(0,0,255), 15); // Red, then green
}

    void colorWipe(uint32_t c1, uint32_t c2, uint32_t c3, uint8_t wait) {
      int i;
      
      for (i=0; i < strip.numPixels(); i++) {
          strip.setPixelColor(i, c2);
          strip.setPixelColor(i-1, Color(0,0,0));
          strip.show();
          delay(wait); 
      }
      
      for (i = strip.numPixels(); i > 0; i--) {
          strip.setPixelColor(i, c2);
          strip.setPixelColor(i+1, Color(0,0,0));
          strip.show();
          delay(wait); 
      }
      
    }


/* Helper functions */

// Create a 24 bit color value from R,G,B
uint32_t Color(byte r, byte g, byte b)
{
  uint32_t c;
  c = r;
  c <<= 8;
  c |= g;
  c <<= 8;
  c |= b;
  return c;
}
Anyone have any idea what the deal is? Is the strandtest sketch too big or (for lack of better programming vocabulary) too intense for the Arduino Uno to handle on it's own (strandtest = 8kb, my single led chase sketch = 4kb)? Are the ~4.5V provided by the 3xAA batteries not enough power to run the sketches?

Enlighten an Arduino n00b, please!

Thanks!

User avatar
pburgess
 
Posts: 4161
Joined: Sun Oct 26, 2008 2:29 am

Re: Taking An Arduino Project Mobile/Memory Limitations?

Post by pburgess »

When using the battery pack, connect power to the Arduino's 5V pin rather than Vin. The latter feeds into the voltage regulator and needs a couple volts overhead. The 5V pin is "after" the regulator in the schematic. Just be sure never to exceed that voltage into the 5V pin, or it's blue smoke time! Your 4.5V battery pack will be fine.

thatsnomoon
 
Posts: 2
Joined: Thu Jul 19, 2012 1:23 am

Re: Taking An Arduino Project Mobile/Memory Limitations?

Post by thatsnomoon »

Awesome! Thank you! That did it!

Adi0524
 
Posts: 1
Joined: Mon Aug 06, 2012 1:02 am

Re: Taking An Arduino Project Mobile/Memory Limitations?

Post by Adi0524 »

pburgess tell me plz how much price battery packet?

User avatar
adafruit_support_rick
 
Posts: 35092
Joined: Tue Mar 15, 2011 11:42 am

Re: Taking An Arduino Project Mobile/Memory Limitations?

Post by adafruit_support_rick »

I believe the OP is using a 3XAA battery holder. Adafruit carries this one:
https://www.adafruit.com/products/727

Locked
Please be positive and constructive with your questions and comments.

Return to “Arduino”