university of florida · web view2007-04-24 · the stall current of each motor is 1.5a, lower...
TRANSCRIPT
Pongator
Shu Jiang
Final Report
Date: 24 April, 2007
TAs:Adam BarnettJulio Suarez
Instructors:A. A. Arroyo
E. M. Schwartz
University of FloridaDepartment of Electrical and Computer Engineering
EEL 5666 Intelligent Machines Design LaboratorySpring 2007
1
Table of Contents
Abstract
Introduction
Integrated System
Mobil Platform
Actuation
Sensors
Behaviors
Conclusion
Appendices
2
AbstractPongator retrieves ping-pong balls for ping-pong players, thus it makes the game more enjoyable for them. First, Pongator roams around in a table-tennis court while avoiding obstacles. When it finds a ping-pong ball, it picks up the ball. Then, Pongator searches out a designated basket and drops the ball into the basket. This paper describes the detail design of Pongator.
3
Introduction
It is such a nuisance for ping-pong players to stop their game to gather ping-
pong balls from the floor. This problem can be solved by using a robot to
pick up balls. Pongator is designed to perform this specific task.
Integrated System
MAVRIC IIB microcontroller
board
CMU cam
IR Sensors
Undecided Sensor
Ultrasound sensors
DC Motors
LCD
Motor Drivers
Battery
Status LED’s
Servos
4
Mobile Platform
Pongator’s mechanical platform is a three tiers design. The first tier hosts
motors, batteries and sensors. The second tier hosts electronic boards. The
third tier acts as a cover but also hosts a LCD. An arm with two degrees of
freedom will be mounted in the front of Pongator with a CMUcam.
Actuation
Pongator’s drive system is consisted of two 12vdc 30:1 200rpm gear head
motors. The stall current of each motor is 1.5A, lower than the max output
current of the TPIC0107B H-Bridge I am using. Tires are green dot sumo
tires (2.13"D x 1.5"W); they provide good traction and prevent robot from
slipping. Two Tamiya ball casters are mounted in the front and back of the
robot respectively. An arm with gripper to pick up ping-pong balls will be
consisted of two servos; one for up and down movement of the arm, the
other for the opening and closing of the gripper. An HS-475 standard servo
with 76 oz.-in torque is used for moving the arm up and down. Initially an
HS-422 servo with 57 oz.-in was used for that purpose. However, 57 oz-in
torque wasn’t enough for the weight of the arm. HS-475 works perfect. HS-
422 is used for the gripper.
5
Microcontroller
MAVRIC IIB from BDMICRO is the controller board used for Pongator.
The board is based on the ATmega128 microcontroller from ATMEL. The
microcontroller can be easily programmed in C.
Sensors
IR
Two Sharp IR sensors are used for obstacle avoidance. They are analog
sensors that output voltages depend on how far the obstacle are. Analog
sensors require analog-digital conversion (ADC). 2 out of 8 ADC channels
are used for the two IR sensors.
Sonar
Three SRF04 sonars are also used for obstacle avoidance. Basically, sonar
first sends a sound pulse, and then it waits for a return echo. The time
between the sending of the pulse and the receiving of the return echo can be
use to determine how far obstacles are. A 10us pulse is needed to trigger the
sonar to send out the sound pulse. This can be done by set a pin high for 10
us, and then set it low. The timing for the return echo should start right after
the 10us pulse as recommended in the SRF04 datasheet.
6
CMUcam
A CMUcam is used to find ping-pong balls and the designated cup. The
track color (TC) command of the CMUcam can be used to find any kind of
color blob. In the case of Pongator, the ping-pong balls are painted red, so
TC command is used to find a red color blob. The TC command returns a
series of numbers, which include x and y coordinates of the center of the
color blob, and also the pixels of the color blob in the picture frame. X-
coordinate value is used to center Pongator while it moves toward the red
ping-pong ball. Y-coordinate value is used to tell Pongator where it should
stop to pick up the ball. The designated cup is also painted red, so pixel
value is used by Pongator to distinguish between the cup and the ball. The
Ping-Pong ball is much smaller than the cup, so its pixel value is much
smaller than the cup.
Behaviors
Basically Pongator will be roaming around in a designated area and use a
CMUcam to look for ping pong balls that are lying on the floor while
avoiding obstacles. When it finds a ball, it will position itself in front of the
ball using the CMUcam. Once positioning is completed, it lowers it arm,
opens its gripper, and picks up the ball by closing its gripper. After the ball
7
is successfully picked up, the robot searches for a designated cup, again
using the CMU cam. Then the robot drops the ball into the cup after it is
located.
Conclusion
Pongator is the first robot I have ever designed and built. It is a fun learning
experience. It is also the first time I use a programming language like C to
do something real. I also acquire lots of mechanical experience. At the end,
Pongator proves the concept of using an autonomous agent to retrieves ping-
pong balls for players.
Website
http://plaza.ufl.edu/shujinbd
8
Appendix A
/*...................... main ...............................*/int main (void){
arm_init();motor_init();sonar_init();lcd_init();int got_ball = 0;int drop_ball = 0;signed int left_motor, right_motor;int x, y, pixel;DDRE = 0X02;UBRR0H = 0;UBRR0L = 25;UCSR0C = 0X06;asm("sei");track_red();while(1){
while(got_ball == 0){
x = convert_x();y = convert_y();pixel = convert_pixel();
lcd_8bit_out(x);lcd_char(' ');lcd_8bit_out(y);lcd_char(' ');lcd_8bit_out(pixel);if(x == 0){
sonar_motor();}else{
if(pixel > 80)sonar_motor();
9
else{
if( y > 150)avoid_ball();
else if((y < 45) && (y > 10)){
left_motor = 0;right_motor = 0;motor_control(left_motor,
right_motor);pick_up();got_ball = 1;
}else{
left_motor = x + y/6;right_motor = y/6 + 80 - x ;
motor_control(left_motor, right_motor);}
}}UCSR0B = 0X90;lcd_return_home();
}
cam_data[0] = 'M';cam_data[1] = ' ';cam_data[2] = '0';cam_data[3] = ' ';cam_data[4] = '0';cam_data[5] = ' ';cam_data[6] = '0';cam_data[7] = ' ';cam_data[8] = '0';cam_data[9] = ' ';
while(drop_ball == 0){
x = convert_x();y = convert_y();
10
pixel = convert_pixel();
lcd_8bit_out(x);lcd_char(' ');lcd_8bit_out(y);lcd_char(' ');lcd_8bit_out(pixel);
if(x == 0)sonar_motor();
else{
if(y > 150)avoid_ball();
else if((y < 25) && (y > 10)){
if(pixel < 70){
avoid_ball();}else{
left_motor = 0;right_motor = 0;
motor_control(left_motor, right_motor);drop();drop_ball = 1;
}}else{
left_motor = x + y/6;right_motor = y/6 + 80 - x ;motor_control(left_motor, right_motor);
}}
lcd_return_home();UCSR0B = 0B10010000;
11