All prices in Canadian dollars. Free shipping on orders over $150!

News

April 10, 2017

Posted in projects


Solar Powered Beckoning Cat

I picked up a battery powered "beckoning cat" on a to Shanghai, and it has consumed 3 "AA" batteries over a period of 36 months.  Seems like a silly waste of batteries, right?

With spring upon us and some sunny days in Toronto, I decided it was time to put one of our Adafruit Solar Badges to work.  These little badges output 40 milliamps @ 5 volts in direct sunlight, which seemed like enough for our cat.

 

The cat was originally powered by a single AA battery, which provides 1.5 volts.  Being a good engineer, I thought it would be best to give it around the same voltage.  One way accomplish this is with voltage dividing resistors.  

 I won't get into the theory here, but I knew that using lower resistance would consume less power, so I went with 10 ohm and 18 ohm resistors.  This would provide 1.79 volts.

You can learn more about this calculation at LearningAboutElectronics.com

 

It turned out that my efforts to match the voltage were in vain, as with the resistors the cat's arm barely moved in direct sunlight!

Resistors dissipate energy, and it turns out that even these low impedance resistors were sapping too much energy. 

I thought about it, and realized that the reason the cat had an AA battery probably wasn't due to delicate electronics that could only tolerate 1.5 volts...rather, it was for cost savings and packaging.  So I thought, why not just hook the solar cell directly to the cat.

It turns out that this is all the cat needed!  

 The cat even works in lower levels of sunlight:

 

Here's a picture showing how I soldered the wires to the AA battery terminals:

February 25, 2017

Posted in projects


Hungry Hippos

This project is a digital remake classic board game Hungry Hungry Hippos. I decided to try and recreate the motion of the hippos from the game at the push of a button. I knew going into this that the hippos had two main motions: the forward and backward motion of their body and the up and down motion of their head. I figured that I could use a servo to control the body motion and a solenoid to control the head motion. I decided that would program my hippo using an Arduino Mega 2560 R3. I started by 3D printing a head for the hippo and a rack and pinion that would represent the hippo's body. This was an iterative process (it took a few tries to get the pinion to fit on the servo), but I finally ended up with a set of parts that I was happy with.

The next thing I had to do was connect the head to the rack. I knew that the head had to pivot up and down in order to "eat" the marbles, so I attached it to the rack using a hinge and some superglue.

I then started working on attaching the solenoid to the rack and head. I was going to glue it to the rack and use a piece of copper pipe to attach it to the head. However, I quickly realized that the solenoid drew too much power to be powered by the Arduino alone. I was able to resolve this problem using a 9V battery adapter and a TIP120 transistor. (Side note: when working with transistors, make sure you use the right one for your project. I thought I could get away with using a transistor that I had laying around in an electronics kit, and when I went to touch it after hooking it up I almost burnt my fingers.) I then encountered another setback: the solenoid did not have enough pullback force to lift the head. I realized that I either had to get a larger solenoid (which may or may not have solved the problem) or come up with another way to move the head. Since I was short on time, I ultimately ended up putting the solenoid aside for another project.

In the mean time, I got to work on setting up the pinion attached to the servo since I was confident that my rack and pinion system would work. I pressure fit the pinion on the servo and taped the servo on the underside of the box lid I was using as the base for the project. I cut a hole in the box lid so that the pinion would be able to connect with the rack.

At this point it was time to wire everything. I decided to make two hippos so I got everything setup and taped all the wiring and components in place on the bottom of the box lid. I used standard push buttons as the controls and a 9V wall adapter to power the Arduino. The wiring was a little bit messy but it was functional nonetheless.

I then put the finishing touches on the hippos. I realized that I needed more weight on the body in order for the rack and pinion to work so I glued an eraser on top of the rack. As for the new head movement, I found out that if I glued a string to the top of the head and tied it back, the tension would cause the head to move.

In the end, everything came together and I was very pleased with the result. The hippos functioned as expected although they were not great at picking up marbles. Still, they properly recreated the motions of the hippos from the actual games. Check out the video below!

Overall, this was a pretty simple project. I would definitely recommend experimenting with servos. In addition to the 180° servos I used for this project, there are also continuous rotation servos that rotate a full 360°. Servos come in a variety of sizes and can be fitted with a variety of attachments. You can basically handle any type of rotational motion you need using a servo. They are very easy to program as well. For more information on this project, please check out the documentation about it that I wrote for my class on my website. You can also see the code I used to program the hippos on GitHub.

September 16, 2016

Posted in neopixel, projects


NeoPixel Colour Picker

The lighting in my garage was pretty poor, and since we sell lots of NeoPixels, naturally I had a strip lying around!  So I figured NeoPixel LED's would be an efficient and bright way to light the garage!

The lighting in my garage was pretty poor, and since we sell lots of NeoPixels, naturally I had a strip lying around!  So I figured NeoPixel LED's would be an efficient and bright way to light the garage!

Of course I didn't want just an on / off switch, it would be way more fun to be able to pick colours.  So, I grabbed a set of round tactile buttons, and luckily there were red, green, blue, yellow, and gray.  I decided red, green and blue would control the colour, yellow would be "white", and gray would be off.

To control everything I used a Pro Trinket 5V, which is like an Arduino Mini with more pins and USB.  I  used 5 input pins for the switches and one output pin for the NeoPixel Strip.

The buttons are wired to ground, meaning, when you press the button the switch closes and sends a ground (LOW) signal to the Trinket.  I wrote the code so it constantly loops to see what buttons are pressed.  What's nice about this is that I was able to have it see if more than one button is pressed, so you can make more than just Red, Green and Blue!

Programming the Pro Trinket is easy via a microUSB cable.  More details on programming the Pro Trinket can be found in the Adafruit Learning System.

On my first prototype I used a basic solderless breadboard with some hookup wires, but to really finish it off i used an Adafruit Perma-Proto board.  This was a good choice because i could easily mount it to the wall and wire up all the connections.  

Adafruit has a great tutorial on how to use NeoPixels, so I will not get into much detail on how they work.  The important thing to know is that they need a good amount of power if you are using a bunch of them, so I used a hefty 10 amp 5V power supply to run 150 NeoPixels.  Also pay attention to the guide's suggestions regarding capacitors and resistors to avoid damaging your NeoPixels.

You'll want to make sure you install Adafruit's NeoPixel Library and also set your Arduino IDE up for the Pro Trinket.

See below for my Arduino code.  Basically I just took the Adafruit NeoPixel strandtest code and added some logic for the buttons.  Super simple!  

 

 

#include <Adafruit_NeoPixel.h>

#define PIN 4
#define HIGH 1
#define LOW 0

// Parameter 1 = number of pixels in strip
// Parameter 2 = Arduino 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(150, PIN, NEO_GRB + NEO_KHZ800);

// IMPORTANT: To reduce NeoPixel burnout risk, add 1000 uF capacitor across
// pixel power leads, add 300 - 500 Ohm resistor on first pixel's data input
// and minimize distance between Arduino and first pixel. Avoid connecting
// on a live circuit...if you must, connect GND first.

// constants won't change. They're used here to
// set pin numbers:
const int offPin = 10; // the number of the pushbutton pin
const int whitePin = 13;
const int greenPin = 6;
const int redPin = 8;
const int bluePin = 5;

// variables will change:
int offState = 0; // variable for reading the pushbutton status
int whiteState = 0;
int greenState = 0;
int redState = 0;
int blueState = 0;
int pixelSpeed = 10;

void setup() {
strip.begin();
strip.show(); // Initialize all pixels to 'off'
pinMode(offPin, INPUT_PULLUP);
pinMode(whitePin, INPUT_PULLUP);
pinMode(greenPin, INPUT_PULLUP);
pinMode(bluePin, INPUT_PULLUP);
pinMode(redPin, INPUT_PULLUP);
pinMode(13, OUTPUT);
}

void loop() {
// Some example procedures showing how to display to the pixels:
whiteState = digitalRead(whitePin);
offState = digitalRead(offPin);
greenState = digitalRead (greenPin);
blueState = digitalRead (bluePin);
redState = digitalRead (redPin);
if (greenState == LOW | redState == LOW | blueState == LOW) {
colorWipe(strip.Color(255 * (1-redState), 255 * (1-greenState), 255 * (1-blueState)), pixelSpeed); // RGB
}
else if (whiteState == LOW) {
colorWipe(strip.Color(255, 255, 255), pixelSpeed); // WHITE
}
else if (offState == LOW) {
colorWipe(strip.Color(0, 0, 0), pixelSpeed); // WHITE
}
}

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