Joseph Guinta
/
ECE4180Lab2
Mbed code for ECE4180 lab2
main.cpp@0:8c9202ca7351, 2014-02-11 (annotated)
- Committer:
- jguinta3
- Date:
- Tue Feb 11 22:29:34 2014 +0000
- Revision:
- 0:8c9202ca7351
ECE4180 lab 2 initial commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jguinta3 | 0:8c9202ca7351 | 1 | /* |
jguinta3 | 0:8c9202ca7351 | 2 | * Allen Wild |
jguinta3 | 0:8c9202ca7351 | 3 | * Joseph Guinta |
jguinta3 | 0:8c9202ca7351 | 4 | * |
jguinta3 | 0:8c9202ca7351 | 5 | * ECE 4180 Lab 2 |
jguinta3 | 0:8c9202ca7351 | 6 | */ |
jguinta3 | 0:8c9202ca7351 | 7 | |
jguinta3 | 0:8c9202ca7351 | 8 | #include "mbed.h" |
jguinta3 | 0:8c9202ca7351 | 9 | #include "rtos.h" |
jguinta3 | 0:8c9202ca7351 | 10 | #include "HMC6352.h" |
jguinta3 | 0:8c9202ca7351 | 11 | #include "EthernetInterface.h" |
jguinta3 | 0:8c9202ca7351 | 12 | #include "uLCD_4DGL.h" |
jguinta3 | 0:8c9202ca7351 | 13 | #include "SDFileSystem.h" |
jguinta3 | 0:8c9202ca7351 | 14 | #include "Speaker.h" |
jguinta3 | 0:8c9202ca7351 | 15 | #include "wave_player.h" |
jguinta3 | 0:8c9202ca7351 | 16 | #include "Servo.h" |
jguinta3 | 0:8c9202ca7351 | 17 | |
jguinta3 | 0:8c9202ca7351 | 18 | #define ANALOG_OUT_PIN p18 |
jguinta3 | 0:8c9202ca7351 | 19 | #define ANALOG_IN p19 |
jguinta3 | 0:8c9202ca7351 | 20 | #define SOUND_WAVFILE "/sd/wavfiles/coolsound.wav" |
jguinta3 | 0:8c9202ca7351 | 21 | #define PWM_PIN p0 |
jguinta3 | 0:8c9202ca7351 | 22 | |
jguinta3 | 0:8c9202ca7351 | 23 | void part1Function(void); |
jguinta3 | 0:8c9202ca7351 | 24 | void part2Function(void); |
jguinta3 | 0:8c9202ca7351 | 25 | void part4Function(void); |
jguinta3 | 0:8c9202ca7351 | 26 | void part5Function(void); |
jguinta3 | 0:8c9202ca7351 | 27 | void part6Function(void); |
jguinta3 | 0:8c9202ca7351 | 28 | void part7Function(void); |
jguinta3 | 0:8c9202ca7351 | 29 | void part8Function(void); |
jguinta3 | 0:8c9202ca7351 | 30 | |
jguinta3 | 0:8c9202ca7351 | 31 | //Part 1 - Analog |
jguinta3 | 0:8c9202ca7351 | 32 | float Analog_out_data[40]; |
jguinta3 | 0:8c9202ca7351 | 33 | AnalogOut a_out_signal(ANALOG_OUT_PIN); |
jguinta3 | 0:8c9202ca7351 | 34 | AnalogIn a_in(ANALOG_IN); |
jguinta3 | 0:8c9202ca7351 | 35 | DigitalOut led1(LED1); |
jguinta3 | 0:8c9202ca7351 | 36 | DigitalOut led2(LED2); |
jguinta3 | 0:8c9202ca7351 | 37 | DigitalOut led3(LED3); |
jguinta3 | 0:8c9202ca7351 | 38 | DigitalOut led4(LED4); |
jguinta3 | 0:8c9202ca7351 | 39 | |
jguinta3 | 0:8c9202ca7351 | 40 | //Part 2 and 3 - I2C and Serial |
jguinta3 | 0:8c9202ca7351 | 41 | HMC6352 compass(p9, p10); |
jguinta3 | 0:8c9202ca7351 | 42 | Serial pc(USBTX, USBRX); |
jguinta3 | 0:8c9202ca7351 | 43 | |
jguinta3 | 0:8c9202ca7351 | 44 | |
jguinta3 | 0:8c9202ca7351 | 45 | //Part 4 - Ethernet |
jguinta3 | 0:8c9202ca7351 | 46 | EthernetInterface eth; |
jguinta3 | 0:8c9202ca7351 | 47 | |
jguinta3 | 0:8c9202ca7351 | 48 | |
jguinta3 | 0:8c9202ca7351 | 49 | //Part 5 - servo position control |
jguinta3 | 0:8c9202ca7351 | 50 | PwmOut servo(p21); |
jguinta3 | 0:8c9202ca7351 | 51 | |
jguinta3 | 0:8c9202ca7351 | 52 | //Part 6 - Color LCD |
jguinta3 | 0:8c9202ca7351 | 53 | uLCD_4DGL uLCD(p28, p27, p29); |
jguinta3 | 0:8c9202ca7351 | 54 | |
jguinta3 | 0:8c9202ca7351 | 55 | // Part 7 - SD |
jguinta3 | 0:8c9202ca7351 | 56 | SDFileSystem sd(p5, p6, p7, p8, "sd"); |
jguinta3 | 0:8c9202ca7351 | 57 | //Part 8 - Speaker |
jguinta3 | 0:8c9202ca7351 | 58 | AnalogOut DACout(p18); |
jguinta3 | 0:8c9202ca7351 | 59 | wave_player waver(&DACout); |
jguinta3 | 0:8c9202ca7351 | 60 | int main() { |
jguinta3 | 0:8c9202ca7351 | 61 | part1Function(); //Analog |
jguinta3 | 0:8c9202ca7351 | 62 | part2Function(); |
jguinta3 | 0:8c9202ca7351 | 63 | part4Function(); //Ethernet |
jguinta3 | 0:8c9202ca7351 | 64 | part5Function(); //servo |
jguinta3 | 0:8c9202ca7351 | 65 | part6Function(); //Color LCD |
jguinta3 | 0:8c9202ca7351 | 66 | part7Function(); //SD |
jguinta3 | 0:8c9202ca7351 | 67 | part8Function(); //Sound |
jguinta3 | 0:8c9202ca7351 | 68 | } |
jguinta3 | 0:8c9202ca7351 | 69 | |
jguinta3 | 0:8c9202ca7351 | 70 | |
jguinta3 | 0:8c9202ca7351 | 71 | |
jguinta3 | 0:8c9202ca7351 | 72 | void part1Function(void) { |
jguinta3 | 0:8c9202ca7351 | 73 | int i = 0; |
jguinta3 | 0:8c9202ca7351 | 74 | //precompute sine wave values |
jguinta3 | 0:8c9202ca7351 | 75 | for( i=0; i<40; i++) { |
jguinta3 | 0:8c9202ca7351 | 76 | Analog_out_data[i]=((1.0 + sin((float(i)/40.0*6.28318530717959)))/2.0); // scale the sine wave from 0.0 to 1.0 |
jguinta3 | 0:8c9202ca7351 | 77 | } |
jguinta3 | 0:8c9202ca7351 | 78 | |
jguinta3 | 0:8c9202ca7351 | 79 | |
jguinta3 | 0:8c9202ca7351 | 80 | //part 1 while loop - consider making each part a separate function (easy to call and comment out) |
jguinta3 | 0:8c9202ca7351 | 81 | while (true) { |
jguinta3 | 0:8c9202ca7351 | 82 | |
jguinta3 | 0:8c9202ca7351 | 83 | //is this what he means by 2 complete cycles for each iteration of the loop?? |
jguinta3 | 0:8c9202ca7351 | 84 | for (i = 0; i < 40; i++) { //cycle 1 |
jguinta3 | 0:8c9202ca7351 | 85 | a_out_signal = Analog_out_data[i]; |
jguinta3 | 0:8c9202ca7351 | 86 | wait(.1); |
jguinta3 | 0:8c9202ca7351 | 87 | } |
jguinta3 | 0:8c9202ca7351 | 88 | for (i = 0; i < 40; i++) { //cycle 2 |
jguinta3 | 0:8c9202ca7351 | 89 | a_out_signal = Analog_out_data[i]; |
jguinta3 | 0:8c9202ca7351 | 90 | wait(.1); |
jguinta3 | 0:8c9202ca7351 | 91 | } |
jguinta3 | 0:8c9202ca7351 | 92 | |
jguinta3 | 0:8c9202ca7351 | 93 | //As the voltage passes a threshold, turn on another LED |
jguinta3 | 0:8c9202ca7351 | 94 | led1 = (a_in > 0.2) ? 1 : 0; |
jguinta3 | 0:8c9202ca7351 | 95 | led2 = (a_in > 0.4) ? 1 : 0; |
jguinta3 | 0:8c9202ca7351 | 96 | led3 = (a_in > 0.6) ? 1 : 0; |
jguinta3 | 0:8c9202ca7351 | 97 | led4 = (a_in > 0.8) ? 1 : 0; |
jguinta3 | 0:8c9202ca7351 | 98 | |
jguinta3 | 0:8c9202ca7351 | 99 | wait(0.3); |
jguinta3 | 0:8c9202ca7351 | 100 | } |
jguinta3 | 0:8c9202ca7351 | 101 | |
jguinta3 | 0:8c9202ca7351 | 102 | }//end of part1 |
jguinta3 | 0:8c9202ca7351 | 103 | |
jguinta3 | 0:8c9202ca7351 | 104 | void part2Function(void) { |
jguinta3 | 0:8c9202ca7351 | 105 | compass.setOpMode(2, 1, 20); //continuous mode, set/reset, 20Hz |
jguinta3 | 0:8c9202ca7351 | 106 | |
jguinta3 | 0:8c9202ca7351 | 107 | while (1) { |
jguinta3 | 0:8c9202ca7351 | 108 | |
jguinta3 | 0:8c9202ca7351 | 109 | wait(0.1); |
jguinta3 | 0:8c9202ca7351 | 110 | |
jguinta3 | 0:8c9202ca7351 | 111 | pc.printf("Compass reading: %f\n", compass.sample() / 10.0); //Compass.sample() returns value from 0 -3599.xxx or something like that, so divide by 10 to get 0-360 degrees |
jguinta3 | 0:8c9202ca7351 | 112 | |
jguinta3 | 0:8c9202ca7351 | 113 | } |
jguinta3 | 0:8c9202ca7351 | 114 | } //end part 2 |
jguinta3 | 0:8c9202ca7351 | 115 | |
jguinta3 | 0:8c9202ca7351 | 116 | |
jguinta3 | 0:8c9202ca7351 | 117 | void part4Function(void) { //Code taken from http://mbed.org/handbook/Ethernet-Interface |
jguinta3 | 0:8c9202ca7351 | 118 | eth.init(); //Use DHCP |
jguinta3 | 0:8c9202ca7351 | 119 | eth.connect(); |
jguinta3 | 0:8c9202ca7351 | 120 | pc.printf("IP Address is %s\n", eth.getIPAddress()); |
jguinta3 | 0:8c9202ca7351 | 121 | |
jguinta3 | 0:8c9202ca7351 | 122 | TCPSocketConnection sock; |
jguinta3 | 0:8c9202ca7351 | 123 | sock.connect("mbed.org", 80); |
jguinta3 | 0:8c9202ca7351 | 124 | |
jguinta3 | 0:8c9202ca7351 | 125 | char http_cmd[] = "GET /media/uploads/mbed_official/hello.txt HTTP/1.0\n\n"; |
jguinta3 | 0:8c9202ca7351 | 126 | sock.send_all(http_cmd, sizeof(http_cmd)-1); |
jguinta3 | 0:8c9202ca7351 | 127 | |
jguinta3 | 0:8c9202ca7351 | 128 | char buffer[300]; |
jguinta3 | 0:8c9202ca7351 | 129 | int ret; |
jguinta3 | 0:8c9202ca7351 | 130 | while (true) { |
jguinta3 | 0:8c9202ca7351 | 131 | ret = sock.receive(buffer, sizeof(buffer)-1); |
jguinta3 | 0:8c9202ca7351 | 132 | if (ret <= 0) |
jguinta3 | 0:8c9202ca7351 | 133 | break; |
jguinta3 | 0:8c9202ca7351 | 134 | buffer[ret] = '\0'; |
jguinta3 | 0:8c9202ca7351 | 135 | pc.printf("Received %d chars from server:\n%s\n", ret, buffer); |
jguinta3 | 0:8c9202ca7351 | 136 | } |
jguinta3 | 0:8c9202ca7351 | 137 | |
jguinta3 | 0:8c9202ca7351 | 138 | sock.close(); |
jguinta3 | 0:8c9202ca7351 | 139 | |
jguinta3 | 0:8c9202ca7351 | 140 | eth.disconnect(); |
jguinta3 | 0:8c9202ca7351 | 141 | while(1) {} |
jguinta3 | 0:8c9202ca7351 | 142 | } //end part 4 |
jguinta3 | 0:8c9202ca7351 | 143 | |
jguinta3 | 0:8c9202ca7351 | 144 | void part5Function(void) { |
jguinta3 | 0:8c9202ca7351 | 145 | servo.period_ms(20); //20ms period |
jguinta3 | 0:8c9202ca7351 | 146 | while (1) { |
jguinta3 | 0:8c9202ca7351 | 147 | for(float offset=0.0; offset<0.001; offset+=0.0001) { |
jguinta3 | 0:8c9202ca7351 | 148 | servo.pulsewidth_ms(1 + offset); // servo position determined by a pulsewidth between 1-2ms |
jguinta3 | 0:8c9202ca7351 | 149 | wait(0.2); |
jguinta3 | 0:8c9202ca7351 | 150 | } |
jguinta3 | 0:8c9202ca7351 | 151 | } |
jguinta3 | 0:8c9202ca7351 | 152 | |
jguinta3 | 0:8c9202ca7351 | 153 | } //end part 5 |
jguinta3 | 0:8c9202ca7351 | 154 | |
jguinta3 | 0:8c9202ca7351 | 155 | void part6Function(void) { |
jguinta3 | 0:8c9202ca7351 | 156 | uLCD.printf("\nHello World!\n"); |
jguinta3 | 0:8c9202ca7351 | 157 | } //end part 6 |
jguinta3 | 0:8c9202ca7351 | 158 | |
jguinta3 | 0:8c9202ca7351 | 159 | void part7Function(void) { |
jguinta3 | 0:8c9202ca7351 | 160 | |
jguinta3 | 0:8c9202ca7351 | 161 | |
jguinta3 | 0:8c9202ca7351 | 162 | mkdir("/sd/mydir", 0777); |
jguinta3 | 0:8c9202ca7351 | 163 | |
jguinta3 | 0:8c9202ca7351 | 164 | FILE *fp = fopen("/sd/mydir/hellosd.txt", "w"); |
jguinta3 | 0:8c9202ca7351 | 165 | if(fp == NULL) { |
jguinta3 | 0:8c9202ca7351 | 166 | error("Could not open file for write\n"); |
jguinta3 | 0:8c9202ca7351 | 167 | } |
jguinta3 | 0:8c9202ca7351 | 168 | fprintf(fp, "Hello SD file world"); |
jguinta3 | 0:8c9202ca7351 | 169 | fclose(fp); |
jguinta3 | 0:8c9202ca7351 | 170 | |
jguinta3 | 0:8c9202ca7351 | 171 | fp = fopen("/sd/mydir/hellosd.txt", "r"); //open file, read string and write to pc through usb virtual com port |
jguinta3 | 0:8c9202ca7351 | 172 | if(fp == NULL) { |
jguinta3 | 0:8c9202ca7351 | 173 | error("Could not open file for read\n"); |
jguinta3 | 0:8c9202ca7351 | 174 | } |
jguinta3 | 0:8c9202ca7351 | 175 | char mystring [100]; //allocate space for string |
jguinta3 | 0:8c9202ca7351 | 176 | if ( fgets (mystring , 100 , fp) != NULL ) //read in line |
jguinta3 | 0:8c9202ca7351 | 177 | pc.printf("%s\n",mystring); //can i do this? i haven't done c in so long |
jguinta3 | 0:8c9202ca7351 | 178 | fclose(fp); |
jguinta3 | 0:8c9202ca7351 | 179 | } //end part 7 |
jguinta3 | 0:8c9202ca7351 | 180 | |
jguinta3 | 0:8c9202ca7351 | 181 | void part8Function(void) { |
jguinta3 | 0:8c9202ca7351 | 182 | |
jguinta3 | 0:8c9202ca7351 | 183 | //open wav file |
jguinta3 | 0:8c9202ca7351 | 184 | FILE *wave_file; |
jguinta3 | 0:8c9202ca7351 | 185 | wave_file = fopen(SOUND_WAVFILE, "r"); |
jguinta3 | 0:8c9202ca7351 | 186 | |
jguinta3 | 0:8c9202ca7351 | 187 | //play wav file |
jguinta3 | 0:8c9202ca7351 | 188 | waver.play(wave_file); |
jguinta3 | 0:8c9202ca7351 | 189 | |
jguinta3 | 0:8c9202ca7351 | 190 | //close wav file |
jguinta3 | 0:8c9202ca7351 | 191 | fclose(wave_file); |
jguinta3 | 0:8c9202ca7351 | 192 | }//end part 8 |