Slow SD Logger
Dependencies: Adafruit_RTCLib BNO055 SDFileSystem_SlowLogger analoghalls mbed
Fork of analoghalls by
main.cpp@6:29986fb055a5, 2017-12-12 (annotated)
- Committer:
- bwang
- Date:
- Tue Dec 12 16:16:16 2017 +0000
- Revision:
- 6:29986fb055a5
- Parent:
- 5:6da98f3faf33
- Child:
- 7:1a5039c49f5d
10Hz logging of plaintext (csv) files
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
nki | 0:9753f3c2e5ca | 1 | #include "mbed.h" |
bwang | 5:6da98f3faf33 | 2 | #include "SDFileSystem.h" |
bwang | 5:6da98f3faf33 | 3 | #include "DS1307.h" |
bwang | 5:6da98f3faf33 | 4 | #include "BNO055.h" |
bwang | 5:6da98f3faf33 | 5 | #include "string.h" |
bwang | 2:b5c19d4eddcc | 6 | |
bwang | 5:6da98f3faf33 | 7 | #define M_PI 3.1415927f |
bwang | 5:6da98f3faf33 | 8 | |
bwang | 5:6da98f3faf33 | 9 | #define DI D11 |
bwang | 5:6da98f3faf33 | 10 | #define DO D12 |
bwang | 5:6da98f3faf33 | 11 | #define SCK D13 |
bwang | 5:6da98f3faf33 | 12 | #define CS D10 |
bwang | 5:6da98f3faf33 | 13 | |
bwang | 5:6da98f3faf33 | 14 | #define I2C1_SDA PB_9 |
bwang | 5:6da98f3faf33 | 15 | #define I2C1_SCL PB_8 |
bwang | 2:b5c19d4eddcc | 16 | |
bwang | 5:6da98f3faf33 | 17 | #define I2C2_SDA D5 |
bwang | 5:6da98f3faf33 | 18 | #define I2C2_SCL D7 |
bwang | 5:6da98f3faf33 | 19 | |
bwang | 5:6da98f3faf33 | 20 | #define PAGE_SIZE 512 |
bwang | 5:6da98f3faf33 | 21 | #define clip(a) if ((a > 254)) a = 254 |
nki | 0:9753f3c2e5ca | 22 | |
bwang | 5:6da98f3faf33 | 23 | PwmOut pwm_r(D4); |
bwang | 5:6da98f3faf33 | 24 | PwmOut pwm_g(D6); |
bwang | 5:6da98f3faf33 | 25 | PwmOut pwm_b(D3); |
nki | 0:9753f3c2e5ca | 26 | |
bwang | 5:6da98f3faf33 | 27 | char fname[255]; |
bwang | 5:6da98f3faf33 | 28 | char current_time[64]; |
nki | 0:9753f3c2e5ca | 29 | |
bwang | 5:6da98f3faf33 | 30 | unsigned char buf[PAGE_SIZE]; |
bwang | 5:6da98f3faf33 | 31 | int buf_idx = 0; |
nki | 0:9753f3c2e5ca | 32 | |
bwang | 5:6da98f3faf33 | 33 | void printDT(char *pre, DateTime &dt) |
bwang | 5:6da98f3faf33 | 34 | { |
bwang | 5:6da98f3faf33 | 35 | printf("%s %u/%u/%02u %2u:%02u:%02u\r\n" |
bwang | 5:6da98f3faf33 | 36 | ,pre |
bwang | 5:6da98f3faf33 | 37 | ,dt.month(),dt.day(),dt.year() |
bwang | 5:6da98f3faf33 | 38 | ,dt.hour(),dt.minute(),dt.second() |
bwang | 5:6da98f3faf33 | 39 | ); |
bwang | 5:6da98f3faf33 | 40 | } |
nki | 0:9753f3c2e5ca | 41 | |
bwang | 5:6da98f3faf33 | 42 | bool rtcUpdate(RtcDs1307 &rtc, int32_t bias) // this must be signed |
bwang | 5:6da98f3faf33 | 43 | { bool bUpdated = false; |
bwang | 5:6da98f3faf33 | 44 | |
bwang | 5:6da98f3faf33 | 45 | // Use the compiled date/time as a basis for setting the clock. |
bwang | 5:6da98f3faf33 | 46 | // We assign it to a signed integer so that negative biases work correctly |
bwang | 5:6da98f3faf33 | 47 | int64_t compiledTime = DateTime(__DATE__,__TIME__).unixtime(); |
bwang | 5:6da98f3faf33 | 48 | |
bwang | 5:6da98f3faf33 | 49 | // This assumes that the program is run VERY soon after the initial compile. |
bwang | 5:6da98f3faf33 | 50 | time_t localt = DateTime(compiledTime + bias).unixtime(); // offset by bias |
bwang | 5:6da98f3faf33 | 51 | |
bwang | 5:6da98f3faf33 | 52 | // If the stored static time stamp does not equal the compiled time stamp, |
bwang | 5:6da98f3faf33 | 53 | // then we need to update the RTC clock and the stored time stamp |
bwang | 5:6da98f3faf33 | 54 | if(*((time_t *)&rtc[0]) != localt) |
bwang | 5:6da98f3faf33 | 55 | { |
bwang | 5:6da98f3faf33 | 56 | // Update the RTC time as local time, not GMT/UTC |
bwang | 5:6da98f3faf33 | 57 | rtc.adjust(localt); |
bwang | 5:6da98f3faf33 | 58 | // Store the new compiled time statically in the object ram image |
bwang | 5:6da98f3faf33 | 59 | *((time_t *)&rtc[0]) = localt; |
bwang | 5:6da98f3faf33 | 60 | // Push the object ram image to the RTC ram image |
bwang | 5:6da98f3faf33 | 61 | bUpdated = rtc.commit(); |
bwang | 5:6da98f3faf33 | 62 | } |
bwang | 5:6da98f3faf33 | 63 | |
bwang | 5:6da98f3faf33 | 64 | return bUpdated; |
bwang | 5:6da98f3faf33 | 65 | } |
nki | 0:9753f3c2e5ca | 66 | |
bwang | 4:f18f6bc5e1fd | 67 | int main() { |
bwang | 5:6da98f3faf33 | 68 | printf("%s\n", "Manworm's High-Speed Logger"); |
bwang | 5:6da98f3faf33 | 69 | |
bwang | 5:6da98f3faf33 | 70 | /*init RGB lights*/ |
bwang | 5:6da98f3faf33 | 71 | pwm_r.period(0.01); |
bwang | 5:6da98f3faf33 | 72 | pwm_g.period(0.01); |
bwang | 5:6da98f3faf33 | 73 | pwm_b.period(0.01); |
bwang | 5:6da98f3faf33 | 74 | |
bwang | 5:6da98f3faf33 | 75 | pwm_r = 0.0f; |
bwang | 5:6da98f3faf33 | 76 | pwm_g = 0.0f; |
bwang | 5:6da98f3faf33 | 77 | pwm_b = 0.0f; |
bwang | 5:6da98f3faf33 | 78 | |
bwang | 5:6da98f3faf33 | 79 | float theta = 0.0f; |
bwang | 5:6da98f3faf33 | 80 | int tics = 0; |
bwang | 5:6da98f3faf33 | 81 | |
bwang | 5:6da98f3faf33 | 82 | /*wait for SD card to be inserted*/ |
bwang | 5:6da98f3faf33 | 83 | SDFileSystem sd(DI, DO, SCK, CS, "sd"); |
bwang | 5:6da98f3faf33 | 84 | while (sd.disk_status()) { |
bwang | 5:6da98f3faf33 | 85 | sd.disk_initialize(); |
bwang | 5:6da98f3faf33 | 86 | wait(0.5); |
bwang | 5:6da98f3faf33 | 87 | } |
bwang | 5:6da98f3faf33 | 88 | |
bwang | 5:6da98f3faf33 | 89 | /*init RTC, get time and date for filename*/ |
bwang | 5:6da98f3faf33 | 90 | I2C i2c1(I2C1_SDA, I2C1_SCL); |
bwang | 5:6da98f3faf33 | 91 | i2c1.frequency(100000); |
bwang | 5:6da98f3faf33 | 92 | RtcDs1307 rtc(i2c1); |
bwang | 5:6da98f3faf33 | 93 | |
bwang | 5:6da98f3faf33 | 94 | rtcUpdate(rtc, -(5*60*60)); |
bwang | 5:6da98f3faf33 | 95 | DateTime dt = rtc.now(); |
bwang | 5:6da98f3faf33 | 96 | printDT("It is now", dt); |
bwang | 5:6da98f3faf33 | 97 | |
bwang | 5:6da98f3faf33 | 98 | strcpy(fname, "/sd/log_"); |
bwang | 5:6da98f3faf33 | 99 | sprintf(current_time, "%u.%u.%02u_%02u.%02u.%02u" |
bwang | 5:6da98f3faf33 | 100 | ,dt.month(),dt.day(),dt.year() |
bwang | 5:6da98f3faf33 | 101 | ,dt.hour(),dt.minute(),dt.second() |
bwang | 5:6da98f3faf33 | 102 | ); |
bwang | 5:6da98f3faf33 | 103 | strcat(fname, current_time); |
bwang | 5:6da98f3faf33 | 104 | strcat(fname, ".csv"); |
bwang | 5:6da98f3faf33 | 105 | printf("Logging to %s\n", fname); |
bwang | 5:6da98f3faf33 | 106 | |
bwang | 5:6da98f3faf33 | 107 | FILE *fp = fopen(fname, "w"); |
nki | 0:9753f3c2e5ca | 108 | |
bwang | 5:6da98f3faf33 | 109 | /*init IMU*/ |
bwang | 5:6da98f3faf33 | 110 | BNO055 imu(I2C2_SDA, I2C2_SCL); |
bwang | 5:6da98f3faf33 | 111 | imu.reset(); |
bwang | 5:6da98f3faf33 | 112 | if (!imu.check()) { |
bwang | 5:6da98f3faf33 | 113 | printf("%s\n", "IMU not ready"); |
bwang | 5:6da98f3faf33 | 114 | } else { |
bwang | 5:6da98f3faf33 | 115 | printf("BNO055 found\r\n\r\n"); |
bwang | 5:6da98f3faf33 | 116 | printf("Chip ID: %03d\r\n",imu.ID.id); |
bwang | 5:6da98f3faf33 | 117 | printf("Accelerometer ID: %03d\r\n",imu.ID.accel); |
bwang | 5:6da98f3faf33 | 118 | printf("Gyroscope ID: %03d\r\n",imu.ID.gyro); |
bwang | 5:6da98f3faf33 | 119 | printf("Magnetometer ID: %03d\r\n\r\n",imu.ID.mag); |
bwang | 5:6da98f3faf33 | 120 | printf("Firmware version v%d.%0d\r\n",imu.ID.sw[0],imu.ID.sw[1]); |
bwang | 5:6da98f3faf33 | 121 | printf("Bootloader version v%d\r\n\r\n",imu.ID.bootload); |
nki | 0:9753f3c2e5ca | 122 | } |
bwang | 5:6da98f3faf33 | 123 | imu.setmode(OPERATION_MODE_NDOF); |
bwang | 5:6da98f3faf33 | 124 | imu.set_accel_units(MPERSPERS); |
bwang | 5:6da98f3faf33 | 125 | |
bwang | 5:6da98f3faf33 | 126 | for (;;) { |
bwang | 5:6da98f3faf33 | 127 | float r, g, b; |
bwang | 5:6da98f3faf33 | 128 | r = sinf(theta); |
bwang | 5:6da98f3faf33 | 129 | g = sinf(theta + 2 * M_PI / 3); |
bwang | 5:6da98f3faf33 | 130 | b = sinf(theta - 2 * M_PI / 3); |
bwang | 5:6da98f3faf33 | 131 | |
bwang | 5:6da98f3faf33 | 132 | pwm_r = 0.5f + 0.5f * r; |
bwang | 5:6da98f3faf33 | 133 | pwm_g = 0.5f + 0.5f * g; |
bwang | 5:6da98f3faf33 | 134 | pwm_b = 0.5f + 0.5f * b; |
bwang | 5:6da98f3faf33 | 135 | |
bwang | 5:6da98f3faf33 | 136 | theta += 0.001f; |
bwang | 5:6da98f3faf33 | 137 | if (theta > 2 * M_PI) theta -= 2 * M_PI; |
bwang | 5:6da98f3faf33 | 138 | |
bwang | 5:6da98f3faf33 | 139 | tics++; |
bwang | 5:6da98f3faf33 | 140 | if (tics % 100 == 0) { |
bwang | 5:6da98f3faf33 | 141 | tics = 0; |
bwang | 5:6da98f3faf33 | 142 | |
bwang | 5:6da98f3faf33 | 143 | imu.get_accel(); |
bwang | 5:6da98f3faf33 | 144 | fprintf(fp, "%d,%d,%d\n",(int) (100*imu.accel.x),(int)(100*imu.accel.y),(int)(100*imu.accel.z)); |
bwang | 5:6da98f3faf33 | 145 | fflush(fp); |
bwang | 5:6da98f3faf33 | 146 | } |
bwang | 5:6da98f3faf33 | 147 | wait(0.001); |
bwang | 3:86ccde39f61b | 148 | } |
bwang | 5:6da98f3faf33 | 149 | } |