![](/media/cache/profiles/4bd40d95b1a5ea73753bb83497730d2d.jpg.50x50_q85.png)
A Jedi light saber controller program with the following "features": - Using RGB LEDs - User can change light colors with a button - Motion dependent (PWM) sounds with a MPU6050 motion sensor - Low voltage detection
Dependencies: L152RE_USBDevice STM32_USB48MHz Watchdog mbed
Diff: main.cpp
- Revision:
- 3:0c2d9355ed8c
- Parent:
- 2:59a7d4677474
diff -r 59a7d4677474 -r 0c2d9355ed8c main.cpp --- a/main.cpp Thu Mar 24 22:42:59 2016 +0000 +++ b/main.cpp Sat Mar 26 21:03:35 2016 +0000 @@ -38,17 +38,15 @@ volatile int Color_Button_Count = 0; //sounds -int sound_to_play; volatile int sound_count = 1; volatile int sound_line = 0; volatile int next_sound_time = 0; -volatile bool sound_is_playing_flag = FALSE; //Battery voltage monitor AnalogIn V_bat(PA_2); //Ticker -Ticker button_ticker, sound_ticker; +Ticker button_ticker; //Set up I2C, (SDA,SCL) //I2C MPU_i2c(PB_9, PB_8); //defined in MPU6050.h... @@ -79,57 +77,6 @@ } -bool sound_player(const int sound_table[][6], int table_lines) -{ - int sound_period; - int sound_pulse_width_us; - if (sound_count > sound_table[sound_line][NUM_STEPS_IDX]) - { - sound_count = 1; - sound_line++; - if (sound_line >= table_lines) - { - return FALSE; - } - } - - sound_period = sound_table[sound_line][INIT_PERIOD_IDX] + ((sound_count-1) * sound_table[sound_line][STEP_PERIOD_IDX]); - sound_pulse_width_us = ( sound_period * (sound_table[sound_line][INIT_VOL_IDX] + ((sound_count-1) * sound_table[sound_line][STEP_VOL_IDX])) )/ 200; - - // there are no checks for 0/negative values of the above - need to make sure that tables are valid. - // set PWM parameters for current step - - Speaker_OUT.period_us(sound_period); - Speaker_OUT.pulsewidth_us(sound_pulse_width_us); - - //update next_sound_time, step count - - next_sound_time = t.read_ms() + sound_table[sound_line][STEP_DUR_IDX]; - sound_count++; - - return TRUE; -} - -void sound_inth() -{ - if ((t.read_ms() >= next_sound_time) && sound_is_playing_flag ) - { - switch (sound_to_play) { - - case STARTUP_SOUND: - sound_is_playing_flag = sound_player(startup_sound_table, STARTUP_TBL_N_LINES); - break; - case MOVEMENT_SOUND: - sound_is_playing_flag = sound_player(movement_sound_table, MOVEMENT_TBL_N_LINES); - break; - case CLASH_SOUND: - sound_is_playing_flag = sound_player(clash_sound_table, CLASH_TBL_N_LINES); - break; - default: - break; - } - } -} int main() { bool motion_is_init = FALSE; @@ -154,6 +101,9 @@ bool ypr_thr_crossed = FALSE; int count = 0; + int sound_to_play; + bool sound_is_playing_flag = FALSE; + int temp_diff; int i = 0; @@ -178,8 +128,6 @@ // start "clock" t.start(); -// attach and set sound interrupt handler (every 10msec) - sound_ticker.attach(&sound_inth, 0.01); // play startup sound sound_to_play = STARTUP_SOUND; sound_line = 0; @@ -192,7 +140,7 @@ button_ticker.attach(&button_inth, 0.025); - wait_ms(1000); //from MPU example + wait_ms(100); //from MPU example (1000) //Initialize watchdog with a 2 second interval // wd.Configure(2.0); @@ -397,6 +345,24 @@ } +// Play sound + if ((t.read_ms() >= next_sound_time) && sound_is_playing_flag ) + { + switch (sound_to_play) { + + case STARTUP_SOUND: + sound_is_playing_flag = sound_player(startup_sound_table, STARTUP_TBL_N_LINES); + break; + case MOVEMENT_SOUND: + sound_is_playing_flag = sound_player(movement_sound_table, MOVEMENT_TBL_N_LINES); + break; + case CLASH_SOUND: + sound_is_playing_flag = sound_player(clash_sound_table, CLASH_TBL_N_LINES); + break; + default: + break; + } + } //handle timer overflow - even if a sound is playing there are 5 minutes before overflow if ((t.read_ms() > (30*60*1000)) && !sound_is_playing_flag) { @@ -505,4 +471,35 @@ break; } } + +bool sound_player(const int sound_table[][6], int table_lines) +{ + int sound_period; + int sound_pulse_width_us; + if (sound_count > sound_table[sound_line][NUM_STEPS_IDX]) + { + sound_count = 1; + sound_line++; + if (sound_line >= table_lines) + { + return FALSE; + } + } + + sound_period = sound_table[sound_line][INIT_PERIOD_IDX] + ((sound_count-1) * sound_table[sound_line][STEP_PERIOD_IDX]); + sound_pulse_width_us = ( sound_period * (sound_table[sound_line][INIT_VOL_IDX] + ((sound_count-1) * sound_table[sound_line][STEP_VOL_IDX])) )/ 200; + + // there are no checks for 0/negative values of the above - need to make sure that tables are valid. + // set PWM parameters for current step + + Speaker_OUT.period_us(sound_period); + Speaker_OUT.pulsewidth_us(sound_pulse_width_us); + + //update next_sound_time, step count + + next_sound_time = t.read_ms() + sound_table[sound_line][STEP_DUR_IDX]; + sound_count++; + + return TRUE; +} \ No newline at end of file