Last active
December 15, 2015 15:48
-
-
Save artizirk/5283968 to your computer and use it in GitHub Desktop.
code for our school lego nxt sumo bots
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// sumobot with two sonic sensors | |
#define START_WAIT 5000 // ms | |
#define jooksu_aeg 500 // how much to back away from white line (ms) | |
#define mootor OUT_BC // motors | |
#define light_threshold 40 // light threshold | |
#define otsingu_kaugus 30 // distance for enemy | |
#define attack_speed 100 // | |
#define left_light_port IN_4 // vasak ees valgus | |
#define right_light_port IN_1 // parem ees valgus | |
#define start_button IN_2 // start button port (if used) | |
#define sonic_front IN_3 // sonic sensor port front | |
#define sonic_back IN_2 // sonic sensor port back | |
#define use_start_button false // use sepperate button for starting | |
#define REVESE_MOTOR true // false = old sumo; true = new sumo | |
int light_left, light_right; // light sensor values | |
int state; // mostly used for white line dettection | |
int sound; // what sound to play | |
int kaugus; // distance front | |
int kaugus_taga; // distance back | |
int last; // last state, used to set rotation direction | |
bool suund; // rotation direction | |
mutex moveMutex; // only one task should use motors at the time | |
mutex DistVarMutex; | |
void setup() | |
{ // setup code | |
// SetSensorTouch(start_button); | |
SetSensorLowspeed(sonic_front); | |
// SetSensorLowspeed(sonic_back); | |
SetSensorLight(left_light_port); | |
SetSensorLight(right_light_port); | |
suund = false; | |
state = 0; | |
sound = 0; | |
} | |
task get_and_chk_lights() | |
{ // get light sensor values for detecting sumo white ring | |
// and set state | |
while(true) { | |
light_left = Sensor(left_light_port); | |
light_right = Sensor(right_light_port); | |
if (light_left > light_threshold) { state = 1; } | |
else if (light_right > light_threshold) { state = 2; } | |
else { state = 0; } | |
NumOut(30, LCD_LINE1, state); | |
NumOut(30, LCD_LINE2, light_right); | |
NumOut(30, LCD_LINE3, light_left); | |
} | |
} | |
void rev_suund() { | |
// reverse rotation direction | |
if (suund == true) | |
suund = false; | |
else | |
suund = true; | |
} | |
void act_on_lights() | |
{ // don't run over the line | |
if ((state == 1) || (state == 2)) | |
{ | |
if (REVESE_MOTOR) {OnRevReg(mootor, 100, OUT_REGMODE_SPEED);} | |
else { OnFwdReg(mootor, 100, OUT_REGMODE_SPEED); } | |
sound = 1; | |
rev_suund(); | |
Wait (jooksu_aeg); | |
sound = 0; | |
Float(mootor); | |
} | |
} | |
task get_sonic() | |
{ // get distance from enemy | |
while(true) { | |
kaugus = SensorUS(sonic_front); | |
kaugus_taga = 100; //SensorUS(sonic_back); | |
NumOut(30, LCD_LINE4, kaugus); | |
NumOut(30, LCD_LINE5, kaugus_taga); | |
if (CurrentTick() % 400 / 100 == 0) { sound = 3; } // sound effect | |
} | |
} | |
task sounds() | |
{ // for fun | |
while (true) { | |
if (sound == 1) { | |
PlayTone(3000, 200); | |
PlayTone(6000, 200); | |
} | |
else if (sound == 2) { | |
PlayTone(4000, 50); | |
Wait (10); | |
PlayTone(1000, 50); | |
Wait (10); | |
PlayTone(4000, 50); | |
sound = 0; | |
Wait (80); | |
} | |
else if (sound == 3) { | |
PlayTone(7000, 100); | |
sound = 0; | |
Wait (10); | |
} | |
} | |
} | |
task sumo() | |
{ // sumo logic | |
while(true) { | |
Acquire(moveMutex); | |
if (state == 0) { | |
//Acquire(DistVarMutex); | |
kaugus = SensorUS(sonic_front); | |
//Release(DistVarMutex); | |
if (kaugus < otsingu_kaugus) { | |
//attack (front sensor detection) | |
if (REVESE_MOTOR) {OnFwdReg(mootor, attack_speed, OUT_REGMODE_SPEED);} | |
else { OnRevReg(mootor, attack_speed, OUT_REGMODE_SPEED); } | |
sound = 2; | |
//Wait(500); | |
if (last == 0) { | |
// if target lost then reverse scan | |
last = 1; | |
rev_suund(); | |
} | |
} | |
//~ if (kaugus_taga < 10) { | |
//~ //attack (back sensor detection) | |
//~ if (REVESE_MOTOR) {OnRevReg(mootor, attack_speed, OUT_REGMODE_SPEED);} | |
//~ else { OnFwdReg(mootor, attack_speed, OUT_REGMODE_SPEED); } | |
//~ sound = 2; | |
//~ //Wait(500); | |
//~ if (last == 0) { | |
//~ // if target lost then reverse scan | |
//~ last = 1; | |
//~ rev_suund(); | |
//~ } | |
//~ } | |
else { | |
// scan for enemy | |
last = 0; | |
if (suund == true ) { | |
OnFwdSync(mootor, 100, REVESE_MOTOR ? -100 : 100); | |
} | |
else if (suund == false) { | |
OnFwdSync(mootor, 100, REVESE_MOTOR ? 100 : -100); | |
} | |
} | |
} | |
} | |
} | |
task ule_serva() | |
{ // check for white line | |
while(true) | |
{ | |
Acquire(moveMutex); | |
act_on_lights(); | |
Release(moveMutex); | |
} | |
} | |
task main() | |
{ | |
//startup | |
setup(); | |
// wait for startbutton (if set so) | |
if (use_start_button) {until (SENSOR_1 == 1);} | |
PlayTone(1000, 100); | |
Wait(START_WAIT); | |
PlayTone(1000, 100); | |
while(true) { | |
OnRevReg(mootor, attack_speed, OUT_REGMODE_SPEED); | |
} | |
//run tasks | |
Precedes(ule_serva, sumo, get_and_chk_lights, sounds, get_sonic); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment