Alvaro Cassinelli / Mbed 2 deprecated skinGames_forktest

Dependencies:   mbed

Fork of scoreLight_Advanced by Alvaro Cassinelli

Committer:
mbedalvaro
Date:
Fri Mar 28 10:18:38 2014 +0000
Revision:
42:c4e9c1116af4
Parent:
35:35af5086ab4f
Child:
44:46e25fa1669b
Added functionality for two rotary encoders to control the additional mirror delay and the fixed threshold (instead of a potentiometer), and discarded the use of interrupt based switches to change the threshold mode (instead I use a two-state switch)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbedalvaro 34:1244fa3f2559 1
mbedalvaro 34:1244fa3f2559 2 #ifndef hardwareIO_h
mbedalvaro 34:1244fa3f2559 3 #define hardwareIO_h
mbedalvaro 34:1244fa3f2559 4
mbedalvaro 34:1244fa3f2559 5 #include "mbed.h"
mbedalvaro 34:1244fa3f2559 6 #include "lockin.h"
mbedalvaro 42:c4e9c1116af4 7 #include "CRotaryEncoder.h"
mbedalvaro 34:1244fa3f2559 8
mbedalvaro 34:1244fa3f2559 9
mbedalvaro 42:c4e9c1116af4 10 // potentiometer to change sensitivity by hand, or other things... ACTUALLY THIS IS NOT WORKING because I cannot switch back and forth from
mbedalvaro 42:c4e9c1116af4 11 // burst mode of analog conversion and "normal" one. Better use a rotary encoder!!
mbedalvaro 34:1244fa3f2559 12 #define POT_ANALOG_INPUT p15 // note: analog inputs in the mbed are from 15 to 20
mbedalvaro 34:1244fa3f2559 13
mbedalvaro 42:c4e9c1116af4 14 // Momentary switches triggering INTERRUPT functions:
mbedalvaro 34:1244fa3f2559 15 // (Any of the numbered mbed pins can be used as an InterruptIn, except p19 and p20)
mbedalvaro 34:1244fa3f2559 16 // NOTE: do not use pins from p21 to p26 because they are all set as pwm output (see lockin.h)
mbedalvaro 34:1244fa3f2559 17 #define LED_SWITCH_ONE p9 // digital output pin
mbedalvaro 34:1244fa3f2559 18 #define SWITCH_ONE p10 // interrupt pin
mbedalvaro 34:1244fa3f2559 19 #define SWITCH_TWO p11 // interrupt pin
mbedalvaro 34:1244fa3f2559 20
mbedalvaro 42:c4e9c1116af4 21 // Two state switch:
mbedalvaro 42:c4e9c1116af4 22 #define TWO_STATE_SWITCH p24
mbedalvaro 34:1244fa3f2559 23
mbedalvaro 34:1244fa3f2559 24 // 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 34:1244fa3f2559 25 #define SCK_PIN p7 //SPI Clock
mbedalvaro 34:1244fa3f2559 26 #define MISO_PIN p6 //SPI input (data comming from DAC, here not connected)
mbedalvaro 34:1244fa3f2559 27 #define MOSI_PIN p5 //SPI output (data going to DAC)
mbedalvaro 34:1244fa3f2559 28
mbedalvaro 34:1244fa3f2559 29 //**** CHIP SELECT pins for MP4922 DAC (mirrors and red laser)
mbedalvaro 34:1244fa3f2559 30 // 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 34:1244fa3f2559 31 #define CS_DAC_MIRRORS p8 //Chip Select of the first DAC (mirrors)
mbedalvaro 34:1244fa3f2559 32
mbedalvaro 34:1244fa3f2559 33 //**** LASERS pins:
mbedalvaro 34:1244fa3f2559 34 #define LASER_RED_PIN p28 // NOT YET USED!! (NOTE: this is NOT the locking sensing laser (also called red, but could be infrared...)
mbedalvaro 34:1244fa3f2559 35 #define LASER_GREEN_PIN p29 // USED (TTL control)
mbedalvaro 34:1244fa3f2559 36 #define LASER_BLUE_PIN p30 // USED (TTL control)
mbedalvaro 34:1244fa3f2559 37
mbedalvaro 34:1244fa3f2559 38 //**** MIRRORS:
mbedalvaro 34:1244fa3f2559 39 //The DAC is 12 bytes capable (Max=4096), but we will limit this a little.
mbedalvaro 34:1244fa3f2559 40 #define MAX_AD_MIRRORS 3845 // note: 4095 is the 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 34:1244fa3f2559 41 #define MIN_AD_MIRRORS 250 // note: 0 is 0 volts for the SPI voltage.
mbedalvaro 34:1244fa3f2559 42 // We assume that the center of the mirror is at MAX_AD_MIRRORS/2 = 2000:
mbedalvaro 34:1244fa3f2559 43 #define CENTER_AD_MIRROR_X 2047 // This MUST BE the direction of the photodetector.
mbedalvaro 34:1244fa3f2559 44 #define CENTER_AD_MIRROR_Y 2047 // This MUST BE the direction of the photodetector.
mbedalvaro 34:1244fa3f2559 45
mbedalvaro 34:1244fa3f2559 46
mbedalvaro 34:1244fa3f2559 47 //**** Look-Up Table:
mbedalvaro 34:1244fa3f2559 48 #define uint16 unsigned short
mbedalvaro 34:1244fa3f2559 49 #define LUT_RESOLUTION 33 // resolution of the Look-Up Table (power of 2 +1)
mbedalvaro 34:1244fa3f2559 50 #define LUT_BITS_SHIFT 7 // bits shift from mirror DAC (12 bits) to LUT ( root_square(LUT_RESOLUTION - 1) )
mbedalvaro 34:1244fa3f2559 51 #define LUT_BITS_MASK 127 // bits mask to obtain the position remainder ( 2^LUT_BITS_SHIFT - 1 )
mbedalvaro 34:1244fa3f2559 52 // possible configurations:
mbedalvaro 34:1244fa3f2559 53 // LUT_RESOLUTION LUT_BITS_SHIFT LUT_BITS_MASK
mbedalvaro 34:1244fa3f2559 54 // 9 9 511
mbedalvaro 34:1244fa3f2559 55 // 17 8 255
mbedalvaro 34:1244fa3f2559 56 // 33 7 127
mbedalvaro 34:1244fa3f2559 57 // 65 6 63
mbedalvaro 34:1244fa3f2559 58 // ...
mbedalvaro 34:1244fa3f2559 59 #define NB_SCANS 8 // number of scans performed to generate the LUT table (actually, each site CUMULATES NB_SCANS values)
mbedalvaro 34:1244fa3f2559 60 // IMPORTANT: NB_SCANS*4095 should not exceed the capacity of uint16, this is 2^16-1=65535.
mbedalvaro 34:1244fa3f2559 61 // In other terms, NB_SCANS should be < 65535/4095=16
mbedalvaro 34:1244fa3f2559 62
mbedalvaro 34:1244fa3f2559 63 #define LUT_FILENAME "/local/LUT.txt"
mbedalvaro 34:1244fa3f2559 64
mbedalvaro 34:1244fa3f2559 65 // For checking (define if human readable file is required - note: it is not used by the program, just as output for human reading)
mbedalvaro 34:1244fa3f2559 66 #define LUT_H_FILENAME "/local/LUT_pos.txt"
mbedalvaro 34:1244fa3f2559 67
mbedalvaro 34:1244fa3f2559 68 // Current Look-up table approximation (only one at a time!):
mbedalvaro 34:1244fa3f2559 69 //#define LUT_BILINEAR
mbedalvaro 34:1244fa3f2559 70 //#define LUT_DIRECT
mbedalvaro 34:1244fa3f2559 71 //#define LUT_LINEAR
mbedalvaro 34:1244fa3f2559 72 #define NO_LUT
mbedalvaro 34:1244fa3f2559 73
mbedalvaro 34:1244fa3f2559 74 //Current method for lockin data acquisition and correction
mbedalvaro 34:1244fa3f2559 75 #define lockin_read() lockin.getMedianValue() // lockin.getSmoothValue(); //return the average of the value stored on the buffer
mbedalvaro 34:1244fa3f2559 76 // lockin.getLastValue(); //return the last conversion of the ADC
mbedalvaro 34:1244fa3f2559 77 // lockin.getMedianValue(); //return the median value of the buffer
mbedalvaro 34:1244fa3f2559 78
mbedalvaro 34:1244fa3f2559 79
mbedalvaro 34:1244fa3f2559 80
mbedalvaro 34:1244fa3f2559 81 // **** REFERENCE SIGNAL:
mbedalvaro 34:1244fa3f2559 82 /*
mbedalvaro 34:1244fa3f2559 83 #define testPin_OC1A 11 // this is, output compare pin OC1A //connected to CK2 = lockIn clock
mbedalvaro 34:1244fa3f2559 84 #define testPin_OC1B 12 // this is, output compare pin OC1B //connected to CK1 = laser clock
mbedalvaro 34:1244fa3f2559 85 #define testPin_OC1C 13
mbedalvaro 34:1244fa3f2559 86 */
mbedalvaro 34:1244fa3f2559 87
mbedalvaro 34:1244fa3f2559 88 // ==================================================================================================================================================================
mbedalvaro 34:1244fa3f2559 89
mbedalvaro 34:1244fa3f2559 90 class HardwareIO {
mbedalvaro 34:1244fa3f2559 91 public:
mbedalvaro 34:1244fa3f2559 92
mbedalvaro 34:1244fa3f2559 93
mbedalvaro 34:1244fa3f2559 94 void init(void);
mbedalvaro 34:1244fa3f2559 95
mbedalvaro 34:1244fa3f2559 96 //Lock-in acquisition methods:
mbedalvaro 34:1244fa3f2559 97 // float LockInRead_Volts();
mbedalvaro 34:1244fa3f2559 98 // int LockInRead_AD();
mbedalvaro 34:1244fa3f2559 99 // float LockInAD_to_Volts(int);
mbedalvaro 34:1244fa3f2559 100
mbedalvaro 34:1244fa3f2559 101 //Look-Up Table:
mbedalvaro 34:1244fa3f2559 102 unsigned short lut[LUT_RESOLUTION][LUT_RESOLUTION]; //Look-Up Table (uint16 is "unsigned short")
mbedalvaro 34:1244fa3f2559 103 void scanLUT(); //create and save the Look-Up Table
mbedalvaro 34:1244fa3f2559 104 void setLUT(); //set the Look-Up Table: either from scanning, or from the file LUT.TXT (if it is present)
mbedalvaro 34:1244fa3f2559 105 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 34:1244fa3f2559 106
mbedalvaro 34:1244fa3f2559 107 void scan_serial(unsigned short pointsPerLine = 400);
mbedalvaro 34:1244fa3f2559 108
mbedalvaro 34:1244fa3f2559 109 void showLimitsMirrors( int times );
mbedalvaro 34:1244fa3f2559 110
mbedalvaro 34:1244fa3f2559 111 // SPI control for DAC for mirrors and red laser power (low level):
mbedalvaro 34:1244fa3f2559 112 void writeOutX(unsigned short value);
mbedalvaro 34:1244fa3f2559 113 void writeOutY(unsigned short value);
mbedalvaro 34:1244fa3f2559 114
mbedalvaro 34:1244fa3f2559 115 // mirror degree-to-AD units conversion factors:
mbedalvaro 34:1244fa3f2559 116 //float AD_to_Deg_MIRROR_X;//=1.0*(MAX_DEG_MIRROR_X-MIN_DEG_MIRROR_X)/(MAX_AD_MIRRORS-MIN_AD_MIRRORS);
mbedalvaro 34:1244fa3f2559 117 //float AD_to_Deg_MIRROR_Y;//=1.0*(MAX_DEG_MIRROR_Y-MIN_DEG_MIRROR_Y)/(MAX_AD_MIRRORS-MIN_AD_MIRRORS);
mbedalvaro 34:1244fa3f2559 118
mbedalvaro 34:1244fa3f2559 119 /*
mbedalvaro 34:1244fa3f2559 120 // Mirror position:
mbedalvaro 34:1244fa3f2559 121 void setMirrorX_Deg(float _Az);
mbedalvaro 34:1244fa3f2559 122 void setMirrorY_Deg(float _El);
mbedalvaro 34:1244fa3f2559 123 void setMirrorX_AD(int _AzAD);
mbedalvaro 34:1244fa3f2559 124 void setMirrorY_AD(int _ElAD);
mbedalvaro 34:1244fa3f2559 125 void setMirrorsXY_AD(int _xAD, int _yAD);
mbedalvaro 34:1244fa3f2559 126 void setMirrorsCenter();
mbedalvaro 34:1244fa3f2559 127 void getAnglesFromAD(float &Az, float &El, int _xAD, int _yAD);
mbedalvaro 34:1244fa3f2559 128 //void setZoneDelimiters(...) // this could be here, instead on the LivingSpot class
mbedalvaro 34:1244fa3f2559 129 */
mbedalvaro 34:1244fa3f2559 130
mbedalvaro 34:1244fa3f2559 131
mbedalvaro 34:1244fa3f2559 132 //Laser Power, for the moment laser are TTL but we can use int:
mbedalvaro 34:1244fa3f2559 133 //if powerValue > 0 ==> 'true'; else 'false'
mbedalvaro 34:1244fa3f2559 134 void setLaserLockinPower(int powerLockingLaser);
mbedalvaro 34:1244fa3f2559 135 // Red laser (not used)
mbedalvaro 34:1244fa3f2559 136 void setRedPower(int powerRed);
mbedalvaro 34:1244fa3f2559 137 // Green laser:
mbedalvaro 34:1244fa3f2559 138 void setGreenPower(int powerGreen);
mbedalvaro 34:1244fa3f2559 139 // Blue laser:
mbedalvaro 34:1244fa3f2559 140 void setBluePower(int powerBlue);
mbedalvaro 34:1244fa3f2559 141
mbedalvaro 34:1244fa3f2559 142 void setRGBPower(unsigned char color); // we will use the 3 LSB bits to set each color, note that here the "red" is the LOCKIN LASER
mbedalvaro 34:1244fa3f2559 143
mbedalvaro 34:1244fa3f2559 144 //void setupPWM();
mbedalvaro 34:1244fa3f2559 145 /* IN ADVANCED HARDWARE:
mbedalvaro 34:1244fa3f2559 146 // init PWM for reference generation:
mbedalvaro 34:1244fa3f2559 147 void initPWM();
mbedalvaro 34:1244fa3f2559 148 // reference signal:
mbedalvaro 34:1244fa3f2559 149 void setRefFreq(int);
mbedalvaro 34:1244fa3f2559 150 void incRefFreq(int inc=1);
mbedalvaro 34:1244fa3f2559 151 void decRefFreq(int dec=1);
mbedalvaro 34:1244fa3f2559 152 */
mbedalvaro 34:1244fa3f2559 153
mbedalvaro 34:1244fa3f2559 154 //float refFreq; // could be private
mbedalvaro 42:c4e9c1116af4 155
mbedalvaro 42:c4e9c1116af4 156 // Interrupt "momentary" switches:
mbedalvaro 42:c4e9c1116af4 157 bool switchOneState, switchTwoState;
mbedalvaro 34:1244fa3f2559 158 bool switchOneChange, switchTwoChange;
mbedalvaro 34:1244fa3f2559 159 void switchOneInterrupt();
mbedalvaro 34:1244fa3f2559 160 void switchTwoInterrupt();
mbedalvaro 34:1244fa3f2559 161 bool switchOneCheck(bool& state);
mbedalvaro 34:1244fa3f2559 162 bool switchTwoCheck(bool& state);
mbedalvaro 35:35af5086ab4f 163 void setSwitchOneState(bool newstate);
mbedalvaro 42:c4e9c1116af4 164
mbedalvaro 42:c4e9c1116af4 165 // two state switch:
mbedalvaro 42:c4e9c1116af4 166 bool twoStateSwitchState;
mbedalvaro 42:c4e9c1116af4 167 bool twoStateSwitchChange;
mbedalvaro 42:c4e9c1116af4 168 bool twoStateSwitchCheck(bool& stateswitch);
mbedalvaro 34:1244fa3f2559 169
mbedalvaro 42:c4e9c1116af4 170 // Potentiometer (does not work!!)
mbedalvaro 34:1244fa3f2559 171 unsigned char updatePotValue(); // the value will be ajusted in the range 0-255
mbedalvaro 34:1244fa3f2559 172 unsigned char potValue;
mbedalvaro 34:1244fa3f2559 173
mbedalvaro 34:1244fa3f2559 174 private:
mbedalvaro 34:1244fa3f2559 175 //DigitalOut Laser_Red, Laser_Green, Laser_Blue;
mbedalvaro 34:1244fa3f2559 176
mbedalvaro 34:1244fa3f2559 177 };
mbedalvaro 34:1244fa3f2559 178
mbedalvaro 34:1244fa3f2559 179
mbedalvaro 34:1244fa3f2559 180 extern HardwareIO IO; // allows the object IO to be used in other .cpp files (IO is pre-instantiated in hardwareIO.cpp)
mbedalvaro 34:1244fa3f2559 181 // 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 34:1244fa3f2559 182 extern Serial pc; // allows pc to be manipulated by other .cpp files, even if pc is defined in the hardwareIO.cpp
mbedalvaro 34:1244fa3f2559 183
mbedalvaro 34:1244fa3f2559 184
mbedalvaro 34:1244fa3f2559 185 #endif