SHOW:
|
|
- or go back to the newest paste.
1 | /* | |
2 | * Skittles Color Sorter using Arduino UNO R3. | |
3 | * S0, S1, S2, S3 - PINs used by the color sensor. | |
4 | * Colours return IDs: 1 - red, 2 - green, 3 - yellow, 4 - orange, 5 - blue | |
5 | */ | |
6 | ||
7 | #include <Servo.h> | |
8 | ||
9 | /* | |
10 | * PIN-urile pentru senzorul de lumina. | |
11 | */ | |
12 | #define S0 3 | |
13 | #define S1 4 | |
14 | #define S2 5 | |
15 | #define S3 6 | |
16 | ||
17 | #define sensorOut 7 | |
18 | ||
19 | /* | |
20 | * Coduri pentru culori. | |
21 | */ | |
22 | - | #define RED 1 |
22 | + | #define RED 0 |
23 | - | #define GREEN 2 |
23 | + | #define GREEN 1 |
24 | - | #define YELLOW 3 |
24 | + | #define YELLOW 2 |
25 | - | #define ORANGE 4 |
25 | + | #define BLUE 3 |
26 | - | #define BLUE 5 |
26 | + | |
27 | #define START_POS 100 // 100° | |
28 | #define SENSOR_POS 47 // 47° | |
29 | - | #define SENSOR_POS 50 // 65° |
29 | + | |
30 | ||
31 | // #define DEBUG | |
32 | - | #define DEBUG |
32 | + | |
33 | Servo topServo; // motor sus | |
34 | Servo bottomServo; // motor jos | |
35 | ||
36 | int frequency = 0, color = 0; | |
37 | int R, G, B; | |
38 | ||
39 | unsigned short colors[4][6] = { | |
40 | // R G B | |
41 | { 75, 82, 90, 108, 78, 91 }, // RED | |
42 | { 82, 89, 88, 96, 81, 89 }, // GREEN | |
43 | { 60, 70, 78, 86, 75, 84 }, // YELLOW | |
44 | { 81, 90, 87, 97, 70, 80 } // BLUE | |
45 | }; | |
46 | ||
47 | /*unsigned short colorsMap[4][3] = { | |
48 | // R, G, B | |
49 | {76, 100, 85}, // RED | |
50 | {76, 84, 79}, // GREEN | |
51 | {69, 84, 82}, // YELLOW | |
52 | {85, 92, 75} // BLUE | |
53 | };*/ | |
54 | ||
55 | void setup() { | |
56 | pinMode(S0, OUTPUT); | |
57 | pinMode(S1, OUTPUT); | |
58 | pinMode(S2, OUTPUT); | |
59 | pinMode(S3, OUTPUT); | |
60 | pinMode(sensorOut, INPUT); | |
61 | ||
62 | - | topServo.write(i); // 110 - 66° cu delay de 2ms intre fiecare ° |
62 | + | |
63 | - | delay(4); // 2ms |
63 | + | |
64 | digitalWrite(S1, LOW); | |
65 | ||
66 | topServo.attach(8); // PIN #8 | |
67 | bottomServo.attach(9); // PIN #9 | |
68 | ||
69 | - | color = getColor(R, G, B); // afla culoarea |
69 | + | bottomServo.write(0); |
70 | ||
71 | Serial.begin(9600); | |
72 | } | |
73 | ||
74 | void loop() { | |
75 | - | //Serial.println("RED"); |
75 | + | |
76 | ||
77 | delay(500); // asteapta 500ms | |
78 | ||
79 | for (int i = START_POS; i >= SENSOR_POS; i--) { // muta motorul sub senzor | |
80 | topServo.write(i); | |
81 | delay(6); | |
82 | } | |
83 | ||
84 | delay(500); // 500ms | |
85 | ||
86 | - | bottomServo.write(100); // 100° |
86 | + | |
87 | color = mapToColour(R, G, B); // afla culoarea (getColor()) | |
88 | ||
89 | - | case ORANGE: { |
89 | + | |
90 | - | Serial.println("ORANGE"); |
90 | + | |
91 | - | bottomServo.write(125); // 125° |
91 | + | |
92 | case RED: { | |
93 | Serial.println("RED"); | |
94 | bottomServo.write(0); // 0° | |
95 | - | //Serial.println("BLUE"); |
95 | + | |
96 | - | bottomServo.write(150); // 150° |
96 | + | |
97 | case GREEN: { | |
98 | Serial.println("GREEN"); | |
99 | - | |
99 | + | bottomServo.write(25); // 25° |
100 | - | case 0: break; // invalid colour |
100 | + | |
101 | } | |
102 | case YELLOW: { | |
103 | Serial.println("YELLOW"); | |
104 | bottomServo.write(50); // 50° | |
105 | break; | |
106 | } | |
107 | case BLUE: { | |
108 | Serial.println("BLUE"); | |
109 | bottomServo.write(75); // 75° | |
110 | break; | |
111 | } | |
112 | } | |
113 | ||
114 | delay(300); // delay 300ms | |
115 | ||
116 | for (int i = SENSOR_POS; i >= END_POS; i--) { | |
117 | topServo.write(i); | |
118 | delay(6); | |
119 | } | |
120 | ||
121 | delay(200); // 200ms | |
122 | ||
123 | for (int i = END_POS; i <= START_POS; i++) { | |
124 | topServo.write(i); // revine la pozitia initiala de 115° | |
125 | delay(4); | |
126 | } | |
127 | ||
128 | color = 0; // reseteaza variabila de culoare | |
129 | } | |
130 | ||
131 | void getRGB(int *R, int *G, int *B) | |
132 | { | |
133 | // Setting red filtered photodiodes to be read | |
134 | digitalWrite(S2, LOW); | |
135 | digitalWrite(S3, LOW); | |
136 | ||
137 | frequency = pulseIn(sensorOut, LOW); | |
138 | *R = frequency; | |
139 | // frequency = map(frequency, 165, 180, 255, 0); | |
140 | ||
141 | #if defined DEBUG | |
142 | Serial.print("R= ");//printing name | |
143 | Serial.print(frequency);//printing RED color frequency | |
144 | Serial.print(" "); | |
145 | #endif | |
146 | delay(100); | |
147 | ||
148 | // Setting Green filtered photodiodes to be read | |
149 | digitalWrite(S2, HIGH); | |
150 | digitalWrite(S3, HIGH); | |
151 | ||
152 | frequency = pulseIn(sensorOut, LOW); | |
153 | *G = frequency; | |
154 | // frequency = map(frequency, 195, 210, 255, 0); | |
155 | ||
156 | #if defined DEBUG | |
157 | Serial.print("G= ");//printing name | |
158 | Serial.print(frequency);//printing RED color frequency | |
159 | Serial.print(" "); | |
160 | #endif | |
161 | ||
162 | delay(100); | |
163 | ||
164 | digitalWrite(S2, LOW); | |
165 | digitalWrite(S3, HIGH); | |
166 | ||
167 | frequency = pulseIn(sensorOut, LOW); | |
168 | *B = frequency; | |
169 | // frequency = map(frequency, 30, 90, 255, 0); | |
170 | ||
171 | #if defined DEBUG | |
172 | Serial.print("B= ");//printing name | |
173 | - | else if ((R >= 85 && R <= 95) && (G >= 85 && G <= 100) && (B >= 83 && B <= 100)) |
173 | + | |
174 | Serial.println(" "); | |
175 | #endif | |
176 | - | else if ((R >= 70 && R <= 80) && (G >= 85 && G <= 90) && (B >= 79 && B <= 90)) |
176 | + | |
177 | - | return YELLOW; // YELLOW |
177 | + | |
178 | ||
179 | - | else if ((R >= 70 && R <= 90) && (G >= 94 && G <= 114) && (B >= 82 && B <= 106)) |
179 | + | double getDist(double from_r, double from_g, double from_b, double r, double g, double b) |
180 | - | return ORANGE; // ORANGE |
180 | + | |
181 | return sqrt((r - from_r) * (r - from_r) + (g - from_g) * (g - from_g) + (b - from_b) * (b - from_b)); | |
182 | - | //return 0; // INVALID |
182 | + | |
183 | - | } |
183 | + | |
184 | unsigned short mapToColour(int r, int g, int b) | |
185 | { | |
186 | double d1, d2, minDist; | |
187 | unsigned short minIdx; | |
188 | ||
189 | minDist = getDist((double)colors[0][0], (double)colors[0][2], (double)colors[0][4], (double)r, (double)g, (double)b) + getDist((double)colors[0][1], (double)colors[0][3], (double)colors[0][5], (double)r, (double)g, (double)b); | |
190 | minIdx = 0; | |
191 | ||
192 | for (unsigned short j = 1; j < 4; j++) | |
193 | { | |
194 | d1 = getDist((double)colors[j][0], (double)colors[j][2], (double)colors[j][4], (double)r, (double)g, (double)b); | |
195 | d2 = getDist((double)colors[j][1], (double)colors[j][3], (double)colors[j][5], (double)r, (double)g, (double)b); | |
196 | ||
197 | #if defined DEBUG | |
198 | Serial.print("("); Serial.print(r); Serial.print(","); Serial.print(g); Serial.print(","); Serial.print(b); Serial.print(") dist for color id "); | |
199 | Serial.print(j); Serial.print(": "); Serial.print(d1 + d2); Serial.println(); | |
200 | #endif | |
201 | ||
202 | if (d1 + d2 < minDist) | |
203 | { | |
204 | minDist = d1 + d2; | |
205 | minIdx = j; | |
206 | } | |
207 | } | |
208 | ||
209 | return minIdx; | |
210 | } | |
211 | ||
212 | /*int mapToColour2(int r, int g, int b) | |
213 | { | |
214 | double d, minDist; | |
215 | int minIdx; | |
216 | ||
217 | minDist = getDist((double)colorsMap[0][0], (double)colorsMap[0][1], (double)colorsMap[0][2], (double)r, (double)g, (double)b); | |
218 | minIdx = 0; | |
219 | ||
220 | #if defined DEBUG | |
221 | Serial.print("("); Serial.print(r); Serial.print(","); Serial.print(g); Serial.print(","); Serial.print(b); Serial.print(") dist for color id 0: "); | |
222 | Serial.print(minDist); Serial.println(); | |
223 | #endif | |
224 | ||
225 | for (int j = 1; j < 4; j++) | |
226 | { | |
227 | d = getDist((double)colors[j][0], (double)colors[j][1], (double)colors[j][2], (double)r, (double)g, (double)b); | |
228 | ||
229 | #if defined DEBUG | |
230 | Serial.print("("); Serial.print(r); Serial.print(","); Serial.print(g); Serial.print(","); Serial.print(b); Serial.print(") dist for color id "); | |
231 | Serial.print(j); Serial.print(": "); Serial.print(d); Serial.println(); | |
232 | #endif | |
233 | ||
234 | if (d < minDist) | |
235 | { | |
236 | minDist = d; | |
237 | minIdx = j; | |
238 | } | |
239 | } | |
240 | ||
241 | return minIdx; | |
242 | } | |
243 | ||
244 | int getColor(int R, int G, int B) | |
245 | { | |
246 | if ((R <= 105 && R >= 90) && (G <= 128 && G >= 110) && (B >= 90 && B <= 105)) | |
247 | return RED; // RED | |
248 | ||
249 | if ((R >= 92 && R <= 103) && (G >= 96 && G <= 109) && (B >= 88 && B <= 100)) | |
250 | return GREEN; // GREEN | |
251 | ||
252 | if ((R >= 70 && R <= 78) && (G >= 85 && G <= 92) && (B >= 82 && B <= 90)) | |
253 | return YELLOW; // YELLOW | |
254 | ||
255 | if (((R >= 70 && R <= 85) && (G >= 104 && G <= 113) && (B >= 86 && B <= 98)) || ((R >= 90 && R <= 98) && (G >= 112 && G <= 122) && (B >= 95 && B <= 105))) | |
256 | return BLUE; // ORANGE | |
257 | ||
258 | return 0; // INVALID | |
259 | }*/ |