ECE3872 HW/SW Project Code
Dependencies: mbed Servo mbed-rtos 4DGL-uLCD-SE PinDetect X_NUCLEO_53L0A1
Revision 18:0e0edd4f9e4d, committed 2020-04-13
- Comitter:
- trmontgomery
- Date:
- Mon Apr 13 02:43:08 2020 +0000
- Parent:
- 17:11c46079d674
- Child:
- 25:7764baddb7bc
- Commit message:
- all files successfully merged
Changed in this revision
--- a/audio_out.h Mon Apr 13 02:23:16 2020 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,98 +0,0 @@
-/*#include "mbed.h"
-#include "XNucleo53L0A1.h"
-#include <stdio.h>
-#include "Speaker.h"
-
-Serial pc(USBTX,USBRX);
-DigitalOut shdn(p26);
-#define VL53L0_I2C_SDA p28
-#define VL53L0_I2C_SCL p27
-
-static XNucleo53L0A1 *board=NULL;
-uint32_t distance;
-
-bool state = false;
-Speaker mySpeaker(p22);
-double freq [30];
-
-double *record(double freq1[30])
-{
- double freq2;
- int status;
- uint32_t distance;
- DevI2C *device_i2c = new DevI2C(VL53L0_I2C_SDA, VL53L0_I2C_SCL);
- /* creates the 53L0A1 expansion board singleton obj
- board = XNucleo53L0A1::instance(device_i2c, A2, D8, D2);
- shdn = 0; //must reset sensor for an mbed reset to work
- wait(0.1);
- shdn = 1;
- wait(0.1);
- /* init the 53L0A1 board with default values
- status = board->init_board();
- while (status) {
- status = board->init_board();
- }
- for(int i = 0; i<30; i++)
- {
- status = board->sensor_centre->get_distance(&distance);
- if (status == VL53L0X_ERROR_NONE) {
- if (distance < 58){
- freq2 = 523.25;
- }
- else if(distance >= 58 && distance < 116){
- freq2 = 554.37;
- }
- else if(distance >= 116 && distance < 174){
- freq2 = 587.33;
- }
- else if(distance >= 174 && distance < 232){
- freq2 = 622.25;
- }
- else if(distance >= 232 && distance < 290){
- freq2 = 659.26;
- }
- else if(distance >= 290 && distance < 348){
- freq2 = 698.46;
- }
- else if(distance >= 348 && distance < 406){
- freq2 = 739.99;
- }
- else if(distance >= 406 && distance < 464){
- freq2 = 783.99;
- }
- else if(distance >= 464 && distance < 522){
- freq2 = 830.61;
- }
- else if(distance >= 522 && distance < 580){
- freq2 = 880.00;
- }
- else if(distance >= 580 && distance < 638){
- freq2 = 932.33;
- }
- else {
- freq2 = 987.77;
- }
- freq1[i] = freq2;
- wait (1);
- }
- }
- return freq1;
-}
-
-void record_and_play()
-{
- while (1)
- {
- if (state == false){
- record(freq);
- state = true;
- }
- if (state == true){
- for (int i = 0; i<30; i++){
- mySpeaker.PlayNote(freq[i],1.0,0.1);
- }
- state = false;
- }
- }
-}
-*/
\ No newline at end of file
--- a/main.cpp Mon Apr 13 02:23:16 2020 +0000
+++ b/main.cpp Mon Apr 13 02:43:08 2020 +0000
@@ -1,7 +1,6 @@
#include "mbed.h"
#include <iostream>
-#include "audio_out.h"
-#include "PinDetect.h"
+#include "speaker_out.h"
#include "uLCD_4DGL.h"
#include "motor_ctl.h"
DigitalOut myled1(LED1);
@@ -9,13 +8,6 @@
DigitalOut myled3(LED3);
DigitalOut myled4(LED4);
-// Push buttons init
-PinDetect pb1(p16);
-PinDetect pb2(p17);
-PinDetect pb3(p18);
-PinDetect pb4(p19);
-// States
-
// State Machine control global variables
bool X; //reset
bool P; //play
@@ -25,7 +17,6 @@
enum sm_state {sRESET, sSTOP, sRECORD, sPLAY, sERASE};
-
void reset(){
/* reset state:
Initial state upon powering up the device
@@ -71,90 +62,99 @@
*/
}
-
-
-void pb1_hit_callback (void)
-{
- myled1 = !myled1;
- //guLCD.printf("REEST");
-}
-
-void pb2_hit_callback (void)
-{
- myled2 = !myled2;
- //guLCD.printf("STOP");
-}
-
-void pb3_hit_callback (void)
-{
- myled3 = !myled3;
- //guLCD.printf("RECORD");
-}
-
-void pb4_hit_callback (void)
-{
- myled4 = !myled4;
- //guLCD.printf("PLAY");
-}
-void hardware_init(){
- // Push buttons init
- pb1.mode(PullUp);
- pb2.mode(PullUp);
- pb3.mode(PullUp);
- pb4.mode(PullUp);
- pb1.attach_deasserted(&pb1_hit_callback);
- pb2.attach_deasserted(&pb2_hit_callback);
- pb3.attach_deasserted(&pb3_hit_callback);
- pb4.attach_deasserted(&pb4_hit_callback);
- pb1.setSampleFrequency();
- pb2.setSampleFrequency();
- pb3.setSampleFrequency();
- pb4.setSampleFrequency();
-}
-
void state_machine_mgr(){
- sm_state curr_state = sRESET;
+ char curr_state = 1;
+ char key_input;
+ X = 1;
+ S = 0;
+ R = 0;
+ P = 0;
+ E = 0;
while(1) {
+ if (pc.readable()) { // if they have pressed a key
+ key_input = pc.getc();
+ if(key_input == '1') X=1; //toggle reset
+ if(key_input == '2') S=1; //toggle stop
+ if(key_input == '3') R=1; //toogle record
+ if(key_input == '4') P=1; //toggle play
+ if(key_input == '5') E=1; //toggle erase
+ }
+ //pc.printf("X: %d\n",X);
+// pc.printf("S: %d\n",S);
+// pc.printf("R: %d\n",R);
+// pc.printf("P: %d\n",P);
+// pc.printf("E: %d\n",E);
+// pc.printf("Current State %d\n",curr_state);
switch(curr_state){
- case sRESET:
- if(S) curr_state = sSTOP;
+ case 1:
+ pc.printf("RESET\n");
+ P = 0;
+ R = 0;
+ if(E){
+ curr_state = 5;
+ X = 0;
+ }else if(S){
+ curr_state = 2;
+ X = 0;
+ }
+ reset();
break;
- case sSTOP:
- if(X){
- curr_state = sRESET;
- }else if(S&R){
- curr_state = sRECORD;
- }else if(S&P){
- curr_state = sPLAY;
- }
- break;
- case sRECORD:
+ case 2:
+ pc.printf("STOP\n");
+ E = 0;
if(X){
- curr_state = sRESET;
- }else if(R&S){
- curr_state = sSTOP;
- }else if(R&P){
- curr_state = sPLAY;
+ curr_state = 1;
+ S = 0;
+ }else if(R){
+ curr_state = 3;
+ S = 0;
+ }else if(P){
+ curr_state = 4;
+ S = 0;
}
+ stop();
break;
- case sPLAY:
+ case 3:
+ pc.printf("RECORD\n");
+ E = 0;
+ P = 0;
if(X){
- curr_state = sRESET;
- }else if(P&S){
- curr_state = sSTOP;
- }else if(P&R){
- curr_state = sPLAY;
+ curr_state = 1;
+ R = 0;
+ }else if(S){
+ curr_state = 2;
+ R = 0;
}
+ record();
break;
- case sERASE:
+ case 4:
+ pc.printf("PLAY\n");
+ E = 0;
+ R = 0;
if(X){
- curr_state = sRESET;
+ curr_state = 1;
+ P = 0;
+ }else if(S){
+ curr_state = 2;
+ P = 0;
}
+ play();
+ break;
+ case 5:
+ pc.printf("ERASE\n");
+ S = 0;
+ P = 0;
+ R = 0;
+ if(X){
+ curr_state = 1;
+ E = 0;
+ }
+ erase();
+ break;
}
}
}
-
int main() {
myled1 = 1;
//hardware_init();
--- a/motor_ctl.h Mon Apr 13 02:23:16 2020 +0000
+++ b/motor_ctl.h Mon Apr 13 02:43:08 2020 +0000
@@ -2,7 +2,7 @@
#include "mbed.h"
#include "Servo.h"
-//#include "rtos.h"
+#include "rtos.h"
Servo r_arm(p24);
Servo l_arm(p23);
@@ -21,15 +21,15 @@
//and then the distance can just control the height
//movement pattern can be random.. right now every other note recorded will be distributed to one side and the rest will go to the other
-unsigned char move_map {0x149, 0x14A, 0x14C, 0x151, 0x152, 0x154, 0x291, 0x292, 0x294, 0x2A1, 0x2A2, 0x2A4};
-unsigned char ra_mask = 0x0C0;
-unsigned char la_mask = 0x300;
-unsigned char rl_mask = 0x03C;
-unsigned char ll_mask = 0x007;
+unsigned short move_map[] {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;
//for testing run through move map
-void ra_dance(unsigned char move) {
+void ra_dance(unsigned short move) {
if (move & ra_mask == 0x040){
r_arm.write(.50);
} else {
@@ -38,7 +38,7 @@
}
-void la_dance() {
+void la_dance(unsigned short move) {
if (move & ra_mask == 0x100){
l_arm.write(.50);
} else {
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/speaker_out.h Mon Apr 13 02:43:08 2020 +0000
@@ -0,0 +1,90 @@
+#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]) {
+ t.start();
+ for(int i = 0; i<100; i++){
+ pc.printf("Please enter note\n");
+ note = pc.getc();
+ switch (note){
+ case 'a':
+ freq2 = 523.25;
+ break;
+
+ case 'b':
+ freq2 = 554.37;
+ break;
+
+ case 'c':
+ freq2 = 587.33;
+ break;
+
+ case 'd':
+ freq2 = 622.25;
+ 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;
+ break;
+ }
+ freq1[i] = freq2;
+ limit = t.read();
+ if(limit > 30){
+ t.stop();
+ break;
+ }
+ }
+ return freq1;
+ }
+
+
+void audio_out() {
+ record(freq);
+ for (int i = 0; i<100; i++){
+ if (freq[i] == 0){
+ }
+ else{
+ mySpeaker.PlayNote(freq[i],1.0,0.1);
+ }
+ }
+}
--- a/speakerout3.h Mon Apr 13 02:23:16 2020 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,90 +0,0 @@
-#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]) {
- t.start();
- for(int i = 0; i<100; i++){
- pc.printf("Please enter note\n");
- note = pc.getc();
- switch (note){
- case 'a':
- freq2 = 523.25;
- break;
-
- case 'b':
- freq2 = 554.37;
- break;
-
- case 'c':
- freq2 = 587.33;
- break;
-
- case 'd':
- freq2 = 622.25;
- 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;
- break;
- }
- freq1[i] = freq2;
- limit = t.read();
- if(limit > 30){
- t.stop();
- break;
- }
- }
- return freq1;
- }
-
-
-int main() {
- record(freq);
- for (int i = 0; i<100; i++){
- if (freq[i] == 0){
- }
- else{
- mySpeaker.PlayNote(freq[i],1.0,0.1);
- }
- }
-}
