Project showcase
3D Printed R2-D2 with an Arduino Core

3D Printed R2-D2 with an Arduino Core © CC BY-NC-ND

The most famous droid in history built in a easy way.

  • 3,695 views
  • 1 comment
  • 6 respects

Components and supplies

Necessary tools and machines

3drag
3D Printer (generic)

About this project

presentation of the project

I created this project for my sister, I had the Pololu Round Robot Chassis Kit so I created all the parts to make it fit. I created different versions of stl files, some have holes for sensors, it depends by what you want to create. I chose ultrasonic sensor to avoid impacts, Bluetooth module to control R2D2 with my smart phone. On line there are many apps, I have still to decide which one I want to use.

The very first video, it was just after printing all the parts

The head has a hole for the LED. The base has a hole for an on/off switch. I use a servo to move the head (I want to switch to a stepper motor). With the speaker I'll make it talk.

I tested the servo motor as soon as i bought it

I used adhesive paper to finish the details of R2D2 so I designed and printed the stencils to make some details. You can find here all files to print.

I accept any suggestions or questions.

Code

theend.inoArduino
//notes        I found the sounds  on https://mycontraption.com/sound-effects-with-and-arduino/
const float  note_C0 = 16.35;  //C0
const float  note_Db0 = 17.32;  //C#0/Db0
const float  note_D0 = 18.35;  //D0
const float  note_Eb0 = 19.45;  //D#0/Eb0
const float  note_E0 = 20.6;  //E0
const float  note_F0 = 21.83;  //F0
const float  note_Gb0 = 23.12;  //F#0/Gb0
const float  note_G0 = 24.5;  //G0
const float  note_Ab0 = 25.96;  //G#0/Ab0
const float  note_A0 = 27.5;  //A0
const float  note_Bb0 = 29.14;  //A#0/Bb0
const float  note_B0 = 30.87;  //B0
const float  note_C1 = 32.7;  //C1
const float  note_Db1 = 34.65;  //C#1/Db1
const float  note_D1 = 36.71;  //D1
const float  note_Eb1 = 38.89;  //D#1/Eb1
const float  note_E1 = 41.2;  //E1
const float  note_F1 = 43.65;  //F1
const float  note_Gb1 = 46.25;  //F#1/Gb1
const float  note_G1 = 49;  //G1
const float  note_Ab1 = 51.91;  //G#1/Ab1
const float  note_A1 = 55;  //A1
const float  note_Bb1 = 58.27;  //A#1/Bb1
const float  note_B1 = 61.74;  //B1
const float  note_C2 = 65.41;  //C2 (Middle C)
const float  note_Db2 = 69.3;  //C#2/Db2
const float  note_D2 = 73.42;  //D2
const float  note_Eb2 = 77.78;  //D#2/Eb2
const float  note_E2 = 82.41;  //E2
const float  note_F2 = 87.31;  //F2
const float  note_Gb2 = 92.5;  //F#2/Gb2
const float  note_G2 = 98;  //G2
const float  note_Ab2 = 103.83;  //G#2/Ab2
const float  note_A2 = 110;  //A2
const float  note_Bb2 = 116.54;  //A#2/Bb2
const float  note_B2 = 123.47;  //B2
const float  note_C3 = 130.81;  //C3
const float  note_Db3 = 138.59;  //C#3/Db3
const float  note_D3 = 146.83;  //D3
const float  note_Eb3 = 155.56;  //D#3/Eb3
const float  note_E3 = 164.81;  //E3
const float  note_F3 = 174.61;  //F3
const float  note_Gb3 = 185;  //F#3/Gb3
const float  note_G3 = 196;  //G3
const float  note_Ab3 = 207.65;  //G#3/Ab3
const float  note_A3 = 220;  //A3
const float  note_Bb3 = 233.08;  //A#3/Bb3
const float  note_B3 = 246.94;  //B3
const float  note_C4 = 261.63;  //C4
const float  note_Db4 = 277.18;  //C#4/Db4
const float  note_D4 = 293.66;  //D4
const float  note_Eb4 = 311.13;  //D#4/Eb4
const float  note_E4 = 329.63;  //E4
const float  note_F4 = 349.23;  //F4
const float  note_Gb4 = 369.99;  //F#4/Gb4
const float  note_G4 = 392;  //G4
const float  note_Ab4 = 415.3;  //G#4/Ab4
const float  note_A4 = 440;  //A4
const float  note_Bb4 = 466.16;  //A#4/Bb4
const float  note_B4 = 493.88;  //B4
const float  note_C5 = 523.25;  //C5
const float  note_Db5 = 554.37;  //C#5/Db5
const float  note_D5 = 587.33;  //D5
const float  note_Eb5 = 622.25;  //D#5/Eb5
const float  note_E5 = 659.26;  //E5
const float  note_F5 = 698.46;  //F5
const float  note_Gb5 = 739.99;  //F#5/Gb5
const float  note_G5 = 783.99;  //G5
const float  note_Ab5 = 830.61;  //G#5/Ab5
const float  note_A5 = 880;  //A5
const float  note_Bb5 = 932.33;  //A#5/Bb5
const float  note_B5 = 987.77;  //B5
const float  note_C6 = 1046.5;  //C6
const float  note_Db6 = 1108.73;  //C#6/Db6
const float  note_D6 = 1174.66;  //D6
const float  note_Eb6 = 1244.51;  //D#6/Eb6
const float  note_E6 = 1318.51;  //E6
const float  note_F6 = 1396.91;  //F6
const float  note_Gb6 = 1479.98;  //F#6/Gb6
const float  note_G6 = 1567.98;  //G6
const float  note_Ab6 = 1661.22;  //G#6/Ab6
const float  note_A6 = 1760;  //A6
const float  note_Bb6 = 1864.66;  //A#6/Bb6
const float  note_B6 = 1975.53;  //B6
const float  note_C7 = 2093;  //C7
const float  note_Db7 = 2217.46;  //C#7/Db7
const float  note_D7 = 2349.32;  //D7
const float  note_Eb7 = 2489.02;  //D#7/Eb7
const float  note_E7 = 2637.02;  //E7
const float  note_F7 = 2793.83;  //F7
const float  note_Gb7 = 2959.96;  //F#7/Gb7
const float  note_G7 = 3135.96;  //G7
const float  note_Ab7 = 3322.44;  //G#7/Ab7
const float  note_A7 = 3520;  //A7
const float  note_Bb7 = 3729.31;  //A#7/Bb7
const float  note_B7 = 3951.07;  //B7
const float  note_C8 = 4186.01;  //C8
const float  note_Db8 = 4434.92;  //C#8/Db8
const float  note_D8 = 4698.64;  //D8
const float  note_Eb8 = 4978.03;  //D#8/Eb8
  int cont=0;
  
  //ultrasonic sensors
  const int trigPin = 2;
const int echoPin = 4;
  int forward;
  long duration; 
  long cm=100;
  
  
  int speakerPin = 3; // speaker connected to digital pin 9 
const int motor1Pin = 7;    // H-bridge leg 1 (pin 2 of H bridge)
const int motor2Pin = 8;    // H-bridge leg 2 (pin 7of H bridge)
const int enablePin = 5;    // H-bridge enable pin 1 
const int enablePin2 = 6;    // H-bridge enable pin 9
const int motor21Pin = 9;    // H-bridge leg 1 (pin 15 of H bridge
const int motor22Pin = 10;    // H-bridge leg 2 (pin 10 of bridge)
  
  int led=12;//red terminal of rgb led
  int led2=13;//blue terminal of rgb led
int incomingByte;      // a variable to read incoming serial data into
  

#include <Servo.h> // 
 
Servo myservo;  // 
               
 
int pos = 1500; 

  
void setup() {
  Serial.begin(9600); // open serial port to receive data
  myservo.attach(11);
    pinMode(speakerPin, OUTPUT); // sets the speakerPin to be an output 
  // set all the other pins you're using as outputs:
  pinMode(motor1Pin, OUTPUT);
  pinMode(motor2Pin, OUTPUT);
  pinMode(enablePin, OUTPUT);
  pinMode(motor21Pin, OUTPUT);
  pinMode(motor22Pin, OUTPUT);
   pinMode(enablePin2, OUTPUT);
   
   pinMode(led, OUTPUT);
   pinMode(led2, OUTPUT);
  // set enablePin high so that motor can turn on:
  digitalWrite(enablePin, LOW);
  digitalWrite(enablePin2, LOW);
  
   r2D2(); //starting sound
      delay(500);
}
  
void loop() {
  
  
   if (Serial.available() > 0) {
    // read the oldest byte in the serial buffer:
    incomingByte = Serial.read();
    //up
    if (incomingByte == '1') {
      forward++;
      if(forward%40==0){
        pinMode(trigPin, OUTPUT);
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  // Read the signal from the sensor: a HIGH pulse whose
  // duration is the time (in microseconds) from the sending
  // of the ping to the reception of its echo off of an object.
  pinMode(echoPin, INPUT);
  duration = pulseIn(echoPin, HIGH);

  // convert the time into a distance

  cm = microsecondsToCentimeters(duration);}
      
      
      
      
      
      
      if(cm>15){
      digitalWrite(led, LOW);//change color of led
   digitalWrite(led2, HIGH);
      analogWrite(enablePin, 200);  // turn on the motor 1
      digitalWrite(motor1Pin, LOW);   // set leg 1 of the H-bridge low
      digitalWrite(motor2Pin, HIGH);  // set leg 2 of the H-bridge high
      
      
      analogWrite(enablePin2, 200);  // turn  on  second motor
      digitalWrite(motor21Pin, LOW);   // set leg 1 of the H-bridge low
      digitalWrite(motor22Pin, HIGH);  // set leg 2 of the H-bridge high
      delay(10);
      digitalWrite(enablePin, LOW);  // turn off motor 1
      digitalWrite(enablePin2, LOW);  // turn off motor 2
    }else
    {    pinMode(trigPin, OUTPUT);
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  // Read the signal from the sensor: a HIGH pulse whose
  // duration is the time (in microseconds) from the sending
  // of the ping to the reception of its echo off of an object.
  pinMode(echoPin, INPUT);
  duration = pulseIn(echoPin, HIGH);

  // convert the time into a distance

  cm = microsecondsToCentimeters(duration);
    
    
    }
     
     
     
     
     
     
     
      cont=0;
      
      
   }//down
    else if (incomingByte == '2') {
      digitalWrite(led, LOW);  //change color of led
   digitalWrite(led2, HIGH);
      analogWrite(enablePin, 200);  // turn on the motor 1
      digitalWrite(motor1Pin, HIGH);   // set leg 1 of the H-bridge high
      digitalWrite(motor2Pin, LOW);  // set leg 2 of the H-bridge low
      
      
      analogWrite(enablePin2, 200);  // turn  on  second motor
      digitalWrite(motor21Pin, HIGH);   // set leg 1 of the H-bridge high
      digitalWrite(motor22Pin, LOW);  // set leg 2 of the H-bridge low
      
            delay(10);
      digitalWrite(enablePin, LOW);  // turn off motor 1
      digitalWrite(enablePin2, LOW);  // turn off motor 2
      
      cont=0;
      
    }     //left
    else if (incomingByte == '3') {
      digitalWrite(led2, LOW);
   digitalWrite(led, HIGH);
   
   
    digitalWrite(enablePin2, HIGH);    // turn  on  second motor
      digitalWrite(motor21Pin, LOW);   // set leg 1 of the H-bridge low
      digitalWrite(motor22Pin, HIGH);  // set leg 2 of the H-bridge high
      delay(10);
      
      digitalWrite(enablePin2, LOW);   // turn off motor 2
   
   
   cont=0;

    }
    
    //right 
    
     else if (incomingByte == '4') {
    digitalWrite(led2, LOW);
   digitalWrite(led, HIGH);
   
      digitalWrite(enablePin, HIGH);  // turn  on motor 1
      digitalWrite(motor1Pin, LOW);   // set leg 1 of the H-bridge low
      digitalWrite(motor2Pin, HIGH);  // set leg 2 of the H-bridge high
      
      
     
      
            delay(10);
      digitalWrite(enablePin, LOW);  // turn off motor 1
  
      cont=0;
      
      
    }     
  
  //triangle
    else if ((incomingByte == '9')&&(cont==0)) {
   cont++;
      ohhh();
   delay(500);
  
      
      
     
    }  
  
  
  //x
   else if ((incomingByte == '7')&&(cont==0)) {
cont++;

  catcall();
      delay(500);
      
      
      
      
    }  
    
       else if (incomingByte == '8') {


      pos=pos+35;
      if(pos<2000){myservo.writeMicroseconds(pos);}
      else{pos=2000;}
      delay(10);
      cont=0;
      
      
      
    }  
    
    
    
       else if (incomingByte == 'A') {
cont=0;
 pos=pos-35;
      if(pos>1000){myservo.writeMicroseconds(pos);}
 else{pos=1000;}
      delay(10);
      
      
      
      
    }  
    
    
    
    
    
  
  
  
  
  
  }
  
}


     // functions made by https://mycontraption.com/sound-effects-with-and-arduino/
void beep (int speakerPin, float noteFrequency, long noteDuration)
{    
  int x;
  // Convert the frequency to microseconds
  float microsecondsPerWave = 1000000/noteFrequency;
  // Calculate how many HIGH/LOW cycles there are per millisecond
  float millisecondsPerCycle = 1000/(microsecondsPerWave * 2);
  // Multiply noteDuration * number or cycles per millisecond
  float loopTime = noteDuration * millisecondsPerCycle;
  // Play the note for the calculated loopTime.
  for (x=0;x<loopTime;x++)   
          {   
              digitalWrite(speakerPin,HIGH); 
              delayMicroseconds(microsecondsPerWave); 
              digitalWrite(speakerPin,LOW); 
              delayMicroseconds(microsecondsPerWave); 
          } 
}     
     


void r2D2(){
          beep(speakerPin, note_A7,100); //A 
          beep(speakerPin, note_G7,100); //G 
          beep(speakerPin, note_E7,100); //E 
          beep(speakerPin, note_C7,100); //C
          beep(speakerPin, note_D7,100); //D 
          beep(speakerPin, note_B7,100); //B 
          beep(speakerPin, note_F7,100); //F 
          beep(speakerPin, note_C8,100); //C 
          beep(speakerPin, note_A7,100); //A 
          beep(speakerPin, note_G7,100); //G 
          beep(speakerPin, note_E7,100); //E 
          beep(speakerPin, note_C7,100); //C
          beep(speakerPin, note_D7,100); //D 
          beep(speakerPin, note_B7,100); //B 
          beep(speakerPin, note_F7,100); //F 
          beep(speakerPin, note_C8,100); //C 
}




void catcall() {
  for (int i=1000; i<5000; i=i*1.05) {
    beep(speakerPin,i,10);
  }
 delay(300);
 
  for (int i=1000; i<3000; i=i*1.03) {
    beep(speakerPin,i,10);
  }
  for (int i=3000; i>1000; i=i*.97) {
    beep(speakerPin,i,10);
  }
}

void ohhh() {
  for (int i=1000; i<2000; i=i*1.02) {
    beep(speakerPin,i,10);
  }
  for (int i=2000; i>1000; i=i*.98) {
    beep(speakerPin,i,10);
  }
}

void uhoh() {
  for (int i=1000; i<1244; i=i*1.01) {
    beep(speakerPin,i,30);
  }
  delay(200);
  for (int i=1244; i>1108; i=i*.99) {
    beep(speakerPin,i,30);
  }
}


long microsecondsToCentimeters(long microseconds)
{
  // The speed of sound is 340 m/s or 29 microseconds per centimeter.
  // The ping travels out and back, so to find the distance of the
  // object we take half of the distance travelled.
  return microseconds / 29 / 2;
}

Schematics

Schematics
As you can see I used a power bank as a power supply. The motors are driven by the H bridge. The speaker is controlled with PWM. And the RGB led is used to blink red and blue light.
Circuit

Comments

Similar projects you might like

3D Printed and Expandable Robot for Arduino

Project showcase by Matthew Hallberg

  • 2,858 views
  • 3 comments
  • 14 respects

3D Printed Prosthetic Hand with Capacitive Touch Sensing

Project tutorial by Amal Mathew

  • 3,560 views
  • 6 comments
  • 23 respects

Otto DIY+ Arduino Bluetooth Robot Easy to 3D Print

Project tutorial by Team Otto builders

  • 48,195 views
  • 117 comments
  • 162 respects

Take Control Over Lego Power Functions

Project tutorial by Patrick Müller

  • 43,671 views
  • 3 comments
  • 60 respects

3D Printed Stepper Motor

Project tutorial by Anthony Garofalo

  • 13,967 views
  • 10 comments
  • 58 respects

Littlearm 2C: Build a 3D Printed Arduino Robot Arm

Project tutorial by Slant Concepts

  • 4,874 views
  • 1 comment
  • 35 respects
Add projectSign up / Login