Society of Robots - Robot Forum

Software => Software => Topic started by: javafiend on March 07, 2008, 12:06:25 PM

Title: Obstacle avoidance
Post by: javafiend on March 07, 2008, 12:06:25 PM
Ok, I'm a total noob and I can handle that.  Now with that being said, can someone please show me some code modifying  my $50 robot with Sharp IR to avoid obstacles?

Thanks :)
Title: Re: Obstacle avoidance
Post by: frank26080115 on March 07, 2008, 08:32:51 PM
being a noob is no excuse... think about what it means to avoid an obstacle first, what the microcontroller needs to know, how it's going to know it, and what should it do with the information currently known by the microcontroller.

learn C, this is stuff you should be learning in high school anyways
Title: Re: Obstacle avoidance
Post by: javafiend on March 08, 2008, 07:26:49 AM
I realize I should be learning C and put more thought into the process.  Unfortunately, family responsibilities severely limit my self-study time.

I'm sure some kids are learning C in high school, but it wasn't available for me 15 years ago.  The best I got was a semester of Pascal.  Funny, I've been a computer programmer for 13 years and never got around to learning C...
Title: Re: Obstacle avoidance
Post by: cooldog on March 08, 2008, 07:30:56 AM
search the forum :o

http://s236.photobucket.com/albums/ff16/robvandiver/?action=view&current=121107_1201.flv (http://s236.photobucket.com/albums/ff16/robvandiver/?action=view&current=121107_1201.flv)

http://s236.photobucket.com/albums/ff16/robvandiver/?action=view&current=121107_1157.flv (http://s236.photobucket.com/albums/ff16/robvandiver/?action=view&current=121107_1157.flv)

Hope those links work.

Ok, so this is $50 robot with the sharp IR rangefinder upgrade version 2: the object avoider.
Still working out some kinks, like I have to get the rangefinder with the longer range, and finding "the perfect range" to work with. Right now Im still autocalibrating it every time I turn it on. Im sure the code could be better, I just changed a couple of lines, but not too bad for someone that knows nothing about anything!

Code: [Select]
/****************************************************************************
*
*   Copyright (c) 2007 www.societyofrobots.com
*   (please link back if you use this code!)
*
*   This program is free software; you can redistribute it and/or modify
*   it under the terms of the GNU General Public License version 2 as
*   published by the Free Software Foundation.
*
*   Alternatively, this software may be distributed under the terms of BSD
*   license.
*
* $50 Robot with Sharp IR using Stampy Technology v1, May 19th, 2007
* Simple case-based method for a robot to do edge detection.
*
*
****************************************************************************/

//SoR Include
#include "SoR_Utils.h" //includes all the technical stuff

//global variables
int sharp_IR_reading=0;

int scan_thresh=0;//threshold value of scanning sensor

int scan_angle=30;//position of scanner, in units of servo command
int max_scan_angle=56;//maximum position scanner can rotate to (57)


//this function causes scanning servo to center on edge of object
void scan(void)
{
//lower (-) goes right
//higher (+) goes left
//30 far right, 50 straight, 56 far left (until it jams)



sharp_IR_reading=a2dConvert8bit(3);

if (sharp_IR_reading > scan_thresh)//object detected
{
if (scan_angle>41) //overflow protection
scan_angle-=2;//scan right
}
else //object not detected
{
if (scan_angle<=max_scan_angle) //maximum servo angle
scan_angle+=2; //scan left
else //if scanned all the way, this forces it to start over
scan_angle=30;
}

//servo scan code
servo_scan(scan_angle);
}


//automatically calculates threshold value before run
void autocalibrate(void)
{
scan_thresh=a2dConvert8bit(3);//sensor reading
}

int main(void)
{
//LED_on();

initialize();

delay_cycles(42000);//two second wait delay

/*********ADD YOUR CODE BELOW THIS LINE **********/

//find thresholds
autocalibrate();

//LED_off();


while(1)
{
scan();

if (sharp_IR_reading > scan_thresh)

robot_turn_right();


//object is centered
else
robot_go_straight();

delay_cycles(400);//a small delay to prevent crazy oscillations
}
/*********ADD YOUR CODE ABOVE THIS LINE **********/

return 0;
}


/*********************COMMAND LIST*************************

delay_cycles(cycles);
Delays - you can make your robot wait for a certain amount of time with this function.
Put the number of computational cycles to delay in the ().
23 cycles is about .992 milliseconds
to calculate: 23/.992*(time in milliseconds to delay) = cycles
Check servo datasheet where it says: 'Direction: Clockwise/Pulse Traveling 1500 to 1900usec'

servo_left(speed); and servo_right(speed);
Commands your servos to rotate at a certain speed.
Vary speed (which represents a delay in cycles) from 20 to 50.
Left is for port D0 and right is for port D1.

robot_turn_left(); and robot_turn_right(); and robot_go_straight();
Dont want to deal with speed?
Just call this function and it will 'just work.'

LED_on(); and LED_off();
Turns on and off your LED. The LED is on port D4.
By bringing port D4 low, you are turning on the LED.


variable=a2dConvert8bit(pin);
Reads analog pin. For example, set 'pin' to 5 to read PC5.
'variable' will store the value.

***********************************************************/

anyways, any suggestions for how I could make it work better or anything I did wrong are welcome!
Title: Re: Obstacle avoidance
Post by: javafiend on March 09, 2008, 08:37:01 AM
I always search the forum first.  Generally I find what I'm looking for except in this case.  Fortunately there are folks with better search skills than me :). 

Thanks cooldog, I'll check that out and see if I can make heads or tails of it.