Вы находитесь на странице: 1из 20

Step 1: Required components

Arduino

Motor-shield - controls motors. Also known as H-Bridge. Here motor-shield is


YFRobot with L298P. Therae are other models with are controlled with different
contacts (like this).

Two motors with gears and power wires.Motor with gears has 100-200 RPM
(revolutions per minute). It is good to connect ceramic capacitor 1uF to motor power
contacts - to reduce electric noise.

Two wheels

Battery set, or accumulator, or power-bank - on 5 volts

Computer cooling turbine on 5 volts. Or on 12 volts - but this require additional 12


volt power or step-up converter 5 volts to 12 volts. A turbine can be found on ebay:
"cooling blower fan 5V".

A set of strong magnets

Wires to connect to battery set. Or USB cable - to connect to power-bank with USB
power connector.

Cable with power connector for Arduino

Wires for Arduino contacts (breadboard wires)

Cardboard

Glue or melting glue

Piece of tin (e.g. from aluminum can)

Plastic box - for dust-bin

Step 2: Arrange components on chassis

Cut the circle from cardboard - chassis of the robot, arrange components on it.
Step 3: Setup motors

Setup the motors (with gears) and wheels on it - cut out holes for wheels and secure motors
on cardboard with ropes, wires or plastic ties.
Step 4: Setup turbine

Cut the round hole in the chassis for turbine and glue the turbine on the chassis.
Step 5: Turbine and motors

Turbine is on top of the chassis, motors - below it.

Step 6: Prepare to set dust-bin

Mark the place where the plastic box will be fixed - this will be a dust-bin. Pin holes around
where the magnets will be located on the top side of the chassis

Step 7: Fix magnets

On the top side of the chassis Glue magnets using hols pinned on the previous step as marks.

Step 8: Fix dast-bin

Put a piece of paper on the place where the dust-bin will be set.
Put the plastic box on top of this paper - this will protect the box to be glued to chassis!
Put magnets around the plastic box. Magnets will stick on the places above magnets glued on
the top side - holding the paper below the box.
Fix magnets to the box with glue. When the glue dries - the box will be hold on the chassis by
magnets and it can be removed.
Cut away the paper.

Step 9: Fix Arduino holders

Wooden stick are fixed with glue so Arduino board can be put on these sticks.
Or use another way to fix the Arduino board with motor-shield.

Step 10: Prepare power wire

Use wire to connect to the battery set.


Or use USB wire to connect to a power-bank.
Be careful

wrong polarity will destroy Arduino and motor-shield

shorting of power wires will destroy batteries or power-bank

Step 11: Connect power wires

Connect all power wires from Arduino, turbine, motor-shield and battery-set.

Be careful

wrong polarity will destroy Arduino and motor-shield

shorting of power wires will destroy batteries or power-bank

Check before power on.


Step 12: Make bumpers

Bumpers are made from the cardboard stripes. They bended and glued in such shape.

Step 13: Setup bumpers

Bumpers are fixed on the chassis in the way so when they are hit - they bend a bit hitting the
chassis.
Chassis is cut a bit if it is needed some space till bumpers.

Step 14: Contacts for bumper

Clean and scratch tin and wires for better contacts. Pieces of tin are connected to wires and
fixed by glue. Be sure the glue is not put between tin and wires.
Step 15: Connect bumpers

Fix contacts from tin to bumpers with glue - connect them to Arduino inputs (e.g. pins 5 and
8).
Another wires (with contacts on its end) are fixed in-front of such contacts on chassis.
Connect these two wires to Arduino GND.
When the bumper is pushed (e.g. it hits the wall) - contacts are connected, a pin gets
connected to GND.

No resistors needed - internal pullup Arduino resisters are configured in program.


Step 16: Setup filter

A piece of synthetic fabric is used as a filter.


Step 17: Rear support

A plastic or cork is used as a rear support - it is fixed on the box by glue.


The shape or location is fixed in the way that the box is 1 mm above the floor - when the
robot is on its wheels.
The thin hole in the box is where the air comes with dust from the floor.
If the box is too high - cut walls and re-glue magnets.
Step 18: Program

The program on github

Step 19: More details about connections

Some details about interconnections.


Motor-shield mounted on-top of Arduino board.
Turbine, Arduino and motor-shield are connected to battery by power wires (or a power-bank
via USB cable).
Be careful with polarity - wrong polarity will destroy Arduino and motor-shield!
Step 20: Using Arduino Nano

Motor-shield can be connected to the Arduino board with wires. Just connect following
contacts between Arduino and motor-shield: 3, 4, 5, 6, 7, 8, GND, +5V
in the way:
pin GND Arduino is connected to pin GND on motor-shield,

pin 5V Arduino is connected to pin 5V on motor-shield,


pin 3 Arduino is connected to pin 3 on motor-shield,
pin 4 Arduino is connected to pin 4 on motor-shield,
etc.
So it's possible to use such board as Arduino Nano - which is smaller than motor-shield.

Step 21: Using motor-driver HG7881

The motor-driver on HG7881 can be connected to Arduino by wires. It is much cheaper than
motor-shield but maximum current is 800mA - which should be enough for most small DIY
robots.

PROGRAM

/*
Program for controlling a robot with two motors.
The robot turns when motors changes their speed and direction.
Front bumpers on left and right sides detect obstacles.
Motor shield is used to run motors.
*/
//right side
const int pinRightMotorDirection = 4;//"Dir A" on motor-shield
const int pinRightMotorSpeed = 3;//"PWM A" on motor-shield
const int pinRightBumper = 5;
//left side
const int pinLeftMotorDirection = 7;//"Dir B" on motor-shield
const int pinLeftMotorSpeed = 6;//"PWM B" on motor-shield
const int pinLeftBumper = 8;
//timeouts - they are different to avoid robot stuck in a corner
const int turnRightTimeout = 150;
const int turnLeftTimeout = 200;
//set in counter how long a motor is running back: N/10 (in milliseconds)
int countDownWhileMovingToRight;
int countDownWhileMovingToLeft;
//Initialization
void setup() {

initPins();
runRightMotorForward();
runLeftMotorForward();
startMotors();
}
//Main loop
void loop() {
verifyAndSetRightSide();
verifyAndSetLeftSide();
processRightSide();
processLeftSide();
delay(10);//repeat every 10 milliseconds
}
//--------------------------------------------------void initPins(){
pinMode(pinRightMotorDirection, OUTPUT);
pinMode(pinRightMotorSpeed, OUTPUT);
pinMode(pinRightBumper, INPUT_PULLUP);
pinMode(pinLeftMotorDirection, OUTPUT);
pinMode(pinLeftMotorSpeed, OUTPUT);
pinMode(pinLeftBumper, INPUT_PULLUP);
}
void startMotors(){
runRightMotorForward();
runLeftMotorForward();
}
void processRightSide(){
if(countDownWhileMovingToRight <= 0)//checks if counter was NOT ran when bumper
had been pressed
return;
//otherwise - counter is counting down (as a delay) while the right motor is moving
backward
countDownWhileMovingToRight--;//decrease the counter if it WAS ran when bumper
had been pressed
if(countDownWhileMovingToRight <= 0)//if the running counter got down to zero
runRightMotorForward();//run the right motor forward
}
void processLeftSide(){
if(countDownWhileMovingToLeft <= 0)
return;
countDownWhileMovingToLeft--;
if(countDownWhileMovingToLeft <= 0)
runLeftMotorForward();
}
void verifyAndSetRightSide(){
if(checkBumperIsNotPressed(pinRightBumper) //checks if right bumper has NOT been
pressed
)
return;
if(checkCounterIsNotSet(countDownWhileMovingToRight))//if the counter is not yet

counting down
runRightMotorBackward();//run the right motor backward
countDownWhileMovingToRight = turnRightTimeout;//set the counter to maximum
value to start it counting down
}
void verifyAndSetLeftSide(){
if(checkBumperIsNotPressed(pinLeftBumper) //checks if left bumper has NOT been
pressed
)
return;
if(checkCounterIsNotSet(countDownWhileMovingToLeft))//if the counter is not yet
counting down
runLeftMotorBackward();//run the right motor backward
countDownWhileMovingToLeft = turnLeftTimeout;//set the counter to maximum value
to start it counting down
}
bool checkCounterIsNotSet(int counter){
return counter <= 0;
}
bool checkBumperIsNotPressed(int pinBumper){
return digitalRead(pinBumper) == HIGH;
}
void runRightMotorForward(){
runMotorForward(pinRightMotorDirection, pinRightMotorSpeed);
}
void runLeftMotorForward(){
runMotorForward(pinLeftMotorDirection, pinLeftMotorSpeed);
}
void runRightMotorBackward(){
runMotorBackward(pinRightMotorDirection, pinRightMotorSpeed);
}
void runLeftMotorBackward(){
runMotorBackward(pinLeftMotorDirection, pinLeftMotorSpeed);
}
void runMotorForward(int pinMotorDirection, int pinMotorSpeed){
digitalWrite(pinMotorDirection, true); //set direction forward
analogWrite(pinMotorSpeed, 255); //set max speed forward
}
void runMotorBackward(int pinMotorDirection, int pinMotorSpeed){
digitalWrite(pinMotorDirection, false); //set direction backward
analogWrite(pinMotorSpeed, 255); //set max speed backward
}

Вам также может понравиться