Sign in

Not a member? | Forgot your Password?

Search blogs

Search tips

Free PDF Downloads

Advanced Linux Programming

What Every Programmer Should Know About Memory

Introduction to Embedded Systems

C++ Tutorial

Embedded Systems - Theory and Design Methodology

Microcontroller Programming and Interfacing

Introduction to Microcontrollers


More Free PDF Downloads

Recent Blogs on EmbeddedRelated

Coding - Step 0: Setting Up a Development Environment
posted by Stephen Friederichs


Book Review: "Turing's Cathedral"
posted by Jason Sachs


Ada - 7 Segments and Catching Errors
posted by Mike Silva


OOKLONE: a cheap RF 433.92MHz OOK frame cloner
posted by Fabien Le Mentec


Practical protection against dust and water (i.e. IP protection)
posted by Dr Cagri Tanriover


Introduction to Microcontrollers

1 - Beginnings

2 - Further Beginnings

3 - Hello World

4 - More On GPIO

5 - Interrupts

6 - More On Interrupts

7 - Timers

8 - Adding Some Real-World Hardware

9 - More Timers and Displays

10 - Buttons and Bouncing

11 - Button Matrix & Auto Repeating

12 - Driving WS2812 RGB LEDs

13 - 7-segment displays & Multiplexing

See Also

ElectronicsDSPFPGA

Embedded Systems Blogs > Lonnie Honeycutt > Arduino robotics #3 - wiring, coding and a test run

Lonnie Honeycutt (contact)
Electronics hobbyist after discovering the Arduino two years ago. Worked as a Wideband and Satcom technician in the USAF. Enjoy sharing my projects with others via blog...show full bio

Would you like to be notified by email when Lonnie Honeycutt publishes a new blog?

  




Pageviews: 1539

Arduino robotics #3 - wiring, coding and a test run

Posted by Lonnie Honeycutt on Oct 17 2013 under Tutorials | Microcontroller   

Arduino Robotics

Arduino robotics is a series of article chronicling my first autonomous robot build, Clusterbot.  This build is meant to be affordable, relatively easy and instructive.  The total cost of the build is around $50.  

1. Arduino robotics - motor control
2. Arduino robotics - chassis, locomotion and power
3. Arduino robotics - wiring, coding and a test run
4. Arduino robotics - HC-SR04 ultrasonic sensor

Connections

Use the chart below as a reference for making connections between the Arduino, TB6612FNG motor driver, motors and battery packs.  I remember that the wires from my 3V battery pack were too thin to connect to the breadboard.  I resolved this by tinning the end of the wire with a bit of solder.  You can either do this, solder pins to the wires, or replace the flimsy wire with proper hookup wire.

 

Arduino Uno TB6612FNG Motor A Motor B 3V battery pack 9V battery pack
GND GND        
5V VCC        
  AO1 - pole      
  AO2 + pole      
  BO2   + pole    
  BO1   - pole    
  VMOT     + pole  
  GND     - pole  
3 PWMA        
1 AIN2        
0 AIN1        
6 STBY        
2 BIN1        
4 BIN2        
5 PWMB        
GND GND        
Barrel conn         Barrel conn

 

The Code

Now we can test the basic functionality of Clusterbot, we just need to write a little code first.  I've decided to make a function for each basic type of movement to keep main as clean as possible.

I'll provide this logic table, derived from the TB6612FNG datasheet, as reference.  It defines how we make the motors spin in the direction and speed that we want.

IN1 IN2 PWM STBY MODE
H H H/L H Short Brake
L H H H CCW
L H L H Short Brake
H L H H CW
H L L H Short Brake
L L H H Stop
H/L H/L H/L L Standby

 

/* Define pinout of Arduino to match physical connections */
#define PWMA 3
#define AIN1 0
#define AIN2 1
#define PWMB 5
#define BIN1 2
#define BIN2 4
#define STBY 6

void setup() {

/* Define all 7 pins as outputs to the TB6612FNG driver */
pinMode(PWMA,OUTPUT);
pinMode(AIN1,OUTPUT);
pinMode(AIN2,OUTPUT);
pinMode(PWMB,OUTPUT);
pinMode(BIN1,OUTPUT);
pinMode(BIN2,OUTPUT);
pinMode(STBY,OUTPUT);

}

void loop() {
  
  startUp();
  goForward();
  delay(5500);
  turnAround();
  goForward();
  delay(5500);
  turnAround();
  goBackward();
  delay(5500);
  rotateLeft();
  delay(560);
  rotateRight();
  delay(560);
  goForward();
  delay(3000);
  applyBrakes();
  delay(2000);
  }

/* Function definitions */
/* Due to variations in motor output, it was found that */
/* a duty cycle of 233 on the left motor and 255 on the */
/* right motor is necessary for approximately straight  */
/* line, full speed travel                              */
/* Testing revealed Clusterbot will do 27 rotations per */
/* minute, with motors turning in opposite direction at */
/* full duty cycle.  This "constant" was used to        */
/* determine the length of time to turn to make 90, 180,*/
/* and 360 degree turns.                                */

void goForward ()
{
  digitalWrite (AIN1,HIGH);
  digitalWrite (AIN2,LOW);
  analogWrite(PWMA,234);
  digitalWrite (BIN1,HIGH);
  digitalWrite (BIN2,LOW);
  analogWrite(PWMB,255);  
}

void goBackward ()
{
  digitalWrite (AIN1,LOW);
  digitalWrite (AIN2,HIGH);
  analogWrite(PWMA,233);
  digitalWrite (BIN1,LOW);
  digitalWrite (BIN2,HIGH);
  analogWrite(PWMB,255);  
}

void rotateRight ()
{
  digitalWrite (AIN1,HIGH);
  digitalWrite (AIN2,LOW);
  analogWrite(PWMA,255);
  digitalWrite (BIN1,LOW);
  digitalWrite (BIN2,HIGH);
  analogWrite(PWMB,255);  
}

void rotateLeft ()
{
  digitalWrite (AIN1,LOW);
  digitalWrite (AIN2,HIGH);
  analogWrite(PWMA,255);
  digitalWrite (BIN1,HIGH);
  digitalWrite (BIN2,LOW);
  analogWrite(PWMB,255);  
}

void veerLeft ()
{
  digitalWrite (AIN1,HIGH);
  digitalWrite (AIN2,LOW);
  analogWrite(PWMA,190);
  digitalWrite (BIN1,HIGH);
  digitalWrite (BIN2,LOW);
  analogWrite(PWMB,255);  
}

void veerRight ()
{
  digitalWrite (AIN1,HIGH);
  digitalWrite (AIN2,LOW);
  analogWrite(PWMA,255);
  digitalWrite (BIN1,HIGH);
  digitalWrite (BIN2,LOW);
  analogWrite(PWMB,190);  
}

void applyBrakes ()
{
  digitalWrite (AIN1,HIGH);
  digitalWrite (AIN2,HIGH);
  analogWrite(PWMA,255);
  digitalWrite (BIN1,HIGH);
  digitalWrite (BIN2,HIGH);
  analogWrite(PWMB,255);  
}

void startUp ()
{
  digitalWrite(STBY,HIGH);
}

void turnAround()
{
  rotateLeft();
  delay(1370);
}

void shutDown ()
{
  digitalWrite(STBY,LOW);
}


The test run!

The time has come to see what Clusterbot can do. He's deaf and blind, but he's got a few moves. Let's watch:


So, Clusterbot can move!  Now it's time to give Clusterbot vision and maybe a voice.  Before that, there's one more thing to take care of:

The Makeover

Clusterbot has quite a few jumper wires, and I've found I can hardly pick him up without accidentally pulling one of the jumpers out.  It's a real mess, it's time to clean things up a bit.  I substitute sloppy jumper wires for hookup wire cut to the proper length and pressed flat.

I also decide that the acrylic base isn't really doing anything for Clusterbot.  I mount the caster directly to the bottom of the gearbox, and mount the erector-set frame to the top.  Much cleaner!  Here's the before and afters:

Clusterbot before

Clusterbot after

Next time

We'll add a sensor and a few other gadgets, and let Clusterbot start making a few decisions for himself.



Rate this article:
0
Rating: 0 | Votes: 0
 
   
 
posted by Lonnie Honeycutt
Electronics hobbyist after discovering the Arduino two years ago. Worked as a Wideband and Satcom technician in the USAF. Enjoy sharing my projects with others via blogging and on my YouTube channel. Currently working for Apple.

Previous post by Lonnie Honeycutt: Arduino robotics #2 - chassis, locomotion and power
Next post by Lonnie Honeycutt: Arduino robotics #4 - HC-SR04 ultrasonic sensor
all articles by Lonnie Honeycutt

Comments / Replies


There are no comments yet!


Sorry, you need javascript enabled to post any comments.