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 20:50:33 2019 +0000
Revision:
12:492f2a122e39
Parent:
11:aa6d9d72b5a2
Child:
14:7e45dbeb0acf
Commit with original mbed.h;

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