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:
Tue Apr 16 22:41:43 2019 +0000
Revision:
2:672f7335a017
Parent:
0:7b070cdce8bd
Child:
3:003d2a50231f
implemented main thread

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jprocter3 0:7b070cdce8bd 1 #include "mbed.h"
jprocter3 0:7b070cdce8bd 2 #include "rtos.h"
jprocter3 0:7b070cdce8bd 3 #include "uLCD_4DGL.h"
jprocter3 0:7b070cdce8bd 4 uLCD_4DGL uLCD(p28,p27,p29); // serial tx, serial rx, reset pin;
jprocter3 0:7b070cdce8bd 5 DigitalOut speaker(p18);
jprocter3 0:7b070cdce8bd 6
jprocter3 0:7b070cdce8bd 7 DigitalOut led1(LED1);
jprocter3 0:7b070cdce8bd 8 DigitalOut led2(LED2);
jprocter3 0:7b070cdce8bd 9 DigitalOut led3(LED3);
jprocter3 0:7b070cdce8bd 10 DigitalOut led4(LED4);
jprocter3 0:7b070cdce8bd 11
jprocter3 2:672f7335a017 12 enum {ROAM, STOP, SLEEP};
jprocter3 2:672f7335a017 13 volatile unsigned int state = ROAM;
jprocter3 2:672f7335a017 14
jprocter3 2:672f7335a017 15 enum {NOT_TOUCHED, TOUCHED_RIGHT, TOUCHED_WRONG};
jprocter3 2:672f7335a017 16 volatile unsigned int touched = NOT_TOUCHED;
jprocter3 2:672f7335a017 17
jprocter3 2:672f7335a017 18 volatile unsigned int energy = 70;
jprocter3 2:672f7335a017 19 volatile bool fed;
jprocter3 2:672f7335a017 20 volatile bool blocked;
jprocter3 0:7b070cdce8bd 21
jprocter3 0:7b070cdce8bd 22 void sonar(void const *argument) {
jprocter3 0:7b070cdce8bd 23
jprocter3 0:7b070cdce8bd 24 }
jprocter3 0:7b070cdce8bd 25
jprocter3 0:7b070cdce8bd 26 void touchpad(void const *argument) {
jprocter3 0:7b070cdce8bd 27
jprocter3 0:7b070cdce8bd 28 }
jprocter3 0:7b070cdce8bd 29
jprocter3 0:7b070cdce8bd 30 void screen(void const *argument) {
jprocter3 0:7b070cdce8bd 31
jprocter3 0:7b070cdce8bd 32 }
jprocter3 0:7b070cdce8bd 33
jprocter3 0:7b070cdce8bd 34 void sound(void const *argument) {
jprocter3 0:7b070cdce8bd 35
jprocter3 0:7b070cdce8bd 36 }
jprocter3 0:7b070cdce8bd 37
jprocter3 0:7b070cdce8bd 38 void wheels(void const *argument) {
jprocter3 0:7b070cdce8bd 39
jprocter3 0:7b070cdce8bd 40 }
jprocter3 0:7b070cdce8bd 41
jprocter3 0:7b070cdce8bd 42 int main() {
jprocter3 0:7b070cdce8bd 43 uLCD.cls();
jprocter3 0:7b070cdce8bd 44 uLCD.printf("Change baudrate.....");
jprocter3 0:7b070cdce8bd 45 uLCD.baudrate(3000000); //jack up baud rate to max
jprocter3 0:7b070cdce8bd 46 uLCD.background_color(BLACK);
jprocter3 0:7b070cdce8bd 47 uLCD.cls();
jprocter3 0:7b070cdce8bd 48
jprocter3 0:7b070cdce8bd 49 Thread thread1(sonar);
jprocter3 0:7b070cdce8bd 50 Thread thread2(touchpad);
jprocter3 0:7b070cdce8bd 51 Thread thread3(screen);
jprocter3 0:7b070cdce8bd 52 Thread thread4(sound);
jprocter3 0:7b070cdce8bd 53 Thread thread5(wheels);
jprocter3 0:7b070cdce8bd 54
jprocter3 0:7b070cdce8bd 55 while(1) {
jprocter3 2:672f7335a017 56 // Status LEDS
jprocter3 2:672f7335a017 57 led1 = state > 0; // no leds on = ROAM, 1 led on = STOP, both on = SLEEP
jprocter3 2:672f7335a017 58 led2 = state > 1;
jprocter3 2:672f7335a017 59 led3 = touched;
jprocter3 2:672f7335a017 60 led4 = fed;
jprocter3 0:7b070cdce8bd 61
jprocter3 2:672f7335a017 62 // Update state
jprocter3 2:672f7335a017 63 if (energy < 5) { // sleeps for 10 seconds and wake up with 50 more energy
jprocter3 2:672f7335a017 64 state = SLEEP;
jprocter3 2:672f7335a017 65 Thread::wait(10000);
jprocter3 2:672f7335a017 66 energy += 50;
jprocter3 2:672f7335a017 67 } else if (energy < 30 || touched != NOT_TOUCHED || fed) {
jprocter3 2:672f7335a017 68 state = STOP;
jprocter3 2:672f7335a017 69 } else {
jprocter3 2:672f7335a017 70 state = ROAM;
jprocter3 2:672f7335a017 71 }
jprocter3 2:672f7335a017 72
jprocter3 2:672f7335a017 73 // Update energy
jprocter3 2:672f7335a017 74 switch(state) {
jprocter3 2:672f7335a017 75 ROAM: energy -= 2;
jprocter3 2:672f7335a017 76 break;
jprocter3 2:672f7335a017 77 STOP: energy -= 1;
jprocter3 2:672f7335a017 78 break;
jprocter3 2:672f7335a017 79 }
jprocter3 2:672f7335a017 80
jprocter3 2:672f7335a017 81 // Make sure energy stays in 0-100
jprocter3 2:672f7335a017 82 if (energy < 0) {
jprocter3 2:672f7335a017 83 energy = 0;
jprocter3 2:672f7335a017 84 } else if (energy > 100) {
jprocter3 2:672f7335a017 85 energy = 100;
jprocter3 2:672f7335a017 86 }
jprocter3 0:7b070cdce8bd 87 }
jprocter3 2:672f7335a017 88 Thread::wait(1000); // runs once per second
jprocter3 0:7b070cdce8bd 89 }