commit

Dependencies:   PID SDFileSystem Stepper_Motor_X27168 mbed-rtos mbed millis

Committer:
ebeauchemin3
Date:
Fri Apr 29 15:00:18 2016 +0000
Revision:
1:d6183c8b01de
Parent:
0:3a7cef09ad54
commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ebeauchemin3 0:3a7cef09ad54 1 #include "mbed.h"
ebeauchemin3 0:3a7cef09ad54 2 #include <stdio.h>
ebeauchemin3 0:3a7cef09ad54 3 #include <stdlib.h>
ebeauchemin3 0:3a7cef09ad54 4 #include <math.h>
ebeauchemin3 0:3a7cef09ad54 5 #include <assert.h>
ebeauchemin3 0:3a7cef09ad54 6 #include "SDFileSystem.h"
ebeauchemin3 0:3a7cef09ad54 7 #include "StepperMotor_X27168.h"
ebeauchemin3 0:3a7cef09ad54 8 #include <mbed.h>
ebeauchemin3 0:3a7cef09ad54 9 #include <mpr121.h>
ebeauchemin3 0:3a7cef09ad54 10 #include "rtos.h"
ebeauchemin3 0:3a7cef09ad54 11 #include "PID.h"
ebeauchemin3 0:3a7cef09ad54 12 #include "millis/millis.h"
ebeauchemin3 0:3a7cef09ad54 13 DigitalOut myled(LED1);
ebeauchemin3 0:3a7cef09ad54 14 Serial pc(USBTX, USBRX);
ebeauchemin3 0:3a7cef09ad54 15 SDFileSystem sd(p5, p6, p7, p8, "sd");
ebeauchemin3 0:3a7cef09ad54 16
ebeauchemin3 0:3a7cef09ad54 17 float xNowPrint;
ebeauchemin3 0:3a7cef09ad54 18 float yNowPrint;
ebeauchemin3 0:3a7cef09ad54 19 float zNowPrint;
ebeauchemin3 0:3a7cef09ad54 20
ebeauchemin3 0:3a7cef09ad54 21 #define DEFAULT_Kp 5//mess with these to increase speed, was 1, .002, 20
ebeauchemin3 0:3a7cef09ad54 22 #define DEFAULT_Ki 0.01
ebeauchemin3 0:3a7cef09ad54 23 #define DEFAULT_Kd 20
ebeauchemin3 0:3a7cef09ad54 24 #define THERMISTORNOMINAL 100000 // 100k
ebeauchemin3 0:3a7cef09ad54 25 // temp. for nominal resistance (almost always 25 C)
ebeauchemin3 0:3a7cef09ad54 26 #define TEMPERATURENOMINAL 25
ebeauchemin3 0:3a7cef09ad54 27 // The beta coefficient of the thermistor (usually 3000-4000)
ebeauchemin3 0:3a7cef09ad54 28 #define BCOEFFICIENT 3950
ebeauchemin3 0:3a7cef09ad54 29 // the value of the 'other' resistor
ebeauchemin3 0:3a7cef09ad54 30 #define SERIESRESISTOR 4700
ebeauchemin3 0:3a7cef09ad54 31 #define AUTOMATIC 1
ebeauchemin3 0:3a7cef09ad54 32 #define MANUAL 0
ebeauchemin3 0:3a7cef09ad54 33 #define DIRECT 0
ebeauchemin3 0:3a7cef09ad54 34 #define REVERSE 1
ebeauchemin3 0:3a7cef09ad54 35 #define thermistor A3 // FRDM-K64F Analog input pin A3 - Adjust to your particular board
ebeauchemin3 0:3a7cef09ad54 36 #define driver PTC3 // FRDM-K64F PWM output pin PTC3 - Adjust to your particular board
ebeauchemin3 0:3a7cef09ad54 37
ebeauchemin3 0:3a7cef09ad54 38 AnalogIn Thermistor(p20);//thermistor); // Read temperature value from thermistor on A3
ebeauchemin3 0:3a7cef09ad54 39 PwmOut Driver(p25); // PWM drive FET heater on PTC3 values are 0-1.0
ebeauchemin3 0:3a7cef09ad54 40 // For 0-100%
ebeauchemin3 0:3a7cef09ad54 41
ebeauchemin3 0:3a7cef09ad54 42 float Input, Output, Setpoint, currTemp =0;
ebeauchemin3 0:3a7cef09ad54 43 PID controller(&Input, &Output, &Setpoint, DEFAULT_Kp , DEFAULT_Ki , DEFAULT_Kd , DIRECT);
ebeauchemin3 0:3a7cef09ad54 44
ebeauchemin3 0:3a7cef09ad54 45 #define RATE 1.0 // Print rate Once per second
ebeauchemin3 0:3a7cef09ad54 46
ebeauchemin3 0:3a7cef09ad54 47 float scaleX = .05;
ebeauchemin3 0:3a7cef09ad54 48 float scaleY = .1;
ebeauchemin3 0:3a7cef09ad54 49 float scaleZ = .1;
ebeauchemin3 0:3a7cef09ad54 50
ebeauchemin3 0:3a7cef09ad54 51 StepperMotor_X27168 smotor1(p23, p24, p22, p21);
ebeauchemin3 0:3a7cef09ad54 52 StepperMotor_X27168 smotor2(p9, p10, p29, p30);
ebeauchemin3 0:3a7cef09ad54 53 StepperMotor_X27168 smotor3(p14, p15, p13, p12);
ebeauchemin3 0:3a7cef09ad54 54 StepperMotor_X27168 smotor4(p17, p16, p18, p19);
ebeauchemin3 0:3a7cef09ad54 55
ebeauchemin3 0:3a7cef09ad54 56 // Setup the i2c bus on pins 9 and 10
ebeauchemin3 0:3a7cef09ad54 57 I2C i2c(p28, p27);
ebeauchemin3 0:3a7cef09ad54 58 // Setup the Mpr121:
ebeauchemin3 0:3a7cef09ad54 59 // constructor(i2c object, i2c address of the mpr121)
ebeauchemin3 0:3a7cef09ad54 60 Mpr121 mpr121(&i2c, Mpr121::ADD_VSS);
ebeauchemin3 0:3a7cef09ad54 61
ebeauchemin3 0:3a7cef09ad54 62 enum moveMotor { NONE, XPLUS, XMINUS, YPLUS, YMINUS, ZPLUS, ZMINUS };
ebeauchemin3 0:3a7cef09ad54 63 moveMotor motorMove = NONE;
ebeauchemin3 0:3a7cef09ad54 64
ebeauchemin3 0:3a7cef09ad54 65 //all motors initially stopped
ebeauchemin3 0:3a7cef09ad54 66 int motor1Go = 2;
ebeauchemin3 0:3a7cef09ad54 67 int motor2Go = 2;
ebeauchemin3 0:3a7cef09ad54 68 int motor3Go = 2;
ebeauchemin3 0:3a7cef09ad54 69 int motor4Go = 2;
ebeauchemin3 0:3a7cef09ad54 70
ebeauchemin3 0:3a7cef09ad54 71 char *strdup (const char *s)
ebeauchemin3 0:3a7cef09ad54 72 {
ebeauchemin3 0:3a7cef09ad54 73 char *d = (char*)malloc (strlen (s) + 1); // Space for length plus nul
ebeauchemin3 0:3a7cef09ad54 74 if (d == NULL) return NULL; // No memory
ebeauchemin3 0:3a7cef09ad54 75 strcpy (d,s); // Copy the characters
ebeauchemin3 0:3a7cef09ad54 76 return d; // Return the new string
ebeauchemin3 0:3a7cef09ad54 77 }
ebeauchemin3 0:3a7cef09ad54 78
ebeauchemin3 0:3a7cef09ad54 79 //split a string on a delimiter
ebeauchemin3 0:3a7cef09ad54 80 char** str_split(char* a_str, const char a_delim)
ebeauchemin3 0:3a7cef09ad54 81 {
ebeauchemin3 0:3a7cef09ad54 82 char** result = 0;
ebeauchemin3 0:3a7cef09ad54 83 size_t count = 0;
ebeauchemin3 0:3a7cef09ad54 84 char* tmp = a_str;
ebeauchemin3 0:3a7cef09ad54 85 char* last_comma = 0;
ebeauchemin3 0:3a7cef09ad54 86 char delim[2];
ebeauchemin3 0:3a7cef09ad54 87 delim[0] = a_delim;
ebeauchemin3 0:3a7cef09ad54 88 delim[1] = 0;
ebeauchemin3 0:3a7cef09ad54 89
ebeauchemin3 0:3a7cef09ad54 90 /* Count how many elements will be extracted. */
ebeauchemin3 0:3a7cef09ad54 91 while (*tmp) {
ebeauchemin3 0:3a7cef09ad54 92 if (a_delim == *tmp) {
ebeauchemin3 0:3a7cef09ad54 93 count++;
ebeauchemin3 0:3a7cef09ad54 94 last_comma = tmp;
ebeauchemin3 0:3a7cef09ad54 95 }
ebeauchemin3 0:3a7cef09ad54 96 tmp++;
ebeauchemin3 0:3a7cef09ad54 97 }
ebeauchemin3 0:3a7cef09ad54 98
ebeauchemin3 0:3a7cef09ad54 99 /* Add space for trailing token. */
ebeauchemin3 0:3a7cef09ad54 100 count += last_comma < (a_str + strlen(a_str) - 1);
ebeauchemin3 0:3a7cef09ad54 101
ebeauchemin3 0:3a7cef09ad54 102 /* Add space for terminating null string so caller
ebeauchemin3 0:3a7cef09ad54 103 knows where the list of returned strings ends. */
ebeauchemin3 0:3a7cef09ad54 104 count++;
ebeauchemin3 0:3a7cef09ad54 105
ebeauchemin3 0:3a7cef09ad54 106 result = (char**)malloc(sizeof(char*) * count);
ebeauchemin3 0:3a7cef09ad54 107
ebeauchemin3 0:3a7cef09ad54 108 if (result) {
ebeauchemin3 0:3a7cef09ad54 109 size_t idx = 0;
ebeauchemin3 0:3a7cef09ad54 110 char* token = strtok(a_str, delim);
ebeauchemin3 0:3a7cef09ad54 111
ebeauchemin3 0:3a7cef09ad54 112 while (token) {
ebeauchemin3 0:3a7cef09ad54 113 assert(idx < count);
ebeauchemin3 0:3a7cef09ad54 114 *(result + idx++) = strdup(token);
ebeauchemin3 0:3a7cef09ad54 115 token = strtok(0, delim);
ebeauchemin3 0:3a7cef09ad54 116 }
ebeauchemin3 0:3a7cef09ad54 117 assert(idx == count - 1);
ebeauchemin3 0:3a7cef09ad54 118 *(result + idx) = 0;
ebeauchemin3 0:3a7cef09ad54 119 }
ebeauchemin3 0:3a7cef09ad54 120
ebeauchemin3 0:3a7cef09ad54 121 return result;
ebeauchemin3 0:3a7cef09ad54 122 }
ebeauchemin3 0:3a7cef09ad54 123 void motorXYprint()
ebeauchemin3 0:3a7cef09ad54 124 {
ebeauchemin3 0:3a7cef09ad54 125 //smotor1.set_speed(xNowPrint/yNowPrint*200);
ebeauchemin3 0:3a7cef09ad54 126 int spinvar = 0;
ebeauchemin3 0:3a7cef09ad54 127 float xSpot = 0;
ebeauchemin3 0:3a7cef09ad54 128 float ySpot = 0;
ebeauchemin3 0:3a7cef09ad54 129 xNowPrint = floor(xNowPrint);
ebeauchemin3 0:3a7cef09ad54 130 yNowPrint = floor(yNowPrint);
ebeauchemin3 0:3a7cef09ad54 131 float product = abs(xNowPrint*yNowPrint);
ebeauchemin3 0:3a7cef09ad54 132
ebeauchemin3 0:3a7cef09ad54 133 if ((xNowPrint > 0) and (xNowPrint > 0)) {
ebeauchemin3 0:3a7cef09ad54 134 while(spinvar <= product) {
ebeauchemin3 0:3a7cef09ad54 135 spinvar ++;
ebeauchemin3 0:3a7cef09ad54 136 if (xSpot < spinvar) {
ebeauchemin3 0:3a7cef09ad54 137 smotor1.step(0);
ebeauchemin3 0:3a7cef09ad54 138 xSpot = xSpot + product/yNowPrint;
ebeauchemin3 0:3a7cef09ad54 139 }
ebeauchemin3 0:3a7cef09ad54 140 if (ySpot < spinvar) {
ebeauchemin3 0:3a7cef09ad54 141 smotor2.step(0);
ebeauchemin3 0:3a7cef09ad54 142 ySpot = ySpot + product/xNowPrint;
ebeauchemin3 0:3a7cef09ad54 143 }
ebeauchemin3 0:3a7cef09ad54 144 }
ebeauchemin3 0:3a7cef09ad54 145 } else if ((xNowPrint > 0)and(xNowPrint < 0)) {
ebeauchemin3 0:3a7cef09ad54 146 while(spinvar <= product) {
ebeauchemin3 0:3a7cef09ad54 147 spinvar ++;
ebeauchemin3 0:3a7cef09ad54 148 if (xSpot < spinvar) {
ebeauchemin3 0:3a7cef09ad54 149 smotor1.step(0);
ebeauchemin3 0:3a7cef09ad54 150 xSpot = xSpot + abs(product/yNowPrint);
ebeauchemin3 0:3a7cef09ad54 151 }
ebeauchemin3 0:3a7cef09ad54 152 if (ySpot < spinvar) {
ebeauchemin3 0:3a7cef09ad54 153 smotor2.step(1);
ebeauchemin3 0:3a7cef09ad54 154 ySpot = ySpot + abs(product/xNowPrint);
ebeauchemin3 0:3a7cef09ad54 155 }
ebeauchemin3 0:3a7cef09ad54 156 //Thread::wait(50.0);
ebeauchemin3 0:3a7cef09ad54 157 }
ebeauchemin3 0:3a7cef09ad54 158 } else if ((xNowPrint < 0)and(xNowPrint > 0)) {
ebeauchemin3 0:3a7cef09ad54 159 while(spinvar <= product) {
ebeauchemin3 0:3a7cef09ad54 160 spinvar ++;
ebeauchemin3 0:3a7cef09ad54 161 if (xSpot < spinvar) {
ebeauchemin3 0:3a7cef09ad54 162 smotor1.step(1);
ebeauchemin3 0:3a7cef09ad54 163 xSpot = xSpot + abs(product/yNowPrint);
ebeauchemin3 0:3a7cef09ad54 164 }
ebeauchemin3 0:3a7cef09ad54 165 if (ySpot < spinvar) {
ebeauchemin3 0:3a7cef09ad54 166 smotor2.step(0);
ebeauchemin3 0:3a7cef09ad54 167 ySpot = ySpot + abs(product/xNowPrint);
ebeauchemin3 0:3a7cef09ad54 168 }
ebeauchemin3 0:3a7cef09ad54 169 //Thread::wait(50.0);
ebeauchemin3 0:3a7cef09ad54 170 }
ebeauchemin3 0:3a7cef09ad54 171 } else if ((xNowPrint < 0)and(xNowPrint < 0)) {
ebeauchemin3 0:3a7cef09ad54 172 while(spinvar <= product) {
ebeauchemin3 0:3a7cef09ad54 173 spinvar ++;
ebeauchemin3 0:3a7cef09ad54 174 if (xSpot < spinvar) {
ebeauchemin3 0:3a7cef09ad54 175 smotor1.step(1);
ebeauchemin3 0:3a7cef09ad54 176 xSpot = xSpot - (product/yNowPrint);
ebeauchemin3 0:3a7cef09ad54 177 }
ebeauchemin3 0:3a7cef09ad54 178 if (ySpot < spinvar) {
ebeauchemin3 0:3a7cef09ad54 179 smotor2.step(1);
ebeauchemin3 0:3a7cef09ad54 180 ySpot = ySpot - (product/xNowPrint);
ebeauchemin3 0:3a7cef09ad54 181 }
ebeauchemin3 0:3a7cef09ad54 182 //Thread::wait(50.0);
ebeauchemin3 0:3a7cef09ad54 183 }
ebeauchemin3 0:3a7cef09ad54 184 }
ebeauchemin3 0:3a7cef09ad54 185 smotor1.step(2);
ebeauchemin3 0:3a7cef09ad54 186 smotor2.step(2);
ebeauchemin3 0:3a7cef09ad54 187 }
ebeauchemin3 0:3a7cef09ad54 188
ebeauchemin3 0:3a7cef09ad54 189 void motorZprint()
ebeauchemin3 0:3a7cef09ad54 190 {
ebeauchemin3 0:3a7cef09ad54 191 //smotor2.set_speed(yNowPrint/xNowPrint*200);
ebeauchemin3 0:3a7cef09ad54 192 int spinvar2 = 0;
ebeauchemin3 0:3a7cef09ad54 193 if (zNowPrint > 0) {
ebeauchemin3 0:3a7cef09ad54 194 while(spinvar2 <= zNowPrint) {
ebeauchemin3 0:3a7cef09ad54 195 spinvar2 ++;
ebeauchemin3 0:3a7cef09ad54 196 //smotor3.step(0);
ebeauchemin3 0:3a7cef09ad54 197 Thread::wait(50.0);
ebeauchemin3 0:3a7cef09ad54 198 }
ebeauchemin3 0:3a7cef09ad54 199 } else if (zNowPrint < 0) {
ebeauchemin3 0:3a7cef09ad54 200 while(spinvar2 >= zNowPrint) {
ebeauchemin3 0:3a7cef09ad54 201 spinvar2 --;
ebeauchemin3 0:3a7cef09ad54 202 //smotor3.step(1);
ebeauchemin3 0:3a7cef09ad54 203 Thread::wait(50.0);
ebeauchemin3 0:3a7cef09ad54 204 }
ebeauchemin3 0:3a7cef09ad54 205 }
ebeauchemin3 0:3a7cef09ad54 206 smotor3.step(2);
ebeauchemin3 0:3a7cef09ad54 207 }
ebeauchemin3 0:3a7cef09ad54 208 void print() //read from gcode file
ebeauchemin3 0:3a7cef09ad54 209 {
ebeauchemin3 0:3a7cef09ad54 210 FILE *fp = fopen("/sd/text/gCode.txt", "r");
ebeauchemin3 0:3a7cef09ad54 211 pc.printf("Hello World!\n");
ebeauchemin3 0:3a7cef09ad54 212 //FILE *stream;
ebeauchemin3 0:3a7cef09ad54 213 char line[200];
ebeauchemin3 0:3a7cef09ad54 214 char g[2]="G";
ebeauchemin3 0:3a7cef09ad54 215 char m[2]="M";
ebeauchemin3 0:3a7cef09ad54 216 char x[2]="X";
ebeauchemin3 0:3a7cef09ad54 217 char y[2]="Y";
ebeauchemin3 0:3a7cef09ad54 218 char z[2]="Z";
ebeauchemin3 0:3a7cef09ad54 219 char e[2]="E";
ebeauchemin3 0:3a7cef09ad54 220 char f[2]="F";
ebeauchemin3 0:3a7cef09ad54 221 char** tokens;
ebeauchemin3 0:3a7cef09ad54 222 char** astrktokens;
ebeauchemin3 0:3a7cef09ad54 223 float extruderX = 0;
ebeauchemin3 0:3a7cef09ad54 224 float extruderY = 0;
ebeauchemin3 0:3a7cef09ad54 225 float extruderZ = 0;
ebeauchemin3 0:3a7cef09ad54 226 float extruderE = 0;
ebeauchemin3 0:3a7cef09ad54 227 float extruderF = 0;
ebeauchemin3 0:3a7cef09ad54 228 pc.printf("here\n");
ebeauchemin3 0:3a7cef09ad54 229 //end the 4 motor threads
ebeauchemin3 0:3a7cef09ad54 230 motor1Go=3;
ebeauchemin3 0:3a7cef09ad54 231 motor2Go=3;
ebeauchemin3 0:3a7cef09ad54 232 motor3Go=3;
ebeauchemin3 0:3a7cef09ad54 233 motor4Go=3;
ebeauchemin3 0:3a7cef09ad54 234 while (fgets(line, 200, fp)) { //get a line
ebeauchemin3 0:3a7cef09ad54 235 wait(.5);
ebeauchemin3 0:3a7cef09ad54 236 char firstLet[sizeof(line)];
ebeauchemin3 0:3a7cef09ad54 237 strncpy(firstLet, line,1);
ebeauchemin3 0:3a7cef09ad54 238 firstLet[1] = 0;
ebeauchemin3 0:3a7cef09ad54 239 if (strcmp(firstLet,g) * strcmp(firstLet,m) == 0) {
ebeauchemin3 0:3a7cef09ad54 240 astrktokens = str_split(line, ';');
ebeauchemin3 0:3a7cef09ad54 241 char* tempdata = *(astrktokens);
ebeauchemin3 0:3a7cef09ad54 242 //pc.printf("Temp data: %s", tempdata);
ebeauchemin3 0:3a7cef09ad54 243 char fullData[100];
ebeauchemin3 0:3a7cef09ad54 244 //char singleVariable[100];
ebeauchemin3 0:3a7cef09ad54 245 strcpy(fullData, tempdata);
ebeauchemin3 0:3a7cef09ad54 246 tokens = str_split(tempdata, ' ');
ebeauchemin3 0:3a7cef09ad54 247 if (tokens) {
ebeauchemin3 0:3a7cef09ad54 248
ebeauchemin3 0:3a7cef09ad54 249 int i = 0;
ebeauchemin3 0:3a7cef09ad54 250 //ssize_t
ebeauchemin3 0:3a7cef09ad54 251 char* data = *(tokens + i);
ebeauchemin3 0:3a7cef09ad54 252 pc.printf("Data: %s ", data);
ebeauchemin3 0:3a7cef09ad54 253 wait(.5);
ebeauchemin3 0:3a7cef09ad54 254 if (strcmp(data,"G0") * strcmp(data,"G1") == 0) {
ebeauchemin3 0:3a7cef09ad54 255 //Move: X,Y,Z-postions to move to, E-extrude amount, F-feedrate
ebeauchemin3 0:3a7cef09ad54 256 pc.printf("Move to: ");
ebeauchemin3 0:3a7cef09ad54 257 i = 1;
ebeauchemin3 0:3a7cef09ad54 258 float newX = 0;
ebeauchemin3 0:3a7cef09ad54 259 float newY = 0;
ebeauchemin3 0:3a7cef09ad54 260 float newZ = 0;
ebeauchemin3 0:3a7cef09ad54 261 float newE = 0;
ebeauchemin3 0:3a7cef09ad54 262 float newF = 0;
ebeauchemin3 0:3a7cef09ad54 263 while(strcmp(*(tokens + i),"\0") != 0) {
ebeauchemin3 0:3a7cef09ad54 264 data = *(tokens + i);
ebeauchemin3 0:3a7cef09ad54 265 //strcpy(singleVariable, data);
ebeauchemin3 0:3a7cef09ad54 266 //pc.printf("Deep Data: %s ", data);
ebeauchemin3 0:3a7cef09ad54 267 char firstLet[sizeof(data)];
ebeauchemin3 0:3a7cef09ad54 268 strncpy(firstLet, data,1);
ebeauchemin3 0:3a7cef09ad54 269 firstLet[1] = 0;
ebeauchemin3 0:3a7cef09ad54 270 if (strcmp(firstLet,x) == 0) {
ebeauchemin3 0:3a7cef09ad54 271 memmove(data, data+1, strlen(data));
ebeauchemin3 0:3a7cef09ad54 272 newX = strtof(data, NULL);
ebeauchemin3 0:3a7cef09ad54 273 pc.printf("X: %f", newX);
ebeauchemin3 0:3a7cef09ad54 274 if (extruderX == 0) {
ebeauchemin3 0:3a7cef09ad54 275 extruderX = newX;
ebeauchemin3 0:3a7cef09ad54 276 }
ebeauchemin3 0:3a7cef09ad54 277 } else if (strcmp(firstLet,y) == 0) {
ebeauchemin3 0:3a7cef09ad54 278 memmove(data, data+1, strlen(data));
ebeauchemin3 0:3a7cef09ad54 279 newY = strtof(data, NULL);
ebeauchemin3 0:3a7cef09ad54 280 pc.printf("Y: %f", newY);
ebeauchemin3 0:3a7cef09ad54 281 if (extruderY == 0) {
ebeauchemin3 0:3a7cef09ad54 282 extruderY = newY;
ebeauchemin3 0:3a7cef09ad54 283 }
ebeauchemin3 0:3a7cef09ad54 284 } else if (strcmp(firstLet,z) == 0) {
ebeauchemin3 0:3a7cef09ad54 285 memmove(data, data+1, strlen(data));
ebeauchemin3 0:3a7cef09ad54 286 newZ = strtof(data, NULL);
ebeauchemin3 0:3a7cef09ad54 287 pc.printf("Z: %f", newZ);
ebeauchemin3 0:3a7cef09ad54 288 if (extruderZ == 0) {
ebeauchemin3 0:3a7cef09ad54 289 extruderZ = newZ;
ebeauchemin3 0:3a7cef09ad54 290 }
ebeauchemin3 0:3a7cef09ad54 291 } else if (strcmp(firstLet,e) == 0) {
ebeauchemin3 0:3a7cef09ad54 292 memmove(data, data+1, strlen(data));
ebeauchemin3 0:3a7cef09ad54 293 newE = strtof(data, NULL);
ebeauchemin3 0:3a7cef09ad54 294 pc.printf("E: %f", newE);
ebeauchemin3 0:3a7cef09ad54 295 } else if (strcmp(firstLet,f) == 0) {
ebeauchemin3 0:3a7cef09ad54 296 memmove(data, data+1, strlen(data));
ebeauchemin3 0:3a7cef09ad54 297 newF = strtof(data, NULL);
ebeauchemin3 0:3a7cef09ad54 298 pc.printf("F: %f", newF);
ebeauchemin3 0:3a7cef09ad54 299 }
ebeauchemin3 0:3a7cef09ad54 300 newX = newX-extruderX;
ebeauchemin3 0:3a7cef09ad54 301 newY = newY-extruderY;
ebeauchemin3 0:3a7cef09ad54 302 newZ = newZ-extruderZ;
ebeauchemin3 0:3a7cef09ad54 303 xNowPrint = newX*scaleX;
ebeauchemin3 0:3a7cef09ad54 304 yNowPrint = newY*scaleY;
ebeauchemin3 0:3a7cef09ad54 305 zNowPrint = newZ*scaleZ;
ebeauchemin3 0:3a7cef09ad54 306 if ((xNowPrint != 0) and (yNowPrint != 0)) {
ebeauchemin3 0:3a7cef09ad54 307 pc.printf("xNow: %f", xNowPrint);
ebeauchemin3 0:3a7cef09ad54 308 pc.printf("yNow: %f", yNowPrint);
ebeauchemin3 0:3a7cef09ad54 309 motorXYprint();
ebeauchemin3 0:3a7cef09ad54 310 }
ebeauchemin3 0:3a7cef09ad54 311 if (zNowPrint != 0) {
ebeauchemin3 0:3a7cef09ad54 312 pc.printf("yNow: %f", yNowPrint);
ebeauchemin3 0:3a7cef09ad54 313 motorZprint();
ebeauchemin3 0:3a7cef09ad54 314 }
ebeauchemin3 0:3a7cef09ad54 315
ebeauchemin3 0:3a7cef09ad54 316
ebeauchemin3 0:3a7cef09ad54 317 i = i+1;
ebeauchemin3 0:3a7cef09ad54 318 }
ebeauchemin3 0:3a7cef09ad54 319 }
ebeauchemin3 0:3a7cef09ad54 320 }
ebeauchemin3 0:3a7cef09ad54 321 }
ebeauchemin3 0:3a7cef09ad54 322 myled = 1;
ebeauchemin3 0:3a7cef09ad54 323 wait(0.2);
ebeauchemin3 0:3a7cef09ad54 324 myled = 0;
ebeauchemin3 0:3a7cef09ad54 325 wait(0.2);
ebeauchemin3 0:3a7cef09ad54 326 }
ebeauchemin3 0:3a7cef09ad54 327 fclose(fp);
ebeauchemin3 0:3a7cef09ad54 328 return;
ebeauchemin3 0:3a7cef09ad54 329 }
ebeauchemin3 0:3a7cef09ad54 330
ebeauchemin3 0:3a7cef09ad54 331
ebeauchemin3 0:3a7cef09ad54 332 void motor1Thread(void const *args)
ebeauchemin3 0:3a7cef09ad54 333 {
ebeauchemin3 0:3a7cef09ad54 334 smotor1.set_speed(80);
ebeauchemin3 0:3a7cef09ad54 335 int spinvar = 0;
ebeauchemin3 0:3a7cef09ad54 336 while(motor1Go<3) { //3 stops the thread
ebeauchemin3 0:3a7cef09ad54 337 while(motor1Go != 2) {
ebeauchemin3 0:3a7cef09ad54 338 spinvar = 0;
ebeauchemin3 0:3a7cef09ad54 339 if (motor1Go == 0) {
ebeauchemin3 0:3a7cef09ad54 340 smotor1.step(0);
ebeauchemin3 0:3a7cef09ad54 341
ebeauchemin3 0:3a7cef09ad54 342 } else if(motor1Go == 1) {
ebeauchemin3 0:3a7cef09ad54 343 smotor1.step(1);
ebeauchemin3 0:3a7cef09ad54 344 }
ebeauchemin3 0:3a7cef09ad54 345 }
ebeauchemin3 0:3a7cef09ad54 346 smotor1.step(2);
ebeauchemin3 0:3a7cef09ad54 347 Thread::wait(50.0);
ebeauchemin3 0:3a7cef09ad54 348 }
ebeauchemin3 0:3a7cef09ad54 349 }
ebeauchemin3 0:3a7cef09ad54 350
ebeauchemin3 0:3a7cef09ad54 351 void motor2Thread(void const *args)
ebeauchemin3 0:3a7cef09ad54 352 {
ebeauchemin3 0:3a7cef09ad54 353 smotor2.set_speed(80);
ebeauchemin3 0:3a7cef09ad54 354 int spinvar2 = 0;
ebeauchemin3 0:3a7cef09ad54 355 while(motor2Go<3) { //3 stops the thread
ebeauchemin3 0:3a7cef09ad54 356 while(motor2Go != 2) {
ebeauchemin3 0:3a7cef09ad54 357 spinvar2 = 0;
ebeauchemin3 0:3a7cef09ad54 358 if (motor2Go == 0) {
ebeauchemin3 0:3a7cef09ad54 359 smotor2.step(0);
ebeauchemin3 0:3a7cef09ad54 360 } else if(motor2Go == 1) {
ebeauchemin3 0:3a7cef09ad54 361 smotor2.step(1);
ebeauchemin3 0:3a7cef09ad54 362 }
ebeauchemin3 0:3a7cef09ad54 363 }
ebeauchemin3 0:3a7cef09ad54 364 smotor2.step(2);
ebeauchemin3 0:3a7cef09ad54 365 Thread::wait(50.0);
ebeauchemin3 0:3a7cef09ad54 366 }
ebeauchemin3 0:3a7cef09ad54 367 }
ebeauchemin3 0:3a7cef09ad54 368 void motor3Thread(void const *args)
ebeauchemin3 0:3a7cef09ad54 369 {
ebeauchemin3 0:3a7cef09ad54 370 smotor3.set_speed(80);
ebeauchemin3 0:3a7cef09ad54 371 int spinvar3 = 0;
ebeauchemin3 0:3a7cef09ad54 372 while(motor3Go<3) { //3 stops the thread
ebeauchemin3 0:3a7cef09ad54 373 while(motor3Go != 2) {
ebeauchemin3 0:3a7cef09ad54 374 spinvar3 = 0;
ebeauchemin3 0:3a7cef09ad54 375 if (motor3Go == 0) {
ebeauchemin3 0:3a7cef09ad54 376 smotor3.step(0);
ebeauchemin3 0:3a7cef09ad54 377
ebeauchemin3 0:3a7cef09ad54 378 } else if(motor3Go == 1) {
ebeauchemin3 0:3a7cef09ad54 379 smotor3.step(1);
ebeauchemin3 0:3a7cef09ad54 380 }
ebeauchemin3 0:3a7cef09ad54 381 }
ebeauchemin3 0:3a7cef09ad54 382 smotor3.step(2);
ebeauchemin3 0:3a7cef09ad54 383 Thread::wait(50.0);
ebeauchemin3 0:3a7cef09ad54 384 }
ebeauchemin3 0:3a7cef09ad54 385 }
ebeauchemin3 0:3a7cef09ad54 386 void motor4Thread(void const *args)
ebeauchemin3 0:3a7cef09ad54 387 {
ebeauchemin3 0:3a7cef09ad54 388 smotor4.set_speed(80); //unnecessary but oh well
ebeauchemin3 0:3a7cef09ad54 389 int spinvar4 = 0;
ebeauchemin3 0:3a7cef09ad54 390 while(motor4Go<3) {
ebeauchemin3 0:3a7cef09ad54 391 while(motor4Go != 2) {
ebeauchemin3 0:3a7cef09ad54 392 spinvar4 = 0;
ebeauchemin3 0:3a7cef09ad54 393 if (motor4Go == 0) {
ebeauchemin3 0:3a7cef09ad54 394 smotor4.step(0);
ebeauchemin3 0:3a7cef09ad54 395 } else if(motor4Go == 1) {
ebeauchemin3 0:3a7cef09ad54 396 smotor4.step(1);
ebeauchemin3 0:3a7cef09ad54 397 }
ebeauchemin3 0:3a7cef09ad54 398 }
ebeauchemin3 0:3a7cef09ad54 399 smotor4.step(2);
ebeauchemin3 0:3a7cef09ad54 400 Thread::wait(50.0);
ebeauchemin3 0:3a7cef09ad54 401 }
ebeauchemin3 0:3a7cef09ad54 402 }
ebeauchemin3 0:3a7cef09ad54 403
ebeauchemin3 0:3a7cef09ad54 404 void getTemperature(void const *args)
ebeauchemin3 0:3a7cef09ad54 405 {
ebeauchemin3 0:3a7cef09ad54 406 // This routine calculates the temperature
ebeauchemin3 0:3a7cef09ad54 407 // using the Steinhart-Hart equation for thermistors
ebeauchemin3 0:3a7cef09ad54 408 // https://en.wikipedia.org/wiki/Steinhart%E2%80%93Hart_equation
ebeauchemin3 0:3a7cef09ad54 409 float temperature, resistance;
ebeauchemin3 0:3a7cef09ad54 410 float steinhart;
ebeauchemin3 0:3a7cef09ad54 411 int a;
ebeauchemin3 0:3a7cef09ad54 412 Setpoint = 200; // Set target temperature in degrees Celcius.
ebeauchemin3 0:3a7cef09ad54 413 controller.SetMode(AUTOMATIC); // Turn PID controller on.
ebeauchemin3 0:3a7cef09ad54 414 while(1) {
ebeauchemin3 0:3a7cef09ad54 415 controller.Compute(); // Process PID loop.
ebeauchemin3 0:3a7cef09ad54 416 //Driver = Output/1000; // Sent PWM value scaled 0 - 1.0 as mbed requires ***originally divided by 1000
ebeauchemin3 0:3a7cef09ad54 417 if (Input < 270) {
ebeauchemin3 0:3a7cef09ad54 418 Driver = .9;
ebeauchemin3 0:3a7cef09ad54 419 } else {
ebeauchemin3 0:3a7cef09ad54 420 Driver = 0;
ebeauchemin3 0:3a7cef09ad54 421 }
ebeauchemin3 0:3a7cef09ad54 422 a = Thermistor.read_u16(); // Read 16bit Analog value
ebeauchemin3 0:3a7cef09ad54 423 // pc.printf("Raw Analog Value for Thermistor = %d\r\n",a);
ebeauchemin3 0:3a7cef09ad54 424 /* Calculate the resistance of the thermistor from analog votage read. */
ebeauchemin3 0:3a7cef09ad54 425 resistance = (float) SERIESRESISTOR / ((65536.0 / a) - 1);
ebeauchemin3 0:3a7cef09ad54 426 // pc.printf("Resistance for Thermistor = %f\r\n",resistance);
ebeauchemin3 0:3a7cef09ad54 427
ebeauchemin3 0:3a7cef09ad54 428 steinhart = resistance / THERMISTORNOMINAL; // (R/Ro)
ebeauchemin3 0:3a7cef09ad54 429 steinhart = log(steinhart); // ln(R/Ro)
ebeauchemin3 0:3a7cef09ad54 430 steinhart /= BCOEFFICIENT; // 1/B * ln(R/Ro)
ebeauchemin3 0:3a7cef09ad54 431 steinhart += 1.0 / (TEMPERATURENOMINAL + 273.15); // + (1/To)
ebeauchemin3 0:3a7cef09ad54 432 steinhart = 1.0 / steinhart; // Invert
ebeauchemin3 0:3a7cef09ad54 433 temperature = steinhart - 273.15; // convert to C
ebeauchemin3 0:3a7cef09ad54 434 // pc.printf("Extruder Temperature is %f\r\n", temperature);
ebeauchemin3 0:3a7cef09ad54 435 Input = temperature;
ebeauchemin3 0:3a7cef09ad54 436 pc.printf("Input Output Setpoint Kp Ki Kd time\r\n");
ebeauchemin3 0:3a7cef09ad54 437 pc.printf("%f, %f, %f, %f, %f, %f, %d \r\n", temperature, Output, Setpoint, controller.GetKp() , controller.GetKi() , controller.GetKd() , millis() );
ebeauchemin3 0:3a7cef09ad54 438 Thread::wait(1000);
ebeauchemin3 0:3a7cef09ad54 439 }
ebeauchemin3 0:3a7cef09ad54 440
ebeauchemin3 0:3a7cef09ad54 441 }
ebeauchemin3 0:3a7cef09ad54 442 int main()
ebeauchemin3 0:3a7cef09ad54 443 {
ebeauchemin3 0:3a7cef09ad54 444
ebeauchemin3 0:3a7cef09ad54 445 int x = 0;
ebeauchemin3 0:3a7cef09ad54 446 int key_code=0;
ebeauchemin3 0:3a7cef09ad54 447 int i=0;
ebeauchemin3 0:3a7cef09ad54 448 int value;
ebeauchemin3 0:3a7cef09ad54 449 startMillis(); // Initialize timer.
ebeauchemin3 0:3a7cef09ad54 450 //terminal prints status data
ebeauchemin3 0:3a7cef09ad54 451 pc.baud(115200);
ebeauchemin3 0:3a7cef09ad54 452 pc.printf("\r\nThermistor PID Test - Build " __DATE__ " " __TIME__ "\r\n");
ebeauchemin3 0:3a7cef09ad54 453 //motors 1-3 are x,y,or z
ebeauchemin3 0:3a7cef09ad54 454 Thread thread1(motor1Thread);
ebeauchemin3 0:3a7cef09ad54 455 Thread thread2(motor2Thread);
ebeauchemin3 0:3a7cef09ad54 456 Thread thread3(motor3Thread);
ebeauchemin3 0:3a7cef09ad54 457 //motor 4 is the feeder motor
ebeauchemin3 0:3a7cef09ad54 458 Thread thread4(motor4Thread);
ebeauchemin3 0:3a7cef09ad54 459 while(1) {
ebeauchemin3 0:3a7cef09ad54 460 //use keypad for controlling motors and temperature while debugging
ebeauchemin3 0:3a7cef09ad54 461 value=mpr121.read(0x00);
ebeauchemin3 0:3a7cef09ad54 462 value +=mpr121.read(0x01)<<8;
ebeauchemin3 0:3a7cef09ad54 463 if((value>>0)&0x01) { //zero button pressed
ebeauchemin3 0:3a7cef09ad54 464 myled = 1;
ebeauchemin3 0:3a7cef09ad54 465 motor1Go = 0; //x motor move back
ebeauchemin3 0:3a7cef09ad54 466 } else if((value>>1)&0x01) { //one button pressed
ebeauchemin3 0:3a7cef09ad54 467 myled = 0;
ebeauchemin3 0:3a7cef09ad54 468 motor1Go = 1; //x motor move forwards
ebeauchemin3 0:3a7cef09ad54 469 } else {
ebeauchemin3 0:3a7cef09ad54 470 motor1Go = 2; //x motor stop
ebeauchemin3 0:3a7cef09ad54 471 }
ebeauchemin3 0:3a7cef09ad54 472 if(((value>>2)&0x01)==1) { //two button pressed
ebeauchemin3 0:3a7cef09ad54 473 myled = 1;
ebeauchemin3 0:3a7cef09ad54 474 motor2Go = 0; //y motor move backward
ebeauchemin3 0:3a7cef09ad54 475 } else if(((value>>3)&0x01)==1) { //three button pressed
ebeauchemin3 0:3a7cef09ad54 476 myled = 0;
ebeauchemin3 0:3a7cef09ad54 477 motor2Go = 1; //y motor forward
ebeauchemin3 0:3a7cef09ad54 478 } else {
ebeauchemin3 0:3a7cef09ad54 479 motor2Go = 2; //else stop y motor
ebeauchemin3 0:3a7cef09ad54 480 }//end if
ebeauchemin3 0:3a7cef09ad54 481 if(((value>>4)&0x01)==1) { //four button pressed
ebeauchemin3 0:3a7cef09ad54 482 myled = 1;
ebeauchemin3 0:3a7cef09ad54 483 motor3Go = 0; //z motor back
ebeauchemin3 0:3a7cef09ad54 484 } else if(((value>>5)&0x01)==1) {
ebeauchemin3 0:3a7cef09ad54 485 myled = 0;
ebeauchemin3 0:3a7cef09ad54 486 motor3Go = 1; //z motor forward
ebeauchemin3 0:3a7cef09ad54 487 } else {
ebeauchemin3 0:3a7cef09ad54 488 motor3Go = 2; //else stop z motor
ebeauchemin3 0:3a7cef09ad54 489 }//end if
ebeauchemin3 0:3a7cef09ad54 490 if((value>>6)&0x01) { //6 button pressed
ebeauchemin3 0:3a7cef09ad54 491 myled = 1;
ebeauchemin3 0:3a7cef09ad54 492 motor4Go = 0;
ebeauchemin3 0:3a7cef09ad54 493 } else if((value>>7)&0x01) { //7 button pressed
ebeauchemin3 0:3a7cef09ad54 494 myled = 0;
ebeauchemin3 0:3a7cef09ad54 495 motor4Go = 1; //motor 4 forwards
ebeauchemin3 0:3a7cef09ad54 496 } else {
ebeauchemin3 0:3a7cef09ad54 497 motor4Go = 2; //stop motor 4
ebeauchemin3 0:3a7cef09ad54 498 }//end if
ebeauchemin3 0:3a7cef09ad54 499 if(((value>>8)&0x01)==1) { //8 button pressed
ebeauchemin3 0:3a7cef09ad54 500 myled = !myled;
ebeauchemin3 0:3a7cef09ad54 501 Setpoint +=1; //increase set temp (C) by 1
ebeauchemin3 0:3a7cef09ad54 502 } else if(((value>>9)&0x01)==1) { //button 9 pressed
ebeauchemin3 0:3a7cef09ad54 503 myled = !myled;
ebeauchemin3 0:3a7cef09ad54 504 Setpoint -= 1; //decrease set point by 1
ebeauchemin3 0:3a7cef09ad54 505 }
ebeauchemin3 0:3a7cef09ad54 506 if((value>>10)&0x01) { //10 button pressed
ebeauchemin3 0:3a7cef09ad54 507 myled = 1;
ebeauchemin3 0:3a7cef09ad54 508 print();
ebeauchemin3 0:3a7cef09ad54 509 }
ebeauchemin3 0:3a7cef09ad54 510 Thread::wait(100);
ebeauchemin3 0:3a7cef09ad54 511 }//end while(1)
ebeauchemin3 0:3a7cef09ad54 512
ebeauchemin3 0:3a7cef09ad54 513 }
ebeauchemin3 0:3a7cef09ad54 514
ebeauchemin3 0:3a7cef09ad54 515