Hardware control: mirrors
Diff: hardwareIO.cpp
- Revision:
- 1:b1f5ed22087a
- Parent:
- 0:3fe2fe307968
--- a/hardwareIO.cpp Wed Aug 01 03:01:45 2012 +0000 +++ b/hardwareIO.cpp Fri Sep 07 06:35:22 2012 +0000 @@ -5,13 +5,10 @@ // -------------------------------------- (0) SETUP ALL IO (call this in the setup() function in main program) Serial pc(USBTX, USBRX); // tx, rx -LocalFileSystem local("local"); // Create the local filesystem under the name "local" SPI spiDAC(MOSI_PIN, MISO_PIN, SCK_PIN); // mosi, miso, sclk DigitalOut csDAC(CS_DAC_MIRRORS); - - AnalogIn ain(POT_ANALOG_INPUT); - + DigitalOut Laser_Red(LASER_RED_PIN); // NOTE: this is NOT the lock in sensing laser (actually, not used yet) DigitalOut Laser_Green(LASER_GREEN_PIN); DigitalOut Laser_Blue(LASER_BLUE_PIN); @@ -25,9 +22,6 @@ pc.baud(115200);// // pc.baud(921600);//115200);// - // Setup for lock-in amplifier and pwm references: - lockin.init(); - // Setup the spi for 8 bit data, high steady state clock, // second edge capture, with a 10MHz clock rate csDAC = 1; @@ -38,8 +32,6 @@ writeOutX(CENTER_AD_MIRROR_X); writeOutY(CENTER_AD_MIRROR_Y); - // Load LUT table: - setLUT(); } //write on the first DAC, output A (mirror X) @@ -70,10 +62,10 @@ void HardwareIO::setRedPower(int powerValue){ if(powerValue > 0){ - lockin.setLaserPower(true); + Laser_Red = 1; } else{ - lockin.setLaserPower(false); + Laser_Red = 0; } } void HardwareIO::setGreenPower(int powerValue){ @@ -92,9 +84,9 @@ Laser_Blue = 0; } } - void HardwareIO::setRGBPower(unsigned char color) { - lockin.setLaserPower(color&0x04>0? false : true); + //lockin.setLaserPower(color&0x04>0? false : true); + Laser_Red=color&0x04>>2; Laser_Green=(color&0x02)>>1; Laser_Blue =color&0x01; } @@ -141,172 +133,3 @@ t.stop(); Laser_Green=0; } - -void HardwareIO::scan_serial(unsigned short pointsPerLine){ - //scan the total surface with a custom resolution - //send the lockin value for each point as a byte on the serial port to the PC - //use "scanSLP_save" to see the data on processing - - - int shiftX = (MAX_AD_MIRRORS - MIN_AD_MIRRORS) / pointsPerLine; - int shiftY = (MAX_AD_MIRRORS - MIN_AD_MIRRORS) / pointsPerLine; - - for(int j=0; j<pointsPerLine; j++){ - writeOutX(MIN_AD_MIRRORS); - writeOutY(j*shiftY + MIN_AD_MIRRORS); - - wait_us(300);//begining of line delay - for(int i=0; i<pointsPerLine; i++){ - writeOutX(i*shiftX + MIN_AD_MIRRORS); - - wait_us(200);//delay between each points - - // SEND A VALUE BETWEEN 0 and 255: - pc.putc(int(255.0*lockin.getMedianValue()/4095));//printf("%dL",int(valueLockin*255));//pc.putc(int(lockin*255));// - } - } -} - -//load Look-up Table from LUT.TXT file -//or create the file with scanLUT() if not existing. -void HardwareIO::setLUT(){ - - FILE *fp = fopen(LUT_FILENAME, "r"); // Open file on the local file system for writing - if(fp){ - //load the file into the lut table; keep the SAME resolution! - fread(lut,sizeof(uint16),LUT_RESOLUTION*LUT_RESOLUTION,fp); - fclose(fp); - } - else{ - //fclose(fp); - //if the file "LUT.TXT" doesn't exist, create one with scanLUT() - lockin.setLaserPower(true); - scanLUT(); - } - -} - -//scan the total surface with a fixed 2^x resolution -//create the Look-Up Table used to "flatten" the scan according to the position -// -//To Do: maybe detect high frequency to be sure the area is clean and empty? -void HardwareIO::scanLUT(){ - - //reset lut table - for(int j=0; j<LUT_RESOLUTION; j++){ - for(int i=0; i<LUT_RESOLUTION; i++){ - lut[i][j] =0; - } - } - - int delayScanning = 300; //in us - - //define the distance between each points (from 0 to 4096) and the offset (here 0) - float shiftX = 1.0*(MAX_AD_MIRRORS - MIN_AD_MIRRORS) / (LUT_RESOLUTION-1); - float shiftY = 1.0*(MAX_AD_MIRRORS - MIN_AD_MIRRORS) / (LUT_RESOLUTION-1); - float offsetX = MIN_AD_MIRRORS; - float offsetY = MIN_AD_MIRRORS; - - //move the mirrors to the first position - writeOutX(MAX_AD_MIRRORS);writeOutY(MIN_AD_MIRRORS); - wait_us(500); - - float x, y; - - //scan the surface NB_SCANS times - //the total value in lut[i][j] shouldn't exceed uint16 !!! - for(int loop=0; loop<NB_SCANS; loop++){ - for(int j=0; j<LUT_RESOLUTION; j++){ - y = shiftY*j + offsetY ; - writeOutY(int(y)); - //scan from right to left - for(int i=LUT_RESOLUTION-1; i>=0; i--){ - x = shiftX*i + offsetX; - writeOutX(int(x)); - wait_us(delayScanning); - lut[i][j] += lockin_read(); - } - //re-scan from left to right - for(int i=0; i<LUT_RESOLUTION; i++){ - x = shiftX*i + offsetX; - writeOutX(int(x)); - wait_us(delayScanning); - lut[i][j] += lockin_read(); - } - } - } - - - //save tab in file - FILE *fp; -#ifdef LUT_FILENAME - fp = fopen(LUT_FILENAME, "w"); // Open file on the local file system for writing - fwrite(lut,sizeof(uint16),LUT_RESOLUTION*LUT_RESOLUTION,fp); - fclose(fp); //close the file (the mBed will appear connected again) -#endif - -#ifdef LUT_H_FILENAME - //save tab in Human readable file (not used by the program, this is just for checking) - // NOTE: we divide the content of the lut table by NB_SCANS, for easy reading (values should be between 0-4095) - fp = fopen(LUT_H_FILENAME, "w"); // Open file on the local file system for writing - fprintf(fp, "scan resolution: %d x %d\r\n",LUT_RESOLUTION, LUT_RESOLUTION); - for(int j=0; j<LUT_RESOLUTION; j++){ - for(int i=0; i<LUT_RESOLUTION; i++){ - fprintf(fp, "X=%d,\tY=%d,\tI=%d\t \r\n", int(shiftX*i + offsetX), int(shiftY*j + offsetY), int(1.0*lut[i][j]/NB_SCANS) ); - } - } - fclose(fp); //close the file (the mBed will appear connected again) -#endif - -} - - -//Return the lockin value "corrected with the Look-UpTable" - this means a RATIO between two reflectivities (and normally, this is <1). -float HardwareIO::lockInCorrectedValue(unsigned short x, unsigned short y){ -//*******Correction using DIRECT approximation -#ifdef LUT_DIRECT - return 2.0* NB_SCANS * lockin_read() / (lut[x >> LUT_BITS_SHIFT][y >> LUT_BITS_SHIFT]); // 2 * NB_SCANS is the number of recorded sample added to one position of the LUT (scan is performed twice: left-right and right-left) -#endif - -//*******Correction using BILINEAR approximation -#ifdef LUT_BILINEAR - unsigned short X = x >> LUT_BITS_SHIFT; //mirror "x" is 12bits, LUT "X" needs 4bits when lut is 17x17 - unsigned short Y = y >> LUT_BITS_SHIFT; //mirror "y" is 12bits, LUT "Y" needs 4bits when lut is 17x17 - float dx = 1.0*(x & LUT_BITS_MASK)/(LUT_BITS_MASK+1); //weight to apply on X (mask with 255 and norm) - float dy = 1.0*(y & LUT_BITS_MASK)/(LUT_BITS_MASK+1); //weight to apply on Y (mask with 255 and norm) - - //Wheighted mean approximation of the Look-Up Table at the position (x,y): - float wmLUT = (1-dy)*( (1-dx)*lut[X][Y] + dx*lut[X+1][Y] ) + dy*( (1-dx)*lut[X][Y+1] + dx*lut[X+1][Y+1] ); - - return 2.0* NB_SCANS * lockin_read() / wmLUT;// 2 * NB_SCANS is the number of recorded sample added to one position of the LUT (scan is performed twice: left-right and right-left) -#endif - -//*******Correction using LINEAR approximation -#ifdef LUT_LINEAR - unsigned short X = x >> LUT_BITS_SHIFT; //mirror "x" is 12bits, LUT "X" needs 4bits when lut is 17x17 - unsigned short Y = y >> LUT_BITS_SHIFT; //mirror "y" is 12bits, LUT "Y" needs 4bits when lut is 17x17 - float dx = 1.0*(x & LUT_BITS_MASK)/(LUT_BITS_MASK+1); //weight to apply on X (mask with 255 and norm) - float dy = 1.0*(y & LUT_BITS_MASK)/(LUT_BITS_MASK+1); //weight to apply on Y (mask with 255 and norm) - float linearLUT, dzx, dzy; - - if(dx>dy){ //if the position is on the "top-right" triangle - dzx = (lut[X+1][Y] - lut[X][Y]) * dx; - dzy = (lut[X+1][Y+1] - lut[X+1][Y]) * dy; - } - else{ //if the position is on the "bottom-left" triangle - dzy = (lut[X][Y+1] - lut[X][Y]) * dy; - dzx = (lut[X+1][Y+1] - lut[X][Y+1]) * dx; - } - - //linear approximation of the Look-Up Table at the position (x,y): - linearLUT = lut[X][Y] + dzx + dzy; - return 2.0* NB_SCANS * lockin_read() / linearLUT; // 2 * NB_SCANS is the number of recorded sample added to one position of the LUT (scan is performed twice: left-right and right-left) - -#endif - -//*******No corrections, just return the value divided by 4096 (this means we are assuming that the surface is everywhere perfectly reflective - we supposedly get the max value always) -#ifdef NO_LUT - return 1.0* lockin_read()/4096; -#endif - -}