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:
Wed Apr 17 00:00:44 2019 +0000
Revision:
5:d7b32a06799d
Parent:
4:9c2c77d61a15
Child:
6:93e21d47480b
Wrote touchpad thread and updated other threads

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 2:672f7335a017 22 enum {NOT_TOUCHED, TOUCHED_RIGHT, TOUCHED_WRONG};
jprocter3 2:672f7335a017 23 volatile unsigned int touched = NOT_TOUCHED;
jprocter3 2:672f7335a017 24
jprocter3 5:d7b32a06799d 25 volatile int energy = 70;
jprocter3 2:672f7335a017 26 volatile bool fed;
jprocter3 2:672f7335a017 27 volatile bool blocked;
jprocter3 0:7b070cdce8bd 28
skrgo3 1:a2a5171ac99f 29 void dist(int distance)
skrgo3 1:a2a5171ac99f 30 {
jprocter3 5:d7b32a06799d 31 blocked = false;
skrgo3 1:a2a5171ac99f 32 //put code here to execute when the distance has changed
jprocter3 5:d7b32a06799d 33 if (state == ROAM && distance < 50) {
skrgo3 1:a2a5171ac99f 34 //turn the bot
jprocter3 5:d7b32a06799d 35 blocked = true;
jprocter3 5:d7b32a06799d 36 } else if (state == STOP && distance < 10) {
skrgo3 1:a2a5171ac99f 37 //increase food status
jprocter3 5:d7b32a06799d 38 fed = true;
jprocter3 5:d7b32a06799d 39 Thread::wait(3000); // make sure fed state lasts atleast 3 seconds
jprocter3 5:d7b32a06799d 40 fed = false;
skrgo3 1:a2a5171ac99f 41 }
skrgo3 1:a2a5171ac99f 42 }
jprocter3 3:003d2a50231f 43 ultrasonic mu(p6, p7, .1, 1, &dist);
jprocter3 0:7b070cdce8bd 44
jprocter3 0:7b070cdce8bd 45 void sonar(void const *argument) {
jprocter3 5:d7b32a06799d 46 while(1) {
skrgo3 1:a2a5171ac99f 47 mu.checkDistance();
skrgo3 1:a2a5171ac99f 48 Thread::wait(100);
skrgo3 1:a2a5171ac99f 49 }
jprocter3 0:7b070cdce8bd 50 }
jprocter3 0:7b070cdce8bd 51
jprocter3 0:7b070cdce8bd 52 void touchpad(void const *argument) {
jprocter3 5:d7b32a06799d 53 while(1) {
jprocter3 5:d7b32a06799d 54 if (mpr121.read(0x00)) { // touchpad has any interaction
jprocter3 5:d7b32a06799d 55 touched = TOUCHED_RIGHT;
jprocter3 5:d7b32a06799d 56 Thread::wait(5000); // make sure touched state lasts 5 seconds
jprocter3 5:d7b32a06799d 57 }
jprocter3 5:d7b32a06799d 58 else { // no touchpad interaction
jprocter3 5:d7b32a06799d 59 touched = NOT_TOUCHED;
jprocter3 5:d7b32a06799d 60 }
jprocter3 5:d7b32a06799d 61 Thread::wait(100); // runs 10 times a second
jprocter3 5:d7b32a06799d 62 }
jprocter3 0:7b070cdce8bd 63 }
jprocter3 0:7b070cdce8bd 64
jprocter3 0:7b070cdce8bd 65 void screen(void const *argument) {
jprocter3 5:d7b32a06799d 66 while(1) {
jprocter3 5:d7b32a06799d 67 Thread::wait(100);
jprocter3 5:d7b32a06799d 68 }
jprocter3 0:7b070cdce8bd 69 }
jprocter3 0:7b070cdce8bd 70
jprocter3 0:7b070cdce8bd 71 void sound(void const *argument) {
jprocter3 5:d7b32a06799d 72 while(1) {
jprocter3 5:d7b32a06799d 73 Thread::wait(100);
jprocter3 5:d7b32a06799d 74 }
jprocter3 0:7b070cdce8bd 75 }
jprocter3 0:7b070cdce8bd 76
jprocter3 0:7b070cdce8bd 77 void wheels(void const *argument) {
jprocter3 5:d7b32a06799d 78 while(1) {
jprocter3 5:d7b32a06799d 79 if(state == ROAM) {
jprocter3 5:d7b32a06799d 80 if (blocked) {
jprocter3 5:d7b32a06799d 81 // code to turn bot
jprocter3 5:d7b32a06799d 82 } else {
jprocter3 5:d7b32a06799d 83 m1.speed(1);
jprocter3 5:d7b32a06799d 84 m2.speed(1);
jprocter3 5:d7b32a06799d 85 }
jprocter3 5:d7b32a06799d 86 } else {
skrgo3 1:a2a5171ac99f 87 m1.speed(0);
skrgo3 1:a2a5171ac99f 88 m2.speed(0);
skrgo3 1:a2a5171ac99f 89 }
jprocter3 5:d7b32a06799d 90 Thread::wait(100);
skrgo3 1:a2a5171ac99f 91 }
jprocter3 0:7b070cdce8bd 92 }
jprocter3 0:7b070cdce8bd 93
jprocter3 0:7b070cdce8bd 94 int main() {
jprocter3 0:7b070cdce8bd 95 uLCD.cls();
jprocter3 0:7b070cdce8bd 96 uLCD.printf("Change baudrate.....");
jprocter3 0:7b070cdce8bd 97 uLCD.baudrate(3000000); //jack up baud rate to max
jprocter3 0:7b070cdce8bd 98 uLCD.background_color(BLACK);
jprocter3 0:7b070cdce8bd 99 uLCD.cls();
skrgo3 1:a2a5171ac99f 100 mu.startUpdates();
jprocter3 0:7b070cdce8bd 101
jprocter3 0:7b070cdce8bd 102 Thread thread1(sonar);
jprocter3 0:7b070cdce8bd 103 Thread thread2(touchpad);
jprocter3 0:7b070cdce8bd 104 Thread thread3(screen);
jprocter3 0:7b070cdce8bd 105 Thread thread4(sound);
jprocter3 0:7b070cdce8bd 106 Thread thread5(wheels);
jprocter3 0:7b070cdce8bd 107
jprocter3 0:7b070cdce8bd 108 while(1) {
jprocter3 2:672f7335a017 109 // Status LEDS
jprocter3 2:672f7335a017 110 led1 = state > 0; // no leds on = ROAM, 1 led on = STOP, both on = SLEEP
jprocter3 2:672f7335a017 111 led2 = state > 1;
jprocter3 2:672f7335a017 112 led3 = touched;
jprocter3 2:672f7335a017 113 led4 = fed;
jprocter3 0:7b070cdce8bd 114
jprocter3 2:672f7335a017 115 // Update state
jprocter3 2:672f7335a017 116 if (energy < 5) { // sleeps for 10 seconds and wake up with 50 more energy
jprocter3 2:672f7335a017 117 state = SLEEP;
jprocter3 2:672f7335a017 118 Thread::wait(10000);
jprocter3 2:672f7335a017 119 energy += 50;
jprocter3 2:672f7335a017 120 } else if (energy < 30 || touched != NOT_TOUCHED || fed) {
jprocter3 2:672f7335a017 121 state = STOP;
jprocter3 2:672f7335a017 122 } else {
jprocter3 2:672f7335a017 123 state = ROAM;
jprocter3 2:672f7335a017 124 }
jprocter3 2:672f7335a017 125
jprocter3 2:672f7335a017 126 // Update energy
jprocter3 2:672f7335a017 127 switch(state) {
jprocter3 4:9c2c77d61a15 128 case ROAM: energy -= 2;
jprocter3 2:672f7335a017 129 break;
jprocter3 4:9c2c77d61a15 130 case STOP : energy -= 1;
jprocter3 2:672f7335a017 131 break;
jprocter3 2:672f7335a017 132 }
jprocter3 2:672f7335a017 133
jprocter3 2:672f7335a017 134 // Make sure energy stays in 0-100
jprocter3 2:672f7335a017 135 if (energy < 0) {
jprocter3 2:672f7335a017 136 energy = 0;
jprocter3 2:672f7335a017 137 } else if (energy > 100) {
jprocter3 2:672f7335a017 138 energy = 100;
jprocter3 2:672f7335a017 139 }
jprocter3 4:9c2c77d61a15 140
jprocter3 4:9c2c77d61a15 141 Thread::wait(1000); // runs once per second
jprocter3 0:7b070cdce8bd 142 }
jprocter3 0:7b070cdce8bd 143 }