ECE3872 HW/SW Project Code

Dependencies:   mbed Servo mbed-rtos 4DGL-uLCD-SE PinDetect X_NUCLEO_53L0A1

Files at this revision

API Documentation at this revision

Comitter:
trmontgomery
Date:
Tue Apr 14 01:40:26 2020 +0000
Parent:
25:7764baddb7bc
Commit message:
map of distinct movements is playable. can record and play music at the same time.

Changed in this revision

SongPlayer.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
motor_ctl.h Show annotated file Show diff for this revision Revisions of this file
speaker_out.h Show annotated file Show diff for this revision Revisions of this file
--- a/SongPlayer.h	Mon Apr 13 21:32:00 2020 +0000
+++ b/SongPlayer.h	Tue Apr 14 01:40:26 2020 +0000
@@ -1,41 +1,34 @@
 #include "mbed.h"
-// new class to play a note on Speaker based on PwmOut class
+#include <vector>
+
 class SongPlayer
 {
 public:
-    SongPlayer(PinName pin) : _pin(pin) {
-// _pin(pin) means pass pin to the constructor
+    SongPlayer(PinName pin, vector<float> freq) : _pin(pin), frequency(freq) {
     }
-// class method to play a note based on PwmOut class
-    void PlaySong(float frequency[], float duration[], float volume=1.0) {
+    void PlaySong(float duration, float volume=1.0) {
         vol = volume;
         notecount = 0;
         _pin.period(1.0/frequency[notecount]);
         _pin = volume/2.0;
-        noteduration.attach(this,&SongPlayer::nextnote, duration[notecount]);
-        // setup timer to interrupt for next note to play
-        frequencyptr = frequency;
-        durationptr = duration;
-        //returns after first note starts to play
+        noteduration.attach(this,&SongPlayer::nextnote, DUR);
     }
     void nextnote();
+    
 private:
     Timeout noteduration;
     PwmOut _pin;
     int notecount;
     float vol;
-    float * frequencyptr;
-    float * durationptr;
+    vector<float> frequency;
 };
-//Interrupt Routine to play next note
+
 void SongPlayer::nextnote()
 {
     _pin = 0.0;
     notecount++; //setup next note in song
-    if (durationptr[notecount]!=0.0) {
-        _pin.period(1.0/frequencyptr[notecount]);
-        noteduration.attach(this,&SongPlayer::nextnote, durationptr[notecount]);
-        _pin = vol/2.0;
-    } else
-        _pin = 0.0; //turn off on last note
+    if (frequency[notecount]==0.0) notecount = 0; 
+    _pin.period(1.0/frequency[notecount]);
+    noteduration.attach(this,&SongPlayer::nextnote, DUR);
+    _pin = vol/2.0;
 }
\ No newline at end of file
--- a/main.cpp	Mon Apr 13 21:32:00 2020 +0000
+++ b/main.cpp	Tue Apr 14 01:40:26 2020 +0000
@@ -3,6 +3,7 @@
 #include <vector>
 #include "speaker_out.h"
 #include "motor_ctl.h"
+#include "SongPlayer.h"
 
 DigitalOut myled1(LED1);
 DigitalOut myled2(LED2);
@@ -17,10 +18,18 @@
 bool E;     //erase
 
 enum sm_state {sRESET, sSTOP, sRECORD, sPLAY, sERASE};
+int curr_state = 1; 
+
+Serial pc(USBTX,USBRX);
+Speaker mySpeaker(p26);
+float time_limit = 30;
+//Timer t; 
 
 //SongPlayer music; 
 //Puppet puppet;
 vector<float> song; //stores all notes recorded by user
+vector<string> dance; 
+
 
 void reset(){ 
     /* reset state:
@@ -56,7 +65,79 @@
         4. Append to list of frequencies
         5. 
     */
-    //music.record(); //need to play as recording happens
+    float freq; 
+    char note; 
+    t.start();
+    while(t.read() < 30){
+        note = pc.getc();
+        switch (note){
+            case 'a':
+                freq = 523.25;
+                dance.push_back(move_map[0]);
+                break;
+            
+            case 's':
+                freq = 554.37;
+                dance.push_back(move_map[1]);
+                break;
+            
+            case 'd':
+                freq = 587.33;
+                dance.push_back(move_map[2]);
+                break;
+            
+            case 'f':
+                freq = 622.25;
+                dance.push_back(move_map[3]);
+                break;
+            
+            case 'g':
+                freq = 659.26;
+                dance.push_back(move_map[4]);
+                break;
+            
+            case 'h':
+                freq = 698.46;
+                dance.push_back(move_map[5]);
+                break;
+            
+            case 'j':
+                freq = 739.99;
+                dance.push_back(move_map[6]);
+                break;
+            
+            case 'k':
+                freq = 783.99;
+                dance.push_back(move_map[7]);
+                break;
+            
+            case 'l':
+                freq = 830.61;
+                dance.push_back(move_map[8]);
+                break;
+            
+            case 'q':
+                freq = 880.00;
+                dance.push_back(move_map[9]);
+                break;
+            
+            case 'w':
+                freq = 932.33;
+                dance.push_back(move_map[10]);
+                break;
+            
+            case 'e':
+                freq = 987.77;
+                dance.push_back(move_map[11]);
+                break;
+            }
+            song.push_back(freq);
+            mySpeaker.PlayNote(freq,0.2,0.5);
+            
+        }
+        t.stop();
+        //curr_state = 3; 
+
 }
 void play(){
     /* play state:
@@ -66,8 +147,8 @@
             - moving servo motors accordingly
             - playing corresponding sounds
     */
-    //puppet.dance();
-    //music.play();
+    SongPlayer mySpeaker(p26, song);
+    mySpeaker.PlaySong(DUR);
 }
 void erase(){
     /* erase state:
@@ -77,7 +158,7 @@
 }
 
 void state_machine_mgr(){
-    char curr_state =  1;
+    
     char key_input;
     X = 1;
     S = 0;
@@ -170,6 +251,20 @@
 }
 
 int main() {
-    //state_machine_mgr();
-    puppet_move();
+    //initialize map of freq to movements
+    move_map.push_back("1111");
+    move_map.push_back("1011");
+    move_map.push_back("0111");
+    move_map.push_back("1122");
+    move_map.push_back("1022");
+    move_map.push_back("0122");
+    move_map.push_back("1133");
+    move_map.push_back("1033");
+    move_map.push_back("0133");
+    move_map.push_back("0031");
+    move_map.push_back("0013");
+    move_map.push_back("1101");
+    state_machine_mgr();
+    //puppet_move();
+    //record();
 }
--- a/motor_ctl.h	Mon Apr 13 21:32:00 2020 +0000
+++ b/motor_ctl.h	Tue Apr 14 01:40:26 2020 +0000
@@ -1,6 +1,7 @@
 #include "mbed.h"
 #include "Servo.h"
 #include "rtos.h"
+#include <string>
 
 Servo r_arm(p24);
 Servo l_arm(p23);
@@ -12,85 +13,49 @@
 Thread t_r_leg;
 Thread t_l_leg;
 
-DigitalOut led(LED4);
+#define DUR 200
+
+vector<string> move_map; //initialized in main
+string note; 
 
-unsigned short move_map1[] = {0x149, 0x14A, 0x14C, 0x151, 0x152, 0x154, 0x291, 0x292, 0x294, 0x2A1, 0x2A2, 0x2A4};
-unsigned short ra_mask = 0x0C0;
-unsigned short la_mask = 0x300;
-unsigned short rl_mask = 0x03C;
-unsigned short ll_mask = 0x007; 
-
-unsigned short move_map[] = {1,2,4,1,2,4,1,2,4,1,2,4,1,2,4,1,2,4};
+void la_dance() {
+    switch(note[0]){
+        case 0: l_arm.write(1.0); break; 
+        case 1: l_arm.write(0.0); break; 
+    }
+    Thread::wait(DUR);
+}
 
 void ra_dance() {
-    //r_arm = 0;
-    //wait(1);
-    for(int p=0; p<12; ++p) {
-        unsigned short pos = move_map[p];
-        switch(pos){
-            case 1: r_arm.write(1.0);
-            case 2: r_arm.write(0.5);
-            case 4: r_arm.write(1.0);
-        }
-        wait(0.5);
-        r_arm = 0.5;
+    switch(note[1]){
+        case '0': r_arm.write(1.0); break; 
+        case '1': r_arm.write(0.0); break; 
     }
-    
-    r_arm = 1;
-    wait(0.5);
-    r_arm = 0.5;
-    wait(0.5);
-    r_arm = 1; 
-    r_arm.write(.50);
-    r_arm.write()
-
+    Thread::wait(DUR);
 }
 
-void la_dance() {
-    l_arm = 0;
-    wait(1);
-    for(float p=0; p<1.0; p += 0.1) {
-        l_arm = p;
-        wait(0.2);
+void ll_dance() {
+    switch(note[2]){
+        case 1: r_leg.write(1.0); break; 
+        case 2: r_leg.write(0.6); break; 
+        case 3: r_leg.write(0.1); break; 
     }
-    l_arm.write(.50);
-
+    Thread::wait(DUR);
 }
 
 void rl_dance() {
-    r_leg = 0;
-    wait(1);
-    for(float p=0; p<1.0; p += 0.1) {
-        r_leg = p;
-        wait(0.2);
+    switch(note[3]){
+        case 1: l_leg.write(1.0); break; 
+        case 2: l_leg.write(0.6); break; 
+        case 3: l_leg.write(0.1); break; 
     }
-    r_leg.write(.50);
-
+    Thread::wait(DUR);
 }
 
-void ll_dance() {
-    l_leg = 0;
-    wait(1);
-    for(float p=0; p<1.0; p += 0.1) {
-        l_leg = p;
-        wait(0.2);
-    }
-    l_leg.write(.50);
-
+void puppet_move(){
+    t_r_arm.start(ra_dance);
+    t_l_arm.start(la_dance);
+    t_r_leg.start(rl_dance);
+    t_l_leg.start(ll_dance);
 }
 
-
-void puppet_move(){
-    //while(1){
-    //t_r_arm.start(ra_dance);
-    //wait(1);
-    //t_l_arm.start(la_dance);
-    //wait(1);
-    //t_r_leg.start(rl_dance);
-    //wait(1);
-    //t_l_leg.start(ll_dance);
-    //wait(1);
-  // }
-  ra_dance();
-}
-
--- a/speaker_out.h	Mon Apr 13 21:32:00 2020 +0000
+++ b/speaker_out.h	Tue Apr 14 01:40:26 2020 +0000
@@ -1,81 +1,68 @@
 #include "mbed.h"
 #include "Speaker.h"
-
-
-Serial pc(USBTX,USBRX);
-Speaker mySpeaker(p26);
-
-Timer t;
-
-
-char note;
-float freq [100];
-float freq2;
-float limit;
-
-float *record(float freq1[100]) {
+#include <vector>
+Timer t; 
+/*
+void record(vector<float>& song) {
+    float freq; 
+    char note; 
     t.start();
-    for(int i = 0; i<100; i++){
-        pc.printf("Please enter note\n");
+    while(t.read() < 30){
         note = pc.getc();
         switch (note){
             case 'a':
-                freq2 = 523.25;
+                freq = 523.25;
                 break;
             
-            case 'b':
-                freq2 = 554.37;
-                break;
-            
-            case 'c':
-                freq2 = 587.33;
+            case 's':
+                freq = 554.37;
                 break;
             
             case 'd':
-                freq2 = 622.25;
+                freq = 587.33;
+                break;
+            
+            case 'f':
+                freq = 622.25;
+                break;
+            
+            case 'g':
+                freq = 659.26;
+                break;
+            
+            case 'h':
+                freq = 698.46;
+                break;
+            
+            case 'j':
+                freq = 739.99;
+                break;
+            
+            case 'k':
+                freq = 783.99;
+                break;
+            
+            case 'l':
+                freq = 830.61;
+                break;
+            
+            case 'q':
+                freq = 880.00;
+                break;
+            
+            case 'w':
+                freq = 932.33;
                 break;
             
             case 'e':
-                freq2 = 659.26;
-                break;
-            
-            case 'f':
-                freq2 = 698.46;
-                break;
-            
-            case 'g':
-                freq2 = 739.99;
-                break;
-            
-            case 'h':
-                freq2 = 783.99;
-                break;
-            
-            case 'i':
-                freq2 = 830.61;
-                break;
-            
-            case 'j':
-                freq2 = 880.00;
-                break;
-            
-            case 'k':
-                freq2 = 932.33;
-                break;
-            
-            case 'l':
-                freq2 = 987.77;
+                freq = 987.77;
                 break;
             }
-            freq1[i] = freq2;
-            limit = t.read();
-            if(limit > 30){
-                t.stop();
-                break;
-            }
+            song.push_back(freq);
+            mySpeaker.PlayNote(freq,1.0,0.2);
         }
-    return freq1;
-    }
+        t.stop();
+}
 
 
 void audio_out() {
@@ -88,3 +75,4 @@
         }
     }
 }
+*/
\ No newline at end of file