A couple of years back, I decided to make my own film camera that had to be an open project in order to secure the film consumption. I chose an STM32 microcontroller but ended up developing my own Visual Pin Configurator for it. This took around two years detour – still in constant development but it is in a form that you can use it for your projects.

And a few days ago I started working on my camera project. What I did until now I consider it the first stage, where I demonstrate the graphical main menu and the light meter (on the left of the TFT display is a MAX44009 LUX sensor). I don’t know how fast or slow the development will be, I need a lot of things that I don’t have right now, but I had to start the project. I would like to have a Canon shutter to experiment with and a servo that will actuate the mirror. I have already (bought it recently) the Canon EF 50mm/1.8 lens (the only lens that I intend to support at the beginning) but my entire family use it so I will work with an old Canon zoom lens (from the film era 😛 ) to create the required functions that manipulate the aperture and focus.
As for the light meter, the values in cyan are LUX values and the one in yellow are EV values – right now, only in full stops (actually, everything is in full stop, aperture, shutter speed, iso, EV) but in the near future that will change for the 1/3 of a stop. What you see bellow was concocted having another sensor in mind (TSL2591), with a reduced light sensitivity (actually, LUX range).
/** (c) Vasile Guta-Ciucur, funlw65@gmail.com, all rights reserved * Licensed under the MIT license (see the LICENSE file). * * D I Y F I L M S L R C A M E R A * ------------------------------------- * - using a Canon EOS EF Lens or a manual lens; * - using a manual mode if lens and shutter are manual and mechanical * - using Canon Av and Tv modes if shutter and lens accept digital commands * - using a MAX44009 I2C LUX sensor * - using an STM32L1 CortexM3 microcontroller. */ /** DISCLAIMER!!! * ============= * * USE YOUR CANON LENS AT YOUR OWN RISK! DON'T BLAME ME OR CANON IF YOU * BRICK IT! IF YOU ARE NOT SURE, USE A MANUAL LENS! */ typedef enum { MANUAL = 0, EOS} lens_t; typedef enum { EOS50MM12 = 0, EOS50MM14, EOS50MM18, EOS85MM12, EOS85MM18} eos_t; typedef enum { IS = 0, MA, MT, AV, TV} cameramode_t; /** film sensitivity in ISO values - 160 will be treated as 100 ISO */ const uint16_t ISO_values[8]={25,50,100,200,400,800,1600,3200}; /** Shutter speeds. * the array index will be used to determine if microseconds! * got it? if index is between 1 and 3 is about microseconds * (you will use a microsecond delay function). */ const uint16_t Tv_speed[]={ 777, /* speed error */ 125, /* 1/8000, value in microseconds, */ 250, /* 1/4000, -"- */ 500, /* 1/2000, -"- */ 1, /* 1/1000, value in milliseconds */ 2, /* 1/500, -"- */ 4, /* 1/250, -"- */ 8, /* 1/125, -"- */ 17, /* 1/60, -"- */ 33, /* 1/30, -"- */ 67, /* 1/15, -"- */ 125, /* 1/8, -"- */ 250, /* 1/4, -"- */ 500, /* 1/2, -"- */ 1000,/* 1, -"- */ 0 /* Bulb mode */ }; const uint16_t Tv_markings[]= { 777, /* speed error */ 8000,/* 1 */ 4000,/* 2 */ 2000,/* 3 */ 1000,/* 4 */ 500, /* 5 */ 250, /* 6 */ 125, /* 7 */ 60, /* 8 */ 30, /* 9 */ 15, /* 10 */ 8, /* 11 */ 4, /* 12 */ 2, /* 13 */ 1, /* 14 */ 0 /* 15 this one is for Bulb mode */ }; /** USER CONSTANTS - user settable. * You must set the maximum speed of your shutter by specifying the * index inside the ST_speed[] array. Default is 4, * meaning ST_speed[4] = 1, meaning 1/1000 maximum shutter speed. * * And you must set the minimum aperture value for the manual lens you will use * it is 16 by default... * I know, the shutter is a constant, a fixed mechanism, and a lens is a * variable, something you can change anytime, but let this be for a while. * For the EOS lenses, this will be set automatically. */ const uint8_t Tv_max_speed = 4; const uint8_t Av_min_aperture = 9; /** aperture values (exceptions 1.2=12 1.7=20 1.8=22) * 8 88 96 104 */ /*0 1 2 3 4 5 6 7 8 9 10 11 12 13*/ const float Av_values[] ={0, 1, 1.4, 2, 2.8, 4, 5.6, 8, 11, 16, 22, 32, 45, 64}; /* Canon EF 50mm lenses */ const int8_t EOSEF50mm12[] ={9, 12, 16, 24, 32, 40, 48, 56, 64, 72, -1, -1, -1, -1}; const int8_t EOSEF50mm14[] ={10, 0, 16, 24, 32, 40, 48, 56, 64, 72, 80, -1, -1, -1}; const int8_t EOSEF50mm18[] ={10, 0, 22, 24, 32, 40, 48, 56, 64, 72, 80, -1, -1, -1}; /* Canon EF 85mm lenses */ const int8_t EOSEF85mm12[] ={9, 12, 16, 24, 32, 40, 48, 56, 64, 72, -1, -1, -1, -1}; const int8_t EOSEF85mm18[] ={10, 0, 22, 24, 32, 40, 48, 56, 64, 72, 80, -1, -1, -1}; /* ========================================================================== */ /* ======================== 25 ISO TABLES =================================== */ /* ========================================================================== */ /** Aperture priority tables with regard to EV value (Ev=[0..15]) * * The array will contain the indices in Tv_speed[] array. */ const uint8_t AV01_25[] = {15, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1}; const uint8_t AV14_25[] = {15, 15, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2}; const uint8_t AV02_25[] = {15, 15, 15, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3}; const uint8_t AV28_25[] = {15, 15, 15, 15, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4}; const uint8_t AV04_25[] = {15, 15, 15, 15, 15, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5}; const uint8_t AV56_25[] = {15, 15, 15, 15, 15, 15, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6}; const uint8_t AV08_25[] = {15, 15, 15, 15, 15, 15, 15, 15, 14, 13, 12, 11, 10, 9, 8, 7}; const uint8_t AV11_25[] = {15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 13, 12, 11, 10, 9, 8}; const uint8_t AV16_25[] = {15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 13, 12, 11, 10, 9}; const uint8_t AV22_25[] = {15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 13, 12, 11, 10}; const uint8_t AV32_25[] = {15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 13, 12, 11}; const uint8_t AV45_25[] = {15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 13, 12}; const uint8_t AV64_25[] = {15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 13}; /** Shutter priority tables with regard to EV value (Ev=[0..15]) * * The array will contain the indices in Av_values[] array. */ const uint8_t TV00001_25[] = {0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0}; const uint8_t TV00012_25[] = {0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}; const uint8_t TV00014_25[] = {0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; const uint8_t TV00018_25[] = {0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}; const uint8_t TV00115_25[] = {0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; const uint8_t TV00130_25[] = {0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; const uint8_t TV00160_25[] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8}; const uint8_t TV01125_25[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7}; const uint8_t TV01250_25[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6}; const uint8_t TV01500_25[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5}; const uint8_t TV11000_25[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4}; const uint8_t TV12000_25[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3}; const uint8_t TV14000_25[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2}; const uint8_t TV18000_25[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}; /* ==================== END 25 ISO TABLES =================================== */ /* ========================================================================== */ /* ========================= 50 ISO TABLES ================================== */ /* ========================================================================== */ /** Aperture priority tables with regard to EV value (Ev=[0..15]) * * The array will contain the indices in Tv_speed[] array. */ const uint8_t AV01_50[] = {15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}; const uint8_t AV14_50[] = {15, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1}; const uint8_t AV02_50[] = {15, 15, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2}; const uint8_t AV28_50[] = {15, 15, 15, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3}; const uint8_t AV04_50[] = {15, 15, 15, 15, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4}; const uint8_t AV56_50[] = {15, 15, 15, 15, 15, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5}; const uint8_t AV08_50[] = {15, 15, 15, 15, 15, 15, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6}; const uint8_t AV11_50[] = {15, 15, 15, 15, 15, 15, 15, 15, 14, 13, 12, 11, 10, 9, 8, 7}; const uint8_t AV16_50[] = {15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 13, 12, 11, 10, 9, 8}; const uint8_t AV22_50[] = {15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 13, 12, 11, 10, 9}; const uint8_t AV32_50[] = {15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 13, 12, 11, 10}; const uint8_t AV45_50[] = {15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 13, 12, 11}; const uint8_t AV64_50[] = {15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 13, 12}; /** Shutter priority tables with regard to EV value (Ev=[0..15]) * * The array will contain the indices in Av_values[] array. */ const uint8_t TV00001_50[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 0}; const uint8_t TV00012_50[] = {0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0}; const uint8_t TV00014_50[] = {0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}; const uint8_t TV00018_50[] = {0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; const uint8_t TV00115_50[] = {0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}; const uint8_t TV00130_50[] = {0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; const uint8_t TV00160_50[] = {0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; const uint8_t TV01125_50[] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8}; const uint8_t TV01250_50[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7}; const uint8_t TV01500_50[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6}; const uint8_t TV11000_50[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5}; const uint8_t TV12000_50[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4}; const uint8_t TV14000_50[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3}; const uint8_t TV18000_50[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2}; /* ===================== END 50 ISO TABLES ================================== */ /* ========================================================================== */ /* ======================== 100 ISO TABLES ================================== */ /* ========================================================================== */ /** Aperture priority tables with regard to EV value (Ev=[0..15]) * * The array will contain the indices in Tv_speed[] array. */ const uint8_t AV01_100[] = {14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0}; const uint8_t AV14_100[] = {15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}; const uint8_t AV02_100[] = {15, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1}; const uint8_t AV28_100[] = {15, 15, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2}; const uint8_t AV04_100[] = {15, 15, 15, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3}; const uint8_t AV56_100[] = {15, 15, 15, 15, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4}; const uint8_t AV08_100[] = {15, 15, 15, 15, 15, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5}; const uint8_t AV11_100[] = {15, 15, 15, 15, 15, 15, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6}; const uint8_t AV16_100[] = {15, 15, 15, 15, 15, 15, 15, 15, 14, 13, 12, 11, 10, 9, 8, 7}; const uint8_t AV22_100[] = {15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 13, 12, 11, 10, 9, 8}; const uint8_t AV32_100[] = {15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 13, 12, 11, 10, 9}; const uint8_t AV45_100[] = {15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 13, 12, 11, 10}; const uint8_t AV64_100[] = {15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 13, 12, 11}; /** Shutter priority tables with regard to EV value (Ev=[0..15]) * * The array will contain the indices in Av_values[] array. */ const uint8_t TV00001_100[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 0, 0}; const uint8_t TV00012_100[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 0}; const uint8_t TV00014_100[] = {0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0}; const uint8_t TV00018_100[] = {0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}; const uint8_t TV00115_100[] = {0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; const uint8_t TV00130_100[] = {0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}; const uint8_t TV00160_100[] = {0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; const uint8_t TV01125_100[] = {0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; const uint8_t TV01250_100[] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8}; const uint8_t TV01500_100[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7}; const uint8_t TV11000_100[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6}; const uint8_t TV12000_100[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5}; const uint8_t TV14000_100[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4}; const uint8_t TV18000_100[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3}; /* ==================== END 100 ISO TABLES ================================== */ /* ========================================================================== */ /* ======================== 200 ISO TABLES ================================== */ /* ========================================================================== */ /** Aperture priority tables with regard to EV value (Ev=[0..15]) * * The array will contain the indices in Tv_speed[] array. */ const uint8_t AV01_200[] = {13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 0}; const uint8_t AV14_200[] = {14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0}; const uint8_t AV02_200[] = {15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}; const uint8_t AV28_200[] = {15, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1}; const uint8_t AV04_200[] = {15, 15, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2}; const uint8_t AV56_200[] = {15, 15, 15, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3}; const uint8_t AV08_200[] = {15, 15, 15, 15, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4}; const uint8_t AV11_200[] = {15, 15, 15, 15, 15, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5}; const uint8_t AV16_200[] = {15, 15, 15, 15, 15, 15, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6}; const uint8_t AV22_200[] = {15, 15, 15, 15, 15, 15, 15, 15, 14, 13, 12, 11, 10, 9, 8, 7}; const uint8_t AV32_200[] = {15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 13, 12, 11, 10, 9, 8}; const uint8_t AV45_200[] = {15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 13, 12, 11, 10, 9}; const uint8_t AV64_200[] = {15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 13, 12, 11, 10}; /** Shutter priority tables with regard to EV value (Ev=[0..15]) * * The array will contain the indices in Av_values[] array. */ const uint8_t TV00001_200[] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 0, 0, 0}; const uint8_t TV00012_200[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 0, 0}; const uint8_t TV00014_200[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 0}; const uint8_t TV00018_200[] = {0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0}; const uint8_t TV00115_200[] = {0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}; const uint8_t TV00130_200[] = {0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; const uint8_t TV00160_200[] = {0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}; const uint8_t TV01125_200[] = {0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; const uint8_t TV01250_200[] = {0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; const uint8_t TV01500_200[] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8}; const uint8_t TV11000_200[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7}; const uint8_t TV12000_200[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6}; const uint8_t TV14000_200[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5}; const uint8_t TV18000_200[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4}; /* ==================== END 200 ISO TABLES ================================== */ /* ========================================================================== */ /* ======================== 400 ISO TABLES ================================== */ /* ========================================================================== */ /** Aperture priority tables with regard to EV value (Ev=[0..15]) * * The array will contain the indices in Tv_speed[] array. */ const uint8_t AV01_400[] = {12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 0, 0}; const uint8_t AV14_400[] = {13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 0}; const uint8_t AV02_400[] = {14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0}; const uint8_t AV28_400[] = {15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}; const uint8_t AV04_400[] = {15, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1}; const uint8_t AV56_400[] = {15, 15, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2}; const uint8_t AV08_400[] = {15, 15, 15, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3}; const uint8_t AV11_400[] = {15, 15, 15, 15, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4}; const uint8_t AV16_400[] = {15, 15, 15, 15, 15, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5}; const uint8_t AV22_400[] = {15, 15, 15, 15, 15, 15, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6}; const uint8_t AV32_400[] = {15, 15, 15, 15, 15, 15, 15, 15, 14, 13, 12, 11, 10, 9, 8, 7}; const uint8_t AV45_400[] = {15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 13, 12, 11, 10, 9, 8}; const uint8_t AV64_400[] = {15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 13, 12, 11, 10, 9}; /** Shutter priority tables with regard to EV value (Ev=[0..15]) * * The array will contain the indices in Av_values[] array. */ const uint8_t TV00001_400[] = {3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 0, 0, 0, 0}; const uint8_t TV00012_400[] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 0, 0, 0}; const uint8_t TV00014_400[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 0, 0}; const uint8_t TV00018_400[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 0}; const uint8_t TV00115_400[] = {0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0}; const uint8_t TV00130_400[] = {0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}; const uint8_t TV00160_400[] = {0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; const uint8_t TV01125_400[] = {0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}; const uint8_t TV01250_400[] = {0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; const uint8_t TV01500_400[] = {0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; const uint8_t TV11000_400[] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8}; const uint8_t TV12000_400[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7}; const uint8_t TV14000_400[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6}; const uint8_t TV18000_400[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5}; /* ==================== END 400 ISO TABLES ================================== */ /* ========================================================================== */ /* ======================== 800 ISO TABLES ================================== */ /* ========================================================================== */ /** Aperture priority tables with regard to EV value (Ev=[0..15]) * * The array will contain the indices in Tv_speed[] array. */ const uint8_t AV01_800[] = {11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 0, 0, 0}; const uint8_t AV14_800[] = {12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 0, 0}; const uint8_t AV02_800[] = {13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 0}; const uint8_t AV28_800[] = {14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0}; const uint8_t AV04_800[] = {15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}; const uint8_t AV56_800[] = {15, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1}; const uint8_t AV08_800[] = {15, 15, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2}; const uint8_t AV11_800[] = {15, 15, 15, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3}; const uint8_t AV16_800[] = {15, 15, 15, 15, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4}; const uint8_t AV22_800[] = {15, 15, 15, 15, 15, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5}; const uint8_t AV32_800[] = {15, 15, 15, 15, 15, 15, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6}; const uint8_t AV45_800[] = {15, 15, 15, 15, 15, 15, 15, 15, 14, 13, 12, 11, 10, 9, 8, 7}; const uint8_t AV64_800[] = {15, 15, 15, 15, 15, 15, 15, 15, 15, 14, 13, 12, 11, 10, 9, 8}; /** Shutter priority tables with regard to EV value (Ev=[0..15]) * * The array will contain the indices in Av_values[] array. */ const uint8_t TV00001_800[] = {4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 0, 0, 0, 0, 0}; const uint8_t TV00012_800[] = {3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 0, 0, 0, 0}; const uint8_t TV00014_800[] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 0, 0, 0}; const uint8_t TV00018_800[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 0, 0}; const uint8_t TV00115_800[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 0}; const uint8_t TV00130_800[] = {0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0}; const uint8_t TV00160_800[] = {0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}; const uint8_t TV01125_800[] = {0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; const uint8_t TV01250_800[] = {0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}; const uint8_t TV01500_800[] = {0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; const uint8_t TV11000_800[] = {0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; const uint8_t TV12000_800[] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8}; const uint8_t TV14000_800[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7}; const uint8_t TV18000_800[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6}; /* ==================== END 800 ISO TABLES ================================== */ /* ========================================================================== */ /* ======================== 1600 ISO TABLES ================================= */ /* ========================================================================== */ /** Aperture priority tables with regard to EV value (Ev=[0..15]) * * The array will contain the indices in Tv_speed[] array. */ const uint8_t AV01_1600[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0}; const uint8_t AV14_1600[] = {11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 0, 0, 0}; const uint8_t AV02_1600[] = {12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 0, 0}; const uint8_t AV28_1600[] = {13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 0}; const uint8_t AV04_1600[] = {14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0}; const uint8_t AV56_1600[] = {15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}; const uint8_t AV08_1600[] = {15, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1}; const uint8_t AV11_1600[] = {15, 15, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2}; const uint8_t AV16_1600[] = {15, 15, 15, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3}; const uint8_t AV22_1600[] = {15, 15, 15, 15, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4}; const uint8_t AV32_1600[] = {15, 15, 15, 15, 15, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5}; const uint8_t AV45_1600[] = {15, 15, 15, 15, 15, 15, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6}; const uint8_t AV64_1600[] = {15, 15, 15, 15, 15, 15, 15, 15, 14, 13, 12, 11, 10, 9, 8, 7}; /** Shutter priority tables with regard to EV value (Ev=[0..15]) * * The array will contain the indices in Av_values[] array. */ const uint8_t TV00001_1600[] = {5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 0, 0, 0, 0, 0, 0}; const uint8_t TV00012_1600[] = {4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 0, 0, 0, 0, 0}; const uint8_t TV00014_1600[] = {3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 0, 0, 0, 0}; const uint8_t TV00018_1600[] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 0, 0, 0}; const uint8_t TV00115_1600[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 0, 0}; const uint8_t TV00130_1600[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 0}; const uint8_t TV00160_1600[] = {0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0}; const uint8_t TV01125_1600[] = {0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}; const uint8_t TV01250_1600[] = {0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; const uint8_t TV01500_1600[] = {0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}; const uint8_t TV11000_1600[] = {0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; const uint8_t TV12000_1600[] = {0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; const uint8_t TV14000_1600[] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8}; const uint8_t TV18000_1600[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7}; /* ==================== END 1600 ISO TABLES ================================= */ /* ========================================================================== */ /* ======================== 3200 ISO TABLES ================================= */ /* ========================================================================== */ /** Aperture priority tables with regard to EV value (Ev=[0..15]) * * The array will contain the indices in Tv_speed[] array. */ const uint8_t AV01_3200[] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0}; const uint8_t AV14_3200[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0}; const uint8_t AV02_3200[] = {11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 0, 0, 0}; const uint8_t AV28_3200[] = {12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 0, 0}; const uint8_t AV04_3200[] = {13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0, 0}; const uint8_t AV56_3200[] = {14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 0}; const uint8_t AV08_3200[] = {15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}; const uint8_t AV11_3200[] = {15, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1}; const uint8_t AV16_3200[] = {15, 15, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2}; const uint8_t AV22_3200[] = {15, 15, 15, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3}; const uint8_t AV32_3200[] = {15, 15, 15, 15, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4}; const uint8_t AV45_3200[] = {15, 15, 15, 15, 15, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5}; const uint8_t AV64_3200[] = {15, 15, 15, 15, 15, 15, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6}; /** Shutter priority tables with regard to EV value (Ev=[0..15]) * * The array will contain the indices in Av_values[] array. */ const uint8_t TV00001_3200[] = {6, 7, 8, 9, 10, 11, 12, 13, 0, 0, 0, 0, 0, 0, 0, 0}; const uint8_t TV00012_3200[] = {5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 0, 0, 0, 0, 0, 0}; const uint8_t TV00014_3200[] = {4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 0, 0, 0, 0, 0}; const uint8_t TV00018_3200[] = {3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 0, 0, 0, 0}; const uint8_t TV00115_3200[] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 0, 0, 0}; const uint8_t TV00130_3200[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 0, 0}; const uint8_t TV00160_3200[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0, 0}; const uint8_t TV01125_3200[] = {0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 0}; const uint8_t TV01250_3200[] = {0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}; const uint8_t TV01500_3200[] = {0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; const uint8_t TV11000_3200[] = {0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}; const uint8_t TV12000_3200[] = {0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; const uint8_t TV14000_3200[] = {0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; const uint8_t TV18000_3200[] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8}; /* ==================== END 3200 ISO TABLES ================================= */ /* -- Global variables -------------------------------------------------- */ uint8_t SLR_EV; /* using only the integer values of it */ float SLR_LUX;/* this comes form the TSL2591 library */ uint8_t SLR_ISO;/* current ISO - index to the ISO_values[] array */ uint8_t SLR_Av; /* current aperture - index to the Av_values[] array */ uint8_t SLR_Tv; /* current shutter speed - index to the Tv_speed[] array */ lens_t SLR_LensType; /* current lens type */ eos_t SLR_EOSModel; /* current EOS lens model */ cameramode_t SLR_Mode; /* current camera mode set by user */ /* ---------------------------------------------------------------------- */ /** FUNCTIONS * ========= */ /* Sets the initial values for the ISO, Aperture, Shutter speed, etc. * */ void slr_init(void){ /* for start, lets set some safe values, no correlation between them yet */ SLR_ISO = 2; /* ISO 100 - a good start for ISO */ SLR_Av = 6; /* Aperture 5.6 - any lens have that */ SLR_Tv = 7; /* Shutter speed 1/125 */ SLR_EV = 13;/* Light is ok */ } /* It will read the sensor at a press of a button - returns a code for success * and lights a green led when the exposure is read correctly. * Requires a functional light sensor library... */ uint8_t read_exposure(void){ /**/ uint8_t v = 0; return v; } /* sets the EV value from the LUX value returned by the light sensor */ void getEV(float LUXvalue){ if(LUXvalue < 3.5) {SLR_EV = 0; return;} if((LUXvalue > 3.4) && (LUXvalue < 7)) {SLR_EV = 1; return;} if((LUXvalue > 6.9) && (LUXvalue < 14)) {SLR_EV = 2; return;} if((LUXvalue > 13.9) && (LUXvalue < 28)) {SLR_EV = 3; return;} if((LUXvalue > 27.9) && (LUXvalue < 56)) {SLR_EV = 4; return;} if((LUXvalue > 55.9) && (LUXvalue < 112)) {SLR_EV = 5; return;} if((LUXvalue > 111.9) && (LUXvalue < 225)) {SLR_EV = 6; return;} if((LUXvalue > 224.9) && (LUXvalue < 450)) {SLR_EV = 7; return;} if((LUXvalue > 449.9) && (LUXvalue < 900)) {SLR_EV = 8; return;} if((LUXvalue > 899.9) && (LUXvalue < 1800)) {SLR_EV = 9; return;} if((LUXvalue > 1799.9) && (LUXvalue < 3600)) {SLR_EV =10; return;} if((LUXvalue > 3599.9) && (LUXvalue < 7200)) {SLR_EV =11; return;} if((LUXvalue > 7199.9) && (LUXvalue < 14400)) {SLR_EV =12; return;} if((LUXvalue > 14399.9) && (LUXvalue < 28900)) {SLR_EV =13; return;} if((LUXvalue > 28899.9) && (LUXvalue < 57800)) {SLR_EV =14; return;} if(LUXvalue > 57799.9) {SLR_EV =15; return;} } void setEOSlens(uint8_t dir){ /**/ } void setSLRmode(uint8_t dir){ /**/ } void setISOindex(uint8_t dir){ /**/ } /* sets the Av of the lens according to the selected lens */ void setAVindex(uint8_t dir){ /**/ } /* sets the Tv according to the hardware capabilities of the shutter. * the maximum speed of the shutter must be declared by the user. */ void setTVindex(uint8_t dir){ /**/ } uint16_t getISOvalue(void){ /**/ uint16_t v = 0; return v; } /* gets the index of aperture value if in TV mode */ uint8_t getAVindex(void){ /**/ uint8_t v = 0; return v; } /* gets the index of shutter speed value if in AV mode */ uint8_t getTVindex(void){ /**/ uint8_t v = 0; return v; }
The project of the first stage is published in repository.