DIY spektrometer) utforska okändan-> (28 / 32 steg)
Steg 28: Koden
Denna kod kan portas till Arduino IDE från Energia och fungerar perfekt på båda plattformarna.
Du kan hämta energia här: http://energia.nu/download/
ÄNDRA x och THE D och den nm variabler att matcha din resultat från den sista steget! Annars din kalibrering blir min kalibrering för min maskin, inte din. Det kommer sedan inte att ge exakta uppgifter.
Koden nedan är för användning med ett SD-kort och levande ström.
#include "SPI.h"
#include "pfatfs.h"
#define cs_pin 10 / / chip Välj pin
#define read_buffer 128 / / storleken (i byte) på läsbufferten
unsignedshortint bw, br; / /, i.
char buffer [read_buffer];
int rc;
DIR dir; / * Katalogobjekt * /
FILINFO f; / * Filen information objekt * ///I/O Belowconstint StepperMotor = P2_4;
constint StepperDirection = P2_5;
constint sensorer [] = {P1_3}; Lägga till fler sensorer här! \//Constants för kalibrering nedan! constdouble nm = 405; Känd kalibrering källa Frequencyconstdouble x = 33.28; Avstånd i punkt ovan "Skärm" constdouble D = 48.78; avståndet till "Skärm" constdouble degreesperstep = 18; Grader per steg för stepper motorconstdouble microstepping = 8. Detta gör att du kan bestämma hur ofta du vill att provet tas (inverterad mikrosteg) constdouble mmPerRotation = 2,76; Detta är avståndet mellan de två tänderna av spindlen som flyttar sensorn upp och downconstdouble heightofTray = 38,00; Under uppskatta detta ett bitconstdouble starty = 32,35;
constboolean SDCARD = false;
Fiol med den nedan på egen risk! ///constdouble stepsperrotation = 360/degreesperstep;
constdouble microstepsuntilend = heightofTray/mmPerRotation * stepsperrotation * (microstepping);
constdouble d = (nm*1e-9)/sin(atan(x/D));
CONST double d = 720e-9; //const dubbel x = (nm * 1e-9 * d); int wavelengthvIntensity [sizeof (sensorer) -1];
int datafile = 0;
dubbel cnt = 0;
char buf [30].
Double tempnm = 0;
dubbel AktuellY = 0;
constdouble noll = starty-x;
char ksk = "0";
Annullerasetup() {
pinMode (PUSH2, INPUT_PULLUP);
pinMode (StepperMotor, OUTPUT);
pinMode (StepperDirection, OUTPUT);
digitalWrite (StepperMotor, låg);
digitalWrite (StepperDirection, låg);
Seriella.begin(9600); initiera serial-uttaget
om (SDCARD == true) {
FatFs.begin(cs_pin); initiera FatFS bibliotek samtal
}
för (int jag = 0; jag < sizeof(wavelengthvIntensity);i++) {
pinMode (sensorer [i], ingång);
}
för (int jag = 0; jag < microstepsuntilend; i ++) {
digitalWrite (StepperMotor, hög);
delayMicroseconds(250);
digitalWrite (StepperMotor, låg);
delayMicroseconds(250);
}
digitalWrite (StepperDirection, hög);
}
void die (int pff_err) {
Seriella.println(); Seriella.print ("misslyckades med rc ="); Seriella.print(pff_err,dec);
för (;);
}
void writedata() {
RC = FatFs.open("Data.csv");
om (rc) die(rc);
Seriella.println();
Seriella.println ("Writing scan Data");
Delay(100);
BW = 0;
för (int jag = 0; jag < sizeof(wavelengthvIntensity);i++) {
sprintf (buf, "% lu,", wavelengthvIntensity[i]);
int StringLength = strlen(buf);
RC = FatFs.write (buf, StringLength & bw);
om (rc ||! bw) bryta;
}
sprintf (buf, "%lu\n\r", tempnm);
int StringLength = strlen(buf);
RC = FatFs.write (buf, StringLength & bw);
om (rc) die(rc);
RC = FatFs.write (0, 0, & bw); Slutföra skrivning
om (rc) die(rc);
RC = FatFs.close(); Stäng fileif (rc) die(rc);
}
Ogiltigloop() {
om (ksk == '1') {
KSK = 0;
CNT = 0;
medan (cnt < microstepsuntilend) {
för (int jag = 0; jag < sizeof(wavelengthvIntensity)-1;i++) {
wavelengthvIntensity [i] = analogRead(Sensors[i]);
Seriella.print(wavelengthvintensity[i]);
Seriella.print (",");
}
Seriella.println(tempnm);
om (SDCARD == true) {
WriteData();
}
digitalWrite (StepperMotor, hög);
delayMicroseconds(1);
digitalWrite (StepperMotor, låg);
delayMicroseconds(1);
CNT ++;
Serial.println(currenty);
Currenty = zero+((cnt/microstepsuntilend) * heightofTray);
tempnm = d*sin(atan((x+currenty)/D))*(1e9);
}
digitalWrite (StepperDirection, låg);
för (int jag = 0; jag < microstepsuntilend; i ++) {
digitalWrite (StepperMotor, hög);
delayMicroseconds(250);
digitalWrite (StepperMotor, låg);
delayMicroseconds(250);
}
digitalWrite (StepperDirection, hög);
Seriella.println("$");
}
KSK = seriell.read();
}
Koden nedan är koden för spektrometern: Live-läget bara.
I/o-Belowconstint StepperMotor = P2_4;
constint StepperDirection = P2_5;
constint sensorer [] = {P1_3}; Lägga till fler sensorer här! \//Constants för kalibrering nedan! constdouble nm = 405; Känd kalibrering källa Frequencyconstdouble x = 37.65; Avstånd i punkt ovan "Skärm" constdouble D = 50,00; avståndet till "Skärm" constdouble degreesperstep = 18; Grader per steg för stepper motorconstdouble microstepping = 8. Detta gör att du kan bestämma hur ofta du vill att provet tas (inverterad mikrosteg) constdouble mmPerRotation = 2,76; Detta är avståndet mellan de två tänderna av spindlen som flyttar sensorn upp och downconstdouble heightofTray = 38,00; Under uppskatta detta ett bitconstdouble starty = 32,35;
Fiol med den nedan på egen risk! ///constdouble stepsperrotation = 360/degreesperstep;
constdouble microstepsuntilend = heightofTray/mmPerRotation * stepsperrotation * (microstepping);
constdouble d = (nm*1e-9)/sin(atan(x/D));
CONST double d = 720e-9; //const dubbel x = (nm * 1e-9 * d); int wavelengthvIntensity [sizeof (sensorer) -1];
int datafile = 0;
dubbel cnt = 0;
char buf [30].
Double tempnm = 0;
dubbel AktuellY = 0;
constdouble noll = starty-x;
char ksk = "0";
Annullerasetup() {
pinMode (PUSH2, INPUT_PULLUP);
Seriella.begin(9600); Hah, glömde jag att lägga till detta i speciella tack till tommy_goh1997 för spotting felet!
pinMode (StepperMotor, OUTPUT);
pinMode (StepperDirection, OUTPUT);
digitalWrite (StepperMotor, låg);
digitalWrite (StepperDirection, låg);
för (int jag = 0; jag < sizeof(wavelengthvIntensity);i++) {
pinMode (sensorer [i], ingång);
}
för (int jag = 0; jag < microstepsuntilend; i ++) {
digitalWrite (StepperMotor, hög);
delayMicroseconds(250);
digitalWrite (StepperMotor, låg);
delayMicroseconds(250);
}
digitalWrite (StepperDirection, hög);
}
Ogiltigloop() {
om (ksk == '1') {
KSK = 0;
CNT = 0;
medan (cnt < microstepsuntilend) {
för (int jag = 0; jag < sizeof(wavelengthvIntensity)-1;i++) {
wavelengthvIntensity [i] = analogRead(Sensors[i]);
Seriella.print(wavelengthvintensity[i]);
Seriella.print (",");
}
Seriella.println(tempnm);
digitalWrite (StepperMotor, hög);
delayMicroseconds(1);
digitalWrite (StepperMotor, låg);
delayMicroseconds(1);
CNT ++;
Serial.println(currenty);
Currenty = zero+((cnt/microstepsuntilend) * heightofTray);
tempnm = d*sin(atan((x+currenty)/D))*(1e9);
}
digitalWrite (StepperDirection, låg);
för (int jag = 0; jag < microstepsuntilend; i ++) {
digitalWrite (StepperMotor, hög);
delayMicroseconds(250);
digitalWrite (StepperMotor, låg);
delayMicroseconds(250);
}
digitalWrite (StepperDirection, hög);
Seriella.println("$");
}
KSK = seriell.read();
}