Shadow Robot Distance Measurement with Bluetooth Code

Dependencies:   4DGL-uLCD-SE HALLFX_ENCODER Motor mbed-rtos mbed

Fork of rtos_mutex by mbed official

Committer:
vikram3
Date:
Tue Mar 14 14:51:26 2017 +0000
Revision:
9:8e1702463051
Parent:
8:0a2509a0b871
Shadow Robot Code

Who changed what in which revision?

UserRevisionLine numberNew contents of line
emilmont 1:0f886ffbe0c1 1 #include "mbed.h"
mbed_official 7:bd0aa7f21f53 2 #include "rtos.h"
vikram3 8:0a2509a0b871 3 #include "stdio.h"
vikram3 8:0a2509a0b871 4 #include "uLCD_4DGL.h"
vikram3 8:0a2509a0b871 5 #include "Motor.h"
vikram3 8:0a2509a0b871 6 #include "HALLFX_ENCODER.h"
emilmont 1:0f886ffbe0c1 7
vikram3 8:0a2509a0b871 8
vikram3 8:0a2509a0b871 9 Serial pc(USBTX, USBRX);
vikram3 8:0a2509a0b871 10 uLCD_4DGL uLCD(p13,p14,p11); // serial tx, serial rx, reset pin; the uLCD pins
vikram3 8:0a2509a0b871 11 Motor mL(p26, p18, p17); // pwm, fwd, rev
vikram3 8:0a2509a0b871 12 Motor mR(p25, p19, p20); // pwm, fwd, rev
vikram3 8:0a2509a0b871 13 Serial blue(p28, p27);
vikram3 8:0a2509a0b871 14 void motorDrive(const char*);
vikram3 8:0a2509a0b871 15 HALLFX_ENCODER encR(p22);
vikram3 8:0a2509a0b871 16 HALLFX_ENCODER encL(p23);
vikram3 8:0a2509a0b871 17 Mutex lcd_mutex;
vikram3 8:0a2509a0b871 18 Mutex print_mutex;
vikram3 8:0a2509a0b871 19
vikram3 8:0a2509a0b871 20 int readR, readL;
mbed_official 7:bd0aa7f21f53 21
vikram3 8:0a2509a0b871 22 volatile const float speed = 0.4;
vikram3 8:0a2509a0b871 23 volatile bool forward = false;
emilmont 1:0f886ffbe0c1 24
vikram3 8:0a2509a0b871 25 void thread2(void const *args) {
emilmont 1:0f886ffbe0c1 26 while (true) {
vikram3 8:0a2509a0b871 27 lcd_mutex.lock();
vikram3 8:0a2509a0b871 28 uLCD.cls();
vikram3 8:0a2509a0b871 29 uLCD.text_width(3); //4X size text
vikram3 8:0a2509a0b871 30 uLCD.text_height(3);
vikram3 8:0a2509a0b871 31 uLCD.color(RED);
vikram3 8:0a2509a0b871 32 uLCD.locate(1,2);
vikram3 8:0a2509a0b871 33 if (forward) {
vikram3 8:0a2509a0b871 34 readR = encR.read();
vikram3 8:0a2509a0b871 35 int dist = readR*23/555;
vikram3 8:0a2509a0b871 36 uLCD.printf("%i cm",dist);
vikram3 8:0a2509a0b871 37 } else {
vikram3 8:0a2509a0b871 38 int dist = 0;
vikram3 8:0a2509a0b871 39 uLCD.printf("%i cm",dist);
vikram3 8:0a2509a0b871 40 }
vikram3 8:0a2509a0b871 41 lcd_mutex.unlock();
vikram3 8:0a2509a0b871 42 Thread::wait(500);
emilmont 1:0f886ffbe0c1 43 }
emilmont 1:0f886ffbe0c1 44 }
emilmont 1:0f886ffbe0c1 45
vikram3 8:0a2509a0b871 46 void thread5(void const *args) {
vikram3 8:0a2509a0b871 47 char bnum = 0;
vikram3 8:0a2509a0b871 48 char bhit = 0;
vikram3 8:0a2509a0b871 49 while(1) {
vikram3 8:0a2509a0b871 50 if (blue.readable()){
vikram3 8:0a2509a0b871 51 lcd_mutex.lock();
vikram3 8:0a2509a0b871 52 if (blue.getc()=='!') {
vikram3 8:0a2509a0b871 53 if (blue.getc()=='B') { //button data
vikram3 8:0a2509a0b871 54 bnum = blue.getc(); //button number
vikram3 8:0a2509a0b871 55 bhit = blue.getc();
vikram3 8:0a2509a0b871 56 if ((bnum>='5')&&(bnum<='8')) //is a number button 1..4
vikram3 8:0a2509a0b871 57 printf("\n\rbnum is %c .", bnum);
vikram3 8:0a2509a0b871 58 if (bhit == '1') {
vikram3 8:0a2509a0b871 59 if (bnum == '1') {
vikram3 8:0a2509a0b871 60 motorDrive("Stop");
vikram3 8:0a2509a0b871 61 } else if (bnum == '5') {
vikram3 8:0a2509a0b871 62 motorDrive("Forward");
vikram3 8:0a2509a0b871 63 } else if (bnum == '6') {
vikram3 8:0a2509a0b871 64 motorDrive("Backward");
vikram3 8:0a2509a0b871 65 } else if (bnum == '7') {
vikram3 8:0a2509a0b871 66 motorDrive("Left");
vikram3 8:0a2509a0b871 67 } else if (bnum == '8') {
vikram3 8:0a2509a0b871 68 motorDrive("Right");
vikram3 8:0a2509a0b871 69 }
vikram3 8:0a2509a0b871 70 } else {
vikram3 8:0a2509a0b871 71 motorDrive("Stop");
vikram3 8:0a2509a0b871 72 }
vikram3 8:0a2509a0b871 73 }
vikram3 8:0a2509a0b871 74 }
vikram3 8:0a2509a0b871 75 lcd_mutex.unlock();
vikram3 8:0a2509a0b871 76 }
vikram3 8:0a2509a0b871 77 Thread::wait(50);
vikram3 8:0a2509a0b871 78 }
vikram3 8:0a2509a0b871 79 }
mbed_official 7:bd0aa7f21f53 80
vikram3 8:0a2509a0b871 81 void motorDrive(const char * input) {
vikram3 8:0a2509a0b871 82
vikram3 8:0a2509a0b871 83 if (strcmp(input, "Forward") == 0) {
vikram3 8:0a2509a0b871 84 encR.reset();
vikram3 8:0a2509a0b871 85 encL.reset();
vikram3 8:0a2509a0b871 86 forward = true;
vikram3 8:0a2509a0b871 87 mL.speed(speed);
vikram3 8:0a2509a0b871 88 mR.speed(speed);
vikram3 8:0a2509a0b871 89 } else if (strcmp(input, "Backward") == 0) {
vikram3 8:0a2509a0b871 90 forward = false;
vikram3 8:0a2509a0b871 91 mL.speed(-speed);
vikram3 8:0a2509a0b871 92 mR.speed(-speed);
vikram3 8:0a2509a0b871 93 } else if (strcmp(input, "Left") == 0) {
vikram3 8:0a2509a0b871 94 forward = false;
vikram3 8:0a2509a0b871 95 mL.speed(-speed);
vikram3 8:0a2509a0b871 96 mR.speed(speed);
vikram3 8:0a2509a0b871 97 } else if (strcmp(input, "Right") == 0) {
vikram3 8:0a2509a0b871 98 forward = false;
vikram3 8:0a2509a0b871 99 mL.speed(speed);
vikram3 8:0a2509a0b871 100 mR.speed(-speed);
vikram3 8:0a2509a0b871 101 } else {
vikram3 8:0a2509a0b871 102 mL.speed(0.0);
vikram3 8:0a2509a0b871 103 mR.speed(0.0);
vikram3 8:0a2509a0b871 104 }
vikram3 8:0a2509a0b871 105 }
Bartek Szatkowski 5:384d6cef11d4 106
vikram3 8:0a2509a0b871 107 int main()
vikram3 8:0a2509a0b871 108 {
vikram3 8:0a2509a0b871 109 printf("\n\r starting main");
vikram3 8:0a2509a0b871 110 encR.reset();
vikram3 8:0a2509a0b871 111 encL.reset();;
vikram3 8:0a2509a0b871 112
vikram3 8:0a2509a0b871 113 uLCD.cls();
vikram3 8:0a2509a0b871 114
vikram3 8:0a2509a0b871 115 Thread t2;
vikram3 8:0a2509a0b871 116 Thread t5;
vikram3 8:0a2509a0b871 117
vikram3 8:0a2509a0b871 118 t2.start(callback(thread2, (void *)"Th 2"));
vikram3 8:0a2509a0b871 119 t5.start(callback(thread5, (void *)"Th 5"));
vikram3 8:0a2509a0b871 120
vikram3 8:0a2509a0b871 121
vikram3 8:0a2509a0b871 122 while(1) {}
vikram3 8:0a2509a0b871 123 }