Matthew Hallberg
Published © CC BY-NC-SA

3D Printed and Expandable Robot for Arduino

This is a very versatile robot with a multitude of features, the chassis can be 3D printed, and there is a lot of room for expansion.

IntermediateShowcase (no instructions)Over 1 day8,440
3D Printed and Expandable Robot for Arduino

Things used in this project

Hardware components

Arduino UNO
Arduino UNO
×1
Dual H-Bridge motor drivers L298
SparkFun Dual H-Bridge motor drivers L298
×1
geared dc motors with wheels
×2
Ultrasonic Sensor - HC-SR04
SparkFun Ultrasonic Sensor - HC-SR04
×1
HC-05 Bluetooth Module
HC-05 Bluetooth Module
×1
9V Battery Clip
9V Battery Clip
×1
9V battery (generic)
9V battery (generic)
×1
SparkFun Breadboard - Mini Modular
×1
Jumper wires (generic)
Jumper wires (generic)
×1
SparkFun LED - RGB Diffused Common Anode
×2
Resistor 330 ohm
Resistor 330 ohm
×3
screws 6-32 X 1/2-inch (Generic)
×1
sand paper (generic)
×1
super glue (generic)
×1

Hand tools and fabrication machines

Regular screwdriver
mini screwdriver
3D Printer (generic)
3D Printer (generic)

Story

Read more

Custom parts and enclosures

3D Files

Individual .stl files with full design in one .123dx file.

Schematics

Connections1

Connections2

Connections3

Code

Bluetooth Voice Control

Arduino
#include <SoftwareSerial.h> 

String command;
int incomingByte = 0;  


int enA = 10;//robot's right motor 
int in1 = 9;
int in2 = 8;

int enB = 5;//robot's left motor
int in3 = 7;
int in4 = 6;

      
int bluepin=A1;//RGB LED pins      
int redpin=A2;    
int greenpin=A3;   
   

void stop()
{
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);  
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);
}

void forward()
{
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  
  analogWrite(enA, 150);//change speeds here 0-255

  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);

  analogWrite(enB, 150);//change speeds here 0-255

  delay(500);//change delay value here to go more forward or less forward
  stop();
}


void backward()
{
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
 
  analogWrite(enA, 150);//change speeds here 0-255

  digitalWrite(in3, LOW);
  digitalWrite(in4, HIGH);

  analogWrite(enB,150);//change speeds here 0-255

  delay(500);
  stop();
}

void right()
{

  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);

  analogWrite(enA, 230);//change speeds here 0-255

  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);

  analogWrite(enB, 230);//change speeds here 0-255
  delay(1000);
  stop();
}

void RGB (int R, int G, int B){

    analogWrite(redpin,R);
    analogWrite(greenpin,G);
    analogWrite(bluepin,B);
}

void setup() {
  RGB(0,0,255); //blue
  Serial.begin(9600);
  pinMode(enA, OUTPUT);
  pinMode(enB, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT); 
}

void loop() {
  while (Serial.available()){ 
  delay(10); 
  char instruction = Serial.read(); 
  if (instruction == '#') {
    break;
    } 
  command = command + instruction; 
  } 

  
  if (command.length() > 0) {
    Serial.println(command);
       if (command == "*forward") {
              forward();
        }  else if (command == "*backward"){
          backward();
          } else if (command == "*turn"){
            right();
          } else if (command == "*red"){
          RGB(255,0,0);
          } else if (command == "*green"){
            RGB(0,255,0);
          } else if (command == "*blue"){
            RGB(0,0,255);
          } 

          

command ="";  
  }

} 

Obstacle Avoiding Code

Arduino
int enA = 10;
int in1 = 9;
int in2 = 8;

int enB = 5;
int in3 = 7;
int in4 = 6;

int trigPin = 2;
int echoPin = 4;
long duration, cm, inches;

int redpin=A1;  
int greenpin=A2;      
int bluepin=A3;

void setup() {

  pinMode(enA, OUTPUT);
  pinMode(enB, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);

  Serial.begin (9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);

}

void forward()
{

  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);

  analogWrite(enA, 180);

  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);

  analogWrite(enB, 180);
}

void backward()
{

  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);

  analogWrite(enA, 150);

  digitalWrite(in3, LOW);
  digitalWrite(in4, HIGH);

  analogWrite(enB, 150);
  
}

void stop()
{
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);  
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);
}

void avoid()
{
  //STOP
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);  
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);
  //BACKUP
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  analogWrite(enA, 150);
  digitalWrite(in3, LOW);
  digitalWrite(in4, HIGH);
  analogWrite(enB, 150);
  delay(1000);
  //TURN
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  analogWrite(enA, 140);
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  analogWrite(enB, 140);
  delay(.001);
  
  
}

void RGB (int R, int G, int B){

    analogWrite(redpin,R);
    analogWrite(greenpin,G);
    analogWrite(bluepin,B);
}

void loop()
{
  RGB(0,0,255); //blue
  delay(1000);

  forward();

  int duration, distance, inch;
  digitalWrite(trigPin, HIGH);
  delay(100);
  digitalWrite(trigPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = (duration/2) / 29.1;
  inch = (distance * 0.3937);

  //Sets object detection distance to 4.5
  if (inch < 15) {
    RGB(255,0,0); //red
    avoid();
    delay(1000);
    forward();
    delay(2000);
   }

}

Bluetooth Control

Arduino
int incomingByte = 0;  
#include <SoftwareSerial.h> 
int enA = 10;//right motor (robot's right)
int in1 = 9;
int in2 = 8;

int enB = 5;//left motor (robot's left)
int in3 = 7;
int in4 = 6;

      
int bluepin=A1; //define RGB LED pins     
int redpin=A2;    
int greenpin=A3; 

int speed = 150; //change speed here, can range from 0 to 255.
   
     
void setup()
{

RGB(255,0,255);//blue

Serial.begin(9600); //Use serial monitor at 9600 for debugging and controlling from computer 
Serial.println("Motor test!");

  pinMode(enA, OUTPUT);
  pinMode(enB, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);

}


void left()
{
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);

  analogWrite(enA, speed);

  digitalWrite(in3, LOW);
  digitalWrite(in4, HIGH);

  analogWrite(enB, speed);
}

void right()
{

  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);

  analogWrite(enA, speed);

  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);

  analogWrite(enB, speed);
}

void forward()
{
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);

  analogWrite(enA, speed);

  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);

  analogWrite(enB, speed);
}

void backward()
{

  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);

  analogWrite(enA, 100);

  digitalWrite(in3, LOW);
  digitalWrite(in4, HIGH);

  analogWrite(enB, 100);
}

void stop()
{
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);  
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);
}

void RGB (int R, int G, int B){

    analogWrite(redpin,R);
    analogWrite(greenpin,G);
    analogWrite(bluepin,B);
}

void loop()
{


    
    if (Serial.available() > 0) {
    incomingByte = Serial.read();
    }
   
  

 switch(incomingByte)
  {
     case 'S':
        
      { stop();
       Serial.println("Stop\n"); 
       incomingByte='*';}
      
     break;
     
     case 'F':
      
     {  forward(); 
       
       Serial.println("Forward\n");
       incomingByte='*';}
     break;
    
      case 'B':
        
    {   backward();
       
       Serial.println("Backward\n");
       incomingByte='*';}
     break;
     
     case 'R':
    
     {  
       right(); 
       Serial.println("Rotate Right\n");
       incomingByte='*';}
     break;

     
       case 'L':

      { 
       left();    
       Serial.println("Rotate Left\n");
       incomingByte='*';}
     break;
     
     case 'W':
        
      { 
       RGB(255,0,0);//red
       Serial.println("Red Eyes");
       incomingByte='*';}
     break;
     
    case 'V':
        
      { 
       RGB(0,255,0);//green 
       Serial.println("Green Eyes");
       incomingByte='*';}
     break;        
  }
    
}

Credits

Matthew Hallberg
8 projects • 55 followers
My name is Matthew and I attend the University of Pittsburgh for Info Sci and CS. I need motivated friends, serious inquiries send me an email.
Contact

Comments

Please log in or sign up to comment.