Skip to content

Instantly share code, notes, and snippets.

@e-Gizmo
Last active February 26, 2020 08:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save e-Gizmo/3b0012663d9c555a5bf30fa6e482d1c4 to your computer and use it in GitHub Desktop.
Save e-Gizmo/3b0012663d9c555a5bf30fa6e482d1c4 to your computer and use it in GitHub Desktop.
Latest version of eBOT SUMO (NEW INVERTED ARENA), you need to include the eGizmo_PBOT2018 library and Wire (if necessary)
//***************************************************************************************//
// e-BOT //
// e-BOT SUMO INVERTED //
// //
// This enables a bot to avoid obstacles and //
// may also solve mazes. //
// Codes by: //
// e-Gizmo Mechatronix Central //
// Taft, Manila, Philippines //
// http://goo.gl/mNcAUu //
// JUNE 7,2018 //
//***************************************************************************************//
// INITIALIZATION:
#include "eGizmo_PBOT2018.h"
#include<Wire.h>
eGizmo_PBOT2018 PBOT;
//US-100 PIN ASSIGNMENT
#define TRIGPIN 15
#define ECHOPIN 16
float DISTANCE;
float DURATION;
int FULL_SPEED = 150; // FULL SPEED TO BUMP THE OPPONENT
int NORMAL_SPEED = 100; // NORMAL SPEED
int MAX_DISTANCE_DETECTION = 30; // DISTANCE TO DETECT THE OPPONENT
int MIN_DISTANCE_DETECTION = 0;
int FULL_STOP = 0; // HALT
int LINER = 0;
boolean GO = false;
/**********************************************************************************/
void setup()
{
Serial.begin(9600);
Wire.begin();
PBOT.BEGIN();
pinMode(TRIGPIN,OUTPUT);
pinMode(ECHOPIN,INPUT);
}
int ping()
{
digitalWrite(TRIGPIN,LOW);
delayMicroseconds(10);
digitalWrite(TRIGPIN,HIGH);
delayMicroseconds(10);
digitalWrite(TRIGPIN,LOW);
DURATION= pulseIn(ECHOPIN,HIGH);
DISTANCE= DURATION*0.034/2;
return(DISTANCE);
}
/**********************************************************************************/
void loop()
{
float VALUE;
VALUE=ping(); // THE VALUE OF ULTRASONIC
delay(10);
// IF LINE IS DETECTED, BLACK = HIGH, WHITE = LOW
if((PBOT.LS3_RIGHT() == LOW|| PBOT.LS2_CENTER() == LOW) || PBOT.LS1_LEFT() == LOW)
{
LINER-=1;
}
// IF THERE IS NO LINE DETECTED AND THERE IS NO ENEMY
while(LINER == 1 && VALUE > MAX_DISTANCE_DETECTION) //IF LESS THAN 20CM,SEARCH MODE.
{
STOP();
delay(200);
LOOKING_FOR_OPPONENT();
delay(200);
break;
}
// IF THERE IS AN ENEMY AND THERE IS NO LINE DETECTED
while((VALUE < MAX_DISTANCE_DETECTION && VALUE > MIN_DISTANCE_DETECTION) && LINER == 1) // IF GREATER THAN 20cm,ATTACK MODE!
{
ATTACK();
delay(1000);
break;
}
//WHILE THERE'S AN ENEMY, ATTACK MODE AND IF LINE IS DETECTED IT WILL GO BACK.
while((VALUE < MAX_DISTANCE_DETECTION && VALUE > MIN_DISTANCE_DETECTION) && LINER == 0)
{
STOP();
delay(500);
GO_BACKWARD ();
delay(500);
SPIN_LEFT();
break;
}
// TURN AROUND IF LINE IS DETECTED
if(LINER == 0)
{
SPIN_LEFT();
delay(500);
GO_FORWARD_SLOW();
}
LINER = 1;
PBOT.SERVO(1, 90); //SERVO TURNS 90 DEGREES AFTER THE CONDITION WAS FINISHED
}
/*---------------------------*/
// SERVO AND ULTRSONIC FUNCTIONS
void LOOKING_FOR_OPPONENT ()
{
int OPPONENT_ON_LEFT;
int OPPONENT_ON_CENTER;
int OPPONENT_ON_RIGHT;
PBOT.SERVO(1, 20);
delay(500);
OPPONENT_ON_RIGHT = ping();
WHILE_SEARCHING_LINE_DETECTED();
PBOT.SERVO(1, 160);
delay(500);
OPPONENT_ON_LEFT = ping();
WHILE_SEARCHING_LINE_DETECTED();
PBOT.SERVO(1, 90);
delay(500);
OPPONENT_ON_CENTER= ping();
WHILE_SEARCHING_LINE_DETECTED();
/*---------------------------*/
if(OPPONENT_ON_RIGHT <= MAX_DISTANCE_DETECTION && LINER == 1 )
{
STOP();
GO = true;
if(OPPONENT_ON_RIGHT <= MAX_DISTANCE_DETECTION && GO == true){
SPIN_RIGHT();
delay(300);
ATTACK();
delay(500);
GO = false;
}
}
/*---------------------------*/
else if(OPPONENT_ON_LEFT <= MAX_DISTANCE_DETECTION && LINER == 1)
{
SPIN_LEFT();
delay(300);
ATTACK();
delay(500);
}
/*---------------------------*/
else if(OPPONENT_ON_LEFT = OPPONENT_ON_RIGHT)
{
GO_FORWARD_SLOW();
delay(200);
}
}
/*---------------------------*/
// MOTOR CONTROL FUNCTION
void ATTACK()
{
PBOT.DIRECTION(MOTOR_BOTH,MOTOR_FWD);
PBOT.SPEED(MOTOR_BOTH, FULL_SPEED);
}
/*---------------------------*/
void GO_FORWARD_SLOW()
{
PBOT.DIRECTION(MOTOR_BOTH,MOTOR_FWD);
PBOT.SPEED(MOTOR_BOTH, NORMAL_SPEED);
}
/*---------------------------*/
void GO_BACKWARD()
{
PBOT.DIRECTION(MOTOR_BOTH,MOTOR_REV);
PBOT.SPEED(MOTOR_BOTH, NORMAL_SPEED);
}
/*---------------------------*/
void STOP()
{
PBOT.DIRECTION(MOTOR_BOTH,MOTOR_REV);
PBOT.SPEED(MOTOR_BOTH, FULL_STOP);
}
/*---------------------------*/
void SPIN_LEFT()
{
PBOT.DIRECTION(MOTOR_A,MOTOR_REV);
PBOT.DIRECTION(MOTOR_B,MOTOR_FWD);
PBOT.SPEED(MOTOR_BOTH, FULL_SPEED);
}
/*---------------------------*/
void SPIN_RIGHT()
{
PBOT.DIRECTION(MOTOR_A,MOTOR_FWD);
PBOT.DIRECTION(MOTOR_B,MOTOR_REV);
PBOT.SPEED(MOTOR_BOTH, FULL_SPEED);
}
//**********************************************************************************
void WHILE_SEARCHING_LINE_DETECTED(){
if(PBOT.LS3_RIGHT() == LOW || PBOT.LS1_LEFT() == LOW)
{
LINER-=1;
}
if(LINER == 0){
GO_BACKWARD();
delay(500);
SPIN_LEFT();
delay(500);
GO_FORWARD_SLOW();
STOP();
}
LINER = 1;
}
// PROGRAM ENDS AND LOOP BACK FOREVER
//**********************************************************************************//PARZ
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment