Introduction: Wombatics Otto Robot

About: Maker of Arduino Compatible boards & Kit sets. Arduino Compatible Robotics Board for Makers and STEM Education

"Wombatics Otto" is to make an Otto DIY Robot with built-in BLE, Motion Sensing and Lithium Battery Charger. The body and head have been changed for easier access to the mainboard and no more hanging wiring.

Source Code & 3D Files for this project are in Github

https://github.com/wombatics/wombatics-otto

The Wombatics SAM01 mainboard is built for projects which need to work with mobile app, servos and motion tracking in mind. With onboard Bluetooth Low Energy (BLE) module, it is compatible with both Android and iOS.
It is ideal for building your own robot such as Otto. This project is a remix of Otto with Wombatics mainboard. More details of Wombatics board.

https://www.wombatics.com

https://github.com/wombatics/sam01

https://www.wombatics.com

Step 1: 3D Printing

3D Printing Setting

Layer Height : 0.2mm
Outline Shells : 3
Fill : 10%
Supports: No

STL Files
2 x OttoDIY_foot_v08.stl
2 x OttoDIY_Leg_v08.stl
1 x Wombatics Otto Body.stl
1 x Wombatics Otto Head.stl

Step 2: Setup the 4 Servos

Connect the servos to D3, D4, D5 and D6 to the mainboard as the diagram below. Connect the mainboard and computer with a micro usb cable.

Step 3: Arduino Setup

Open Arduino IDE under Tools, pick Board: Arduino Nano, Processor: ATmega328P (Old Bootloader) and the correct Port. (USB driver for the wombatics mainboard: http://bit.ly/cp2112-usb-serial )

Step 4: Servo Test

Test whether the servos are working with the (OTTO_Servo_Setup.ino). Leave it at 90 degree at the end for assembling the robot.

#include <Servo.h> 
#include <Oscillator.h>


/*
                 --------------- 
                |     O   O     |
                |---------------|
RIGHT LEG 4==>  |               | <== LEFT LEG 3
                 --------------- 
                    ||     ||
RIGHT FOOT 6==>   -----   ------  <== LEFT FOOT 5
                 |-----   ------|
*/

#define PIN_LEFT_LEG   3   
#define PIN_RIGHT_LEG  4  
#define PIN_LEFT_FOOT  5  
#define PIN_RIGHT_FOOT 6 

#define N_SERVOS 4 // There are four servos 
Oscillator servo[N_SERVOS];

void setup()
{
  servo[0].attach(PIN_LEFT_LEG); 
  servo[1].attach(PIN_RIGHT_LEG); 
  servo[2].attach(PIN_LEFT_FOOT); 
  servo[3].attach(PIN_RIGHT_FOOT); 

  //Test 45 degree
  servo[0].SetPosition(45);
  servo[1].SetPosition(45);
  servo[2].SetPosition(45);
  servo[3].SetPosition(45);
  delay(1000);

  //Test 90 degree
  servo[0].SetPosition(90);
  servo[1].SetPosition(90);
  servo[2].SetPosition(90);
  servo[3].SetPosition(90);
  delay(1000);  

  //Test 135 degree
  servo[0].SetPosition(135);
  servo[1].SetPosition(135);
  servo[2].SetPosition(135);
  servo[3].SetPosition(135);
  delay(1000);  

  // Set Final position to 90 degree for assembly
  servo[0].SetPosition(90);
  servo[1].SetPosition(90);
  servo[2].SetPosition(90);
  servo[3].SetPosition(90);
  
  delay(1000);
  
}

void loop() 
{

}

Step 5: Assembling Part 1 - 3D Printing Parts and Servos

Put two servos into the body and secure them with the screws come with the servos

Join the leg to the body with the servo horn

Put the two servos into the leg, and put the hood onto the leg servos while keeping the servos at 90 degree.

Put the servo wires up to the body through the holes at the bottom of the body

Slide the foot on the leg servo

Step 6: Assembling Part 2 - Mainboard, Servos, Ultrasonic Sensor and Battery

We are going to connect all the electronics to the mainboard and stick the mainboard on the servos with some thick mounting tape.

Here are the two components that we are going to put it. The mainboard and battery.

We'll need this strong mounting tape to fix the mainboard on top of the servos

Put the Ultrasonic sensor in and make sure the wiring are CORRECT! (This is very important, as incorrect wiring can burn the ultrasonic sensor)

Connecting the servos and ultrasonic sensor.

Below show the servo numbers when the robot is facing you. Connect the servos to D3,D4,D5 & D6 with the orange wire on the S pin and brown wire on the - pin.

For the ultrasonic sensor:
- Green wire (Vcc) to any + pin
- Blue wire (Trig) to S pin of D7
- Purple wire (Echo) to S pin of D8
- Grey wire (Gnd) to S any - pin

Connect the battery to the mainboard and hide it inside the body

Stick the mainboard to the servos and tidy up the wiring

Step 7: Testing - Servos

Test again with OTTO_Servo_Setup.ino file and check whether the servo move correctly and return to centre position. It is ok for not returning to exactly

Step 8: Testing - Ultrasonic Sensor

Below is a simple test for the ultrasonic sensor. It will print out the distance measured from the sensor. If the object in front is less than 20cm, it'll turn on the built-in LED (Pin 13) and also play a tone with the built-in buzzer (Pin 12).

/* 
 * Wombatics OTTO - Ultrasonic Test
 * https://www.wombatics.com/
 * https://www.facebook.com/wombaticsco/ 
 * https://github.com/wombatics/
*/

#define trigPin 7
#define echoPin 8
#define led     13
#define buzzer  12


void setup() 
{
  Serial.begin (9600);
  ultrasonicSetup();
  
  pinMode(led, OUTPUT);
  pinMode(buzzer, OUTPUT);
  
}

void loop() 
{
  long distance;

  distance = ultrasonicDistance();

  Serial.print(distance);
  Serial.println(" cm");

  if( distance < 20)
  {
    digitalWrite(led, HIGH);
    tone(buzzer, 100, 10);
  }
  else
  {
    digitalWrite(led, LOW);
  }
  
  delay(100);
}

// Functions for Ultrasonic
void ultrasonicSetup()
{
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
}

long ultrasonicDistance()
{
  long duration, distance;

  digitalWrite(trigPin, LOW);  
  delayMicroseconds(2); 
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10); 
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH, 24000);
  distance =  duration / 58;
  
  if (distance >= 400 || distance <= 0)
  {
    distance = 9999;
  }

  return distance;
}

Step 9:

In Arduino IDE, Open "Tools->Serial Monitor". The distance measured from the ultrasonic sensor will be printed out.

Step 10: Adding Otto Arduino Libraries and Moonwalk

Now we are ready to put everything to work.

First, we need to add Otto Arduino libraries to Arduino libraries. (Documents/Arduino/libraries) Download the "libraries.zip", unzip it and copy the directories to your Arduino libraries directory.

── libraries
│   ├── BatReader
│   ├── EnableInterrupt
│   ├── LedMatrix
│   ├── Oscillator
│   ├── Otto
│   ├── OttoSerialCommand
│   └── US

Step 11: Upload Moonwalking Code

Next, upload the following code ( OTTO_dance.ino ) and it will start moonwalking.

/* 
 * Wombatics OTTO - Moonwalk Dance
 * https://www.wombatics.com/
 * https://www.facebook.com/wombaticsco/ 
 * https://github.com/wombatics/
*/

#include <Servo.h> 
#include <Oscillator.h>
#include <US.h>
#include <Otto.h>

/*
                 --------------- 
                |     O   O     |
                |---------------|
RIGHT LEG 4==>  |               | <== LEFT LEG 3
                 --------------- 
                    ||     ||
RIGHT FOOT 6==>   -----   ------  <== LEFT FOOT 5
                 |-----   ------|
*/

#define PIN_LEFT_LEG   3   
#define PIN_RIGHT_LEG  4  
#define PIN_LEFT_FOOT  5  
#define PIN_RIGHT_FOOT 6 

#define PIN_TRIGGER 7
#define PIN_ECHO    8
#define PIN_LED     13
#define PIN_BUZZER  12

#define TRIM_LEFT_LEG   0 
#define TRIM_RIGHT_LEG  0
#define TRIM_LEFT_FOOT  0
#define TRIM_RIGHT_FOOT 0

Otto Otto;  //This is Otto!

void setup()
{
  Serial.begin(9600);
  
  //Set the servo pins
  Otto.init(PIN_LEFT_LEG,PIN_RIGHT_LEG,PIN_LEFT_FOOT,PIN_RIGHT_FOOT,true, A6, PIN_BUZZER, PIN_TRIGGER, PIN_ECHO);
  Otto.setTrims(TRIM_LEFT_LEG,TRIM_RIGHT_LEG, TRIM_LEFT_FOOT, TRIM_RIGHT_FOOT);
  Otto.home();
  delay(2000);
 
}


void loop()
{
 
  Otto.moonwalker(10);

  delay(3000);
}

Step 12: Avoid Obstacles

Here we can teach Otto how to avoid obstacles. Otto will walk backward and turn when obstacle is detected in front. ( OTTO_avoid.ino )

/* 
 * Wombatics OTTO - Avoid Obstacles
 * https://www.wombatics.com/
 * https://www.facebook.com/wombaticsco/ 
 * https://github.com/wombatics/
*/

#include <Servo.h> 
#include <Oscillator.h>
#include <US.h>
#include <Otto.h>

/*
                 --------------- 
                |     O   O     |
                |---------------|
RIGHT LEG 4==>  |               | <== LEFT LEG 3
                 --------------- 
                    ||     ||
RIGHT FOOT 6==>   -----   ------  <== LEFT FOOT 5
                 |-----   ------|
*/

#define PIN_LEFT_LEG   3   
#define PIN_RIGHT_LEG  4  
#define PIN_LEFT_FOOT  5  
#define PIN_RIGHT_FOOT 6 

#define PIN_TRIGGER 7
#define PIN_ECHO    8
#define PIN_LED     13
#define PIN_BUZZER  12

#define TRIM_LEFT_LEG   0 
#define TRIM_RIGHT_LEG  0
#define TRIM_LEFT_FOOT  0
#define TRIM_RIGHT_FOOT 0

Otto Otto;  //This is Otto!

void setup()
{
  Serial.begin(9600);
  
  //Set the servo pins
  Otto.init(PIN_LEFT_LEG,PIN_RIGHT_LEG,PIN_LEFT_FOOT,PIN_RIGHT_FOOT,true, A6, PIN_BUZZER, PIN_TRIGGER, PIN_ECHO);
  Otto.setTrims(TRIM_LEFT_LEG,TRIM_RIGHT_LEG, TRIM_LEFT_FOOT, TRIM_RIGHT_FOOT);
  Otto.home();
  delay(2000);
 
}

///////////////////////////////////////////////////////////////////
//-- Principal Loop ---------------------------------------------//
///////////////////////////////////////////////////////////////////
void loop() 
{
  bool obstacleDetected = false;
  
  obstacleDetected = obstacleDetector(); 
  
  if(obstacleDetected)
  { 
        Otto.sing(S_surprise); 
        Otto.walk(10,1000,BACKWARD); 
        delay(1000);
        Otto.sing(S_happy);
        Otto.turn(10,1000,RIGHT);                
        delay(2000); 
          
   }        
   else
   { 
          Otto.walk(1,1000,FORWARD);  
    }          
 }  

///////////////////////////////////////////////////////////////////
//-- Function to read distance sensor 
bool obstacleDetector()
{
   int distance = Otto.getDistance();
   
   Serial.println(distance);
   
   if(distance<15)
   {
      return true;
   }
   else
   {
      return false;
   }

}