// Bambino // TAB FILE > behaviour46.ino -> JAbehaviour48.ino // BEHAVIOUR MODIFIERS - speeddown(), speedup(), // disable_walking(), enable_walking(), toggle_f_walking() // BEHAVIOUR RULES - reactUObjects(), reactObstaclesLR(), reactHolesLR() // - avoidUObjects(), avoidObstaclesLR(), avoidHolesLR() //----------------------------------------------------------- /*behaviour46.ino -> JAbehaviour48.ino NEW enable_walking() servoRoll.attach(6); servoPaceR.attach(7); servoPaceL.attach(12); disable_walking() servoRoll.detach(6); servoPaceR.detach(7); servoPaceL.detach(12); CHANGED */ //== BEHAVIOUR MODIFIERS ==================================== void speeddown() // reduce by half rollspeed and pacespeed with a minimum of 1 { rollspeed =max(1, rollspeed/2); pacespeed =max(1, pacespeed/2); } //---------------------------- void speedup() // increase by 1 rollspeed and pacespeed upto rollspeedmax and pacespeedmax { rollspeed =min(rollspeedmax, rollspeed++); pacespeed =min(pacespeedmax, pacespeed++); } //----------------------------------------------------------- void disable_walking() // disable walking { if (f_walking) { Srollat =rollat; SpaceLat =paceLat; SpaceRat =paceRat; #ifdef servolib servoRoll.detach(); servoPaceR.detach(); servoPaceL.detach(); #endif } f_walking =false; } //----------------------------------------------------------- void enable_walking() // enable walking { if (!f_walking) { rollat =Srollat; paceLat =SpaceLat; paceRat =SpaceRat; #ifdef servolib servoRoll.attach(6); servoPaceR.attach(7); servoPaceL.attach(12); #endif } f_walking =true; } //----------------------------------------------------------- void toggle_f_walking() { if(f_walking) { disable_walking(); } else { enable_walking(); } } //== BEHAVIOUR RULES ======================================== void reactUObjects() { if(objectRange <=SonarTooNear) { if (!f_reacting) { ReactAt =EEPROMindex; } // save pointer epage =3; // ReActs page setEEPROMindexes('2'); // ReAct #2, SonarTooNear f_reacting =true; } else { if(objectRange <=SonarAwareAt) { if (!f_reacting) { ReactAt =EEPROMindex; } // save pointer epage =3; // ReActs page setEEPROMindexes('1'); // ReAct #1, SonarAwareAt f_reacting =true; } } } //---------------------------- void reactObstaclesLR() { if (f_obstacleLeft && f_obstacleRight) { digitalWrite(LwhiskerLEDpin_, LOW); // whisker LED ON - indicate an obstacle digitalWrite(RwhiskerLEDpin_, LOW); // whisker LED ON - indicate an obstacle if (!f_reacting) { ReactAt =EEPROMindex; } // save pointer epage =3; // ReActs page setEEPROMindexes('3'); // ReAct #3, obstacle Left and Right f_reacting =true; } else { if (f_obstacleLeft) { digitalWrite(LwhiskerLEDpin_, LOW); // whisker LED ON - indicate an obstacle digitalWrite(RwhiskerLEDpin_, HIGH); // whisker LED OFF if (!f_reacting) { ReactAt =EEPROMindex; } // save pointer epage =3; // ReActs page setEEPROMindexes('4'); // ReAct #4, obstacle Left f_reacting =true; } else { if (f_obstacleRight) { digitalWrite(LwhiskerLEDpin_, HIGH); // whisker LED OFF digitalWrite(RwhiskerLEDpin_, LOW); // whisker LED ON - indicate an obstacle if (!f_reacting) { ReactAt =EEPROMindex; } // save pointer epage =3; // ReActs page setEEPROMindexes('5'); // ReAct #5, obstacle Right f_reacting =true; } } } } //---------------------------- void reactHolesLR() { if (f_holeLeft && f_holeRight) { digitalWrite(LbeardLEDpin_, LOW); // beard LED ON - indicate a hole digitalWrite(RbeardLEDpin_, LOW); // beard LED ON - indicate a hole if (!f_reacting) { ReactAt =EEPROMindex; } // save pointer epage =3; // ReActs page setEEPROMindexes('6'); // ReAct #6, hole Left and Right f_reacting =true; } else { if (f_holeLeft) { digitalWrite(LbeardLEDpin_, LOW); // beard LED ON - indicate a hole digitalWrite(RbeardLEDpin_, HIGH); // beard LED OFF if (!f_reacting) { ReactAt =EEPROMindex; } // save pointer epage =3; // ReActs page setEEPROMindexes('7'); // ReAct #7, hole Left f_reacting =true; } else { if (f_holeRight) { digitalWrite(LbeardLEDpin_, HIGH); // beard LED OFF digitalWrite(RbeardLEDpin_, LOW); // beard LED ON - indicate a hole if (!f_reacting) { ReactAt =EEPROMindex; } // save pointer epage =3; // ReActs page setEEPROMindexes('8'); // ReAct #8, hole Right f_reacting =true; } } } } //=========================================================== void avoidUObjects() { // check objectRange from Ultrasonic module HC-SR04 if(objectRange <10) { beep(voicePin,1500,200); speeddown(); backward(); } if(objectRange <15) { beep(voicePin,800,200); speeddown(); turnAway(); turnMemory(); turnMemory(); } if(objectRange <20) { beep(voicePin,400,200); turnMemory(); } } //---------------------------- void avoidObstaclesLR() { if (f_obstacleRight && f_obstacleLeft) { speeddown(); digitalWrite(RwhiskerLEDpin_, LOW); // whisker LED ON - indicate an obstacle digitalWrite(LwhiskerLEDpin_, LOW); // whisker LED ON - indicate an obstacle backward(); turnOther(); turnMemory(); turnMemory(); turnMemory(); turnMemory(); digitalWrite(RwhiskerLEDpin_, HIGH); // whisker LED Off digitalWrite(LwhiskerLEDpin_, HIGH); // whisker LED Off } else { if (f_obstacleRight) { speeddown(); digitalWrite(RwhiskerLEDpin_, LOW); // whisker LED ON - indicate an obstacle backward(); turnLeft(); turnLeft(); turnLeft(); turnLeft(); digitalWrite(RwhiskerLEDpin_, HIGH); // whisker LED Off } else { if (f_obstacleLeft) { speeddown(); digitalWrite(LwhiskerLEDpin_, LOW); // whisker LED ON - indicate an obstacle backward(); turnRight(); turnRight(); turnRight(); turnRight(); digitalWrite(LwhiskerLEDpin_, HIGH); // whisker LED Off } } } } //---------------------------- void avoidHolesLR() { if (f_holeRight && f_holeLeft) { speeddown(); digitalWrite(RbeardLEDpin_, LOW); // beard LED ON - indicate a hole digitalWrite(LbeardLEDpin_, LOW); // beard LED ON - indicate a hole backward(); turnOther(); turnMemory(); turnMemory(); turnMemory(); turnMemory(); digitalWrite(RbeardLEDpin_, HIGH); // beard LED Off digitalWrite(LbeardLEDpin_, HIGH); // beard LED Off } else { if (f_holeRight) { speeddown(); digitalWrite(RbeardLEDpin_, LOW); // beard LED ON - indicate a hole backward(); turnLeft(); turnLeft(); turnLeft(); turnLeft(); digitalWrite(RbeardLEDpin_, HIGH); // beard LED Off } else { if (f_holeLeft) { speeddown(); digitalWrite(LbeardLEDpin_, LOW); // beard LED ON - indicate a hole backward(); turnRight(); turnRight(); turnRight(); turnRight(); digitalWrite(LbeardLEDpin_, HIGH); // beard LED Off } } } } //===========================================================