Code for a robotic pet to interact with.

Dependencies:   mbed wave_player Servo Motordriver mbed-rtos 4DGL-uLCD-SE SDFileSystem_OldbutworkswithRTOS HC_SR04_Ultrasonic_Library

Committer:
skrgo3
Date:
Thu Apr 18 23:22:31 2019 +0000
Revision:
7:7050d3c2b720
Parent:
6:93e21d47480b
Child:
8:ddddef6634cd
Movement!!!

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jprocter3 0:7b070cdce8bd 1 #include "mbed.h"
skrgo3 7:7050d3c2b720 2 #include "motordriver.h"
jprocter3 0:7b070cdce8bd 3 #include "rtos.h"
jprocter3 0:7b070cdce8bd 4 #include "uLCD_4DGL.h"
jprocter3 5:d7b32a06799d 5 #include "mpr121.h"
skrgo3 1:a2a5171ac99f 6 #include "ultrasonic.h"
jprocter3 0:7b070cdce8bd 7 uLCD_4DGL uLCD(p28,p27,p29); // serial tx, serial rx, reset pin;
jprocter3 0:7b070cdce8bd 8 DigitalOut speaker(p18);
skrgo3 7:7050d3c2b720 9 Motor m1(p23, p7, p8, 1); // pwm, fwd, rev
skrgo3 7:7050d3c2b720 10 Motor m2(p24, p9, p10, 1); // pwm, fwd, rev
skrgo3 7:7050d3c2b720 11 I2C i2c(p13, p14);
jprocter3 5:d7b32a06799d 12 Mpr121 mpr121(&i2c, Mpr121::ADD_VSS);
jprocter3 0:7b070cdce8bd 13
jprocter3 0:7b070cdce8bd 14 DigitalOut led1(LED1);
jprocter3 0:7b070cdce8bd 15 DigitalOut led2(LED2);
jprocter3 0:7b070cdce8bd 16 DigitalOut led3(LED3);
jprocter3 0:7b070cdce8bd 17 DigitalOut led4(LED4);
jprocter3 0:7b070cdce8bd 18
jprocter3 2:672f7335a017 19 enum {ROAM, STOP, SLEEP};
jprocter3 2:672f7335a017 20 volatile unsigned int state = ROAM;
jprocter3 2:672f7335a017 21
jprocter3 5:d7b32a06799d 22 volatile int energy = 70;
jprocter3 6:93e21d47480b 23 volatile bool touched;
jprocter3 2:672f7335a017 24 volatile bool fed;
jprocter3 2:672f7335a017 25 volatile bool blocked;
jprocter3 0:7b070cdce8bd 26
skrgo3 1:a2a5171ac99f 27 void dist(int distance)
skrgo3 1:a2a5171ac99f 28 {
jprocter3 5:d7b32a06799d 29 blocked = false;
skrgo3 1:a2a5171ac99f 30 //put code here to execute when the distance has changed
skrgo3 7:7050d3c2b720 31 if (state == ROAM) {
skrgo3 7:7050d3c2b720 32 if(distance < 250) {
skrgo3 7:7050d3c2b720 33 m1.stop(0);
skrgo3 7:7050d3c2b720 34 m2.stop(0);
skrgo3 7:7050d3c2b720 35 Thread::wait(100);
skrgo3 7:7050d3c2b720 36 m1.speed(.75);
skrgo3 7:7050d3c2b720 37 m2.speed(-.75);
skrgo3 7:7050d3c2b720 38 Thread::wait(500);
skrgo3 7:7050d3c2b720 39 blocked = true;
skrgo3 7:7050d3c2b720 40 } else {
skrgo3 7:7050d3c2b720 41 m1.speed(.5);
skrgo3 7:7050d3c2b720 42 m2.speed(.5);
skrgo3 7:7050d3c2b720 43 }
skrgo3 7:7050d3c2b720 44 } else if (state == STOP && distance < 60) {
skrgo3 1:a2a5171ac99f 45 //increase food status
jprocter3 5:d7b32a06799d 46 fed = true;
jprocter3 5:d7b32a06799d 47 Thread::wait(3000); // make sure fed state lasts atleast 3 seconds
jprocter3 5:d7b32a06799d 48 fed = false;
skrgo3 1:a2a5171ac99f 49 }
skrgo3 1:a2a5171ac99f 50 }
jprocter3 3:003d2a50231f 51 ultrasonic mu(p6, p7, .1, 1, &dist);
jprocter3 0:7b070cdce8bd 52
jprocter3 0:7b070cdce8bd 53 void sonar(void const *argument) {
jprocter3 5:d7b32a06799d 54 while(1) {
skrgo3 1:a2a5171ac99f 55 mu.checkDistance();
skrgo3 1:a2a5171ac99f 56 Thread::wait(100);
skrgo3 1:a2a5171ac99f 57 }
jprocter3 0:7b070cdce8bd 58 }
jprocter3 0:7b070cdce8bd 59
jprocter3 0:7b070cdce8bd 60 void touchpad(void const *argument) {
jprocter3 5:d7b32a06799d 61 while(1) {
jprocter3 5:d7b32a06799d 62 if (mpr121.read(0x00)) { // touchpad has any interaction
jprocter3 6:93e21d47480b 63 touched = true;
jprocter3 5:d7b32a06799d 64 Thread::wait(5000); // make sure touched state lasts 5 seconds
jprocter3 5:d7b32a06799d 65 }
jprocter3 5:d7b32a06799d 66 else { // no touchpad interaction
jprocter3 6:93e21d47480b 67 touched = false;
jprocter3 5:d7b32a06799d 68 }
jprocter3 5:d7b32a06799d 69 Thread::wait(100); // runs 10 times a second
jprocter3 5:d7b32a06799d 70 }
jprocter3 0:7b070cdce8bd 71 }
jprocter3 0:7b070cdce8bd 72
jprocter3 0:7b070cdce8bd 73 void screen(void const *argument) {
jprocter3 5:d7b32a06799d 74 while(1) {
jprocter3 6:93e21d47480b 75 uLCD.filled_rectangle(0, 0, 127, 127, BLACK); // clear screen
jprocter3 6:93e21d47480b 76 switch(state) {
jprocter3 6:93e21d47480b 77 case ROAM: {
jprocter3 6:93e21d47480b 78 uLCD.circle(64, 64, 50, BLUE); // blue circle in the center
jprocter3 6:93e21d47480b 79 } break;
jprocter3 6:93e21d47480b 80 case STOP: {
jprocter3 6:93e21d47480b 81 uLCD.locate(0,0);
jprocter3 6:93e21d47480b 82 if (energy < 30) { // tired
jprocter3 6:93e21d47480b 83 uLCD.color(RED+GREEN);
jprocter3 6:93e21d47480b 84 uLCD.printf("0"); // yellow 0's
jprocter3 6:93e21d47480b 85 } else if (fed || touched) { // touched or fed
jprocter3 6:93e21d47480b 86 uLCD.color(RED);
jprocter3 6:93e21d47480b 87 uLCD.printf("<3");
jprocter3 6:93e21d47480b 88 } else { // wondering
jprocter3 6:93e21d47480b 89 uLCD.color(BLUE);
jprocter3 6:93e21d47480b 90 uLCD.printf("?"); // blue ?'s
jprocter3 6:93e21d47480b 91 }
jprocter3 6:93e21d47480b 92 } break;
jprocter3 6:93e21d47480b 93 case SLEEP: {
jprocter3 6:93e21d47480b 94 uLCD.locate(0,0);
jprocter3 6:93e21d47480b 95 uLCD.color(BLUE);
jprocter3 6:93e21d47480b 96 uLCD.printf("Z"); // blue Z's
jprocter3 6:93e21d47480b 97 }
jprocter3 6:93e21d47480b 98 }
jprocter3 6:93e21d47480b 99
jprocter3 5:d7b32a06799d 100 Thread::wait(100);
jprocter3 5:d7b32a06799d 101 }
jprocter3 0:7b070cdce8bd 102 }
jprocter3 0:7b070cdce8bd 103
jprocter3 0:7b070cdce8bd 104 void sound(void const *argument) {
jprocter3 5:d7b32a06799d 105 while(1) {
jprocter3 6:93e21d47480b 106 switch(state) {
jprocter3 6:93e21d47480b 107 case STOP: {
jprocter3 6:93e21d47480b 108 if (energy < 30) { // tired
jprocter3 6:93e21d47480b 109
jprocter3 6:93e21d47480b 110 } else if (fed || touched) { // touched or fed
jprocter3 6:93e21d47480b 111
jprocter3 6:93e21d47480b 112 } else { // wondering
jprocter3 6:93e21d47480b 113
jprocter3 6:93e21d47480b 114 }
jprocter3 6:93e21d47480b 115 } break;
jprocter3 6:93e21d47480b 116 case SLEEP: {
jprocter3 6:93e21d47480b 117
jprocter3 6:93e21d47480b 118 }
jprocter3 6:93e21d47480b 119 }
jprocter3 6:93e21d47480b 120
jprocter3 5:d7b32a06799d 121 Thread::wait(100);
jprocter3 5:d7b32a06799d 122 }
jprocter3 0:7b070cdce8bd 123 }
jprocter3 0:7b070cdce8bd 124
jprocter3 0:7b070cdce8bd 125 int main() {
jprocter3 0:7b070cdce8bd 126 uLCD.cls();
jprocter3 0:7b070cdce8bd 127 uLCD.printf("Change baudrate.....");
jprocter3 0:7b070cdce8bd 128 uLCD.baudrate(3000000); //jack up baud rate to max
jprocter3 0:7b070cdce8bd 129 uLCD.background_color(BLACK);
jprocter3 6:93e21d47480b 130 uLCD.text_bold(ON);
jprocter3 6:93e21d47480b 131 uLCD.text_mode(OPAQUE);
jprocter3 6:93e21d47480b 132 uLCD.text_width(5);
jprocter3 6:93e21d47480b 133 uLCD.text_height(5);
jprocter3 0:7b070cdce8bd 134 uLCD.cls();
skrgo3 1:a2a5171ac99f 135 mu.startUpdates();
jprocter3 0:7b070cdce8bd 136
skrgo3 7:7050d3c2b720 137 Thread thread1(sonar);
skrgo3 7:7050d3c2b720 138 //Thread thread2(touchpad);
skrgo3 7:7050d3c2b720 139 //Thread thread3(screen);
jprocter3 6:93e21d47480b 140 //Thread thread4(sound);
jprocter3 0:7b070cdce8bd 141
jprocter3 0:7b070cdce8bd 142 while(1) {
jprocter3 2:672f7335a017 143 // Status LEDS
jprocter3 2:672f7335a017 144 led1 = state > 0; // no leds on = ROAM, 1 led on = STOP, both on = SLEEP
jprocter3 2:672f7335a017 145 led2 = state > 1;
jprocter3 2:672f7335a017 146 led3 = touched;
jprocter3 2:672f7335a017 147 led4 = fed;
jprocter3 0:7b070cdce8bd 148
jprocter3 2:672f7335a017 149 // Update state
jprocter3 2:672f7335a017 150 if (energy < 5) { // sleeps for 10 seconds and wake up with 50 more energy
jprocter3 2:672f7335a017 151 state = SLEEP;
jprocter3 2:672f7335a017 152 Thread::wait(10000);
jprocter3 2:672f7335a017 153 energy += 50;
jprocter3 6:93e21d47480b 154 } else if (energy < 30 || touched || fed) {
jprocter3 2:672f7335a017 155 state = STOP;
jprocter3 2:672f7335a017 156 } else {
jprocter3 2:672f7335a017 157 state = ROAM;
jprocter3 2:672f7335a017 158 }
jprocter3 2:672f7335a017 159
jprocter3 2:672f7335a017 160 // Update energy
jprocter3 2:672f7335a017 161 switch(state) {
jprocter3 4:9c2c77d61a15 162 case ROAM: energy -= 2;
jprocter3 2:672f7335a017 163 break;
jprocter3 4:9c2c77d61a15 164 case STOP : energy -= 1;
jprocter3 2:672f7335a017 165 break;
jprocter3 2:672f7335a017 166 }
jprocter3 2:672f7335a017 167
jprocter3 2:672f7335a017 168 // Make sure energy stays in 0-100
jprocter3 2:672f7335a017 169 if (energy < 0) {
jprocter3 2:672f7335a017 170 energy = 0;
jprocter3 2:672f7335a017 171 } else if (energy > 100) {
jprocter3 2:672f7335a017 172 energy = 100;
jprocter3 2:672f7335a017 173 }
jprocter3 4:9c2c77d61a15 174
jprocter3 4:9c2c77d61a15 175 Thread::wait(1000); // runs once per second
jprocter3 0:7b070cdce8bd 176 }
jprocter3 0:7b070cdce8bd 177 }