Laser Sensing Display for UI interfaces in the real world

Dependencies:   mbed

Fork of skinGames_forktest by Alvaro Cassinelli

Committer:
mbedalvaro
Date:
Mon Jun 18 12:39:28 2012 +0000
Revision:
26:c9329c4fc20a
Parent:
23:bf666fcc61bc
still some color problems - cannot change the green from command

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbedalvaro 0:345b3bc7a0ea 1
mbedalvaro 0:345b3bc7a0ea 2 #ifndef hardwareIO_h
mbedalvaro 0:345b3bc7a0ea 3 #define hardwareIO_h
mbedalvaro 0:345b3bc7a0ea 4
mbedalvaro 0:345b3bc7a0ea 5 #include "mbed.h"
mbedalvaro 0:345b3bc7a0ea 6 #include "lockin.h"
mbedalvaro 0:345b3bc7a0ea 7
mbedalvaro 0:345b3bc7a0ea 8
mbedalvaro 23:bf666fcc61bc 9 // potentiometer to change sensitivity by hand, or other things.
mbedalvaro 23:bf666fcc61bc 10 #define POT_ANALOG_INPUT p15 // note: analog inputs in the mbed are from 15 to 20
mbedalvaro 22:d87317d7ca91 11
mbedalvaro 0:345b3bc7a0ea 12 // NOTE: the SPI library uses the following pins, but we don't have to set them and inputs or outputs (this is done when the library is initialized, which is done by pre-instantiation.
mbedalvaro 0:345b3bc7a0ea 13 #define SCK_PIN p7 //SPI Clock
mbedalvaro 0:345b3bc7a0ea 14 #define MISO_PIN p6 //SPI input (data comming from DAC, here not connected)
mbedalvaro 0:345b3bc7a0ea 15 #define MOSI_PIN p5 //SPI output (data going to DAC)
mbedalvaro 0:345b3bc7a0ea 16
mbedalvaro 0:345b3bc7a0ea 17 //**** CHIP SELECT pins for MP4922 DAC (mirrors and red laser)
mbedalvaro 0:345b3bc7a0ea 18 // VERY IMPORTANT: the chip select for the DACs should be different from the default SPI "SS" pin (Slave Select), which is 53 by default (and will be used by the Ethernet Shield).
mbedalvaro 0:345b3bc7a0ea 19 #define CS_DAC_MIRRORS p8 //Chip Select of the first DAC (mirrors)
mbedalvaro 0:345b3bc7a0ea 20
mbedalvaro 0:345b3bc7a0ea 21 //**** LASERS pins:
mbedalvaro 23:bf666fcc61bc 22 #define LASER_RED_PIN p28 // NOT YET USED!! (NOTE: this is NOT the locking sensing laser (also called red, but could be infrared...)
mbedalvaro 23:bf666fcc61bc 23 #define LASER_GREEN_PIN p29 // USED (TTL control)
mbedalvaro 23:bf666fcc61bc 24 #define LASER_BLUE_PIN p30 // USED (TTL control)
mbedalvaro 0:345b3bc7a0ea 25
mbedalvaro 0:345b3bc7a0ea 26 //**** MIRRORS:
mbedalvaro 0:345b3bc7a0ea 27 //The DAC is 12 bytes capable (Max=4096), but we will limit this a little.
mbedalvaro 0:345b3bc7a0ea 28 #define MAX_AD_MIRRORS 4095 // Absolute maximum for the SPI voltage (5V). This is for checking hardware compliance, but max and min angles can be defined for X and Y in each LivingSpot instance.
mbedalvaro 0:345b3bc7a0ea 29 #define MIN_AD_MIRRORS 0
mbedalvaro 0:345b3bc7a0ea 30 // We assume that the center of the mirror is at MAX_AD_MIRRORS/2 = 2000:
mbedalvaro 0:345b3bc7a0ea 31 #define CENTER_AD_MIRROR_X 2047 // This MUST BE the direction of the photodetector.
mbedalvaro 0:345b3bc7a0ea 32 #define CENTER_AD_MIRROR_Y 2047 // This MUST BE the direction of the photodetector.
mbedalvaro 0:345b3bc7a0ea 33
mbedalvaro 0:345b3bc7a0ea 34
mbedalvaro 0:345b3bc7a0ea 35 //**** Look-Up Table:
mbedalvaro 0:345b3bc7a0ea 36 #define uint16 unsigned short
mbedalvaro 0:345b3bc7a0ea 37 #define LUT_RESOLUTION 33 // resolution of the Look-Up Table (power of 2 +1)
mbedalvaro 0:345b3bc7a0ea 38 #define LUT_BITS_SHIFT 7 // bits shift from mirror DAC (12 bits) to LUT ( root_square(LUT_RESOLUTION - 1) )
mbedalvaro 0:345b3bc7a0ea 39 #define LUT_BITS_MASK 127 // bits mask to obtain the position remainder ( 2^LUT_BITS_SHIFT - 1 )
mbedalvaro 0:345b3bc7a0ea 40 // possible configurations:
mbedalvaro 0:345b3bc7a0ea 41 // LUT_RESOLUTION LUT_BITS_SHIFT LUT_BITS_MASK
mbedalvaro 0:345b3bc7a0ea 42 // 9 9 511
mbedalvaro 0:345b3bc7a0ea 43 // 17 8 255
mbedalvaro 0:345b3bc7a0ea 44 // 33 7 127
mbedalvaro 0:345b3bc7a0ea 45 // 65 6 63
mbedalvaro 0:345b3bc7a0ea 46 // ...
mbedalvaro 10:6f8e48dca1bd 47 #define NB_SCANS 8 // number of scans performed to generate the LUT table (actually, each site CUMULATES NB_SCANS values)
mbedalvaro 22:d87317d7ca91 48 // IMPORTANT: NB_SCANS*4095 should not exceed the capacity of uint16, this is 2^16-1=65535.
mbedalvaro 22:d87317d7ca91 49 // In other terms, NB_SCANS should be < 65535/4095=16
mbedalvaro 10:6f8e48dca1bd 50
mbedalvaro 0:345b3bc7a0ea 51 #define LUT_FILENAME "/local/LUT.txt"
mbedalvaro 14:0fc33a3a7b4b 52
mbedalvaro 14:0fc33a3a7b4b 53 // For checking (define if human readable file is required - note: it is not used by the program, just as output for human reading)
mbedalvaro 22:d87317d7ca91 54 #define LUT_H_FILENAME "/local/LUT_pos.txt"
mbedalvaro 0:345b3bc7a0ea 55
mbedalvaro 14:0fc33a3a7b4b 56 // Current Look-up table approximation (only one at a time!):
mbedalvaro 14:0fc33a3a7b4b 57 //#define LUT_BILINEAR
mbedalvaro 14:0fc33a3a7b4b 58 //#define LUT_DIRECT
mbedalvaro 14:0fc33a3a7b4b 59 //#define LUT_LINEAR
mbedalvaro 14:0fc33a3a7b4b 60 #define NO_LUT
mbedalvaro 0:345b3bc7a0ea 61
mbedalvaro 10:6f8e48dca1bd 62 //Current method for lockin data acquisition and correction
mbedalvaro 10:6f8e48dca1bd 63 #define lockin_read() lockin.getMedianValue() // lockin.getSmoothValue(); //return the average of the value stored on the buffer
mbedalvaro 10:6f8e48dca1bd 64 // lockin.getLastValue(); //return the last conversion of the ADC
mbedalvaro 10:6f8e48dca1bd 65 // lockin.getMedianValue(); //return the median value of the buffer
mbedalvaro 10:6f8e48dca1bd 66
mbedalvaro 0:345b3bc7a0ea 67
mbedalvaro 26:c9329c4fc20a 68 extern DigitalOut Laser_Red, Laser_Green, Laser_Blue;
mbedalvaro 26:c9329c4fc20a 69
mbedalvaro 0:345b3bc7a0ea 70 // **** REFERENCE SIGNAL:
mbedalvaro 0:345b3bc7a0ea 71 /*
mbedalvaro 0:345b3bc7a0ea 72 #define testPin_OC1A 11 // this is, output compare pin OC1A //connected to CK2 = lockIn clock
mbedalvaro 0:345b3bc7a0ea 73 #define testPin_OC1B 12 // this is, output compare pin OC1B //connected to CK1 = laser clock
mbedalvaro 0:345b3bc7a0ea 74 #define testPin_OC1C 13
mbedalvaro 0:345b3bc7a0ea 75 */
mbedalvaro 0:345b3bc7a0ea 76
mbedalvaro 0:345b3bc7a0ea 77 // ==================================================================================================================================================================
mbedalvaro 0:345b3bc7a0ea 78
mbedalvaro 0:345b3bc7a0ea 79 class HardwareIO {
mbedalvaro 0:345b3bc7a0ea 80 public:
mbedalvaro 0:345b3bc7a0ea 81
mbedalvaro 0:345b3bc7a0ea 82
mbedalvaro 0:345b3bc7a0ea 83 void init(void);
mbedalvaro 0:345b3bc7a0ea 84
mbedalvaro 0:345b3bc7a0ea 85 //Lock-in acquisition methods:
mbedalvaro 10:6f8e48dca1bd 86 // float LockInRead_Volts();
mbedalvaro 10:6f8e48dca1bd 87 // int LockInRead_AD();
mbedalvaro 10:6f8e48dca1bd 88 // float LockInAD_to_Volts(int);
mbedalvaro 0:345b3bc7a0ea 89
mbedalvaro 0:345b3bc7a0ea 90 //Look-Up Table:
mbedalvaro 14:0fc33a3a7b4b 91 unsigned short lut[LUT_RESOLUTION][LUT_RESOLUTION]; //Look-Up Table (uint16 is "unsigned short")
mbedalvaro 0:345b3bc7a0ea 92 void scanLUT(); //create and save the Look-Up Table
mbedalvaro 0:345b3bc7a0ea 93 void setLUT(); //set the Look-Up Table: either from scanning, or from the file LUT.TXT (if it is present)
mbedalvaro 10:6f8e48dca1bd 94 float lockInCorrectedValue(unsigned short x, unsigned short y); //return the lockin value corrected with the Look-UpTable (this is, a RATIO of reflectivities, and <1)
mbedalvaro 0:345b3bc7a0ea 95
mbedalvaro 10:6f8e48dca1bd 96 void scan_serial(unsigned short pointsPerLine = 400);
mbedalvaro 0:345b3bc7a0ea 97
mbedalvaro 22:d87317d7ca91 98 void showLimitsMirrors( int times );
mbedalvaro 22:d87317d7ca91 99
mbedalvaro 0:345b3bc7a0ea 100 // SPI control for DAC for mirrors and red laser power (low level):
mbedalvaro 10:6f8e48dca1bd 101 void writeOutX(unsigned short value);
mbedalvaro 10:6f8e48dca1bd 102 void writeOutY(unsigned short value);
mbedalvaro 0:345b3bc7a0ea 103
mbedalvaro 0:345b3bc7a0ea 104 // mirror degree-to-AD units conversion factors:
mbedalvaro 0:345b3bc7a0ea 105 //float AD_to_Deg_MIRROR_X;//=1.0*(MAX_DEG_MIRROR_X-MIN_DEG_MIRROR_X)/(MAX_AD_MIRRORS-MIN_AD_MIRRORS);
mbedalvaro 0:345b3bc7a0ea 106 //float AD_to_Deg_MIRROR_Y;//=1.0*(MAX_DEG_MIRROR_Y-MIN_DEG_MIRROR_Y)/(MAX_AD_MIRRORS-MIN_AD_MIRRORS);
mbedalvaro 0:345b3bc7a0ea 107
mbedalvaro 0:345b3bc7a0ea 108 /*
mbedalvaro 0:345b3bc7a0ea 109 // Mirror position:
mbedalvaro 0:345b3bc7a0ea 110 void setMirrorX_Deg(float _Az);
mbedalvaro 0:345b3bc7a0ea 111 void setMirrorY_Deg(float _El);
mbedalvaro 0:345b3bc7a0ea 112 void setMirrorX_AD(int _AzAD);
mbedalvaro 0:345b3bc7a0ea 113 void setMirrorY_AD(int _ElAD);
mbedalvaro 0:345b3bc7a0ea 114 void setMirrorsXY_AD(int _xAD, int _yAD);
mbedalvaro 0:345b3bc7a0ea 115 void setMirrorsCenter();
mbedalvaro 0:345b3bc7a0ea 116 void getAnglesFromAD(float &Az, float &El, int _xAD, int _yAD);
mbedalvaro 0:345b3bc7a0ea 117 //void setZoneDelimiters(...) // this could be here, instead on the LivingSpot class
mbedalvaro 0:345b3bc7a0ea 118 */
mbedalvaro 0:345b3bc7a0ea 119
mbedalvaro 0:345b3bc7a0ea 120
mbedalvaro 0:345b3bc7a0ea 121 //Laser Power, for the moment laser are TTL but we can use int:
mbedalvaro 0:345b3bc7a0ea 122 //if powerValue > 0 ==> 'true'; else 'false'
mbedalvaro 0:345b3bc7a0ea 123 // Red laser:
mbedalvaro 0:345b3bc7a0ea 124 void setRedPower(int powerRed);
mbedalvaro 0:345b3bc7a0ea 125 // Green laser:
mbedalvaro 0:345b3bc7a0ea 126 void setGreenPower(int powerGreen);
mbedalvaro 0:345b3bc7a0ea 127 // Blue laser:
mbedalvaro 0:345b3bc7a0ea 128 void setBluePower(int powerBlue);
mbedalvaro 0:345b3bc7a0ea 129
mbedalvaro 23:bf666fcc61bc 130 void setRGBPower(unsigned char color); // we will use the 3 LSB bits to set each color
mbedalvaro 0:345b3bc7a0ea 131
mbedalvaro 0:345b3bc7a0ea 132 //void setupPWM();
mbedalvaro 0:345b3bc7a0ea 133 /* IN ADVANCED HARDWARE:
mbedalvaro 0:345b3bc7a0ea 134 // init PWM for reference generation:
mbedalvaro 0:345b3bc7a0ea 135 void initPWM();
mbedalvaro 0:345b3bc7a0ea 136 // reference signal:
mbedalvaro 0:345b3bc7a0ea 137 void setRefFreq(int);
mbedalvaro 0:345b3bc7a0ea 138 void incRefFreq(int inc=1);
mbedalvaro 0:345b3bc7a0ea 139 void decRefFreq(int dec=1);
mbedalvaro 0:345b3bc7a0ea 140 */
mbedalvaro 0:345b3bc7a0ea 141
mbedalvaro 0:345b3bc7a0ea 142 //float refFreq; // could be private
mbedalvaro 0:345b3bc7a0ea 143
mbedalvaro 0:345b3bc7a0ea 144
mbedalvaro 0:345b3bc7a0ea 145 private:
mbedalvaro 0:345b3bc7a0ea 146
mbedalvaro 0:345b3bc7a0ea 147 };
mbedalvaro 0:345b3bc7a0ea 148
mbedalvaro 0:345b3bc7a0ea 149
mbedalvaro 0:345b3bc7a0ea 150 extern HardwareIO IO; // allows the object IO to be used in other .cpp files (IO is pre-instantiated in hardwareIO.cpp)
mbedalvaro 0:345b3bc7a0ea 151 // NOTE: IO encapsulates many IO functions, but perhaps it is better not to have an IO object - just use each IO function separatedly (as with pc object for instance)
mbedalvaro 0:345b3bc7a0ea 152 extern Serial pc; // allows pc to be manipulated by other .cpp files, even if pc is defined in the hardwareIO.cpp
mbedalvaro 0:345b3bc7a0ea 153
mbedalvaro 0:345b3bc7a0ea 154
mbedalvaro 0:345b3bc7a0ea 155 #endif