Most of the other parts of this series will be about the Galileo Board and the software driving the project. This installment is about the object itself, which to me is the most important.
The Bees
The visible parts all come from my work as a Tech Disrupter at the Intel Experience store.
–
The idea of doing something bee themed actually came in mid December with the honeycombed bottom of a Mitsubishi VCR. The honeycombing provides strength to the plastic so the manufacturer can use less material.
–
I began collecting springs as well. Printers were the best source. The vibration motors came from BrushBots left behind from the races. Although I did collect some from mobile phones. A washer below the spring provides a large stable base. The different types of springs used means each bee has its own personality.
–
The bodies are index card. The best wing configuration turned out to be a combination of brown craft paper and a thin plastic from some discarded packaging. The plastic is about the same weight as overhead transparency sheets and the veining was drawn with sharpies.
–
Each bee motor has salvaged telephone exchange wire extensions. Each joint is protected with clear heatshrink I bought from Electronic City‘s closing sale. Some of the wire was stranded which necessitated soldering on male header pins for breadboarding.
–
The Circuit
With the UNO I would have been tempted to drive the pager motors directly, but with the Galileo’s increased delicacy I decided to seek out the correct way of do things. The most thorough but clear explanation of how to hook up a pager motor the right way came from Precision Microdrives. Instead of surface mount mosfets I used PN2222 transistors. Transistors do not require pull down resistors, but they do require current limiting resistors.
- Motor (from abandoned Brush Bots)
- Vmotor, the 3.3V source (yellow wire in picture below)
- Transistor (PN2222A)
- Current limiting resistor (220 Ω)
- Diode* (*Flyback protection. Optional at this power level. Ideally a Schottky, I used a 1N5817)
- Capacitor* (*Optional for a tiny motor in a non-radio, no-sensor circuit, 10 to 100p, didn’t use)
This is what that circuit looks when multiplied and put into an Arduino protoshield. This is an old shield, but both Adafruit and SparkFun sell good ones.
Using a shield help ease the transfer from the UNO used for preliminary testing and the Galileo. Switching from the UNO lead to the discovery that on the Galileo the I/O pins are pulled up (5V or 3.3V depending) between the Galileo embedded Linux start-up and the Arduino sketch startup. The Bees are angry when woken.
This is ideal for projects using negative logic, but it is kind of a disaster for motor projects using positive logic. I am following this thread about GPIO pins starting high to see if there will be a way to choose.
The Code
This code just tests the bee behavior based on the input of a potentiometer. I’ve also been running into a problem where if the bees have just been left alone for awhile (especially off) the program locks up. When queried on the serial port the identity of the board has switched ports. I have not determined what is happening with that yet, either.
//------------------------------------------------------------ START LICENSE /*The MIT License (MIT) Copyright (c) 2014 Carlyn Maw Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ // ---------------------------------------------------------------- END LICENSE //This code is testing code for the circut to make sure all of the //physical Arduino I/O is working. It checks a potentiometer or other //sensors on the AO PIN and equates it to the future number of mails //in the inbox. //On each pin 9, 10 and 11 are 220 Ohm resistors leading to the bases of //PN2222A transistors. The collector is attached to the motor and the //emitter to ground. //------------------------------------------------- OUTPUTS AND THEIR VARIABLES //the total number of bees bing controlled const int beeTotalNumber = 3; int beePins[beeTotalNumber] = {9, 10, 11 }; //INPUTS AND THEIR VARIABLES int howManyNewEmails = 0; //-------------------------------------------------------- GLOBAL BEE SETTINGS //the number of emails the bees hit maximum freakout. //ideally it should be divisible by the number of //beeActivityLevels int maxBeeVar = 1023; //how many different states the Bees can be in const int beeActivityLevels = 16; //The area that dictates the 16 BeeActivityLevels. int b[beeActivityLevels][beeTotalNumber] = { { 0, 0, 0 }, { 0, 0, 50 }, { 0, 50, 50 }, { 50, 50, 50 }, { 50, 50, 100 }, { 50, 100, 100 }, { 100, 100, 100 }, { 100, 100, 150 }, { 100, 150, 150 }, { 150, 150, 150 }, { 150, 150, 200 }, { 150, 200, 200 }, { 200, 200, 200 }, { 200, 200, 250 }, { 200, 250, 250 }, { 255, 255, 255 }, }; //---------------------------------------------------------------------- SETUP void setup() { Serial.begin(9600); } //----------------------------------------------------------------------- LOOP void loop() { //get the data determining bee behavior howManyNewEmails = analogRead(A0); //Serial.println(howManyNewEmails); //update the bees updateBees(howManyNewEmails, maxBeeVar); //mini-pause delay(10); } //---------------------------------------------------------------- updateBees() void updateBees(int v, int maxVal) { //ignore any values of V above maximum freakout level // v = min(v, maxVal); does not work in Intel Galileo MacOS IDE if (v > maxVal) { v = maxVal; } //map the newly constrained V to the beeActivityLevel array //the top value is 1 less than the number than the array size //because the an array starts with the index number 0 int mappedV = map(v, 0, maxVal, 0, beeActivityLevels-1); //Serial.println(mappedV); //for each bee, get the value it supposed to be and set it there for (int i=0; i <= beeTotalNumber-1; i++){ //Serial.println(b[mappedV][i]); analogWrite(beePins[i], b[mappedV][i]); } }
Related Posts
- Part 1
- This overview
- Part 2
- From Zero to Blink.
- Creating an SD card image and getting a sketch to persist on the Galileo
- UPDATE: Blink on an external LED
- Part 3 (This Post)
- Creating the bees and getting them to work on an Arduino UNO
- Part 4
- Setting up Wifi (very easy, library examples worked immediately)
- Getting the SD card read & write to work (a missing libraries/symlink problem)
- Part 5
- Serial Communication to the Linux Core
- Troubleshooting Python on the Galileo
- Part 6
- Revising the example String to Int code (lack of Null Termination problems)
- Moving the motors over to the Galileo
Pingback: carlynorama | Intel Galileo and Bee Mail Part 6: c string to int on an Arduino
Pingback: carlynorama | Intel Galileo and Bee Mail Part 5: Troubleshooting Python in the Linux Shell
Pingback: carlynorama | Intel Galileo and Bee Mail Part 4: Working with Libraries
Pingback: carlynorama | The Intel Galileo Board and Bee Mail Part 2: Blink
Pingback: carlynorama | The Intel Galileo Board and Bee Mail Part 1: Overview