STEM Sussex Big Bang Fair requires loud, bright attractions to engage with the visiting students.

ST3Mbot meets those needs. He started life as an old flip top bin, that had a nice Chrome lid (or head). I chopped the bin in half with a dremel, and welded a square frame of 20x40 ERW steel on which to mount the legs.

I cut holes to mount 3 sr04 ultrasonic units, a thermal printer and a grill for the speaker. I welded on a couple of M16 bolts to the sides to hold the legs. The legs were made of old library shelving, 50x50 box steel. Welded into a T to hold the drive wheels. For the neck I reinforced the plastic bin base with MDF, and welded a couple of bolt brackets to the steel frame to hold it in place. Originally I was going to have one R2 style "eye", but sketches looked good with a couple of Neopixel eyes so that's what I did.

// NeoPixel Ring simple sketch (c) 2013 Shae Erisson
// released under the GPLv3 license to match the rest of the AdaFruit NeoPixel library
// Set as Leonardo 5V 16Mhz - Device is 5V 16MHz Pro micro clone

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
  #include <avr/power.h>

// set pin out and LED no
#define PIN            2
#define NUMPIXELS      12
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
//set delay in microseconds
int delayval = 100;

void setup() {
  pixels.begin(); // This initializes the NeoPixel library.

void loop() {
  // first NeoPixel is 0, second is 1
  for(int i=0;i<NUMPIXELS;i++){
    // pixels.Color takes RGB values, from 0,0,0 up to 255,255,255
    pixels.setPixelColor(i, pixels.Color(25,0,0));;

I checked the R2 builders form for the best way to rotate the head, and it seems that a "lazy susan" easily bought from eBay is what most folk use. I fitted an MDF base mounted a couple of L brackets to bolt to the chrome head.

In the centre of the lazy susan I mounted an old servo I've had laying around since Technogames in 2000, the photo shows the original set- up, with a rigid mecano bar fixing the servo to the neck. Testing showed this was a problem, and I later rigged up a bungee cord to give a bit of slack in the system, as the original bar had no slack, and the servo was getting a bit hot.

I used a trinket pro arduino for the servo which has enough power output to run the servo directly.

#include <Arduino.h>

 HC-SR04 Ping distance sensor:
 VCC to arduino 5v 
 GND to arduino GND
 Echo to Arduino pin 7 
 Trig to Arduino pin 8
 Echo to Arduino pin 9
 Trig to Arduino pin 10
  Echo to Arduino pin 11 
 Trig to Arduino pin 12
 This sketch originates from Virtualmix:
 Has been modified by Winkle ink here:
 And modified further by ScottC here:
 on 10 Nov 2012.
 Modified to turn head of ST3M droid using servo

#include <Servo.h>

#define echoPin1 7 // Echo Pin
#define trigPin1 8 // Trigger Pin
#define echoPin2 9 // Echo Pin
#define trigPin2 10 // Trigger Pin
#define echoPin3 11 // Echo Pin
#define trigPin3 12 // Trigger Pin

Servo myservo;  // create servo object to control a servo
int maximumRange = 200; // Maximum range needed
int minimumRange = 0; // Minimum range needed
long duration1, duration2, duration3, distance;// Duration used to calculate distance
int servoposition = 0;//initialise servo

void setup() {
 Serial.begin (9600);
 pinMode(trigPin1, OUTPUT);
 pinMode(echoPin1, INPUT);
 pinMode(trigPin2, OUTPUT);
 pinMode(echoPin2, INPUT);
 pinMode(trigPin3, OUTPUT);
 pinMode(echoPin3, INPUT);
 myservo.attach(6);  // attaches the servo on pin 6 to the servo object


void loop() {
/* The following trigPin/echoPin cycle is used to determine the
 distance of the nearest object by bouncing soundwaves off of it.

 Add a loop to get closest object
 digitalWrite(trigPin1, LOW);
 digitalWrite(trigPin2, LOW);
Read more »