/* 4/27/2024 Cole Barrett Conner McKay Code for a small 2 wheeled robot which will exhibit 4 emotions: anger, happiness, sadness, and fear. */ #include #include VL53L0X sensor; #include #define NUM_LEDS 2 CRGB leds[NUM_LEDS]; #define M2A 17 #define M2B 16 #define M1A 19 #define M1B 18 #define WSLED 4 uint32_t lastTime = 0; void errorLed(int count = 1){ for (int i = 0; i< count; i++){ leds[0] = CRGB::Red; FastLED.show(); delay(100); leds[0] = CRGB::Black; FastLED.show(); delay(100); } delay(1000); } void forward(uint8_t mySpeed){ ledcWrite(3, mySpeed); //Set M2B to mySpeed ledcWrite(2, 0); //Set M2A to LOW ledcWrite(1, mySpeed);//Set M1B to mySpeed ledcWrite(0, 0); //Set M1A to LOW } void reverse(uint8_t mySpeed){ ledcWrite(2, mySpeed); //Set M2A to mySpeed ledcWrite(3, 0); //Set M2B to LOW ledcWrite(0, mySpeed);//Set M1A to mySpeed ledcWrite(1, 0); //Set M1B to LOW } void cw(uint8_t mySpeed){//Clockwise ledcWrite(3, mySpeed); //Set M2B to mySpeed ledcWrite(2, 0); //Set M2A to LOW ledcWrite(1, 0); //Set M1B to LOW ledcWrite(0, mySpeed); //Set M1A to mySpeed } void ccw(uint8_t mySpeed){//Counter clockwise ledcWrite(2, mySpeed); //Set M2A to mySpeed ledcWrite(3, 0); //Set M2B to LOW ledcWrite(0, 0); //Set M1A to LOW ledcWrite(1, mySpeed); //Set M1BA to mySpeed } void rCircleCW(uint8_t mySpeed){//big loop clockwise ledcWrite(3, 0); //Set M2B to LOW ledcWrite(2, mySpeed-50); //Set M2A to mySpeed-50 ledcWrite(1, 0); //Set M1B to LOW ledcWrite(0, mySpeed); //Set M1A to mySpeed } void rCircleCCW(uint8_t mySpeed){//big loop counter clockwise ledcWrite(3, 0); //Set M2B to LOW ledcWrite(2, mySpeed); //Set M2A to mySpeed ledcWrite(1, 0); //Set M1B to LOW ledcWrite(0, mySpeed-50); //Set M1A to mySpeed-50 } void circleCW(uint8_t mySpeed){//big loop counter clockwise backward ledcWrite(2, 0); //Set M2A to LOW ledcWrite(3, mySpeed); //Set M2B to mySpeed ledcWrite(0, 0); //Set M1A to LOW ledcWrite(1, mySpeed-50); //Set M1B to mySpeed-50 } void circleCCW(uint8_t mySpeed){//big loop clockwise backward ledcWrite(2, 0); //Set M2A to LOW ledcWrite(3, mySpeed-50); //Set M2B to mySpeed-50 ledcWrite(0, 0); //Set M1A to LOW ledcWrite(1, mySpeed); //Set M1B to mySpeed } //------------------------------------VOID SCARED---------------------------------------------------------------------------------------------------------------------------------------- void shake(){ reverse(230); delay(100); cw(225); delay(100); ccw(225); delay(100); forward (230); reverse(230); delay(100); cw(225); delay(100); ccw(225); delay(100); forward (230); } void scared(){ digitalWrite(25, HIGH);// Blue LEDS on digitalWrite(27, HIGH); digitalWrite(32, LOW);// green LEDS off digitalWrite(14, LOW); digitalWrite(12, HIGH);// RED LEDS on digitalWrite(33, HIGH); int m = 250;// variable for speed. circleCW(m); delay(200); reverse(m); delay (200); shake(); shake(); shake(); shake(); circleCCW(250); delay(1600); forward(240); delay (100); shake(); } //-------------------------------------------VOID DISTANCE------------------------------------------------------------------------------------------------------------------------------------ void distance(){ int distance = sensor.readRangeSingleMillimeters(); if (distance > 100){ //robot has been lifted up scared(); } } //-------------------------------------------VOID SAD------------------------------------------------------------------------------------------------------------------------------------ void sad(){ digitalWrite(25, HIGH);// Blue LEDs on digitalWrite(27, HIGH); digitalWrite(32, LOW);// green leds off digitalWrite(14, LOW); digitalWrite(12, LOW);// RED LEDS off digitalWrite(33, LOW); forward(200); delay(500); distance(); cw(200); delay(200); distance(); ccw(200); delay(200); distance(); reverse(200); delay(100); distance(); circleCCW(250); delay(2000); for (int i = 250; i > 200; i--){ //slow down over time forward(i); delay(14); distance(); } forward(200); delay (100); distance(); shake(); forward(250); delay(175); distance(); shake(); circleCCW(250); delay(200); distance(); shake(); distance(); shake(); } //~~~~~~HAPPY~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ void happy(){ // ----------LEDs---------- digitalWrite(25, LOW);//Blue LEDs off digitalWrite(27, LOW); digitalWrite(32, HIGH);//green LEDs on digitalWrite(14, HIGH); digitalWrite(12, HIGH);//red LEDs on digitalWrite(33, HIGH); // --------movement-------- int m = 255;// variable to easily change max speed distance(); circleCW(m); delay(2000); distance(); circleCCW(m); delay(2000); for (int i = 235; i > 180; i--){ //slow down over time forward(i); delay(14); distance(); } delay(500); for (int i = 180; i < 235; i++){ //slow down over time reverse(i); delay(14); distance(); } rCircleCCW(m); delay(3000); distance(); rCircleCW(m); delay(1500); distance(); cw(m); delay(750); distance(); circleCW(m); delay(4000); forward(0);//STOP delay(2000); } //~~~~~~ANGER~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ void anger(){ // ----------LEDs---------- digitalWrite(25, LOW);//Blue LEDs off digitalWrite(27, LOW); digitalWrite(32, LOW);//green LEDs off digitalWrite(14, LOW); digitalWrite(12, HIGH);//red LEDs on digitalWrite(33, HIGH); // --------movement-------- int v = 255;// variable to easily change max speed distance(); forward(v); delay(550); distance(); reverse(v); delay(800); distance(); cw(v-20); delay(300); distance(); forward(v); delay(800); distance(); circleCCW(v); delay(750); distance(); forward(v); delay(500); distance(); ccw(v); delay(500); distance(); forward(v); delay(1250); distance(); circleCW(v); delay(2000); distance(); cw(v); delay(300); ccw(v); delay(300); cw(v); delay(300); ccw(v); delay(300); distance(); cw(v); delay(300); ccw(v); delay(300); cw(v); delay(300); ccw(v); delay(300); distance(); forward(230); delay(500); distance(); cw(230); delay(250); distance(); forward(240); delay(1000); distance(); forward(0);//STOP delay(2000); } //~~~~~~SET~UP~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ void setup() { Serial.begin(115200); FastLED.addLeds(leds, NUM_LEDS); // GRB ordering is assumed // This section creates the I2C (Wire) connection and quieries for a VL53LX Wire.begin(); sensor.setTimeout(500); if (!sensor.init()) { Serial.println("Failed to detect and initialize sensor!"); while (1) {errorLed();} } // Set the 4 motor controll lines as outputs pinMode(M1A, OUTPUT); pinMode(M1B, OUTPUT); pinMode(M2A, OUTPUT); pinMode(M2B, OUTPUT); //These lines connect 4 PWM channels to the 4 motor control Pins ledcSetup(0, 30000, 8); ledcAttachPin(M1A, 0); ledcSetup(1, 30000, 8); ledcAttachPin(M1B, 1); ledcSetup(2, 30000, 8); ledcAttachPin(M2A, 2); ledcSetup(3, 30000, 8); ledcAttachPin(M2B, 3); forward(230); pinMode(12, OUTPUT); //red light pinMode(14, OUTPUT); //green light pinMode(27, OUTPUT); //blue light pinMode(32, OUTPUT); //green light pinMode(33, OUTPUT); //red light pinMode(25, OUTPUT); //blue light } //~~~~~~LOOP~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ void loop() { //~~~~~~HAPPY~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ delay(1000); happy(); distance(); //~~~~~~ANGER~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ delay(1000); anger(); distance(); //~~~~~~SAD~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ delay(1000); sad(); distance(); }