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