~
Dependencies: 4DGL-uLCD-SE SDFileSystem
main.cpp@14:2c2395937c57, 2016-10-18 (annotated)
- Committer:
- kswanson31
- Date:
- Tue Oct 18 18:34:44 2016 +0000
- Revision:
- 14:2c2395937c57
- Parent:
- 13:c14dc22c38ba
Included majority of all lab code, formatted to show device names and pins, device purpose information
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
fkhan39 | 7:1a21d8290cf1 | 1 | #include <fstream> |
fkhan39 | 7:1a21d8290cf1 | 2 | #include <string> |
kswanson31 | 14:2c2395937c57 | 3 | #include "mbed.h" |
kswanson31 | 14:2c2395937c57 | 4 | #include "LSM9DS1.h" |
kswanson31 | 14:2c2395937c57 | 5 | #include "math.h" |
kswanson31 | 14:2c2395937c57 | 6 | #include "uLCD_4DGL.h" |
kswanson31 | 14:2c2395937c57 | 7 | #include "Servo.h" |
kswanson31 | 14:2c2395937c57 | 8 | #include "Motor.h" |
kswanson31 | 14:2c2395937c57 | 9 | #include "StepperMotor_X27168.h" |
fkhan39 | 7:1a21d8290cf1 | 10 | #include "SDFileSystem.h" |
kswanson31 | 14:2c2395937c57 | 11 | #include "SongPlayer.h" |
fkhan39 | 0:570683b2d0c9 | 12 | |
fkhan39 | 7:1a21d8290cf1 | 13 | |
kswanson31 | 14:2c2395937c57 | 14 | /* Serial via USB |
kswanson31 | 5:151b0fa1fb44 | 15 | Serial pc(USBTX, USBRX); |
fkhan39 | 7:1a21d8290cf1 | 16 | */ |
fkhan39 | 7:1a21d8290cf1 | 17 | |
kswanson31 | 14:2c2395937c57 | 18 | /* Sine wave output pin |
kswanson31 | 5:151b0fa1fb44 | 19 | AnalogOut aout(p18); |
kswanson31 | 14:2c2395937c57 | 20 | */ |
kswanson31 | 14:2c2395937c57 | 21 | |
kswanson31 | 14:2c2395937c57 | 22 | /* IR distance sensor |
kswanson31 | 14:2c2395937c57 | 23 | AnalogIn ain(p15); // p15 <- senor out, yellow |
kswanson31 | 5:151b0fa1fb44 | 24 | DigitalOut led1(LED1); |
kswanson31 | 5:151b0fa1fb44 | 25 | DigitalOut led2(LED2); |
kswanson31 | 5:151b0fa1fb44 | 26 | DigitalOut led3(LED3); |
kswanson31 | 5:151b0fa1fb44 | 27 | DigitalOut led4(LED4); |
kswanson31 | 5:151b0fa1fb44 | 28 | */ |
kswanson31 | 5:151b0fa1fb44 | 29 | |
kswanson31 | 14:2c2395937c57 | 30 | /* IMU, using I2C |
kswanson31 | 14:2c2395937c57 | 31 | LSM9DS1 imu(p9, p10, 0xD6, 0x3C); // dev SDA, SCL |
kswanson31 | 14:2c2395937c57 | 32 | */ |
kswanson31 | 14:2c2395937c57 | 33 | |
kswanson31 | 14:2c2395937c57 | 34 | /* RS232 Serial |
kswanson31 | 14:2c2395937c57 | 35 | Serial pc(p13, p14); // dev RX, TX (serial) |
kswanson31 | 14:2c2395937c57 | 36 | */ |
fkhan39 | 11:eca6295235e6 | 37 | |
kswanson31 | 14:2c2395937c57 | 38 | /* LCD level and compass |
kswanson31 | 14:2c2395937c57 | 39 | uLCD_4DGL lcd(p28, p27, p30); // dev RX, TX, reset. Use +5 (Vu) |
kswanson31 | 14:2c2395937c57 | 40 | int ax, ay; |
kswanson31 | 14:2c2395937c57 | 41 | double theta; |
kswanson31 | 14:2c2395937c57 | 42 | */ |
kswanson31 | 14:2c2395937c57 | 43 | |
kswanson31 | 14:2c2395937c57 | 44 | /* Control high current device with xtor/relay |
kswanson31 | 14:2c2395937c57 | 45 | DigitalOut binaryCtrl(p25); // control signal |
kswanson31 | 14:2c2395937c57 | 46 | DigitalOut myled(LED1); |
kswanson31 | 12:a2908fdf3b66 | 47 | */ |
fkhan39 | 9:63c3c734a620 | 48 | |
kswanson31 | 14:2c2395937c57 | 49 | /* With Power MOSFET for pwm */ |
kswanson31 | 14:2c2395937c57 | 50 | PwmOut pwmCtrl(p25); // digital control with pwm |
kswanson31 | 14:2c2395937c57 | 51 | PwmOut myled(LED1); |
kswanson31 | 14:2c2395937c57 | 52 | |
kswanson31 | 14:2c2395937c57 | 53 | /* Servo movement |
kswanson31 | 14:2c2395937c57 | 54 | Servo myservo(p21); // dev yellow. Use Vu |
kswanson31 | 14:2c2395937c57 | 55 | */ |
kswanson31 | 14:2c2395937c57 | 56 | |
kswanson31 | 14:2c2395937c57 | 57 | /* DC Motor control with H-bridge |
kswanson31 | 14:2c2395937c57 | 58 | Motor m(p23, p11, p12); // pwm control, fwd, rev |
kswanson31 | 14:2c2395937c57 | 59 | */ |
kswanson31 | 14:2c2395937c57 | 60 | |
kswanson31 | 14:2c2395937c57 | 61 | /* Stepper motor |
kswanson31 | 14:2c2395937c57 | 62 | // pwmA and B set to 3.3V (no speed control, only directional) |
kswanson31 | 14:2c2395937c57 | 63 | // A poles on left side (top view). A1 pole to A02, etc. |
kswanson31 | 14:2c2395937c57 | 64 | StepperMotor_X27168 smotor(p25, p26, p23, p22); // bfwd, brev, afwd, arev |
kswanson31 | 14:2c2395937c57 | 65 | */ |
kswanson31 | 14:2c2395937c57 | 66 | |
kswanson31 | 14:2c2395937c57 | 67 | /* MEMS microphone |
fkhan39 | 4:f5bc5d9a790b | 68 | BusOut myleds(LED1,LED2,LED3,LED4); |
kswanson31 | 5:151b0fa1fb44 | 69 | |
fkhan39 | 4:f5bc5d9a790b | 70 | class microphone |
fkhan39 | 4:f5bc5d9a790b | 71 | { |
kswanson31 | 14:2c2395937c57 | 72 | public : |
kswanson31 | 14:2c2395937c57 | 73 | microphone(PinName pin); |
kswanson31 | 14:2c2395937c57 | 74 | float read(); |
kswanson31 | 14:2c2395937c57 | 75 | operator float (); |
kswanson31 | 14:2c2395937c57 | 76 | private : |
kswanson31 | 14:2c2395937c57 | 77 | AnalogIn _pin; |
fkhan39 | 4:f5bc5d9a790b | 78 | }; |
kswanson31 | 14:2c2395937c57 | 79 | |
fkhan39 | 4:f5bc5d9a790b | 80 | microphone::microphone (PinName pin): |
fkhan39 | 4:f5bc5d9a790b | 81 | _pin(pin) |
fkhan39 | 4:f5bc5d9a790b | 82 | { |
fkhan39 | 4:f5bc5d9a790b | 83 | } |
kswanson31 | 14:2c2395937c57 | 84 | |
fkhan39 | 4:f5bc5d9a790b | 85 | float microphone::read() |
fkhan39 | 4:f5bc5d9a790b | 86 | { |
fkhan39 | 4:f5bc5d9a790b | 87 | return _pin.read(); |
fkhan39 | 4:f5bc5d9a790b | 88 | } |
kswanson31 | 14:2c2395937c57 | 89 | |
fkhan39 | 4:f5bc5d9a790b | 90 | inline microphone::operator float () |
fkhan39 | 4:f5bc5d9a790b | 91 | { |
fkhan39 | 4:f5bc5d9a790b | 92 | return _pin.read(); |
fkhan39 | 4:f5bc5d9a790b | 93 | } |
fkhan39 | 4:f5bc5d9a790b | 94 | |
fkhan39 | 4:f5bc5d9a790b | 95 | microphone mymicrophone(p16); |
kswanson31 | 5:151b0fa1fb44 | 96 | */ |
fkhan39 | 0:570683b2d0c9 | 97 | |
kswanson31 | 14:2c2395937c57 | 98 | /* SPI bus: microSD card |
kswanson31 | 14:2c2395937c57 | 99 | SDFileSystem sd(p5, p6, p7, p8, "sd"); mosi -> DI, miso <- DO, slck -> sclck, CS -> CS |
kswanson31 | 14:2c2395937c57 | 100 | // CD on device could be used in PullUp mode to check if a card is present |
fkhan39 | 9:63c3c734a620 | 101 | */ |
fkhan39 | 11:eca6295235e6 | 102 | |
kswanson31 | 14:2c2395937c57 | 103 | /* Speaker |
fkhan39 | 9:63c3c734a620 | 104 | float note[16]= {329.628,329.628,329.628,349.228,391.995,391.995,391.995,349.228, |
fkhan39 | 9:63c3c734a620 | 105 | 329.628,349.228,391.995,349.228,329.628,293.665,329.628,349.228 |
fkhan39 | 9:63c3c734a620 | 106 | }; |
fkhan39 | 9:63c3c734a620 | 107 | float duration[16]= {0.48,0.12,0.48,0.12,0.48,0.12,0.12,0.12, |
fkhan39 | 9:63c3c734a620 | 108 | 0.12,0.12,0.12,0.12,0.48,0.12,1.68,0.12 |
fkhan39 | 9:63c3c734a620 | 109 | }; |
fkhan39 | 9:63c3c734a620 | 110 | */ |
fkhan39 | 9:63c3c734a620 | 111 | |
fkhan39 | 9:63c3c734a620 | 112 | |
fkhan39 | 9:63c3c734a620 | 113 | int main() { |
fkhan39 | 9:63c3c734a620 | 114 | |
kswanson31 | 14:2c2395937c57 | 115 | /* Sine wave output pin |
fkhan39 | 1:4ed94566512a | 116 | const double pi = 3.141592653589793238462; |
kswanson31 | 14:2c2395937c57 | 117 | const double amplitude = 1.0f; // 3.3 V |
kswanson31 | 14:2c2395937c57 | 118 | const double offset = 65535/2; // 0xFFFF/2, half the full 3.3V |
fkhan39 | 1:4ed94566512a | 119 | double rads = 0.0; |
fkhan39 | 1:4ed94566512a | 120 | uint16_t sample = 0; |
kswanson31 | 5:151b0fa1fb44 | 121 | */ |
fkhan39 | 9:63c3c734a620 | 122 | |
kswanson31 | 14:2c2395937c57 | 123 | /* RS232 Serial, LCD bubble level |
fkhan39 | 9:63c3c734a620 | 124 | imu.begin(); |
fkhan39 | 9:63c3c734a620 | 125 | if (!imu.begin()) { |
fkhan39 | 11:eca6295235e6 | 126 | pc.printf("Failed to communicate with imu9DS1.\n"); |
fkhan39 | 9:63c3c734a620 | 127 | } |
fkhan39 | 9:63c3c734a620 | 128 | imu.calibrate(); |
kswanson31 | 12:a2908fdf3b66 | 129 | */ |
fkhan39 | 11:eca6295235e6 | 130 | |
kswanson31 | 14:2c2395937c57 | 131 | /* Servo movement |
kswanson31 | 14:2c2395937c57 | 132 | // servo adjusts until desired angle is sensed, determind by the pulse width |
kswanson31 | 14:2c2395937c57 | 133 | // width varies from 1 - 2 ms, 1ms - 0 deg, 1.5 - 90 deg, 2 ms - 180 |
kswanson31 | 14:2c2395937c57 | 134 | // servo updates below every 20ms |
kswanson31 | 14:2c2395937c57 | 135 | for(float p=0; p<1.0; p += 0.1) { |
kswanson31 | 14:2c2395937c57 | 136 | myservo = p; |
kswanson31 | 14:2c2395937c57 | 137 | wait(0.2); |
kswanson31 | 14:2c2395937c57 | 138 | } |
kswanson31 | 14:2c2395937c57 | 139 | */ |
kswanson31 | 14:2c2395937c57 | 140 | |
kswanson31 | 14:2c2395937c57 | 141 | /* DC Motor control with H-bridge |
kswanson31 | 14:2c2395937c57 | 142 | for (float s= -1.0; s < 1.0 ; s += 0.01) { |
kswanson31 | 14:2c2395937c57 | 143 | m.speed(s); |
kswanson31 | 14:2c2395937c57 | 144 | wait(0.02); |
kswanson31 | 14:2c2395937c57 | 145 | } |
kswanson31 | 14:2c2395937c57 | 146 | */ |
kswanson31 | 14:2c2395937c57 | 147 | |
kswanson31 | 14:2c2395937c57 | 148 | /* Stepper motor |
kswanson31 | 14:2c2395937c57 | 149 | smotor.step_position(180); |
kswanson31 | 14:2c2395937c57 | 150 | wait(0.5); |
kswanson31 | 14:2c2395937c57 | 151 | |
kswanson31 | 14:2c2395937c57 | 152 | smotor.step_position(100); |
kswanson31 | 14:2c2395937c57 | 153 | wait(0.5); |
kswanson31 | 14:2c2395937c57 | 154 | |
kswanson31 | 14:2c2395937c57 | 155 | smotor.angle_position(270); |
kswanson31 | 14:2c2395937c57 | 156 | wait(0.5); |
kswanson31 | 14:2c2395937c57 | 157 | |
kswanson31 | 14:2c2395937c57 | 158 | smotor.step_position(0); |
kswanson31 | 14:2c2395937c57 | 159 | wait(0.5); |
kswanson31 | 14:2c2395937c57 | 160 | */ |
fkhan39 | 9:63c3c734a620 | 161 | |
kswanson31 | 14:2c2395937c57 | 162 | /* SPI bus: microSD card |
fkhan39 | 9:63c3c734a620 | 163 | mkdir("/sd/mydir", 0777); |
kswanson31 | 14:2c2395937c57 | 164 | |
fkhan39 | 9:63c3c734a620 | 165 | FILE *fp = fopen("/sd/mydir/sdtest.txt", "w"); |
fkhan39 | 9:63c3c734a620 | 166 | if(fp == NULL) { |
fkhan39 | 9:63c3c734a620 | 167 | error("Could not open file for write\n"); |
fkhan39 | 9:63c3c734a620 | 168 | } |
kswanson31 | 14:2c2395937c57 | 169 | |
fkhan39 | 9:63c3c734a620 | 170 | fprintf(fp, "Hello SD file World!"); |
fkhan39 | 9:63c3c734a620 | 171 | fclose(fp); |
fkhan39 | 9:63c3c734a620 | 172 | |
fkhan39 | 9:63c3c734a620 | 173 | std::ifstream file("/sd/mydir/sdtest.txt"); |
fkhan39 | 9:63c3c734a620 | 174 | string str; |
fkhan39 | 9:63c3c734a620 | 175 | |
fkhan39 | 9:63c3c734a620 | 176 | while (std::getline(file, str)) |
fkhan39 | 9:63c3c734a620 | 177 | { |
fkhan39 | 9:63c3c734a620 | 178 | const char * c = str.c_str(); |
fkhan39 | 9:63c3c734a620 | 179 | pc.printf(c); |
fkhan39 | 9:63c3c734a620 | 180 | } |
fkhan39 | 9:63c3c734a620 | 181 | */ |
fkhan39 | 9:63c3c734a620 | 182 | |
kswanson31 | 14:2c2395937c57 | 183 | /* Speaker |
kswanson31 | 14:2c2395937c57 | 184 | SongPlayer mySpeaker(p26); // pwm pin |
fkhan39 | 9:63c3c734a620 | 185 | // Start song and return once playing starts |
kswanson31 | 14:2c2395937c57 | 186 | mySpeaker.PlaySong(note, duration); |
fkhan39 | 9:63c3c734a620 | 187 | */ |
fkhan39 | 9:63c3c734a620 | 188 | |
fkhan39 | 9:63c3c734a620 | 189 | while (1) { |
fkhan39 | 9:63c3c734a620 | 190 | |
kswanson31 | 14:2c2395937c57 | 191 | /* Sine wave output pin |
fkhan39 | 9:63c3c734a620 | 192 | for (int i = 0; i < 720; i++) { |
fkhan39 | 9:63c3c734a620 | 193 | rads = (pi * i) / 180.0f; |
fkhan39 | 9:63c3c734a620 | 194 | sample = (uint16_t)(amplitude * (offset * (cos(rads + pi))) + offset); |
fkhan39 | 9:63c3c734a620 | 195 | aout.write_u16(sample); |
fkhan39 | 9:63c3c734a620 | 196 | } |
kswanson31 | 14:2c2395937c57 | 197 | */ |
fkhan39 | 9:63c3c734a620 | 198 | |
kswanson31 | 14:2c2395937c57 | 199 | /* IR distance sensor |
kswanson31 | 14:2c2395937c57 | 200 | led1 = (ain > 0.2f) ? 1 : 0; // more LEDs with increasing distance |
fkhan39 | 9:63c3c734a620 | 201 | led2 = (ain > 0.4f) ? 1 : 0; |
fkhan39 | 9:63c3c734a620 | 202 | led3 = (ain > 0.6f) ? 1 : 0; |
fkhan39 | 9:63c3c734a620 | 203 | led4 = (ain > 0.8f) ? 1 : 0; |
fkhan39 | 9:63c3c734a620 | 204 | wait(.01); |
fkhan39 | 9:63c3c734a620 | 205 | */ |
fkhan39 | 9:63c3c734a620 | 206 | |
kswanson31 | 14:2c2395937c57 | 207 | /* RS232 Serial |
fkhan39 | 11:eca6295235e6 | 208 | imu.readAccel(); |
fkhan39 | 11:eca6295235e6 | 209 | imu.readMag(); |
fkhan39 | 11:eca6295235e6 | 210 | imu.readGyro(); |
fkhan39 | 11:eca6295235e6 | 211 | |
fkhan39 | 11:eca6295235e6 | 212 | pc.printf("gyro: %d %d %d\n\r", imu.gx, imu.gy, imu.gz); |
fkhan39 | 11:eca6295235e6 | 213 | pc.printf("accel: %d %d %d\n\r", imu.ax, imu.ay, imu.az); |
fkhan39 | 11:eca6295235e6 | 214 | pc.printf("mag: %d %d %d\n\n\r", imu.mx, imu.my, imu.mz); |
kswanson31 | 12:a2908fdf3b66 | 215 | */ |
fkhan39 | 11:eca6295235e6 | 216 | |
kswanson31 | 14:2c2395937c57 | 217 | /* LCD level and compass |
fkhan39 | 9:63c3c734a620 | 218 | imu.readAccel(); |
fkhan39 | 9:63c3c734a620 | 219 | imu.readMag(); |
fkhan39 | 9:63c3c734a620 | 220 | imu.readGyro(); |
kswanson31 | 14:2c2395937c57 | 221 | |
kswanson31 | 14:2c2395937c57 | 222 | // level |
kswanson31 | 3:99acbebbed6c | 223 | |
kswanson31 | 14:2c2395937c57 | 224 | lcd.filled_circle(64 + ax / 250, 64 + ay/ 250 , 8, BLACK); // write over past circle |
kswanson31 | 14:2c2395937c57 | 225 | ax = imu.ax, ay = imu.ay; // get data |
kswanson31 | 14:2c2395937c57 | 226 | lcd.filled_circle(64 + ax / 250, 64 + ay/ 250 , 8, WHITE); // draw new 'reading' |
kswanson31 | 14:2c2395937c57 | 227 | lcd.circle(64, 64, 10, WHITE); // redraw the center (constant) |
fkhan39 | 9:63c3c734a620 | 228 | |
kswanson31 | 14:2c2395937c57 | 229 | // compass |
fkhan39 | 9:63c3c734a620 | 230 | |
kswanson31 | 14:2c2395937c57 | 231 | lcd.line(64,64,64+60*cos(theta), 64+60*sin(theta), BLACK); // write over past heading |
kswanson31 | 14:2c2395937c57 | 232 | theta = atan2((double)imu.mx, (double)imu.my); // get data |
kswanson31 | 14:2c2395937c57 | 233 | lcd.line(64,64,64+60*cos(theta), 64+60*sin(theta), GREEN); // draw new heading |
fkhan39 | 9:63c3c734a620 | 234 | lcd.locate(0,1); |
kswanson31 | 14:2c2395937c57 | 235 | lcd.printf("%f",180 * theta / 3.14159); // write degree heading at the top left |
fkhan39 | 9:63c3c734a620 | 236 | */ |
kswanson31 | 12:a2908fdf3b66 | 237 | |
kswanson31 | 14:2c2395937c57 | 238 | /* Control high current device with xtor/relay |
kswanson31 | 14:2c2395937c57 | 239 | binaryCtrl = 1; // slow out because of relay |
kswanson31 | 13:c14dc22c38ba | 240 | myled = 1; |
kswanson31 | 13:c14dc22c38ba | 241 | wait(.2); |
kswanson31 | 14:2c2395937c57 | 242 | binaryCtrl = 0; |
kswanson31 | 13:c14dc22c38ba | 243 | myled = 0; |
kswanson31 | 13:c14dc22c38ba | 244 | wait(.2); |
kswanson31 | 14:2c2395937c57 | 245 | */ |
kswanson31 | 13:c14dc22c38ba | 246 | |
kswanson31 | 14:2c2395937c57 | 247 | /* With Power MOSFET for pwm */ |
kswanson31 | 14:2c2395937c57 | 248 | myled = 1.0f; |
kswanson31 | 12:a2908fdf3b66 | 249 | |
kswanson31 | 12:a2908fdf3b66 | 250 | for (int i = 0; i < 5; i++) { |
kswanson31 | 14:2c2395937c57 | 251 | pwmCtrl = i*0.2f; |
kswanson31 | 14:2c2395937c57 | 252 | myled = pwmCtrl; |
kswanson31 | 14:2c2395937c57 | 253 | wait(.2); |
kswanson31 | 12:a2908fdf3b66 | 254 | } |
kswanson31 | 14:2c2395937c57 | 255 | |
kswanson31 | 14:2c2395937c57 | 256 | /* MEMS microphone |
kswanson31 | 14:2c2395937c57 | 257 | //read in, subtract 0.67 DC bias, take absolute value, and scale up from .1Vpp to 15 (0xFFFF) for builtin LEDs |
kswanson31 | 14:2c2395937c57 | 258 | myleds = (int) abs( mymicrophone - 0.67/3.3 ) * 500.0; |
kswanson31 | 14:2c2395937c57 | 259 | //Use an 8kHz audio sample rate (phone quality audio); |
kswanson31 | 14:2c2395937c57 | 260 | wait(1.0/8000.0); |
kswanson31 | 12:a2908fdf3b66 | 261 | */ |
fkhan39 | 9:63c3c734a620 | 262 | } |
kswanson31 | 14:2c2395937c57 | 263 | } |