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 21:53:42 2019 +0000
Revision:
6:93e21d47480b
Parent:
5:d7b32a06799d
Child:
7:7050d3c2b720
Implemented screen thread

Who changed what in which revision?

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