The Claw working with Buttons (no EMG)
Dependencies: MODSERIAL Motordriver QEI Servo mbed
Fork of The_Claw by
main.cpp@2:ad4b181a6422, 2016-10-19 (annotated)
- Committer:
- meikefrok
- Date:
- Wed Oct 19 11:03:34 2016 +0000
- Revision:
- 2:ad4b181a6422
- Parent:
- 1:1d2208dce484
- Child:
- 3:3a671d01bcb8
Button for Base Cart Arm, with LED
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
megrootens | 0:048fbd80203e | 1 | #include "mbed.h" |
megrootens | 0:048fbd80203e | 2 | |
megrootens | 0:048fbd80203e | 3 | // = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = > |
megrootens | 0:048fbd80203e | 4 | // Serial communication using MODSERIAL |
megrootens | 0:048fbd80203e | 5 | #define SERIAL_BAUD 115200 // baud rate for serial communication |
megrootens | 0:048fbd80203e | 6 | #include "MODSERIAL.h" |
megrootens | 0:048fbd80203e | 7 | MODSERIAL pc(USBTX,USBRX); |
megrootens | 0:048fbd80203e | 8 | |
megrootens | 0:048fbd80203e | 9 | // = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = > |
megrootens | 0:048fbd80203e | 10 | // Timing |
megrootens | 0:048fbd80203e | 11 | const float kTimeLedToggle = 0.25f; // period with which to toggle LED |
megrootens | 0:048fbd80203e | 12 | const float kTimePrintSerial = 1.0f;// period with which data is printed |
megrootens | 0:048fbd80203e | 13 | |
megrootens | 0:048fbd80203e | 14 | // = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = > |
megrootens | 0:048fbd80203e | 15 | // constants |
megrootens | 0:048fbd80203e | 16 | const int kLedOn = 0; // LED on if 0 |
megrootens | 0:048fbd80203e | 17 | |
megrootens | 0:048fbd80203e | 18 | // LEDs |
meikefrok | 2:ad4b181a6422 | 19 | DigitalOut led_r(LED_RED); |
meikefrok | 2:ad4b181a6422 | 20 | DigitalOut led_g(LED_GREEN); |
meikefrok | 2:ad4b181a6422 | 21 | DigitalOut led_b(LED_BLUE); |
megrootens | 0:048fbd80203e | 22 | |
megrootens | 0:048fbd80203e | 23 | // ID of led that should blink; *volatile* because changed by interrupt |
meikefrok | 2:ad4b181a6422 | 24 | volatile int part_id = 0; |
megrootens | 0:048fbd80203e | 25 | |
megrootens | 0:048fbd80203e | 26 | // counters |
megrootens | 0:048fbd80203e | 27 | int num_turned_on_0 = 0; // count number of times red LED turned on |
megrootens | 0:048fbd80203e | 28 | int num_turned_on_1 = 0; // count number of times green LED turned on |
megrootens | 0:048fbd80203e | 29 | int num_turned_on_2 = 0; // count number of times blue LED turned on |
megrootens | 0:048fbd80203e | 30 | |
megrootens | 0:048fbd80203e | 31 | |
megrootens | 0:048fbd80203e | 32 | |
megrootens | 0:048fbd80203e | 33 | /** |
megrootens | 0:048fbd80203e | 34 | * Toggle / Switch / Blink the state of the LED. |
megrootens | 0:048fbd80203e | 35 | * Count the number of times the LED was turned ON. |
megrootens | 0:048fbd80203e | 36 | * We have quite some duplicate code here; this is not ideal and could be solved |
megrootens | 0:048fbd80203e | 37 | * using more 'advanced' concepts such as arrays and enums. |
megrootens | 0:048fbd80203e | 38 | * However, this is outside the scope of this course for now. |
megrootens | 0:048fbd80203e | 39 | */ |
megrootens | 0:048fbd80203e | 40 | void ToggleLed() |
megrootens | 0:048fbd80203e | 41 | { |
meikefrok | 2:ad4b181a6422 | 42 | switch (part_id) { |
megrootens | 0:048fbd80203e | 43 | case 0: { |
megrootens | 0:048fbd80203e | 44 | // LED 0 to toggle and count: |
meikefrok | 2:ad4b181a6422 | 45 | led_r = kLedOn; |
meikefrok | 2:ad4b181a6422 | 46 | if (led_r == kLedOn) { |
megrootens | 0:048fbd80203e | 47 | num_turned_on_0++; |
megrootens | 0:048fbd80203e | 48 | } |
megrootens | 0:048fbd80203e | 49 | |
megrootens | 0:048fbd80203e | 50 | // LEDs to turn off: |
meikefrok | 2:ad4b181a6422 | 51 | led_g = not kLedOn; |
meikefrok | 2:ad4b181a6422 | 52 | led_b = not kLedOn; |
megrootens | 0:048fbd80203e | 53 | |
megrootens | 0:048fbd80203e | 54 | break; |
megrootens | 0:048fbd80203e | 55 | } |
megrootens | 0:048fbd80203e | 56 | case 1: { |
megrootens | 0:048fbd80203e | 57 | // LED 1 to toggle and count: |
meikefrok | 2:ad4b181a6422 | 58 | led_g = kLedOn; |
meikefrok | 2:ad4b181a6422 | 59 | if (led_g == kLedOn) { |
megrootens | 0:048fbd80203e | 60 | num_turned_on_1++; |
megrootens | 0:048fbd80203e | 61 | } |
megrootens | 0:048fbd80203e | 62 | |
megrootens | 0:048fbd80203e | 63 | // LEDs to turn off: |
meikefrok | 2:ad4b181a6422 | 64 | led_r = not kLedOn; |
meikefrok | 2:ad4b181a6422 | 65 | led_b = not kLedOn; |
megrootens | 0:048fbd80203e | 66 | |
megrootens | 0:048fbd80203e | 67 | break; |
megrootens | 0:048fbd80203e | 68 | } |
megrootens | 0:048fbd80203e | 69 | case 2: { |
megrootens | 0:048fbd80203e | 70 | // LED 2 to toggle and count: |
meikefrok | 2:ad4b181a6422 | 71 | led_b = kLedOn; |
meikefrok | 2:ad4b181a6422 | 72 | if (led_b == kLedOn) { |
megrootens | 0:048fbd80203e | 73 | num_turned_on_2++; |
megrootens | 0:048fbd80203e | 74 | } |
megrootens | 0:048fbd80203e | 75 | |
megrootens | 0:048fbd80203e | 76 | // LEDs to turn off: |
meikefrok | 2:ad4b181a6422 | 77 | led_r = not kLedOn; |
meikefrok | 2:ad4b181a6422 | 78 | led_g = not kLedOn; |
megrootens | 0:048fbd80203e | 79 | |
megrootens | 0:048fbd80203e | 80 | break; |
megrootens | 0:048fbd80203e | 81 | } |
megrootens | 0:048fbd80203e | 82 | } |
megrootens | 0:048fbd80203e | 83 | } |
megrootens | 0:048fbd80203e | 84 | |
megrootens | 0:048fbd80203e | 85 | /** |
megrootens | 0:048fbd80203e | 86 | * Print the number of times each LED was turned on through serial communication |
megrootens | 0:048fbd80203e | 87 | */ |
megrootens | 0:048fbd80203e | 88 | void PrintSerial() |
megrootens | 0:048fbd80203e | 89 | { |
megrootens | 0:048fbd80203e | 90 | pc.printf("*Status*\r\n\tn_r = %d\r\n\tn_g = %d\r\n\tn_b = %d\r\n\r\n", |
megrootens | 0:048fbd80203e | 91 | num_turned_on_0, num_turned_on_1, num_turned_on_2); |
megrootens | 0:048fbd80203e | 92 | } |
megrootens | 0:048fbd80203e | 93 | |
megrootens | 0:048fbd80203e | 94 | /** |
megrootens | 0:048fbd80203e | 95 | * Switch the led id that blinks |
megrootens | 0:048fbd80203e | 96 | * led_blink_id goes from 0 -> 1 -> 2 -> 0 -> ... |
megrootens | 0:048fbd80203e | 97 | * @ensure led_blink_id = ++led_blink_id % kNumStates |
megrootens | 0:048fbd80203e | 98 | */ |
meikefrok | 2:ad4b181a6422 | 99 | void SetValue2() { |
meikefrok | 2:ad4b181a6422 | 100 | part_id = 0; |
meikefrok | 2:ad4b181a6422 | 101 | } |
meikefrok | 2:ad4b181a6422 | 102 | |
meikefrok | 2:ad4b181a6422 | 103 | void SetValue3() { |
meikefrok | 2:ad4b181a6422 | 104 | part_id = 1; |
meikefrok | 2:ad4b181a6422 | 105 | } |
meikefrok | 2:ad4b181a6422 | 106 | |
meikefrok | 2:ad4b181a6422 | 107 | |
meikefrok | 2:ad4b181a6422 | 108 | void SetValue4() { |
meikefrok | 2:ad4b181a6422 | 109 | part_id = 2; |
megrootens | 0:048fbd80203e | 110 | } |
megrootens | 0:048fbd80203e | 111 | |
meikefrok | 2:ad4b181a6422 | 112 | |
megrootens | 0:048fbd80203e | 113 | /** |
megrootens | 0:048fbd80203e | 114 | * Main loop. |
megrootens | 0:048fbd80203e | 115 | */ |
megrootens | 0:048fbd80203e | 116 | int main() |
megrootens | 0:048fbd80203e | 117 | { |
megrootens | 0:048fbd80203e | 118 | // Serial comm baud rate |
megrootens | 0:048fbd80203e | 119 | pc.baud(SERIAL_BAUD); |
megrootens | 0:048fbd80203e | 120 | pc.printf("\r\n**RESET**\r\n"); |
megrootens | 0:048fbd80203e | 121 | |
megrootens | 0:048fbd80203e | 122 | // Turn off all LEDs initially |
meikefrok | 2:ad4b181a6422 | 123 | led_r = not kLedOn; |
meikefrok | 2:ad4b181a6422 | 124 | led_g = not kLedOn; |
meikefrok | 2:ad4b181a6422 | 125 | led_b = not kLedOn; |
megrootens | 0:048fbd80203e | 126 | |
megrootens | 0:048fbd80203e | 127 | // Create ticker and attach LED toggle function |
megrootens | 0:048fbd80203e | 128 | Ticker tick_toggle_led; |
megrootens | 1:1d2208dce484 | 129 | tick_toggle_led.attach(&ToggleLed,kTimeLedToggle); |
megrootens | 0:048fbd80203e | 130 | |
megrootens | 0:048fbd80203e | 131 | // Create ticker and attach Print function |
megrootens | 0:048fbd80203e | 132 | Ticker tick_print_serial; |
megrootens | 0:048fbd80203e | 133 | tick_print_serial.attach(&PrintSerial,kTimePrintSerial); |
megrootens | 0:048fbd80203e | 134 | |
megrootens | 0:048fbd80203e | 135 | // Create interrupt and attach switch function |
meikefrok | 2:ad4b181a6422 | 136 | InterruptIn btn_base(D2); |
meikefrok | 2:ad4b181a6422 | 137 | btn_base.fall(&SetValue2); |
megrootens | 0:048fbd80203e | 138 | |
meikefrok | 2:ad4b181a6422 | 139 | InterruptIn btn_cart(D3); |
meikefrok | 2:ad4b181a6422 | 140 | btn_cart.fall(&SetValue3); |
meikefrok | 2:ad4b181a6422 | 141 | |
meikefrok | 2:ad4b181a6422 | 142 | InterruptIn btn_arm(D4); |
meikefrok | 2:ad4b181a6422 | 143 | btn_arm.fall(&SetValue4); |
meikefrok | 2:ad4b181a6422 | 144 | |
megrootens | 0:048fbd80203e | 145 | while (true); |
megrootens | 0:048fbd80203e | 146 | } |
meikefrok | 2:ad4b181a6422 | 147 | |
meikefrok | 2:ad4b181a6422 | 148 | |
meikefrok | 2:ad4b181a6422 | 149 |