Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: HIDScope MODSERIAL Motordriver QEI Servo mbed
Fork of The_Claw_with_EMG_Control_PID by
main.cpp
- Committer:
- megrootens
- Date:
- 2016-09-16
- Revision:
- 0:048fbd80203e
- Child:
- 1:1d2208dce484
File content as of revision 0:048fbd80203e:
/**
* Minor BioRobotics 2016
*
* Programming Homework Set 2
* Exercise 2, example solution.
*
* Note that this problem can be solved in *much* cleaner ways, using slightly
* more advanced C++ / programming techniques. However, this example shows that
* even with very basic programming skills quite a lot can be achieved.
*
* M.E. Grootens [at] utwente.nl,
* v0.1, 16.09.2016
*/
#include "mbed.h"
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = >
// Serial communication using MODSERIAL
#define SERIAL_BAUD 115200 // baud rate for serial communication
#include "MODSERIAL.h"
MODSERIAL pc(USBTX,USBRX);
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = >
// Timing
const float kTimeLedToggle = 0.25f; // period with which to toggle LED
const float kTimePrintSerial = 1.0f;// period with which data is printed
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = >
// constants
const int kNumLeds = 3; // three LEDs
const int kLedOn = 0; // LED on if 0
// LEDs
DigitalOut led_0(LED_RED);
DigitalOut led_1(LED_GREEN);
DigitalOut led_2(LED_BLUE);
// ID of led that should blink; *volatile* because changed by interrupt
volatile int led_blink_id = 0;
// counters
int num_turned_on_0 = 0; // count number of times red LED turned on
int num_turned_on_1 = 0; // count number of times green LED turned on
int num_turned_on_2 = 0; // count number of times blue LED turned on
/**
* Toggle / Switch / Blink the state of the LED.
* Count the number of times the LED was turned ON.
* We have quite some duplicate code here; this is not ideal and could be solved
* using more 'advanced' concepts such as arrays and enums.
* However, this is outside the scope of this course for now.
*/
void ToggleLed()
{
switch (led_blink_id) {
case 0: {
// LED 0 to toggle and count:
led_0 = not led_0;
if (led_0 == kLedOn) {
num_turned_on_0++;
}
// LEDs to turn off:
led_1 = not kLedOn;
led_2 = not kLedOn;
break;
}
case 1: {
// LED 1 to toggle and count:
led_1 = not led_1;
if (led_1 == kLedOn) {
num_turned_on_1++;
}
// LEDs to turn off:
led_0 = not kLedOn;
led_2 = not kLedOn;
break;
}
case 2: {
// LED 2 to toggle and count:
led_2 = not led_2;
if (led_2 == kLedOn) {
num_turned_on_2++;
}
// LEDs to turn off:
led_0 = not kLedOn;
led_1 = not kLedOn;
break;
}
}
}
/**
* Print the number of times each LED was turned on through serial communication
*/
void PrintSerial()
{
pc.printf("*Status*\r\n\tn_r = %d\r\n\tn_g = %d\r\n\tn_b = %d\r\n\r\n",
num_turned_on_0, num_turned_on_1, num_turned_on_2);
}
/**
* Switch the led id that blinks
* led_blink_id goes from 0 -> 1 -> 2 -> 0 -> ...
* @ensure led_blink_id = ++led_blink_id % kNumStates
*/
void SwitchLedColor() {
led_blink_id++;
if (led_blink_id>=kNumLeds) {
// could also use modulo ('%') operator
led_blink_id = 0;
}
}
/**
* Main loop.
*/
int main()
{
// Serial comm baud rate
pc.baud(SERIAL_BAUD);
pc.printf("\r\n**RESET**\r\n");
// Turn off all LEDs initially
led_0 = not kLedOn;
led_1 = not kLedOn;
led_2 = not kLedOn;
// Create ticker and attach LED toggle function
Ticker tick_toggle_led;
tick_toggle_led.attach(ToggleLed,kTimeLedToggle);
// Create ticker and attach Print function
Ticker tick_print_serial;
tick_print_serial.attach(&PrintSerial,kTimePrintSerial);
// Create interrupt and attach switch function
InterruptIn sw2(SW2);
sw2.fall(&SwitchLedColor);
while (true);
}
