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:
Sat Apr 20 19:51:26 2019 +0000
Revision:
11:aa6d9d72b5a2
Parent:
10:29a382784838
Child:
12:492f2a122e39
Tested LCD and I2C code

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