Shadow Robot Distance Measurement with Bluetooth Code
Dependencies: 4DGL-uLCD-SE HALLFX_ENCODER Motor mbed-rtos mbed
Fork of rtos_mutex by
main.cpp@9:8e1702463051, 2017-03-14 (annotated)
- 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?
| User | Revision | Line number | New 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 | } |
