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:
jprocter3
Date:
Thu Apr 18 23:47:22 2019 +0000
Revision:
9:8a5b623fff86
Parent:
8:ddddef6634cd
Child:
10:29a382784838
changed status LED variable defiinition;

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