Rev 2527 Rev 3669
1 #include "OneWire.h" 1 #include <OneWire.h>
2 #include <Stepper.h> 2 #include <Stepper.h>
3 #include <Wire.h> 3 #include <Wire.h>
4   4  
5 /* 5 /*
6   6  
7 protokol: 7 protokol:
8   8  
9 M - motor na jednu stranu 9 M - motor na jednu stranu
10 m - motor na druhou stranu 10 m - motor na druhou stranu
11 -- 11 --
12 a - vypni FW1 12 a - vypni FW1
13 A - zapni FW1 13 A - zapni FW1
14 -- 14 --
15 b - vypni FW2 15 b - vypni FW2
16 B - zapni FW2 16 B - zapni FW2
17 -- 17 --
18 c - vypni FW3 18 c - vypni FW3
19 C - zapni FW3 19 C - zapni FW3
20 -- 20 --
21 i - inicializace: vypni vsechny FW, vytahni motor 21 i - inicializace: vypni vsechny FW, vytahni motor
22   22  
23 */ 23 */
24   24  
25 #define light0 0x44 // A0 = L (I2C light0) 25 #define light0 0x44 // A0 = L (I2C light0)
26 #define light1 0x45 // A0 = H (I2C light1) 26 #define light1 0x45 // A0 = H (I2C light1)
27   27  
28 int lights[] = {light0, light1}; 28 int lights[] = {light0, light1};
29   29  
30 //#define LAMP1 13 // Callibration Lamp 1 30 //#define LAMP1 13 // Callibration Lamp 1
31 //#define LAMP2 6 // Callibration Lamp 2 31 //#define LAMP2 6 // Callibration Lamp 2
32   32  
33   33  
34 #define FW1 7 // [PD7 - red] Slit Wheel 1-st from light 34 #define FW1 7 // [PD7 - red] Slit Wheel 1-st from light
35 #define FW2 8 // [PB0 - yellow] Grism Wheel 2-nd from light 35 #define FW2 8 // [PB0 - yellow] Grism Wheel 2-nd from light
36 #define FW3 3 // [PD3 - blue] Filter Wheel 3-rd from light 36 #define FW3 3 // [PD3 - blue] Filter Wheel 3-rd from light
37   37  
38 int filters[] = {FW1, FW2, FW3}; 38 int filters[] = {FW1, FW2, FW3};
39   39  
40 const int STEPS = 3500; // change this to fit the number of steps 40 const int STEPS = 3500; // change this to fit the number of steps
41 const int SSPEED = 8000; // max. 15 // stepper motor speed 41 const int SSPEED = 8000; // max. 15 // stepper motor speed
42   42  
43 // initialize the stepper library on pins 43 // initialize the stepper library on pins
44 #define M1 9 44 #define M1 9
45 #define M2 10 45 #define M2 10
46 #define M3 11 46 #define M3 11
47 #define M4 12 47 #define M4 12
48 Stepper myStepper(200, M1,M2,M3,M4); 48 Stepper myStepper(200, M1,M2,M3,M4);
49   49  
50 // DS18S20 Temperature chip 50 // DS18S20 Temperature chip
51 OneWire ds(5); // 1-Wire pin 51 OneWire ds(5); // 1-Wire pin
52 byte addr[2][8]; // 2x 1-Wire Address 52 byte addr[2][8]; // 2x 1-Wire Address
53   53  
54 char deleni16[16]={'0','1','1','2','3','3','4','4','5','6','6','7','7','8','9','9'}; 54 char deleni16[16]={'0','1','1','2','3','3','4','4','5','6','6','7','7','8','9','9'};
55   55  
56 char serInString[100]; 56 char serInString[100];
57 int serInIndx = 0; 57 int serInIndx = 0;
58 int in1, in2; 58 int in1, in2;
59   59  
60 void motor (word arg) 60 void motor (word arg)
61 { 61 {
62 word n; 62 word n;
63 word s=SSPEED; 63 word s=SSPEED;
64 64
65 /* 65 /*
66 for(n=0;n<2500000/SSPEED;n++) 66 for(n=0;n<2500000/SSPEED;n++)
67 { 67 {
68 digitalWrite(M1, LOW); 68 digitalWrite(M1, LOW);
69 digitalWrite(M2, HIGH); 69 digitalWrite(M2, HIGH);
70 digitalWrite(M1, LOW); 70 digitalWrite(M1, LOW);
71 digitalWrite(M2, HIGH); 71 digitalWrite(M2, HIGH);
72 delayMicroseconds(SSPEED); 72 delayMicroseconds(SSPEED);
73 digitalWrite(M1, HIGH); 73 digitalWrite(M1, HIGH);
74 digitalWrite(M2, LOW); 74 digitalWrite(M2, LOW);
75 digitalWrite(M1, HIGH); 75 digitalWrite(M1, HIGH);
76 digitalWrite(M2, LOW); 76 digitalWrite(M2, LOW);
77 delayMicroseconds(SSPEED); 77 delayMicroseconds(SSPEED);
78 } 78 }
79 */ 79 */
80   80  
81 if(arg==-1) 81 if(arg==-1)
82 { 82 {
83 for(n=0;n<STEPS/4;n++) 83 for(n=0;n<STEPS/4;n++)
84 { 84 {
85 digitalWrite(M1, LOW); 85 digitalWrite(M1, LOW);
86 digitalWrite(M2, HIGH); 86 digitalWrite(M2, HIGH);
87 // digitalWrite(M3, LOW); 87 // digitalWrite(M3, LOW);
88 // digitalWrite(M4, HIGH); 88 // digitalWrite(M4, HIGH);
89 delayMicroseconds(s); 89 delayMicroseconds(s);
90 // digitalWrite(M1, LOW); 90 // digitalWrite(M1, LOW);
91 // digitalWrite(M2, HIGH); 91 // digitalWrite(M2, HIGH);
92 digitalWrite(M3, HIGH); 92 digitalWrite(M3, HIGH);
93 digitalWrite(M4, LOW); 93 digitalWrite(M4, LOW);
94 delayMicroseconds(s); 94 delayMicroseconds(s);
95 digitalWrite(M1, HIGH); 95 digitalWrite(M1, HIGH);
96 digitalWrite(M2, LOW); 96 digitalWrite(M2, LOW);
97 // digitalWrite(M3, HIGH); 97 // digitalWrite(M3, HIGH);
98 // digitalWrite(M4, LOW); 98 // digitalWrite(M4, LOW);
99 delayMicroseconds(s); 99 delayMicroseconds(s);
100 // digitalWrite(M1, HIGH); 100 // digitalWrite(M1, HIGH);
101 // digitalWrite(M2, LOW); 101 // digitalWrite(M2, LOW);
102 digitalWrite(M3, LOW); 102 digitalWrite(M3, LOW);
103 digitalWrite(M4, HIGH); 103 digitalWrite(M4, HIGH);
104 delayMicroseconds(s); 104 delayMicroseconds(s);
105 if(s>1500)s-=50; 105 if(s>1500)s-=50;
106 } 106 }
107 } 107 }
108 else 108 else
109 { 109 {
110 for(n=0;n<STEPS/4;n++) 110 for(n=0;n<STEPS/4;n++)
111 { 111 {
112 // digitalWrite(M1, HIGH); 112 // digitalWrite(M1, HIGH);
113 // digitalWrite(M2, LOW); 113 // digitalWrite(M2, LOW);
114 digitalWrite(M3, LOW); 114 digitalWrite(M3, LOW);
115 digitalWrite(M4, HIGH); 115 digitalWrite(M4, HIGH);
116 delayMicroseconds(s); 116 delayMicroseconds(s);
117 digitalWrite(M1, HIGH); 117 digitalWrite(M1, HIGH);
118 digitalWrite(M2, LOW); 118 digitalWrite(M2, LOW);
119 // digitalWrite(M3, HIGH); 119 // digitalWrite(M3, HIGH);
120 // digitalWrite(M4, LOW); 120 // digitalWrite(M4, LOW);
121 delayMicroseconds(s); 121 delayMicroseconds(s);
122 // digitalWrite(M1, LOW); 122 // digitalWrite(M1, LOW);
123 // digitalWrite(M2, HIGH); 123 // digitalWrite(M2, HIGH);
124 digitalWrite(M3, HIGH); 124 digitalWrite(M3, HIGH);
125 digitalWrite(M4, LOW); 125 digitalWrite(M4, LOW);
126 delayMicroseconds(s); 126 delayMicroseconds(s);
127 digitalWrite(M1, LOW); 127 digitalWrite(M1, LOW);
128 digitalWrite(M2, HIGH); 128 digitalWrite(M2, HIGH);
129 // digitalWrite(M3, LOW); 129 // digitalWrite(M3, LOW);
130 // digitalWrite(M4, HIGH); 130 // digitalWrite(M4, HIGH);
131 delayMicroseconds(s); 131 delayMicroseconds(s);
132 if(s>1500)s-=50; 132 if(s>1500)s-=50;
133 } 133 }
134 } 134 }
135 /* 135 /*
136 myStepper.setSpeed(1); 136 myStepper.setSpeed(1);
137 myStepper.step(arg * 10); 137 myStepper.step(arg * 10);
138 myStepper.setSpeed(sspeed); 138 myStepper.setSpeed(sspeed);
139 myStepper.step(arg * steps); 139 myStepper.step(arg * steps);
140 */ 140 */
141 digitalWrite(M1, LOW); 141 digitalWrite(M1, LOW);
142 digitalWrite(M2, LOW); 142 digitalWrite(M2, LOW);
143 digitalWrite(M3, LOW); 143 digitalWrite(M3, LOW);
144 digitalWrite(M4, LOW); 144 digitalWrite(M4, LOW);
145 } 145 }
146   146  
147 int light (int arg) 147 int light (int arg)
148 { 148 {
149 int LSB = 0, MSB = 0; // data from light 149 int LSB = 0, MSB = 0; // data from light
150 150
151 // Setup device 151 // Setup device
152 Wire.beginTransmission(lights[arg]); 152 Wire.beginTransmission(lights[arg]);
153 Wire.write(byte(0x00)); // command register 153 Wire.write(byte(0x00)); // command register
154 Wire.write(byte(0b11000001)); // setup (eye light sensing; measurement range 2 [4000 lx]) 154 Wire.write(byte(0b11000001)); // setup (eye light sensing; measurement range 2 [4000 lx])
155 Wire.endTransmission(); // stop transmitting 155 Wire.endTransmission(); // stop transmitting
156   156  
157 // Delay for measurement, maybe 100ms is enough, maybe not 157 // Delay for measurement, maybe 100ms is enough, maybe not
158 delay(110); 158 delay(110);
159   159  
160 // LSB 160 // LSB
161 Wire.beginTransmission(lights[arg]); 161 Wire.beginTransmission(lights[arg]);
162 Wire.write(byte(0x01)); // sends light0 162 Wire.write(byte(0x01)); // sends light0
163 Wire.endTransmission(); // stop transmitting 163 Wire.endTransmission(); // stop transmitting
164 // Connect to device and request one byte 164 // Connect to device and request one byte
165 Wire.beginTransmission(lights[arg]); 165 Wire.beginTransmission(lights[arg]);
166 Wire.requestFrom(lights[arg], 1); 166 Wire.requestFrom(lights[arg], 1);
167 LSB = Wire.read(); 167 LSB = Wire.read();
168 Wire.endTransmission(); 168 Wire.endTransmission();
169 169
170 // MSB 170 // MSB
171 Wire.beginTransmission(lights[arg]); 171 Wire.beginTransmission(lights[arg]);
172 Wire.write(byte(0x02)); // sends light0 172 Wire.write(byte(0x02)); // sends light0
173 Wire.endTransmission(); // stop transmitting 173 Wire.endTransmission(); // stop transmitting
174 // Connect to device and request one byte 174 // Connect to device and request one byte
175 Wire.beginTransmission(lights[arg]); 175 Wire.beginTransmission(lights[arg]);
176 Wire.requestFrom(lights[arg], 1); 176 Wire.requestFrom(lights[arg], 1);
177 MSB = Wire.read(); 177 MSB = Wire.read();
178 Wire.endTransmission(); // stop transmitting 178 Wire.endTransmission(); // stop transmitting
179 179
180 return ((MSB << 8) + LSB); 180 return ((MSB << 8) + LSB);
181 } 181 }
182   182  
183 int temperature (int arg) 183 int temperature (int arg)
184 { 184 {
185 int i, temp; 185 int i, temp;
186 byte data[12]; 186 byte data[12];
187 187
188 if (OneWire::crc8 (addr[arg], 7) != addr[arg][7]) 188 if (OneWire::crc8 (addr[arg], 7) != addr[arg][7])
189 { 189 {
190 Serial.print("CRC is not valid!\n"); 190 Serial.print("CRC is not valid!\n");
191 return 0; 191 return 0;
192 } 192 }
193 193
194 ds.reset(); 194 ds.reset();
195 ds.select(addr[arg]); 195 ds.select(addr[arg]);
196 ds.write(0x44, 1); // start conversion, with parasite power on at the end 196 ds.write(0x44, 1); // start conversion, with parasite power on at the end
197 197
198 delay(800); // maybe 750ms is enough, maybe not 198 delay(800); // maybe 750ms is enough, maybe not
199 199
200 ds.reset(); 200 ds.reset();
201 ds.select(addr[arg]); 201 ds.select(addr[arg]);
202 ds.write(0xBE); // Read Scratchpad 202 ds.write(0xBE); // Read Scratchpad
203 203
204 for ( i = 0; i < 9; i++) // we need 9 bytes 204 for ( i = 0; i < 9; i++) // we need 9 bytes
205 { 205 {
206 data[i] = ds.read(); 206 data[i] = ds.read();
207 } 207 }
208 208
209 temp = (data[1] << 8) + data[0]; //take the two bytes from the response relating to temperature 209 temp = (data[1] << 8) + data[0]; //take the two bytes from the response relating to temperature
210 // temp = temp >> 4; //divide by 16 to get pure celcius readout 210 // temp = temp >> 4; //divide by 16 to get pure celcius readout
211 211
212 return temp; 212 return temp;
213 } 213 }
214   214  
215 void inicializace () 215 void inicializace ()
216 { 216 {
217 // vysune se motor 217 // vysune se motor
218 motor (1); 218 motor (1);
219 // vsechny vystupy off 219 // vsechny vystupy off
220 // digitalWrite(LAMP1, LOW); 220 // digitalWrite(LAMP1, LOW);
221 // digitalWrite(LAMP2, LOW); 221 // digitalWrite(LAMP2, LOW);
222 digitalWrite(FW1, LOW); 222 digitalWrite(FW1, LOW);
223 digitalWrite(FW2, LOW); 223 digitalWrite(FW2, LOW);
224 digitalWrite(FW3, LOW); 224 digitalWrite(FW3, LOW);
225 } 225 }
226   226  
227 void setup() 227 void setup()
228 { 228 {
229 // pinMode(LAMP1, OUTPUT); 229 // pinMode(LAMP1, OUTPUT);
230 // pinMode(LAMP2, OUTPUT); 230 // pinMode(LAMP2, OUTPUT);
231 pinMode(FW1, OUTPUT); 231 pinMode(FW1, OUTPUT);
232 pinMode(FW2, OUTPUT); 232 pinMode(FW2, OUTPUT);
233 pinMode(FW3, OUTPUT); 233 pinMode(FW3, OUTPUT);
234   234  
235 pinMode(6, OUTPUT); 235 pinMode(6, OUTPUT);
236 //analogWrite(6, 254); 236 //analogWrite(6, 254);
237 digitalWrite(6, HIGH); 237 digitalWrite(6, HIGH);
238 238
239 // initialize the serial port: 239 // initialize the serial port:
240 Serial.begin(9600); 240 Serial.begin(9600);
241 241
242 Wire.begin(); // join i2c bus 242 Wire.begin(); // join i2c bus
243 243
244 // OneWire 244 // OneWire
245 ds.reset_search(); 245 ds.reset_search();
246 if (!ds.search(addr[0])) // search for next thermometer 246 if (!ds.search(addr[0])) // search for next thermometer
247 { 247 {
248 Serial.print ("1st thermometer error."); 248 Serial.print ("1st thermometer error.");
249 ds.reset_search(); 249 ds.reset_search();
250 delay(250); 250 delay(250);
251 return; 251 return;
252 } 252 }
253 if (!ds.search(addr[1])) // search for next thermometer 253 if (!ds.search(addr[1])) // search for next thermometer
254 { 254 {
255 Serial.print ("2nd thermometer error."); 255 Serial.print ("2nd thermometer error.");
256 ds.reset_search(); 256 ds.reset_search();
257 delay(250); 257 delay(250);
258 return; 258 return;
259 } 259 }
260 260
261 inicializace (); 261 inicializace ();
262 } 262 }
263   263  
264 void telemetrie () 264 void telemetrie ()
265 { 265 {
266 int t; 266 int t;
267 Serial.print ("FW1="); 267 Serial.print ("FW1=");
268 Serial.print (digitalRead (filters[0]) ? '1' : '0'); 268 Serial.print (digitalRead (filters[0]) ? '1' : '0');
269 Serial.print (",FW2="); 269 Serial.print (",FW2=");
270 Serial.print (digitalRead (filters[1]) ? '1' : '0'); 270 Serial.print (digitalRead (filters[1]) ? '1' : '0');
271 Serial.print (",FW3="); 271 Serial.print (",FW3=");
272 Serial.print (digitalRead (filters[2]) ? '1' : '0'); 272 Serial.print (digitalRead (filters[2]) ? '1' : '0');
273 Serial.print (",T1="); 273 Serial.print (",T1=");
274 t=temperature(0); 274 t=temperature(0);
275 Serial.print (t >> 4); 275 Serial.print (t >> 4);
276 Serial.print ("."); 276 Serial.print (".");
277 Serial.print (deleni16[t & 0xf]); 277 Serial.print (deleni16[t & 0xf]);
278 Serial.print (",T2="); 278 Serial.print (",T2=");
279 t=temperature(1); 279 t=temperature(1);
280 Serial.print (t >> 4); 280 Serial.print (t >> 4);
281 Serial.print ("."); 281 Serial.print (".");
282 Serial.print (deleni16[t & 0xf]); 282 Serial.print (deleni16[t & 0xf]);
283 Serial.print (",L1="); 283 Serial.print (",L1=");
284 Serial.print (light (0)); 284 Serial.print (light (0));
285 Serial.print (",L2="); 285 Serial.print (",L2=");
286 Serial.print (light (1)); 286 Serial.print (light (1));
287 Serial.println (); 287 Serial.println ();
288 } 288 }
289   289  
290 void readSerialString () 290 void readSerialString ()
291 { 291 {
292 serInIndx=0; 292 serInIndx=0;
293 do 293 do
294 { 294 {
295 while(Serial.available()==0); 295 while(Serial.available()==0);
296 serInString[serInIndx] = Serial.read(); 296 serInString[serInIndx] = Serial.read();
297 Serial.print(serInString[serInIndx]); 297 Serial.print(serInString[serInIndx]);
298 serInIndx++; 298 serInIndx++;
299 } while ((serInString[serInIndx-1]!='\n')&&(serInString[serInIndx-1]!='.')); 299 } while ((serInString[serInIndx-1]!='\n')&&(serInString[serInIndx-1]!='.'));
300 Serial.print("\r\n="); 300 Serial.print("\r\n=");
301 } 301 }
302   302  
303 void loop() 303 void loop()
304 { 304 {
305 // readSerialString(); 305 // readSerialString();
306 306
307 if (Serial.available()) 307 if (Serial.available())
308 { 308 {
309 switch (Serial.read()) 309 switch (Serial.read())
310 { 310 {
311 case 'i': // inicializace 311 case 'i': // inicializace
312 inicializace (); 312 inicializace ();
313 break; 313 break;
314 case 'm': 314 case 'm':
315 motor (-1); 315 motor (-1);
316 break; 316 break;
317 case 'M': 317 case 'M':
318 motor (1); // vysunuto 318 motor (1); // vysunuto
319 break; 319 break;
320   320  
321 case 'x': 321 case 'x':
322 myStepper.setSpeed(100); 322 myStepper.setSpeed(100);
323 myStepper.step(3000); 323 myStepper.step(3000);
324 break; 324 break;
325 case 'y': 325 case 'y':
326 myStepper.setSpeed(10.0); 326 myStepper.setSpeed(10.0);
327 myStepper.step(-3000); 327 myStepper.step(-3000);
328 break; 328 break;
329   329  
330 case 'A': 330 case 'A':
331 digitalWrite(FW1, HIGH); 331 digitalWrite(FW1, HIGH);
332 break; 332 break;
333 case 'a': 333 case 'a':
334 digitalWrite(FW1, LOW); 334 digitalWrite(FW1, LOW);
335 break; 335 break;
336 case 'B': 336 case 'B':
337 digitalWrite(FW2, HIGH); 337 digitalWrite(FW2, HIGH);
338 break; 338 break;
339 case 'b': 339 case 'b':
340 digitalWrite(FW2, LOW); 340 digitalWrite(FW2, LOW);
341 break; 341 break;
342 case 'C': 342 case 'C':
343 digitalWrite(FW3, HIGH); 343 digitalWrite(FW3, HIGH);
344 break; 344 break;
345 case 'c': 345 case 'c':
346 digitalWrite(FW3, LOW); 346 digitalWrite(FW3, LOW);
347 break; 347 break;
348 } 348 }
349 telemetrie (); 349 telemetrie ();
350 Serial.flush (); 350 Serial.flush ();
351 // /for (serInIndx = 100; serInIndx > 0; serInIndx--) 351 // /for (serInIndx = 100; serInIndx > 0; serInIndx--)
352 // serInString[serInIndx] = ' '; 352 // serInString[serInIndx] = ' ';
353 } 353 }
354 354
355 // delay(100); 355 // delay(100);
356 } 356 }