~

Dependencies:   4DGL-uLCD-SE SDFileSystem

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?

UserRevisionLine numberNew 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 }