Pieces falling off your ‘bot lately?

Cardboard, sentics, M.A.R.V.I.N., Pickle, drums, dancers, you name it, the robot has been named it and can do it.

What is “it”?  It is life itself.  The god in the machine.

And that, folks, is what we’re doing here today at the Maker Session: Robot Hacks finale — showcasing a few of the dozens of great projects that were worked on the past 18 days.

Screenshots to wet your whistle while you work on your anthropomorphic dreams!:

RobotHacksFinale-001 RobotHacksFinale-002 RobotHacksFinale-003 RobotHacksFinale-004 RobotHacksFinale-005 RobotHacksFinale-006 RobotHacksFinale-007 RobotHacksFinale-008 RobotHacksFinale-009 RobotHacksFinale-010 RobotHacksFinale-011 RobotHacksFinale-012 RobotHacksFinale-013 RobotHacksFinale-014 RobotHacksFinale-015 RobotHacksFinale-016 RobotHacksFinale-017

Thanks again to the folks at MAKE and GE.

Two observations — one, we need to get young people more involved, and two, let’s hope those who started keep the excitement going onto even more ambitious projects!

The final version of the “storybook” for today’s presentation

Here’s the final version of the “storybook” (i.e., an open source computer program) that was downloaded into an Arduino microcontroller for presentation as a desktop art sculpture (a/k/a dancebot):

/* Desktop art sculpture by Team Tree Trunk, November 2013
(Rick Hill, Janeil Hill and Jennifer Nye (with influence by Abi Leggette))

Created in conjunction with the Robot Hacks event sponsored by
MAKE magazine and GE, 3-20 November 2013.

This project was inspired by the work of Erin Kennedy, aka RobotGrrl.

Once upon a time, there were five photosensitive cells that wanted
to play together.

They were gathered inside a dark rectangular box when they felt
a commotion.

It was a two-eyed entity that called itself an ultrasonic sensor,
telling the five photosensitive cells that ultrasonic sensors are
like the bat or other creature that uses echolocation to describe
its  environment.

The six of them looked up and saw the big shadow and shape of
a giant that had lifted the lid of their box, exposing them to light,
showing them a world they had never seen before, full of odd
shapes and more entities just like themselves.

The giant removed them from the box and attached their legs into
holes that connected to rows of entities already in place, with
names like resistor, wire, LED and a complicated entity called
the Arduino.

The giant then played with them and gave them power.

They were more alive than ever before!

Excitedly, they joined with the wires, resistors, LEDs and Arduino
to move one-armed objects called servos.

Eventually, they left the rows of holes and were glued together
with metal to form a new network of connections inside a
cylindrical box.

The giant told them they were going to become a desktop art sculpture,
a Cubist version of a robot, dissected into its separate parts and put
on display like a Damien Hirst cadaver.

He walked them through a strange language, based on the idea of logic,
that made them more than the sum of their parts...

Five LDRs/photocells and one ultrasonic sensor are pointed outward
in the circular side wall of a hat box.

Each photocell controls the movement of a small analog servo
attached to the lid of the hat box.

The ultrasonic sensor controls the movement of large analog servo
attached to the lid of the hat box, which in turn is connected to
a set of pulleys.

If the distance from an object to the ultrasonic sensor is less than 5,
then all of the servos are returned to their original "zero" position;
otherwise they rotate based on readings from the photocells and ultrasonic sensor.

*/

int photocellPin0 = 0;     // the first photocell is connected to Arduino pin a0
int photocellPin1 = 1;     // the second photocell is connected to Arduino pin a1
int photocellPin2 = 2;     // the third photocell is connected to Arduino pin a2
int photocellPin3 = 3;     // the fourth photocell is connected to Arduino pin a3
int photocellPin4 = 4;     // the fifth photocell is connected to Arduino pin a4
int photocellReading;      // this is what we call the analog reading from the sensor
int yourDistance;          // this is what we call the analog reading from the ultrasonic sensor
int servoPosition;         // this is what we call the servo position between 0 and 180 degrees on a compass

#include <Servo.h> // add a virtual library book called Servo.h for reference
                   // by the logical sentences in this storybook

Servo myservo0;  // create servo object to control a servo on Arduino pin D3
Servo myservo1;  // create servo object to control a servo on Arduino pin D5
Servo myservo2;  // create servo object to control a servo on Arduino pin D6
Servo myservo3;  // create servo object to control a servo on Arduino pin D9
Servo myservo4;  // create servo object to control a servo on Arduino pin D10
Servo myservo5;  // create servo object to control a servo on Arduino pin D11

const int pingPin = 2; // tells the logical sentences that the ultrasonic sensor
                       // is connected to Arduino pin D2

// NOTE: anything that starts with a "/*" and ends with a "*/" is to be ignored
/*
const int closeD = 10; // cm; maximum closest distance - 0 to 10 cm range
const int midD = 20; // cm; maximum hand distance - 10 to 20 cm range
const int farD = 30; // cm; maximum farthest distance - 20 to 30 cm range
*/

int pos = 0;    // variable to store the servo position */

void setup(void) {
 myservo0.attach(3);  // attaches the servo 0 on pin 3 to the servo object
 myservo1.attach(5);  // attaches the servo 1 on pin 5 to the servo object
 myservo2.attach(6);  // attaches the servo 2 on pin 6 to the servo object
 myservo3.attach(9);  // attaches the servo 3 on pin 9 to the servo object
 myservo4.attach(10);  // attaches the servo 4 on pin 10 to the servo object
 myservo5.attach(11);  // attaches the servo 5 on pin 11 to the servo object

  // We'll send debugging information via the Serial monitor
  Serial.begin(9600);

}

// This is the part of the logic that keeps the sensors and servo alive 
void loop(void) {

  // get the ultrasonic sensor raw distance in centimetres
  yourDistance = getDistance(pingPin); 

  // limit the reading from 0 to 50, ignoring smaller or larger numbers
  yourDistance = constrain(yourDistance, 0, 50); 

  // adjust the servo position (0 to 180 degrees) to match the ultrasonic readings (0 to 50)
  servoPosition = map(yourDistance, 0, 50, 0, 180);

  // tell the servo to move to the reading that was just called servoPosition 
  myservo5.write(servoPosition);

  // here's where all the servos are moved to their zero -0- position if
  // the distance from an object to the ultrasonic sensor is less than five -5-
  if (yourDistance < 5)
  {
     myservo0.write(0);
     myservo1.write(0);
     myservo2.write(0);
     myservo3.write(0);
     myservo4.write(0);
  }  

  // if the distance from an object to the ultrasonic sensor is five -5- or more
  // then we do something else;
  // in this case, as shown below, we record what the photocells are reading
  else
  {
  // we repeat this set of logical sentences five times

  //Repetition Number One
  // get the photocell sensor raw reading
  photocellReading = analogRead(photocellPin0);
  Serial.print("Analog reading 0 = ");  // send the phrase in quotes to the serial port
  Serial.println(photocellReading);     // send the raw analog reading to the serial port

  // limit the reading from 0 to 300, ignoring smaller or larger numbers
  photocellReading = constrain(photocellReading, 0, 300);

  // adjust the servo position (0 to 180 degrees) to match the ultrasonic readings (0 to 300)
  servoPosition = map(photocellReading, 0, 300, 0, 180);
  myservo0.write(servoPosition);

  //Repetition Number Two
  photocellReading = analogRead(photocellPin1);  
  Serial.print("Analog reading 1 = ");
  Serial.println(photocellReading);     // the raw analog reading
  photocellReading = constrain(photocellReading, 0, 300);
  servoPosition = map(photocellReading, 0, 300, 0, 180);
  myservo1.write(servoPosition);

  //Repetition Number Three
  photocellReading = analogRead(photocellPin2);  
  Serial.print("Analog reading 2 = ");
  Serial.println(photocellReading);     // the raw analog reading
  photocellReading = constrain(photocellReading, 0, 300);
  servoPosition = map(photocellReading, 0, 300, 0, 180);
  myservo2.write(servoPosition);

  //Repetition Number Four
  photocellReading = analogRead(photocellPin3);  
  Serial.print("Analog reading 3 = ");
  Serial.println(photocellReading);     // the raw analog reading
  photocellReading = constrain(photocellReading, 0, 300);
  servoPosition = map(photocellReading, 0, 300, 0, 180);
  myservo3.write(servoPosition);

  //Repetition Number Five
  photocellReading = analogRead(photocellPin4);  
  Serial.print("Analog reading 4 = ");
  Serial.println(photocellReading);     // the raw analog reading
  photocellReading = constrain(photocellReading, 0, 300);
  servoPosition = map(photocellReading, 0, 300, 0, 180);
  myservo4.write(servoPosition);
  }

  delay(300);  // wait about three tenths of a second to repeat everything in the loop
}

// NOTE: anything that starts with a "/*" and ends with a "*/" is to be ignored

/* boolean ping(int pingPin)
//boolean ping(int pingPin, int ledPin1, int ledPin2, int ledPin3)
{
  int d = getDistance(pingPin); // cm
  boolean pinActivated1 = false;
  boolean pinActivated2 = false;
  boolean pinActivated3 = false; 
  if (d < closeD) { 
    digitalWrite(ledPin1, HIGH);
    digitalWrite(ledPin2, LOW);
    digitalWrite(ledPin3, LOW); 
    myservo5.write(180);
    pinActivated1 = true;
    pinActivated2 = false;
    pinActivated3 = false; 
  } else {
    if (d < midD) {
      digitalWrite(ledPin1, LOW);
      digitalWrite(ledPin2, HIGH);
      digitalWrite(ledPin3, LOW);
      myservo5.write(90);
    pinActivated1 = false;
    pinActivated2 = true;
    pinActivated3 = false; 
    }
    else {
      digitalWrite(ledPin1, LOW);
      digitalWrite(ledPin2, LOW);
      digitalWrite(ledPin3, HIGH); 
      myservo5.write(0);
    pinActivated1 = false;
    pinActivated2 = false;
    pinActivated3 = true; 
  }
  }
//  return pinActivated1, pinActivated2, pinActivated3;
  return pingPin;
} */

// This part of the logical sentences tells the ultrasonic sensor what to say.

int getDistance(int pingPin)
{
  long duration, inches, cm;

  pinMode(pingPin, OUTPUT);
  digitalWrite(pingPin, LOW);
  delayMicroseconds(2);
  digitalWrite(pingPin, HIGH);
  delayMicroseconds(5);
  digitalWrite(pingPin, LOW);

  pinMode(pingPin, INPUT);
  duration = pulseIn(pingPin, HIGH);

  inches = microsecondsToInches(duration);
  cm = microsecondsToCentimeters(duration);
  Serial.print(inches);
  Serial.print("in, ");
  Serial.print(cm);
  Serial.print("cm");
  Serial.println();  
  return(cm); // You could also return inches
}

long microsecondsToInches(long microseconds)
{
  return microseconds / 74 / 2;
}

long microsecondsToCentimeters(long microseconds)
{
  return microseconds / 29 / 2;
}
/*******************************************************************************/
//  This is free software; you can redistribute it and/or
//  modify it under the terms of the GNU Lesser General Public
//  License as published by the Free Software Foundation; either
//  version 2.1 of the License, or (at your option) any later version.
//
//  This is distributed in the hope that it will be useful,
//  but WITHOUT ANY WARRANTY; without even the implied warranty of
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
//  Lesser General Public License for more details.
//
//  You could have received a copy of the GNU Lesser General Public
//  License along with this code; if not, write to the Free Software
//  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
//
/*******************************************************************************/

Sadness and madness…

image

As the desktop interactive art sculpture takes shape, I pause to send more positive thoughts and prayers to our Robot Hacks teammate/friend, Jenn, and to her family also upon news that her father is no longer with us.

Dear, sweet Jenn: you were blessed with a wonderful father who gave you life.  While you grieve — and please take the time to let the grief crash over you like a rogue ocean wave, knocking you off your feet, with surprise waves catching you offguard for months that seem like they’ll never end — give room for happiness and sunshine to brighten your darkest moments in the cold depths of winter blues.

If I could take the pain away, I would, but I won’t because you are a human being, not a robot.

You are a superhero in a parallel universe 200 years from now, rescuing Mars settlements from disaster so as you reminisce with your siblings, dint forget you have a planet that depends on you!

I’ll dedicate our desktop art sculpture to your father — I hope you don’t mind.

Creativity is contagious — catch it!

Well, I humbly speak for the team…

  • from the first inspirations (Jennifer Nye, Abi Leggette and the WCS dance community),
  • to the practical applications engineer (Janeil Hill),
  • to the dreamer who has turned into the nuts-and-bolts design technician (Rick Hill)

…extending a hearty “Thank you!” to the fine folks at MAKE magazine, their publisher/owner and sponsor GE, for the following announcement:

On Nov 19, 2013, at 0:37, Stuart Gannes wrote:

Hi Rick,

We are fascinated by your project and would like to invite you to present at the finale on Wed Nov. 20. Presentation will be about 5-7 minutes, and the audience and Master Makers will be friendly. I am very impressed with your project. Let me know if you are interested.

Best Regards,

Stuart Gannes
Producer

——–

On Tue, Nov 19, 2013 at 6:36 AM, Rick Hill wrote:

Stuart,

Thanks for the honour of the invitation. I’ll organise the notes for our team and present our project at the finale tomorrow. We’ve had fun in our learning/building and will gladly share the two-week journey with the audience and Master Makers.

Again, we appreciate the work behind-the-scenes by your team and the sponsors who helped put this event together. More importantly, we hope it inspires the next generation of Makers to make their dreams and imaginations a reality!

Regards,
Rick Hill
Team Tree Trunk

Sent from my iPad

——–

On Tue, Nov 19, 2013 at 11:13 AM, Stuart Gannes wrote:

You’re welcome Rick. Looking forward to your presentation tomorrow.

Stuart

Don’t forget to sign your release 🙂

You only have to be 10% smarter than your tools

The Entrepreneurs Club announced a new contest today, specifically designed for youths aged 6-16.  Five winners will be awarded an all-expense paid trip to the annual Entrepreneurs Club, where the winners will be encouraged to pitch their dream projects for potential VC funding; alternatively, they will be given a small budget to develop a marketing plan to pitch their dream projects via crowdfunding.

The contest participants will attempt to accomplish the following goals:

  1. Design an autonomous rover*. (One winner will be announced for the best autonomous rover design.)
  2. Launch the rover into the upper atmosphere with a weather balloon**. (One winner will be announced for the best rover launch design.)
  3. Land the rover***. (One winner will be announced for the best rover landing design.)
  4. Retrieve the rover from its predetermined rendezvous point****. (One winner will be announced for the best rover rendezvous point design).

An overall winner will be announced that has shown the best combination of the most innovative and/or accurate achievement of the goals listed above.  In addition to the all-expense paid trip, the overall winner will be allowed to recruit new team members from any of the other contest winners or contest participants to pitch dream projects (primary team size may not exceed seven members).

*The rover must have onboard the following capabilities:

  1. Self-powered — may be any combination of fuel cell, ultracapacitor, nonrechargeable/rechargeable [alkaline, NiMH, NiCad, LiPo, nuclear, etc.] battery, wind, solar cell, or other means clearly documented and demonstrated to the contest judges.
  2. Guidance control system — may be a combination of GPS, 3D visual mapping, solar, magnetic, or other means clearly documented and demonstrated to the contest judges.
  3. Data logging system — must have a means to record location data and broadcast location data periodically, no less than once a minute (location data may include GPS coordinates, geotagged/timestamped photos or other means (see number 4 below) to record and show the rover’s current location), keeping onboard its total journey information or other means of remote storage of data logging information clearly documented and demonstrated to the contest judges.
  4. Environmental measurement and collection tools — may be a combination of air/land/water temperature, humidity, water salinity/pH, atmosphere/soil/water contents, biological sampling, or other means clearly documented and demonstrated to the contest judges.
  5. Additional features will be allowed as long as they are clearly documented and demonstrated to the contest judges.
  6. NOTE: Keep in mind that the rover may arrive at the rendezvous point by air, land and/or water.  The most/efficient use of all three will increase the chance of winning for the contest participant(s).

** A list of preapproved weather balloon suppliers will be provided.

*** The rover landing may include the following:

  1. Balloon remnants still attached.
  2. Balloon remnants detached.
  3. Parachute deployment.
  4. Self-guided UAV (powered or unpowered).
  5. Descent deceleration thrusters.
  6. Aquatic vehicle capabilities (surface/submarine).
  7. Additional landing features will be allowed as long as they are clearly documented and demonstrated to the contest judges.

****The rendezvous point must be preapproved by the contest judges before the rover is launched.  The time from launch of the rover to retrieval of the rover at the rendezvous point must take no longer than 48 hours.  The contest participants and their preapproved equipment must be in full view of the contest judges and/or their official representatives during the 48-hour period.