1/23/2012

HC-SR04 Ultrasonic sensor added to the Arduino Cluster bot.

ClusterBot, the Arduino robot, now with active ultrasonic
distance ranging via the HC-SR04.
ClusterBot finally gets a brain!  In this program, Cluster simply goes straight and shines the LED, but then will rotate left when something comes within the programmed ranged on his.  While rotating left, ClusterBot is still testingfor object, then will go stragiht when there is no longer something in the path.

You may also notice ClusterBot has had some cosmetic surgery.  I took all of his crazy jumpers out and replaced them with much neater custom sized hookup wires.  I also took the entire robot apart and took him off of that ridiculous Pololu round frame.  ClusterBot is much easier to add things to now, plus he's cleaner looking and lighter.

I bought the HC-SR04 ultrasonic sensor on eBay for around $4.  The Parallax Ping, which is a very similar sensor, sells for $30.  Reading on the web, the best I can tell is there are two differences between the two sensors.  The Parallax Ping only requires one data pin, while the HC-SRO4 requires two data pins.  If I am that crunched for pins, I think your money would be better spent on the Arduino Mega than spending an extra $26 dollars for basically the same functionality.  I've also read that some people have found the Ping has a little further range.  I haven't tested the HC-SRO4 out thoroughly yet, but I have seen it measure accurately (within an inch) out to 48 inches.

I'll post the code for the new version of the ClusterBot, but I won't get into the details of the HC-SRO4 until tomorrow.




#include "Ultrasonic.h"
Ultrasonic ultrasonic( 10, 11);

#define PWMA 3
#define AIN1 0
#define AIN2 1
#define PWMB 5
#define BIN1 2
#define BIN2 4
#define STBY 6
#define LED 7
#define SPEAKER 9
#define FREQ 1000

/* Robot should continue straight until an object is within the distance threshold */
/* Sorry for the superflous code at the bottom - I need to get those functions */
/* into a header file  */

/* The robot should move forward and have a steady green LED until something is 7 inches in front of the sensor.
   Then the robot should stop and rotate left until there is not an object within 7 inches anymore               */

void setup() {
 
pinMode(PWMA,OUTPUT);
pinMode(AIN1,OUTPUT);
pinMode(AIN2,OUTPUT);
pinMode(PWMB,OUTPUT);
pinMode(BIN1,OUTPUT);
pinMode(BIN2,OUTPUT);
pinMode(STBY,OUTPUT);
pinMode(LED,OUTPUT);

}

void loop() {
 
  startUp();
  while(ultrasonic.Ranging(INC) < 9) {
    rotateLeft();
    digitalWrite(LED,HIGH);
    tone(SPEAKER,FREQ);
    delay(20);
    digitalWrite(LED,LOW);
    noTone(SPEAKER);
    delay(20);
  }
  goForward();
  digitalWrite(LED,HIGH);
 
 
}
void goForward ()
{
  digitalWrite (AIN1,HIGH);
  digitalWrite (AIN2,LOW);
  analogWrite(PWMA,233);
  digitalWrite (BIN1,HIGH);
  digitalWrite (BIN2,LOW);
  analogWrite(PWMB,255); 
}

void goBackward ()
{
  digitalWrite (AIN1,LOW);
  digitalWrite (AIN2,HIGH);
  analogWrite(PWMA,233);
  digitalWrite (BIN1,LOW);
  digitalWrite (BIN2,HIGH);
  analogWrite(PWMB,255); 
}

void rotateRight ()
{
  digitalWrite (AIN1,HIGH);
  digitalWrite (AIN2,LOW);
  analogWrite(PWMA,255);
  digitalWrite (BIN1,LOW);
  digitalWrite (BIN2,HIGH);
  analogWrite(PWMB,255); 
}

void rotateLeft ()
{
  digitalWrite (AIN1,LOW);
  digitalWrite (AIN2,HIGH);
  analogWrite(PWMA,255);
  digitalWrite (BIN1,HIGH);
  digitalWrite (BIN2,LOW);
  analogWrite(PWMB,255); 
}

void veerLeft ()
{
  digitalWrite (AIN1,HIGH);
  digitalWrite (AIN2,LOW);
  analogWrite(PWMA,190);
  digitalWrite (BIN1,HIGH);
  digitalWrite (BIN2,LOW);
  analogWrite(PWMB,255); 
}

void veerRight ()
{
  digitalWrite (AIN1,HIGH);
  digitalWrite (AIN2,LOW);
  analogWrite(PWMA,255);
  digitalWrite (BIN1,HIGH);
  digitalWrite (BIN2,LOW);
  analogWrite(PWMB,190); 
}

void applyBrakes ()
{
  digitalWrite (AIN1,HIGH);
  digitalWrite (AIN2,HIGH);
  analogWrite(PWMA,255);
  digitalWrite (BIN1,HIGH);
  digitalWrite (BIN2,HIGH);
  analogWrite(PWMB,255); 
}

void startUp ()
{
  digitalWrite(STBY,HIGH);
}

void turnAround()
{
  rotateLeft();
  delay(1370);
}

void shutDown ()
{
  digitalWrite(STBY,LOW);
}

MeanPC Weekly #1

I've been doing posts that have been a little more time consuming lately.   Each post is taking me longer to put up than they used to since there has been a hardware and video element for each one of late.  I find things I want to share during the week which don't necessarily rate a blog post all on their own.

So now I will start a weekly post of things I've found interesting during the week.  Most, but not all, of these items should be tech related.  Will try and get one of these posts up every Sunday night/Monday morning.

#1 - Electronic goldmine - I ordered a big box of various surplus parts from the electronic goldmine last week.  They have really great prices on a lot of their items, and they were a great way for me to get a large variety of parts for not a lot of money.  My "electronics lab" is starting from ground zero, so I don't have a lot of the little odds and ends you need component wise.

The Electronic Goldmine shipped the big box o' parts out to me, and it did not disappoint.  I was very happy with the entire order.I even did an Unboxing video of the parts.  Most of it is pretty boring, admittedly.  In one scene, you can see me take a component out that is surrounded by two pieces of cardboard .  I didn't think about what might be in it, and was a little rough trying to separate the two pieces of cardboard from eachother.

I broke the first solar panel, then was much more careful with the second one.  It broke too.  I was a little clumsy for sure, but the packaging on these things was terrible.  After two emails, Ben at the Electronic Goldmine agreed to ship two more solar panels.  They arrived quickly and I managed to extract the super-fragile panels safely by cutting the tape open with an exacto knife.

+1 for Electronic Goldmine's customer service.  I admitted to having some responsibility in breaking the cells, but they were good enough to replace them anyway.  Definitely a company I'll recommend to others and do business with again.

2. Built my first robot this past week using an Arduino Uno, a Tamiya twin-motor gearbox, Tamiya truck tires, a Pololu motor driver, a Pololu round robot chassis and some assorted Meccano parts.  The build went relatively well, although it was frustrating at times.  I'm not the most mechanical guy in the world, so I ended up doing things the hard way and had to tear the robot apart to put the next piece on several times.

I certainly learned the importance of thinking ahead, and maybe doing a quick sketch of the robot next time before building,  I ended up with a terribly ugly contraption, which I just had to name 'ClusterBot'.  ClusterBot does function, however so it was an overall success.

I think I will be building my next few robots with a wooden base.  Wood is easy to cut and work with and I can drill holes with ease and wherever I want.  Plus wood is cheap.  The Pololu base was useless for my purposes.  The Tamiya twin motor gearbox works surprisingly good for the price-point - $9 as of this post.  The motor driver and wheels are great too.  Great learning experience.

3. I mounted a HC-SR04 Ultrasonic sensor to the cluster bot and got it working.  ClusterBot would go forward until he 'saw' something that was closer than the distance threshold I set.  Once that threshold hit, ClusterBot was instructed to keep rotating left until there was no longer an obstacle.  After a few hours of typos, using the wrong set of pins on the Arduino mini-breadboard, and making more than my usual fair share of logical errors - ClusterBot was working almost perfectly.

Clusterbot had mounds of jumper wire looped all over his head, however and a few other issues.  My daughter ran ClusterBot under a bed, where there were a few tumbleweeds of cat fur hiding out.  After ClusterBot plowed into a couple of these, one of the motors almost stopped spinning.  I opened it up and removed the cat fur.  Put it back together and the gearbox started working perfectly again.  I decided right there to go ahead and dismatntle ClusterBox and start over.

I got another robot built, on the same general lines, but much much cleaner.  I'll be sharing the new bot with you sometime this week.  I got rid of the Pololu round robot frame, and decided to just mount the robot on a Meccano frame instead.  This robot is much neater now, and I notice how much taking the weight off and having the robot in balance affects the performance.

4.  Ordered several parts from eBay mid-last week.  I've already gotten all of them in the mail, even though they had to come all the way from China.  I was somewhat leary of ordering from the Chinese sellers on eBay, but I've used several now with good results and super-cheap prices.  Compare the HC-SR04 ultrasonic sensor to the Parallax Ping sensor.  The Ping sensor supposedly has a little more range than the Chinese knock-offs, but I've found the Chinese Ultrasonic sensors to be very accurate and they have plenty of range for my purpose.  The biggest difference is the price - Ebay HC-SR04 is around $4 shipped, while the Parallax Ping sensor is $30 and doesn't include shipping.  8 Chinese Ultrasonics are >>>> than 1 Parallax Ping.  I'll have more on the HC-SR04 this week on YouTube and the blog.

5.  Found a Robotics website I didn't know about before - Let's Make Robots.  A really good site with helpful people in chat and the forums.  You can make a collection of other people's postings, robots, pictures, etc. As you browse the site, it's an easy way to hang on to ideas you like for reviewing later.  This is probably my favorite bot site I've found so far.

6. On a very sad note, we had to put our 18 year old manx cat, Blackjack, to sleep.  My nine-year old daughter is quite the artist in Paint, and made a memorial Speed Paint of our friend.  Check it out if you'd like to see her using what I consider to be some very advanced techniques to get the absolute most she can out of Paint.


1/19/2012

Cluster Bot lives! First run of my Arduino/Tamiya/Toshiba robot

ClusterBot, my first Arduino robot.
ClusterBot is assembled and I've written some rudimentary Arduino code to get it up and running.  I wrote some simple subroutines for basic maneuvering like rotateLeft(), goForward(), goBackward(), applyBrakes(), turnAround(), etc. to make programming the bot a little easier.  The plan is to get my daughter interested in programming the robot, so I'm trying to make it as simple as possible for both her and I.  The commands remind me a little of the old-school Logo programming language.

See the ClusterBot build videos here.

ClusterBot specs:
Arduino Uno microcontroller board
Pololu round robot chassis
Tamiya twin-motor gearbox
Toshiba TB6612FNG motor driver on carrier board providing PWM motor control.
9V battery pack for Arduino power
2 AA battery pack for motor power
Various K'NEX parts for mounting parts

The robot is performing fairly well, with some limitations.  First of all, the robot is stupid.  No active sensors at this time, ClusterBot will simply go exactly where you tell it, with no obstacle avoidance in place.

I had to spend a little time getting ClusterBot to track straight.  I've got no physical way to do a front-end alignment on the robot, so I tweaked the goForward() and goBackward() functions by changing the PWM values until the bot tracked relatively straight.  It's not crucial that it's perfect with this robot, but when I first ran ClusterBot, he would move in arcs instead of lines.  I'm not sure if the robot is not tracking straight because it is physically crooked, the weight is unevenly distributed, the PWM signals are different from the two pins on the Arduino, or if it's simply a matter of different performance characteristics of the two cheap-o motors.  Probably a combination of all of the above.

I also took some rough measurements of the angular distance travelled when rotating left and right so I could easily make the robot turn roughly 90 degrees, 180 degrees, etc.  The problem with this is that as the batteries discharge, the angular travel will decrease also.  It's just a rough estimate.  It might not be on this bot, but I will have to have encoders on my wheels at some point, or just use stepper motors.  Encoded wheels will probably be the answer though.

ClusterBot has been a qualified success so far, and I've learned a ton about the mechanical construction, Arduino code and motor drivers.  The next order of business is to get some sensors on this bot, starting with the HC-SR04 ultrasonic sensor.  I'll also put some microswitches tied to bump sensors.  Eventually I'd like to make ClusterBot have line following or avoiding capabilites also.



The code:  Please excuse my lack of commenting.  It should be fairly straightforward and easy to read though.


#define PWMA 3
#define AIN1 0
#define AIN2 1
#define PWMB 5
#define BIN1 2
#define BIN2 4
#define STBY 6


/* Robot does 27 rotations in one minute and
10 feet in 25 seconds.  Current straight tracking is 233 left, 255 right. */


void setup() {
  // put your setup code here, to run once:
pinMode(PWMA,OUTPUT);
pinMode(AIN1,OUTPUT);
pinMode(AIN2,OUTPUT);
pinMode(PWMB,OUTPUT);
pinMode(BIN1,OUTPUT);
pinMode(BIN2,OUTPUT);
pinMode(STBY,OUTPUT);


}


void loop() {
  
  startUp();
  goForward();
  delay(5500);
  turnAround();
  goForward();
  delay(5500);
  turnAround();
  goBackward();
  delay(5500);
  rotateLeft();
  delay(560);
  rotateRight();
  delay(560);
  goForward();
  delay(3000);
  applyBrakes();
  delay(2000);
  }


void goForward ()
{
  digitalWrite (AIN1,HIGH);
  digitalWrite (AIN2,LOW);
  analogWrite(PWMA,234);
  digitalWrite (BIN1,HIGH);
  digitalWrite (BIN2,LOW);
  analogWrite(PWMB,255);  
}


void goBackward ()
{
  digitalWrite (AIN1,LOW);
  digitalWrite (AIN2,HIGH);
  analogWrite(PWMA,233);
  digitalWrite (BIN1,LOW);
  digitalWrite (BIN2,HIGH);
  analogWrite(PWMB,255);  
}


void rotateRight ()
{
  digitalWrite (AIN1,HIGH);
  digitalWrite (AIN2,LOW);
  analogWrite(PWMA,255);
  digitalWrite (BIN1,LOW);
  digitalWrite (BIN2,HIGH);
  analogWrite(PWMB,255);  
}


void rotateLeft ()
{
  digitalWrite (AIN1,LOW);
  digitalWrite (AIN2,HIGH);
  analogWrite(PWMA,255);
  digitalWrite (BIN1,HIGH);
  digitalWrite (BIN2,LOW);
  analogWrite(PWMB,255);  
}


void veerLeft ()
{
  digitalWrite (AIN1,HIGH);
  digitalWrite (AIN2,LOW);
  analogWrite(PWMA,190);
  digitalWrite (BIN1,HIGH);
  digitalWrite (BIN2,LOW);
  analogWrite(PWMB,255);  
}


void veerRight ()
{
  digitalWrite (AIN1,HIGH);
  digitalWrite (AIN2,LOW);
  analogWrite(PWMA,255);
  digitalWrite (BIN1,HIGH);
  digitalWrite (BIN2,LOW);
  analogWrite(PWMB,190);  
}


void applyBrakes ()
{
  digitalWrite (AIN1,HIGH);
  digitalWrite (AIN2,HIGH);
  analogWrite(PWMA,255);
  digitalWrite (BIN1,HIGH);
  digitalWrite (BIN2,HIGH);
  analogWrite(PWMB,255);  
}


void startUp ()
{
  digitalWrite(STBY,HIGH);
}


void turnAround()
{
  rotateLeft();
  delay(1370);
}


void shutDown ()
{
  digitalWrite(STBY,LOW);
}

1/18/2012

How to use the TB6612FNG motor driver with the Arduino for noobs

Pinout of the TB6612FNG motor driver IC
mounted on a breakout board.
It took a few hours of research and trial and error for me to figure out how to use the Toshiba TB6612FNG with my Arduino, but I finally figured it out.  Hopefully I can save someone some trouble by posting all of the information here.

This information is referring to the Toshiba TB6612FNG , sold on breakout boards as the Sparkfun Motor Driver 1A Dual TB6612FNG and the Pololu Dual DC Motor Driver 1A.  Refer to the picture at the left for the rest of this post for pinout information.  

A few TB6612FNG links:

At first I was under the impression that you just hooked up AO1 and AO2 to one motor, BO1 and BO2 to the other motor, and PWMA to one PWMA to one PWM output and PWMB to another PWM output.  It turns out, you have to make every connection on the TB6612FNG chip to get it to work properly.   I'll cover them one by one.

From the top left of the diagram, working counter-clockwise:
GND - Connect to the ground terminal on the Arduino board
VCC  - Connect to the 5V VCC on the Arduino board.
AO1 - Connect to the negative lead of motor A.
AO2 - Connect to the positive lead of motor A.
BO2 - Connect to the positive lead of motor B.
BO1 - Connect to the negative lead of motor B.
VMOT - Connect to the positive side of the power source you are using to power the motors.
GND - Connect to the negative side of the power source you are using to power the motors.
PWMA - Connect to PWM pin on the Arduino.  On the Arduino Uno, this would be either pin 3,5,6,9,10,or 11.
AIN2 - Connect to a digital pin on the Arduino.
AIN1 - Connect to a digital pin on the Arduino.
STBY - Connect to a digital pin on the Arduino.
BIN1 - Connect to a digital pin on the Arduino.
BIN2 - Connect to a digital pin on the Arduino.
PWMB - Connect to a PWM pin on the Arduino.  On the Arduino Uno, this would be either pin 3,5,6,9,10,or 11.
GND - Connect to the ground of the Arduino.

Now that you have the connections made, it is easy to use the controller to make your motors go.  Basically, you make motor A move clockwise by setting AIN1 to HIGH, AIN2 to LOW, and sending a value between 1 and 255 to PWMA.  STBY will need to be set HIGH also for any motor control to happen.

Also, your mileage may vary, but I found that my motors would not function reliably unless I used a minimum PWM value of 35.  This is probably a function of motor size, power source, robot weight, etc.

So, to go forward you would need to program:
STBY - HIGH
AIN1 - HIGH
AIN2 - LOW
PWMA - 255
STBY - HIGH
BIN1 - HIGH
BIN2 - LOW
PWMB - 255

Backwards would be the same as the above, except AIN1 and BIN1 would be LOW while AIN2 and BIN2 would be high.

So, the IN1 and IN2 pins determine direction, while the PWM pins control speed.  You should be able to use this information to figure out how to do all sorts of turns and maneuvers.

Don't forget the STBY pin must be high for the chip to work!
  

1/16/2012

Cluster Bot build on the Pololu round robot chassis kit -assembly videos - $25 kit

The Cluster Bot - an Arduino controlled robot built on a Pololu round robot
frame and powered by a Tamiya twin-motor gearbox driven by a Toshiba
TB6612FNG motor driver I.C.
I ordered the Pololu round robot chassis kit from Robotshop.com last month, and am finally getting around to putting it together.  The kit was only $25 and included a frame, a Tamiya twin-motor gearbox kit (RB-Tam-01), ball caster kit (RB-Tam-11), and truck tires (RB-Tam-13).  I also ordered a 1 amp Pololu dual motor driver board.

You have to assemble everything that came in the kit, most notably the twin-motor gearbox.  I was apprehensive because of all the small gears and pieces, but it ended up being pretty straightforward.  It took me 40 minutes from box opening to finishing up assembly of the gearbox, and I was moving extra methodically.  If I had to put another one together right now, it would take 10 minutes tops.

The rest of the assembly was a breeze, as you can see from the YouTube videos I posted below.  As of this writing, the only thing I have left to do is install the arduino board and breadboard on the chassis and hookup the motor wires.

Like I mentioned this kit seems to be a great deal, if the gearbox works out ok.  I was very surprised to find the kit came with an extra caster and two wheels.  If I build my own simple chassis and use a couple of servos, I can use the caster and wheels/tires to make another bot.

If I had it to do over again, I would cut my own chassis.  The acrylic Pololu chassis from RobotShop is nice, but I can save the $6 and make one that has holes exactly where I want them.  The Tamiya gearbox motor is only 9.99, the casters are about $6 for both, and the tire/wheel set is $4.50.  Add the Pololu motor drivers at $9 apiece.  With these materials you can build two complete robots for $24 apiece, provided you supply the chassis and an arduino.

Edit - If you do buy the Pololu round robot chassis, consider buying or making a top shelf.  The bottom will really only be able to hold batteries at best.  The reason - there are very few places on the bottom you will be able to drill and screw into because of the size of the Tamiya twin-motor gearbox right below.  I had to get very creative with the parts I had on hand to make it work, and it was a little frustrating.

I also found it someone difficult to get the balance right.  The only way I was able to balance the robot without doing a complete redesign was to basically build an outrigger to put the 9 volt battery pack onto.  Kind of a funky looking design, but in a way I like it.  I'm learning a lot on this first robot build.  I'll pay attention to mounting locations for standoffs and weight distribution foremost on my next build.

Hope you enjoy my assembly videos below.  I'll make another post when I start connecting the electronics and bringing this robot to life.  I'm really hoping this chassis works out - if it does I will have a cheap platform for some of my social robotics projects.













1/13/2012

An Arduino simulation of a blind draw scenario for a football pool

A friend at work proposed an interesting problem to me last week.  He told me about a football pool he and 5 others were doing.  The twelve teams that made the NFL playoffs were put into a hat.  Each of the 6 people blindly draw two teams.  Each person puts up 20 bucks.  If you drew the team that made it to the superbowl and lost, you got the 20 back.  If you drew the team that won the superbowl, you'd win 100 bucks.

So, out of 12 teams, there were 2 winners and 10 losers.  His question is "does it matter which order the participants draw their teams in?"  I told him I didn't think it mattered.  He seemed to think differently.

The dilemma is - the first person to draw was assured that the winner was still in the hat, but there were also more losers in the hat.  The last person to draw could many times be drawing dead, with the winner already having been drawn.  Long story short - I didn't think it mattered which order you drew in, while he thought it was clearly better to choose last.

I don't know how to do the math, so I proposed a computer simulation instead.  To simplify the simulation, I will have only one winner and five losers.  There will be six people drawing randomly, and the first person to draw the number '2' out of numbers 1-6 will be declared the winner for that round.  I'll keep track how many times each drawing position picks the winner, then run the simulation a large number of times.  100,000 iterations ought to be sufficient.

A quick pseudocode for the program:
1. Define six variables to store the results in.
2. Pick a random number for player1, player2, etc until the number '2' is drawn.
3. As losers are drawn, remove those numbers from the random possibilities.
4. Add 1 to the total for the winning player.
5. Repeat in a for loop and report results every 1000 iterations.

Here's the code I have so far...it's not working yet.  On test runs, I am getting more than 32,000 wins total out of  32,000 draws.  There must be some logical problem with my if..else construction.  I'll update this post when I get it fixed.  If someone can see my error, please chime in.

void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);
}
void loop() {
randomSeed(analogRead(0));
int player1,player2,player3,player4,player5,player6,iterations,i;
iterations = 32000;
// Pick a random number for the current player.  If the current
// player picks '1', add 1 to their total.  Otherwise draw again
// for the next player, subtracting 1 from the number of picks to
// draw from.
for (i = 0;i<iterations;i++){
if (random(1,7)==1) {player1++;}
else if (random(1,6)==1) {player2++;}
else if (random(1,5)==1) {player3++;}
else if (random(1,4)==1) {player4++;}
else if (random(1,3)==1) {player5++;}
else player6++;
}
// If the draw is a multiple of 1,000 - print the current results to the Serial monitor.
//if ((i%1000)==0) {
Serial.print("# ");
Serial.print(i);
Serial.print(" Plr 1: ");
Serial.print(player1);
Serial.print(" Plr 2: ");
Serial.print(player2);
Serial.print(" Plr 3: ");
Serial.print(player3);
Serial.print(" Plr 4: ");
Serial.print(player4);
Serial.print(" Plr 5: ");
Serial.print(player5);
Serial.print(" Plr 6: ");
Serial.print(player6);
Serial.println("");
//}
}


Electronic Goldmine - good source for assorted electronic components

Buying in small quantities, it can cost quite a bit to stock up on all the electronic components you'll need for your projects.  I am constantly finding that I need a potentiometer, a certain diode or relay, or a ton of other items.  I've been shopping around trying to find a good deal on electronic components.  Digikey and Mouser are definitely good places to shop, but you will usually only get good prices when you buy the components in larger lots.

I found a site called Electronic Goldmine and it turns out they sell exactly what I was looking for - assortment packs of components for cheap.  I think these are surplus components from various manufacturers.  I spent $68.77 at the Electronic Goldmine and got a huge box of parts.  If you watch the video below, you can compare the items to what I actually received in the bag to determine if it was a good value or not.  The first item I open is the 'Super Radial Capacitor Assortment' and it is literally hundreds of electrolytic capacitors in all sizes for only $6.50.  Easily a $20 box of caps.  Here's the breakdown on what I bought:

1.00 - Giant CDS Cell
2.99 - Miniature toggle switch assortment
1.99 - Wintek 1 X 24 LCD display module
1.99 - Super relay assortment
2.25 - Heat shrink assortment
1.90 - Super switch assortment (10 pack)
2.00 - 63 Tin 37 Lead rosin core solder - (This was a bad deal.  Very small amount of solder for the $$)
 .79 - 2 digit common anode red 7 segment LED
1.19 - HP 4 digit 7 segment yellow common anode display
1.29 - HP HDSP-K511 2 digit common anode green 7 segment display
6.50 - Super radial capacitor assortment
1.00 - Battery snap wth leads for 9V battery (3 pack)
2.00 - Super diode assortment
5.00 - Super pot assortment
5.00 - Giant 100 Piece LED Assortment
2.00 - Mini electret microphone assortment
2.49 - disc capacitor assortment
2.49 - voltage regulator assortment
2.49 - Opto assortment
2.49 - Super LED blowout
2.49 - Small relays assortment
2.49 - Bargraph/LED bar displays
2.49 - Super coil assortment
2.49 - Head assortment
2.49 - Small incandescent lamps
2.49 - Test clip assortment
2.49 - 4.5"X1.5" solar cell - bought two of these.  Broke them both. :(  Packaged poorly.